blob: 4280941c37557d08cb388207e4eaf72025c516f8 [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:
Manuel Klimekec5c3db2015-05-07 12:26:30 +000033 enum IncompleteCheck {
34 IC_ExpectComplete,
35 IC_ExpectIncomplete,
36 IC_DoNotCheck
37 };
38
Daniel Jasperd246a5a2015-06-15 15:25:11 +000039 std::string format(llvm::StringRef Code,
40 const FormatStyle &Style = getLLVMStyle(),
Manuel Klimekec5c3db2015-05-07 12:26:30 +000041 IncompleteCheck CheckIncomplete = IC_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()));
Manuel Klimekec5c3db2015-05-07 12:26:30 +000045 bool IncompleteFormat = false;
46 tooling::Replacements Replaces =
47 reformat(Style, Code, Ranges, "<stdin>", &IncompleteFormat);
48 if (CheckIncomplete != IC_DoNotCheck) {
49 bool ExpectedIncompleteFormat = CheckIncomplete == IC_ExpectIncomplete;
50 EXPECT_EQ(ExpectedIncompleteFormat, IncompleteFormat) << Code << "\n\n";
51 }
Daniel Jasperec04c0d2013-05-16 10:40:07 +000052 ReplacementCount = Replaces.size();
Eric Liu4f8d9942016-07-11 13:53:12 +000053 auto Result = applyAllReplacements(Code, Replaces);
54 EXPECT_TRUE(static_cast<bool>(Result));
55 DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
56 return *Result;
Daniel Jasperf7935112012-12-03 18:12:45 +000057 }
58
Manuel Klimekb69e3c62013-01-02 18:33:23 +000059 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
60 FormatStyle Style = getLLVMStyle();
61 Style.ColumnLimit = ColumnLimit;
62 return Style;
63 }
64
Daniel Jasper1b750ed2013-01-14 16:24:39 +000065 FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
66 FormatStyle Style = getGoogleStyle();
67 Style.ColumnLimit = ColumnLimit;
68 return Style;
69 }
70
Manuel Klimekb69e3c62013-01-02 18:33:23 +000071 void verifyFormat(llvm::StringRef Code,
72 const FormatStyle &Style = getLLVMStyle()) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000073 EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
Nico Weberd96ae862017-02-24 19:10:12 +000074 if (Style.Language == FormatStyle::LK_Cpp) {
75 // Objective-C++ is a superset of C++, so everything checked for C++
76 // needs to be checked for Objective-C++ as well.
77 FormatStyle ObjCStyle = Style;
78 ObjCStyle.Language = FormatStyle::LK_ObjC;
79 EXPECT_EQ(Code.str(), format(test::messUp(Code), ObjCStyle));
80 }
Daniel Jasperf7935112012-12-03 18:12:45 +000081 }
82
Manuel Klimekec5c3db2015-05-07 12:26:30 +000083 void verifyIncompleteFormat(llvm::StringRef Code,
84 const FormatStyle &Style = getLLVMStyle()) {
85 EXPECT_EQ(Code.str(),
86 format(test::messUp(Code), Style, IC_ExpectIncomplete));
87 }
88
Daniel Jasperf7935112012-12-03 18:12:45 +000089 void verifyGoogleFormat(llvm::StringRef Code) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000090 verifyFormat(Code, getGoogleStyle());
Daniel Jasperf7935112012-12-03 18:12:45 +000091 }
Daniel Jasper5b49f472013-01-23 12:10:53 +000092
93 void verifyIndependentOfContext(llvm::StringRef text) {
94 verifyFormat(text);
95 verifyFormat(llvm::Twine("void f() { " + text + " }").str());
96 }
Daniel Jasper7b038a22013-01-30 09:46:12 +000097
Daniel Jasper675b4f82015-01-19 10:51:23 +000098 /// \brief Verify that clang-format does not crash on the given input.
99 void verifyNoCrash(llvm::StringRef Code,
100 const FormatStyle &Style = getLLVMStyle()) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +0000101 format(Code, Style, IC_DoNotCheck);
Daniel Jasper675b4f82015-01-19 10:51:23 +0000102 }
103
Daniel Jasper7b038a22013-01-30 09:46:12 +0000104 int ReplacementCount;
Daniel Jasperf7935112012-12-03 18:12:45 +0000105};
106
Manuel Klimek52b15152013-01-09 15:25:02 +0000107TEST_F(FormatTest, MessUp) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +0000108 EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
109 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
110 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
111 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
112 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
Manuel Klimek52b15152013-01-09 15:25:02 +0000113}
114
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000115//===----------------------------------------------------------------------===//
116// Basic function tests.
117//===----------------------------------------------------------------------===//
118
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +0000119TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000120 EXPECT_EQ(";", format(";"));
121}
122
123TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
124 EXPECT_EQ("int i;", format(" int i;"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +0000125 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000126 EXPECT_EQ("int i;\nint j;", format(" int i; int j;"));
127 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;"));
128}
129
130TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
131 EXPECT_EQ("int i;", format("int\ni;"));
132}
133
134TEST_F(FormatTest, FormatsNestedBlockStatements) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000135 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000136}
137
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000138TEST_F(FormatTest, FormatsNestedCall) {
139 verifyFormat("Method(f1, f2(f3));");
140 verifyFormat("Method(f1(f2, f3()));");
Daniel Jasper48cb3b92013-01-13 08:19:51 +0000141 verifyFormat("Method(f1(f2, (f3())));");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000142}
143
Daniel Jasper14556742013-02-07 21:08:36 +0000144TEST_F(FormatTest, NestedNameSpecifiers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +0000145 verifyFormat("vector<::Type> v;");
Daniel Jasper14556742013-02-07 21:08:36 +0000146 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
Daniel Jasper11be8ac2013-08-28 07:07:07 +0000147 verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
Daniel Jasperf322eb52014-10-23 20:22:22 +0000148 verifyFormat("bool a = 2 < ::SomeFunction();");
Daniel Jasper23c2b5a2017-02-17 10:44:07 +0000149 verifyFormat("ALWAYS_INLINE ::std::string getName();");
150 verifyFormat("some::string getName();");
Daniel Jasper736c14f2013-01-16 07:19:28 +0000151}
152
Daniel Jasper7b038a22013-01-30 09:46:12 +0000153TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
154 EXPECT_EQ("if (a) {\n"
155 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000156 "}",
157 format("if(a){f();}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000158 EXPECT_EQ(4, ReplacementCount);
159 EXPECT_EQ("if (a) {\n"
160 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000161 "}",
162 format("if (a) {\n"
163 " f();\n"
164 "}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000165 EXPECT_EQ(0, ReplacementCount);
Daniel Jasperd6e61882015-06-17 12:23:15 +0000166 EXPECT_EQ("/*\r\n"
167 "\r\n"
168 "*/\r\n",
169 format("/*\r\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +0000170 "\r\n"
171 "*/\r\n"));
Daniel Jasperd6e61882015-06-17 12:23:15 +0000172 EXPECT_EQ(0, ReplacementCount);
Daniel Jasper7b038a22013-01-30 09:46:12 +0000173}
174
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000175TEST_F(FormatTest, RemovesEmptyLines) {
176 EXPECT_EQ("class C {\n"
177 " int i;\n"
178 "};",
179 format("class C {\n"
180 " int i;\n"
181 "\n"
182 "};"));
183
Nico Weber34272652014-11-13 16:25:37 +0000184 // Don't remove empty lines at the start of namespaces or extern "C" blocks.
Daniel Jasper01b35482014-03-21 13:03:33 +0000185 EXPECT_EQ("namespace N {\n"
186 "\n"
187 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000188 "}",
Daniel Jasper01b35482014-03-21 13:03:33 +0000189 format("namespace N {\n"
190 "\n"
191 "int i;\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000192 "}",
193 getGoogleStyle()));
Nico Weber34272652014-11-13 16:25:37 +0000194 EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
195 "\n"
196 "int i;\n"
197 "}",
198 format("extern /**/ \"C\" /**/ {\n"
199 "\n"
200 "int i;\n"
201 "}",
202 getGoogleStyle()));
203
204 // ...but do keep inlining and removing empty lines for non-block extern "C"
205 // functions.
206 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
207 EXPECT_EQ("extern \"C\" int f() {\n"
208 " int i = 42;\n"
209 " return i;\n"
210 "}",
211 format("extern \"C\" int f() {\n"
212 "\n"
213 " int i = 42;\n"
214 " return i;\n"
215 "}",
216 getGoogleStyle()));
Daniel Jasper01b35482014-03-21 13:03:33 +0000217
Daniel Jasper11164bd2014-03-21 12:58:53 +0000218 // Remove empty lines at the beginning and end of blocks.
219 EXPECT_EQ("void f() {\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000220 "\n"
221 " if (a) {\n"
222 "\n"
223 " f();\n"
224 " }\n"
225 "}",
226 format("void f() {\n"
227 "\n"
228 " if (a) {\n"
229 "\n"
230 " f();\n"
231 "\n"
232 " }\n"
233 "\n"
234 "}",
235 getLLVMStyle()));
236 EXPECT_EQ("void f() {\n"
Daniel Jasper11164bd2014-03-21 12:58:53 +0000237 " if (a) {\n"
238 " f();\n"
239 " }\n"
240 "}",
241 format("void f() {\n"
242 "\n"
243 " if (a) {\n"
244 "\n"
245 " f();\n"
246 "\n"
247 " }\n"
248 "\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000249 "}",
250 getGoogleStyle()));
Daniel Jasper11164bd2014-03-21 12:58:53 +0000251
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000252 // Don't remove empty lines in more complex control statements.
253 EXPECT_EQ("void f() {\n"
254 " if (a) {\n"
255 " f();\n"
256 "\n"
257 " } else if (b) {\n"
258 " f();\n"
259 " }\n"
260 "}",
261 format("void f() {\n"
262 " if (a) {\n"
263 " f();\n"
264 "\n"
265 " } else if (b) {\n"
266 " f();\n"
267 "\n"
268 " }\n"
269 "\n"
270 "}"));
271
272 // FIXME: This is slightly inconsistent.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000273 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
274 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000275 EXPECT_EQ("namespace {\n"
276 "int i;\n"
277 "}",
278 format("namespace {\n"
279 "int i;\n"
280 "\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000281 "}", LLVMWithNoNamespaceFix));
282 EXPECT_EQ("namespace {\n"
283 "int i;\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +0000284 "}",
Krasimir Georgiev32eaa862017-03-01 15:35:39 +0000285 format("namespace {\n"
286 "int i;\n"
287 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000288 "}"));
289 EXPECT_EQ("namespace {\n"
290 "int i;\n"
291 "\n"
292 "} // namespace",
293 format("namespace {\n"
294 "int i;\n"
295 "\n"
296 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000297
298 FormatStyle Style = getLLVMStyle();
299 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
300 Style.MaxEmptyLinesToKeep = 2;
301 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
302 Style.BraceWrapping.AfterClass = true;
303 Style.BraceWrapping.AfterFunction = true;
304 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
305
306 EXPECT_EQ("class Foo\n"
307 "{\n"
308 " Foo() {}\n"
309 "\n"
310 " void funk() {}\n"
311 "};",
312 format("class Foo\n"
313 "{\n"
314 " Foo()\n"
315 " {\n"
316 " }\n"
317 "\n"
318 " void funk() {}\n"
319 "};",
320 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000321}
322
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000323TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000324 verifyFormat("x = (a) and (b);");
325 verifyFormat("x = (a) or (b);");
326 verifyFormat("x = (a) bitand (b);");
327 verifyFormat("x = (a) bitor (b);");
328 verifyFormat("x = (a) not_eq (b);");
329 verifyFormat("x = (a) and_eq (b);");
330 verifyFormat("x = (a) or_eq (b);");
331 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000332}
333
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000334//===----------------------------------------------------------------------===//
335// Tests for control statements.
336//===----------------------------------------------------------------------===//
337
Daniel Jaspercdd06622013-05-14 10:31:09 +0000338TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000339 verifyFormat("if (true)\n f();\ng();");
340 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000341 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000342
Daniel Jasper3a685df2013-05-16 12:12:21 +0000343 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000344 AllowsMergedIf.AlignEscapedNewlinesLeft = true;
Daniel Jasperced17f82013-01-16 15:44:34 +0000345 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
346 verifyFormat("if (a)\n"
347 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000348 " f();",
349 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000350 verifyFormat("{\n"
351 " if (a)\n"
352 " label:\n"
353 " f();\n"
354 "}",
355 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000356 verifyFormat("#define A \\\n"
357 " if (a) \\\n"
358 " label: \\\n"
359 " f()",
360 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000361 verifyFormat("if (a)\n"
362 " ;",
363 AllowsMergedIf);
364 verifyFormat("if (a)\n"
365 " if (b) return;",
366 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000367
Daniel Jasper3a685df2013-05-16 12:12:21 +0000368 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000369 " f();\n",
370 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000371 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000372 " f();",
373 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000374 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000375 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000376 "}",
377 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000378 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000379 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000380 "}",
381 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000382
383 AllowsMergedIf.ColumnLimit = 14;
384 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000385 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000386 " return;",
387 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000388
389 AllowsMergedIf.ColumnLimit = 13;
390 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000391}
392
Daniel Jasper3a685df2013-05-16 12:12:21 +0000393TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
394 FormatStyle AllowsMergedLoops = getLLVMStyle();
395 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
396 verifyFormat("while (true) continue;", AllowsMergedLoops);
397 verifyFormat("for (;;) continue;", AllowsMergedLoops);
398 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
399 verifyFormat("while (true)\n"
400 " ;",
401 AllowsMergedLoops);
402 verifyFormat("for (;;)\n"
403 " ;",
404 AllowsMergedLoops);
405 verifyFormat("for (;;)\n"
406 " for (;;) continue;",
407 AllowsMergedLoops);
408 verifyFormat("for (;;) // Can't merge this\n"
409 " continue;",
410 AllowsMergedLoops);
411 verifyFormat("for (;;) /* still don't merge */\n"
412 " continue;",
413 AllowsMergedLoops);
414}
415
Daniel Jasper17605d32014-05-14 09:33:35 +0000416TEST_F(FormatTest, FormatShortBracedStatements) {
417 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
418 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
419
420 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
421 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
422
423 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
424 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
425 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
426 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
427 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
428 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
429 verifyFormat("if (true) { //\n"
430 " f();\n"
431 "}",
432 AllowSimpleBracedStatements);
433 verifyFormat("if (true) {\n"
434 " f();\n"
435 " f();\n"
436 "}",
437 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000438 verifyFormat("if (true) {\n"
439 " f();\n"
440 "} else {\n"
441 " f();\n"
442 "}",
443 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000444
Daniel Jasperbd630732014-05-22 13:25:26 +0000445 verifyFormat("template <int> struct A2 {\n"
446 " struct B {};\n"
447 "};",
448 AllowSimpleBracedStatements);
449
Daniel Jasper17605d32014-05-14 09:33:35 +0000450 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
451 verifyFormat("if (true) {\n"
452 " f();\n"
453 "}",
454 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000455 verifyFormat("if (true) {\n"
456 " f();\n"
457 "} else {\n"
458 " f();\n"
459 "}",
460 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000461
462 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
463 verifyFormat("while (true) {\n"
464 " f();\n"
465 "}",
466 AllowSimpleBracedStatements);
467 verifyFormat("for (;;) {\n"
468 " f();\n"
469 "}",
470 AllowSimpleBracedStatements);
471}
472
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000473TEST_F(FormatTest, ParseIfElse) {
474 verifyFormat("if (true)\n"
475 " if (true)\n"
476 " if (true)\n"
477 " f();\n"
478 " else\n"
479 " g();\n"
480 " else\n"
481 " h();\n"
482 "else\n"
483 " i();");
484 verifyFormat("if (true)\n"
485 " if (true)\n"
486 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000487 " if (true)\n"
488 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000489 " } else {\n"
490 " g();\n"
491 " }\n"
492 " else\n"
493 " h();\n"
494 "else {\n"
495 " i();\n"
496 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000497 verifyFormat("void f() {\n"
498 " if (a) {\n"
499 " } else {\n"
500 " }\n"
501 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000502}
503
504TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000505 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000506 verifyFormat("if (a)\n"
507 " f();\n"
508 "else if (b)\n"
509 " g();\n"
510 "else\n"
511 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000512 verifyFormat("if (a) {\n"
513 " f();\n"
514 "}\n"
515 "// or else ..\n"
516 "else {\n"
517 " g()\n"
518 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000519
520 verifyFormat("if (a) {\n"
521 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
522 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
523 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000524 verifyFormat("if (a) {\n"
525 "} else if (\n"
526 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
527 "}",
528 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000529}
530
Daniel Jasperf7935112012-12-03 18:12:45 +0000531TEST_F(FormatTest, FormatsForLoop) {
532 verifyFormat(
533 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000534 " ++VeryVeryLongLoopVariable)\n"
535 " ;");
536 verifyFormat("for (;;)\n"
537 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000538 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000539 verifyFormat("for (;;) {\n"
540 " f();\n"
541 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000542 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000543
544 verifyFormat(
545 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
546 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000547 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000548
549 verifyFormat(
550 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000551 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000552 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
553 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000554 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000555 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
556 " I = FD->getDeclsInPrototypeScope().begin(),\n"
557 " E = FD->getDeclsInPrototypeScope().end();\n"
558 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000559 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
560 " I = Container.begin(),\n"
561 " E = Container.end();\n"
562 " I != E; ++I) {\n}",
563 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000564
Daniel Jasper48c62f92013-01-28 17:30:17 +0000565 verifyFormat(
566 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
567 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000568 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
569 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000570 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000571 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
572 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
573 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000574 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
575 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
576 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000577 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
578 " aaaaaaaaaa);\n"
579 " iter; ++iter) {\n"
580 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000581 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
582 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
583 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
584 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000585
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000586 FormatStyle NoBinPacking = getLLVMStyle();
587 NoBinPacking.BinPackParameters = false;
588 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
589 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
590 " aaaaaaaaaaaaaaaa,\n"
591 " aaaaaaaaaaaaaaaa,\n"
592 " aaaaaaaaaaaaaaaa);\n"
593 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
594 "}",
595 NoBinPacking);
596 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000597 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
598 " E = UnwrappedLines.end();\n"
599 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000600 " ++I) {\n}",
601 NoBinPacking);
Daniel Jasperf7935112012-12-03 18:12:45 +0000602}
603
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000604TEST_F(FormatTest, RangeBasedForLoops) {
605 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
606 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
607 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
608 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000609 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
610 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000611 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
612 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000613}
614
Daniel Jaspere1e43192014-04-01 12:55:11 +0000615TEST_F(FormatTest, ForEachLoops) {
616 verifyFormat("void f() {\n"
617 " foreach (Item *item, itemlist) {}\n"
618 " Q_FOREACH (Item *item, itemlist) {}\n"
619 " BOOST_FOREACH (Item *item, itemlist) {}\n"
620 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
621 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000622
623 // As function-like macros.
624 verifyFormat("#define foreach(x, y)\n"
625 "#define Q_FOREACH(x, y)\n"
626 "#define BOOST_FOREACH(x, y)\n"
627 "#define UNKNOWN_FOREACH(x, y)\n");
628
629 // Not as function-like macros.
630 verifyFormat("#define foreach (x, y)\n"
631 "#define Q_FOREACH (x, y)\n"
632 "#define BOOST_FOREACH (x, y)\n"
633 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000634}
635
Daniel Jasperf7935112012-12-03 18:12:45 +0000636TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000637 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000638 verifyFormat("while (true)\n"
639 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000640 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000641 verifyFormat("while () {\n"
642 " f();\n"
643 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000644}
645
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000646TEST_F(FormatTest, FormatsDoWhile) {
647 verifyFormat("do {\n"
648 " do_something();\n"
649 "} while (something());");
650 verifyFormat("do\n"
651 " do_something();\n"
652 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000653}
654
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000655TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000656 verifyFormat("switch (x) {\n"
657 "case 1:\n"
658 " f();\n"
659 " break;\n"
660 "case kFoo:\n"
661 "case ns::kBar:\n"
662 "case kBaz:\n"
663 " break;\n"
664 "default:\n"
665 " g();\n"
666 " break;\n"
667 "}");
668 verifyFormat("switch (x) {\n"
669 "case 1: {\n"
670 " f();\n"
671 " break;\n"
672 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000673 "case 2: {\n"
674 " break;\n"
675 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000676 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000677 verifyFormat("switch (x) {\n"
678 "case 1: {\n"
679 " f();\n"
680 " {\n"
681 " g();\n"
682 " h();\n"
683 " }\n"
684 " break;\n"
685 "}\n"
686 "}");
687 verifyFormat("switch (x) {\n"
688 "case 1: {\n"
689 " f();\n"
690 " if (foo) {\n"
691 " g();\n"
692 " h();\n"
693 " }\n"
694 " break;\n"
695 "}\n"
696 "}");
697 verifyFormat("switch (x) {\n"
698 "case 1: {\n"
699 " f();\n"
700 " g();\n"
701 "} break;\n"
702 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000703 verifyFormat("switch (test)\n"
704 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000705 verifyFormat("switch (x) {\n"
706 "default: {\n"
707 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000708 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000709 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000710 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000711 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000712 "// if 1, do f()\n"
713 "case 1:\n"
714 " f();\n"
715 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000716 verifyFormat("switch (x) {\n"
717 "case 1:\n"
718 " // Do amazing stuff\n"
719 " {\n"
720 " f();\n"
721 " g();\n"
722 " }\n"
723 " break;\n"
724 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000725 verifyFormat("#define A \\\n"
726 " switch (x) { \\\n"
727 " case a: \\\n"
728 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000729 " }",
730 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000731 verifyFormat("#define OPERATION_CASE(name) \\\n"
732 " case OP_name: \\\n"
733 " return operations::Operation##name\n",
734 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000735 verifyFormat("switch (x) {\n"
736 "case 1:;\n"
737 "default:;\n"
738 " int i;\n"
739 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000740
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000741 verifyGoogleFormat("switch (x) {\n"
742 " case 1:\n"
743 " f();\n"
744 " break;\n"
745 " case kFoo:\n"
746 " case ns::kBar:\n"
747 " case kBaz:\n"
748 " break;\n"
749 " default:\n"
750 " g();\n"
751 " break;\n"
752 "}");
753 verifyGoogleFormat("switch (x) {\n"
754 " case 1: {\n"
755 " f();\n"
756 " break;\n"
757 " }\n"
758 "}");
759 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000760 " ;");
761
762 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
763 " case OP_name: \\\n"
764 " return operations::Operation##name\n");
765 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
766 " // Get the correction operation class.\n"
767 " switch (OpCode) {\n"
768 " CASE(Add);\n"
769 " CASE(Subtract);\n"
770 " default:\n"
771 " return operations::Unknown;\n"
772 " }\n"
773 "#undef OPERATION_CASE\n"
774 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000775 verifyFormat("DEBUG({\n"
776 " switch (x) {\n"
777 " case A:\n"
778 " f();\n"
779 " break;\n"
780 " // On B:\n"
781 " case B:\n"
782 " g();\n"
783 " break;\n"
784 " }\n"
785 "});");
Daniel Jasper031e2402014-04-28 07:48:36 +0000786 verifyFormat("switch (a) {\n"
787 "case (b):\n"
788 " return;\n"
789 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000790
791 verifyFormat("switch (a) {\n"
792 "case some_namespace::\n"
793 " some_constant:\n"
794 " return;\n"
795 "}",
796 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000797}
798
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000799TEST_F(FormatTest, CaseRanges) {
800 verifyFormat("switch (x) {\n"
801 "case 'A' ... 'Z':\n"
802 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000803 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000804 " break;\n"
805 "}");
806}
807
Daniel Jasperb87899b2014-09-10 13:11:45 +0000808TEST_F(FormatTest, ShortCaseLabels) {
809 FormatStyle Style = getLLVMStyle();
810 Style.AllowShortCaseLabelsOnASingleLine = true;
811 verifyFormat("switch (a) {\n"
812 "case 1: x = 1; break;\n"
813 "case 2: return;\n"
814 "case 3:\n"
815 "case 4:\n"
816 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +0000817 "case 6: // comment\n"
818 " return;\n"
819 "case 7:\n"
820 " // comment\n"
821 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +0000822 "case 8:\n"
823 " x = 8; // comment\n"
824 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000825 "default: y = 1; break;\n"
826 "}",
827 Style);
828 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +0000829 "#if FOO\n"
830 "case 0: return 0;\n"
831 "#endif\n"
832 "}",
833 Style);
834 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000835 "case 1: {\n"
836 "}\n"
837 "case 2: {\n"
838 " return;\n"
839 "}\n"
840 "case 3: {\n"
841 " x = 1;\n"
842 " return;\n"
843 "}\n"
844 "case 4:\n"
845 " if (x)\n"
846 " return;\n"
847 "}",
848 Style);
849 Style.ColumnLimit = 21;
850 verifyFormat("switch (a) {\n"
851 "case 1: x = 1; break;\n"
852 "case 2: return;\n"
853 "case 3:\n"
854 "case 4:\n"
855 "case 5: return;\n"
856 "default:\n"
857 " y = 1;\n"
858 " break;\n"
859 "}",
860 Style);
861}
862
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000863TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000864 verifyFormat("void f() {\n"
865 " some_code();\n"
866 "test_label:\n"
867 " some_other_code();\n"
868 " {\n"
869 " some_more_code();\n"
870 " another_label:\n"
871 " some_more_code();\n"
872 " }\n"
873 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +0000874 verifyFormat("{\n"
875 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000876 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +0000877 " some_other_code();\n"
878 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000879 verifyFormat("{\n"
880 " some_code();\n"
881 "test_label:;\n"
882 " int i = 0;\n"
883 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000884}
885
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000886//===----------------------------------------------------------------------===//
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000887// Tests for classes, namespaces, etc.
888//===----------------------------------------------------------------------===//
889
890TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +0000891 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000892}
893
894TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
895 verifyFormat("class A {\n"
896 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +0000897 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000898 "protected:\n"
899 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000900 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000901 "};");
902 verifyGoogleFormat("class A {\n"
903 " public:\n"
904 " protected:\n"
905 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000906 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000907 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +0000908 verifyFormat("class A {\n"
909 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +0000910 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +0000911 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +0000912 " void f2() {}\n"
913 "protected slots:\n"
914 " void f3() {}\n"
915 "protected Q_SLOTS:\n"
916 " void f4() {}\n"
917 "private slots:\n"
918 " void f5() {}\n"
919 "private Q_SLOTS:\n"
920 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +0000921 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +0000922 " void g1();\n"
923 "Q_SIGNALS:\n"
924 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +0000925 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +0000926
927 // Don't interpret 'signals' the wrong way.
928 verifyFormat("signals.set();");
929 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +0000930 verifyFormat("{\n"
931 " signals.set(); // This needs indentation.\n"
932 "}");
Daniel Jasper31343832016-07-27 10:13:24 +0000933 verifyFormat("void f() {\n"
934 "label:\n"
935 " signals.baz();\n"
936 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000937}
938
Alexander Kornienkofd433362013-03-27 17:08:02 +0000939TEST_F(FormatTest, SeparatesLogicalBlocks) {
940 EXPECT_EQ("class A {\n"
941 "public:\n"
942 " void f();\n"
943 "\n"
944 "private:\n"
945 " void g() {}\n"
946 " // test\n"
947 "protected:\n"
948 " int h;\n"
949 "};",
950 format("class A {\n"
951 "public:\n"
952 "void f();\n"
953 "private:\n"
954 "void g() {}\n"
955 "// test\n"
956 "protected:\n"
957 "int h;\n"
958 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +0000959 EXPECT_EQ("class A {\n"
960 "protected:\n"
961 "public:\n"
962 " void f();\n"
963 "};",
964 format("class A {\n"
965 "protected:\n"
966 "\n"
967 "public:\n"
968 "\n"
969 " void f();\n"
970 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +0000971
972 // Even ensure proper spacing inside macros.
973 EXPECT_EQ("#define B \\\n"
974 " class A { \\\n"
975 " protected: \\\n"
976 " public: \\\n"
977 " void f(); \\\n"
978 " };",
979 format("#define B \\\n"
980 " class A { \\\n"
981 " protected: \\\n"
982 " \\\n"
983 " public: \\\n"
984 " \\\n"
985 " void f(); \\\n"
986 " };",
987 getGoogleStyle()));
988 // But don't remove empty lines after macros ending in access specifiers.
989 EXPECT_EQ("#define A private:\n"
990 "\n"
991 "int i;",
992 format("#define A private:\n"
993 "\n"
994 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +0000995}
996
Daniel Jasper83193602013-04-05 17:22:09 +0000997TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +0000998 verifyFormat("class A : public B {};");
999 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001000
1001 verifyFormat(
1002 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001003 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00001004 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1005 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001006 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001007 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001008 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001009 verifyFormat("class AAAAAAAAAAAA : public B,\n"
1010 " public C,\n"
1011 " public D,\n"
1012 " public E,\n"
1013 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001014 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00001015
1016 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00001017 " ReallyReallyLongClassName {\n"
1018 " int i;\n"
1019 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00001020 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00001021 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1022 " aaaaaaaaaaaaaaaa> {};");
1023 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1024 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1025 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00001026 verifyFormat("template <class R, class C>\n"
1027 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1028 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00001029 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00001030}
1031
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00001032TEST_F(FormatTest, BreakBeforeInheritanceComma) {
1033 FormatStyle StyleWithInheritanceBreak = getLLVMStyle();
1034 StyleWithInheritanceBreak.BreakBeforeInheritanceComma = true;
1035
1036 verifyFormat("class MyClass : public X {};", StyleWithInheritanceBreak);
1037 verifyFormat("class MyClass\n"
1038 " : public X\n"
1039 " , public Y {};",
1040 StyleWithInheritanceBreak);
1041}
1042
Manuel Klimek28cacc72013-01-07 18:10:23 +00001043TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001044 verifyFormat("class A {\n} a, b;");
1045 verifyFormat("struct A {\n} a, b;");
1046 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001047}
1048
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001049TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001050 verifyFormat("enum {\n"
1051 " Zero,\n"
1052 " One = 1,\n"
1053 " Two = One + 1,\n"
1054 " Three = (One + Two),\n"
1055 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1056 " Five = (One, Two, Three, Four, 5)\n"
1057 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001058 verifyGoogleFormat("enum {\n"
1059 " Zero,\n"
1060 " One = 1,\n"
1061 " Two = One + 1,\n"
1062 " Three = (One + Two),\n"
1063 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1064 " Five = (One, Two, Three, Four, 5)\n"
1065 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001066 verifyFormat("enum Enum {};");
1067 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001068 verifyFormat("enum X E {} d;");
1069 verifyFormat("enum __attribute__((...)) E {} d;");
1070 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001071 verifyFormat("enum {\n"
1072 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001073 "};",
1074 getLLVMStyleWithColumns(30));
1075
1076 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001077 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001078
1079 EXPECT_EQ("enum KeepEmptyLines {\n"
1080 " ONE,\n"
1081 "\n"
1082 " TWO,\n"
1083 "\n"
1084 " THREE\n"
1085 "}",
1086 format("enum KeepEmptyLines {\n"
1087 " ONE,\n"
1088 "\n"
1089 " TWO,\n"
1090 "\n"
1091 "\n"
1092 " THREE\n"
1093 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001094 verifyFormat("enum E { // comment\n"
1095 " ONE,\n"
1096 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001097 "};\n"
1098 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001099 // Not enums.
1100 verifyFormat("enum X f() {\n"
1101 " a();\n"
1102 " return 42;\n"
1103 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001104 verifyFormat("enum X Type::f() {\n"
1105 " a();\n"
1106 " return 42;\n"
1107 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001108 verifyFormat("enum ::X f() {\n"
1109 " a();\n"
1110 " return 42;\n"
1111 "}");
1112 verifyFormat("enum ns::X f() {\n"
1113 " a();\n"
1114 " return 42;\n"
1115 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001116}
1117
Daniel Jasperb7150872013-08-30 10:10:19 +00001118TEST_F(FormatTest, FormatsEnumsWithErrors) {
1119 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001120 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001121 " Two = 1;\n"
1122 "};");
1123 verifyFormat("namespace n {\n"
1124 "enum Type {\n"
1125 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001126 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001127 " int i;\n"
1128 "}\n"
1129 "void g() {}");
1130}
1131
Daniel Jasper2b41a822013-08-20 12:42:50 +00001132TEST_F(FormatTest, FormatsEnumStruct) {
1133 verifyFormat("enum struct {\n"
1134 " Zero,\n"
1135 " One = 1,\n"
1136 " Two = One + 1,\n"
1137 " Three = (One + Two),\n"
1138 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1139 " Five = (One, Two, Three, Four, 5)\n"
1140 "};");
1141 verifyFormat("enum struct Enum {};");
1142 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001143 verifyFormat("enum struct X E {} d;");
1144 verifyFormat("enum struct __attribute__((...)) E {} d;");
1145 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001146 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1147}
1148
1149TEST_F(FormatTest, FormatsEnumClass) {
1150 verifyFormat("enum class {\n"
1151 " Zero,\n"
1152 " One = 1,\n"
1153 " Two = One + 1,\n"
1154 " Three = (One + Two),\n"
1155 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1156 " Five = (One, Two, Three, Four, 5)\n"
1157 "};");
1158 verifyFormat("enum class Enum {};");
1159 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001160 verifyFormat("enum class X E {} d;");
1161 verifyFormat("enum class __attribute__((...)) E {} d;");
1162 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001163 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1164}
1165
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001166TEST_F(FormatTest, FormatsEnumTypes) {
1167 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001168 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001169 " B\n"
1170 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001171 verifyFormat("enum X : int { A, B };");
1172 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001173}
1174
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001175TEST_F(FormatTest, FormatsNSEnums) {
1176 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1177 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1178 " // Information about someDecentlyLongValue.\n"
1179 " someDecentlyLongValue,\n"
1180 " // Information about anotherDecentlyLongValue.\n"
1181 " anotherDecentlyLongValue,\n"
1182 " // Information about aThirdDecentlyLongValue.\n"
1183 " aThirdDecentlyLongValue\n"
1184 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001185 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1186 " a = 1,\n"
1187 " b = 2,\n"
1188 " c = 3,\n"
1189 "};");
1190 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1191 " a = 1,\n"
1192 " b = 2,\n"
1193 " c = 3,\n"
1194 "};");
1195 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1196 " a = 1,\n"
1197 " b = 2,\n"
1198 " c = 3,\n"
1199 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001200}
1201
Nico Weber7769a902013-01-14 05:49:49 +00001202TEST_F(FormatTest, FormatsBitfields) {
1203 verifyFormat("struct Bitfields {\n"
1204 " unsigned sClass : 8;\n"
1205 " unsigned ValueKind : 2;\n"
1206 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001207 verifyFormat("struct A {\n"
1208 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1209 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1210 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001211 verifyFormat("struct MyStruct {\n"
1212 " uchar data;\n"
1213 " uchar : 8;\n"
1214 " uchar : 8;\n"
1215 " uchar other;\n"
1216 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001217}
1218
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001219TEST_F(FormatTest, FormatsNamespaces) {
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001220 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1221 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1222
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001223 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001224 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001225 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001226 "}",
1227 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001228 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001229 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001230 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001231 "}",
1232 LLVMWithNoNamespaceFix);
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001233 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001234 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001235 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001236 "}",
1237 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001238 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001239 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001240 "void f() { f(); }",
1241 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001242
1243 // This code is more common than we thought; if we
1244 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001245 // its own line, which is undesirable.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001246 verifyFormat("namespace {};",
1247 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001248 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001249 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001250 "};",
1251 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001252
1253 verifyFormat("namespace {\n"
1254 "int SomeVariable = 0; // comment\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001255 "} // namespace",
1256 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001257 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1258 "#define HEADER_GUARD\n"
1259 "namespace my_namespace {\n"
1260 "int i;\n"
1261 "} // my_namespace\n"
1262 "#endif // HEADER_GUARD",
1263 format("#ifndef HEADER_GUARD\n"
1264 " #define HEADER_GUARD\n"
1265 " namespace my_namespace {\n"
1266 "int i;\n"
1267 "} // my_namespace\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001268 "#endif // HEADER_GUARD",
1269 LLVMWithNoNamespaceFix));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001270
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001271 EXPECT_EQ("namespace A::B {\n"
1272 "class C {};\n"
1273 "}",
1274 format("namespace A::B {\n"
1275 "class C {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001276 "}",
1277 LLVMWithNoNamespaceFix));
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001278
Daniel Jasper65ee3472013-07-31 23:16:02 +00001279 FormatStyle Style = getLLVMStyle();
1280 Style.NamespaceIndentation = FormatStyle::NI_All;
1281 EXPECT_EQ("namespace out {\n"
1282 " int i;\n"
1283 " namespace in {\n"
1284 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001285 " } // namespace in\n"
1286 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001287 format("namespace out {\n"
1288 "int i;\n"
1289 "namespace in {\n"
1290 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001291 "} // namespace in\n"
1292 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001293 Style));
1294
1295 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1296 EXPECT_EQ("namespace out {\n"
1297 "int i;\n"
1298 "namespace in {\n"
1299 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001300 "} // namespace in\n"
1301 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001302 format("namespace out {\n"
1303 "int i;\n"
1304 "namespace in {\n"
1305 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001306 "} // namespace in\n"
1307 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001308 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001309}
1310
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001311TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00001312
Daniel Jasper40aacf42013-03-14 13:45:21 +00001313TEST_F(FormatTest, FormatsInlineASM) {
1314 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001315 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001316 verifyFormat(
1317 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1318 " \"cpuid\\n\\t\"\n"
1319 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001320 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001321 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001322 EXPECT_EQ(
1323 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001324 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001325 " mov edx,[that] // vtable in edx\n"
1326 " mov eax,methodIndex\n"
1327 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001328 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001329 "}",
1330 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1331 " __asm {\n"
1332 " mov edx,[that] // vtable in edx\n"
1333 " mov eax,methodIndex\n"
1334 " call [edx][eax*4] // stdcall\n"
1335 " }\n"
1336 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001337 EXPECT_EQ("_asm {\n"
1338 " xor eax, eax;\n"
1339 " cpuid;\n"
1340 "}",
1341 format("_asm {\n"
1342 " xor eax, eax;\n"
1343 " cpuid;\n"
1344 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00001345 verifyFormat("void function() {\n"
1346 " // comment\n"
1347 " asm(\"\");\n"
1348 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00001349 EXPECT_EQ("__asm {\n"
1350 "}\n"
1351 "int i;",
1352 format("__asm {\n"
1353 "}\n"
1354 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00001355}
1356
Nico Weberd5650bd2013-01-07 16:36:17 +00001357TEST_F(FormatTest, FormatTryCatch) {
1358 verifyFormat("try {\n"
1359 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001360 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001361 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001362 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001363 " exit(42);\n"
1364 "}");
1365
1366 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00001367 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001368 " return 5;\n"
1369 "}");
1370 verifyFormat("class A {\n"
1371 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001372 " A() try : a(0) {\n"
1373 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001374 " throw;\n"
1375 " }\n"
1376 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00001377
1378 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001379 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00001380}
1381
Nico Weberfac23712015-02-04 15:26:27 +00001382TEST_F(FormatTest, FormatSEHTryCatch) {
1383 verifyFormat("__try {\n"
1384 " int a = b * c;\n"
1385 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
1386 " // Do nothing.\n"
1387 "}");
1388
1389 verifyFormat("__try {\n"
1390 " int a = b * c;\n"
1391 "} __finally {\n"
1392 " // Do nothing.\n"
1393 "}");
1394
1395 verifyFormat("DEBUG({\n"
1396 " __try {\n"
1397 " } __finally {\n"
1398 " }\n"
1399 "});\n");
1400}
1401
Daniel Jasper04a71a42014-05-08 11:58:24 +00001402TEST_F(FormatTest, IncompleteTryCatchBlocks) {
1403 verifyFormat("try {\n"
1404 " f();\n"
1405 "} catch {\n"
1406 " g();\n"
1407 "}");
1408 verifyFormat("try {\n"
1409 " f();\n"
1410 "} catch (A a) MACRO(x) {\n"
1411 " g();\n"
1412 "} catch (B b) MACRO(x) {\n"
1413 " g();\n"
1414 "}");
1415}
1416
1417TEST_F(FormatTest, FormatTryCatchBraceStyles) {
1418 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00001419 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
1420 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00001421 Style.BreakBeforeBraces = BraceStyle;
1422 verifyFormat("try {\n"
1423 " // something\n"
1424 "} catch (...) {\n"
1425 " // something\n"
1426 "}",
1427 Style);
1428 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00001429 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
1430 verifyFormat("try {\n"
1431 " // something\n"
1432 "}\n"
1433 "catch (...) {\n"
1434 " // something\n"
1435 "}",
1436 Style);
Nico Weberfac23712015-02-04 15:26:27 +00001437 verifyFormat("__try {\n"
1438 " // something\n"
1439 "}\n"
1440 "__finally {\n"
1441 " // something\n"
1442 "}",
1443 Style);
Nico Weber33381f52015-02-07 01:57:32 +00001444 verifyFormat("@try {\n"
1445 " // something\n"
1446 "}\n"
1447 "@finally {\n"
1448 " // something\n"
1449 "}",
1450 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001451 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
1452 verifyFormat("try\n"
1453 "{\n"
1454 " // something\n"
1455 "}\n"
1456 "catch (...)\n"
1457 "{\n"
1458 " // something\n"
1459 "}",
1460 Style);
1461 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
1462 verifyFormat("try\n"
1463 " {\n"
1464 " // something\n"
1465 " }\n"
1466 "catch (...)\n"
1467 " {\n"
1468 " // something\n"
1469 " }",
1470 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00001471 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1472 Style.BraceWrapping.BeforeCatch = true;
1473 verifyFormat("try {\n"
1474 " // something\n"
1475 "}\n"
1476 "catch (...) {\n"
1477 " // something\n"
1478 "}",
1479 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001480}
1481
Daniel Jaspere25509f2012-12-17 11:29:41 +00001482TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001483 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00001484
Daniel Jaspera44991332015-04-29 13:06:49 +00001485 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
1486 " 100000000, "
1487 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00001488
Daniel Jasper473c62c2013-05-17 09:35:01 +00001489 // Here, everything other than the "}" would fit on a line.
1490 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001491 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001492 EXPECT_EQ("S s = {a,\n"
1493 "\n"
1494 " b};",
1495 format("S s = {\n"
1496 " a,\n"
1497 "\n"
1498 " b\n"
1499 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00001500
1501 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
1502 // line. However, the formatting looks a bit off and this probably doesn't
1503 // happen often in practice.
1504 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001505 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00001506 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001507}
1508
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001509TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001510 verifyFormat("const struct A a = {.a = 1, .b = 2};");
1511 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
1512 " .bbbbbbbbbb = 2,\n"
1513 " .cccccccccc = 3,\n"
1514 " .dddddddddd = 4,\n"
1515 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001516 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001517 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
1518 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
1519 " .ccccccccccccccccccccccccccc = 3,\n"
1520 " .ddddddddddddddddddddddddddd = 4,\n"
1521 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001522
1523 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
1524}
1525
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001526TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001527 verifyFormat("static A x = {{{}}};\n");
1528 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
1529 " {init1, init2, init3, init4}}};",
1530 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00001531
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001532 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001533 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1534 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1535 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
1536 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00001537 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001538 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1539 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1540 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00001541 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
1542 " {rect.fRight - rect.fLeft, rect.fBottom - "
1543 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001544
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001545 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001546 "SomeArrayOfSomeType a = {\n"
1547 " {{1, 2, 3},\n"
1548 " {1, 2, 3},\n"
1549 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
1550 " 333333333333333333333333333333},\n"
1551 " {1, 2, 3},\n"
1552 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00001553 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00001554 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001555 " {{1, 2, 3}},\n"
1556 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001557 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
1558 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001559 " {{1, 2, 3}},\n"
1560 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001561
Daniel Jaspera44991332015-04-29 13:06:49 +00001562 verifyFormat("struct {\n"
1563 " unsigned bit;\n"
1564 " const char *const name;\n"
1565 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
1566 " {kOsWin, \"Windows\"},\n"
1567 " {kOsLinux, \"Linux\"},\n"
1568 " {kOsCrOS, \"Chrome OS\"}};");
1569 verifyFormat("struct {\n"
1570 " unsigned bit;\n"
1571 " const char *const name;\n"
1572 "} kBitsToOs[] = {\n"
1573 " {kOsMac, \"Mac\"},\n"
1574 " {kOsWin, \"Windows\"},\n"
1575 " {kOsLinux, \"Linux\"},\n"
1576 " {kOsCrOS, \"Chrome OS\"},\n"
1577 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001578}
1579
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001580TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
1581 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
1582 " \\\n"
1583 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
1584}
1585
Daniel Jasperda16db32013-01-07 10:48:50 +00001586TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00001587 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
1588 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00001589
1590 // Do break defaulted and deleted functions.
1591 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1592 " default;",
1593 getLLVMStyleWithColumns(40));
1594 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1595 " delete;",
1596 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00001597}
1598
1599TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
1600 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
1601 getLLVMStyleWithColumns(40));
1602 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1603 getLLVMStyleWithColumns(40));
1604 EXPECT_EQ("#define Q \\\n"
1605 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
1606 " \"aaaaaaaa.cpp\"",
1607 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1608 getLLVMStyleWithColumns(40)));
1609}
1610
1611TEST_F(FormatTest, UnderstandsLinePPDirective) {
1612 EXPECT_EQ("# 123 \"A string literal\"",
1613 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00001614}
1615
Manuel Klimek591b5802013-01-31 15:58:48 +00001616TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00001617 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00001618 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001619}
1620
1621TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
1622 EXPECT_EQ("#line 42 \"test\"\n",
1623 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001624 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
1625 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001626}
1627
1628TEST_F(FormatTest, EndOfFileEndsPPDirective) {
1629 EXPECT_EQ("#line 42 \"test\"",
1630 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001631 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001632}
1633
Daniel Jasper877615c2013-10-11 19:45:02 +00001634TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
1635 verifyFormat("#define A \\x20");
1636 verifyFormat("#define A \\ x20");
1637 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
1638 verifyFormat("#define A ''");
1639 verifyFormat("#define A ''qqq");
1640 verifyFormat("#define A `qqq");
1641 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00001642 EXPECT_EQ("const char *c = STRINGIFY(\n"
1643 "\\na : b);",
1644 format("const char * c = STRINGIFY(\n"
1645 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00001646
1647 verifyFormat("a\r\\");
1648 verifyFormat("a\v\\");
1649 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00001650}
1651
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001652TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001653 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
1654 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001655 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001656 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00001657 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00001658
1659 verifyFormat("#define A A\n#define A A");
1660 verifyFormat("#define A(X) A\n#define A A");
1661
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001662 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
1663 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001664}
1665
1666TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001667 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001668 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001669 "#define A( \\\n"
1670 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001671 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001672 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001673 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001674 " #include \"a.h\"\n"
1675 "#define A(A,\\\n"
1676 " B)\n"
1677 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001678 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001679 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001680}
1681
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001682TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00001683
1684TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
1685 EXPECT_EQ("#define A \\\n"
1686 " c; \\\n"
1687 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001688 "f;",
1689 format("#define A c; e;\n"
1690 "f;",
1691 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00001692}
1693
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001694TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00001695
Manuel Klimek1abf7892013-01-04 23:34:14 +00001696TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00001697 EXPECT_EQ("int x,\n"
1698 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001699 " y;",
1700 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00001701}
1702
Manuel Klimek09e07972013-01-05 21:34:55 +00001703TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00001704 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00001705 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00001706 verifyFormat("#define A \\\n"
1707 " { \\\n"
1708 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001709 " }",
1710 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00001711
1712 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001713 " void function##X()",
1714 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00001715
1716 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001717 " void a##b##c()",
1718 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00001719
Daniel Jasper39825ea2013-01-14 15:40:57 +00001720 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00001721}
1722
Manuel Klimekd053c5b2013-01-23 14:37:36 +00001723TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00001724 EXPECT_EQ("#define A (x)", format("#define A (x)"));
1725 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00001726}
1727
Manuel Klimek0c137952013-02-11 12:33:24 +00001728TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
1729 EXPECT_EQ("#define A b;", format("#define A \\\n"
1730 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001731 " b;",
1732 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001733 EXPECT_EQ("#define A \\\n"
1734 " \\\n"
1735 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001736 " b;",
1737 format("#define A \\\n"
1738 " \\\n"
1739 " a; \\\n"
1740 " b;",
1741 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001742 EXPECT_EQ("#define A \\\n"
1743 " a; \\\n"
1744 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001745 " b;",
1746 format("#define A \\\n"
1747 " a; \\\n"
1748 " \\\n"
1749 " b;",
1750 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001751}
1752
Daniel Jasper00475962013-02-19 17:14:38 +00001753TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001754 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00001755 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00001756 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00001757 " case 2\n",
1758 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00001759 verifyFormat("#define MACRO(a) \\\n"
1760 " if (a) \\\n"
1761 " f(); \\\n"
1762 " else \\\n"
1763 " g()",
1764 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00001765 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001766 verifyIncompleteFormat("#define STR(x) #x\n"
1767 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00001768 verifyFormat("#pragma omp threadprivate( \\\n"
1769 " y)), // expected-warning",
1770 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00001771 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00001772 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001773 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00001774 "#define b \\\n"
1775 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001776 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00001777 "a",
1778 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00001779 verifyFormat("#define A \\\n"
1780 " { \\\n"
1781 " {\n"
1782 "#define B \\\n"
1783 " } \\\n"
1784 " }",
1785 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00001786 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00001787 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00001788 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00001789 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00001790}
1791
Daniel Jasper40e19212013-05-29 13:16:10 +00001792TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
1793 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
1794 EXPECT_EQ("class A : public QObject {\n"
1795 " Q_OBJECT\n"
1796 "\n"
1797 " A() {}\n"
1798 "};",
1799 format("class A : public QObject {\n"
1800 " Q_OBJECT\n"
1801 "\n"
1802 " A() {\n}\n"
1803 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00001804 EXPECT_EQ("MACRO\n"
1805 "/*static*/ int i;",
1806 format("MACRO\n"
1807 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00001808 EXPECT_EQ("SOME_MACRO\n"
1809 "namespace {\n"
1810 "void f();\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001811 "} // namespace",
Daniel Jasper41a0f782013-05-29 14:09:17 +00001812 format("SOME_MACRO\n"
1813 " namespace {\n"
1814 "void f( );\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001815 "} // namespace"));
Daniel Jasper40e19212013-05-29 13:16:10 +00001816 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00001817 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
1818 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00001819 // Only if everything is upper case.
1820 EXPECT_EQ("class A : public QObject {\n"
1821 " Q_Object A() {}\n"
1822 "};",
1823 format("class A : public QObject {\n"
1824 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00001825 " A() {\n}\n"
1826 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00001827
1828 // Only if the next line can actually start an unwrapped line.
1829 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
1830 format("SOME_WEIRD_LOG_MACRO\n"
1831 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00001832
1833 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00001834 "(n, buffers))\n",
1835 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00001836}
1837
Alexander Kornienkode644272013-04-08 22:16:06 +00001838TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
1839 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
1840 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
1841 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001842 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00001843 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
1844 "int *createScopDetectionPass() { return 0; }",
1845 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
1846 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
1847 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
1848 " class X {};\n"
1849 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
1850 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001851 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
1852 // braces, so that inner block is indented one level more.
1853 EXPECT_EQ("int q() {\n"
1854 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
1855 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
1856 " IPC_END_MESSAGE_MAP()\n"
1857 "}",
1858 format("int q() {\n"
1859 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
1860 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
1861 " IPC_END_MESSAGE_MAP()\n"
1862 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00001863
Daniel Jasper352dae12014-01-03 11:50:46 +00001864 // Same inside macros.
1865 EXPECT_EQ("#define LIST(L) \\\n"
1866 " L(A) \\\n"
1867 " L(B) \\\n"
1868 " L(C)",
1869 format("#define LIST(L) \\\n"
1870 " L(A) \\\n"
1871 " L(B) \\\n"
1872 " L(C)",
1873 getGoogleStyle()));
1874
Daniel Jasper545c6522013-09-17 09:26:07 +00001875 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001876 EXPECT_EQ("int q() {\n"
1877 " f(x);\n"
1878 " f(x) {}\n"
1879 " f(x)->g();\n"
1880 " f(x)->*g();\n"
1881 " f(x).g();\n"
1882 " f(x) = x;\n"
1883 " f(x) += x;\n"
1884 " f(x) -= x;\n"
1885 " f(x) *= x;\n"
1886 " f(x) /= x;\n"
1887 " f(x) %= x;\n"
1888 " f(x) &= x;\n"
1889 " f(x) |= x;\n"
1890 " f(x) ^= x;\n"
1891 " f(x) >>= x;\n"
1892 " f(x) <<= x;\n"
1893 " f(x)[y].z();\n"
1894 " LOG(INFO) << x;\n"
1895 " ifstream(x) >> x;\n"
1896 "}\n",
1897 format("int q() {\n"
1898 " f(x)\n;\n"
1899 " f(x)\n {}\n"
1900 " f(x)\n->g();\n"
1901 " f(x)\n->*g();\n"
1902 " f(x)\n.g();\n"
1903 " f(x)\n = x;\n"
1904 " f(x)\n += x;\n"
1905 " f(x)\n -= x;\n"
1906 " f(x)\n *= x;\n"
1907 " f(x)\n /= x;\n"
1908 " f(x)\n %= x;\n"
1909 " f(x)\n &= x;\n"
1910 " f(x)\n |= x;\n"
1911 " f(x)\n ^= x;\n"
1912 " f(x)\n >>= x;\n"
1913 " f(x)\n <<= x;\n"
1914 " f(x)\n[y].z();\n"
1915 " LOG(INFO)\n << x;\n"
1916 " ifstream(x)\n >> x;\n"
1917 "}\n"));
1918 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001919 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001920 " if (1) {\n"
1921 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001922 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001923 " while (1) {\n"
1924 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001925 " F(x)\n"
1926 " G(x);\n"
1927 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001928 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001929 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001930 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001931 " }\n"
1932 "}\n",
1933 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001934 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001935 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001936 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001937 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001938 "F(x)\n"
1939 "G(x);\n"
1940 "F(x)\n"
1941 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001942 "}\n"));
1943 EXPECT_EQ("class A {\n"
1944 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00001945 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001946 " A(X x)\n" // FIXME: function-level try blocks are broken.
1947 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001948 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001949 " }\n"
1950 "};",
1951 format("class A {\n"
1952 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00001953 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001954 " A(X x)\n"
1955 " try : t(0) {} catch (...) {}\n"
1956 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00001957 EXPECT_EQ("class SomeClass {\n"
1958 "public:\n"
1959 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1960 "};",
1961 format("class SomeClass {\n"
1962 "public:\n"
1963 " SomeClass()\n"
1964 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1965 "};"));
1966 EXPECT_EQ("class SomeClass {\n"
1967 "public:\n"
1968 " SomeClass()\n"
1969 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1970 "};",
1971 format("class SomeClass {\n"
1972 "public:\n"
1973 " SomeClass()\n"
1974 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1975 "};",
1976 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00001977
1978 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00001979}
1980
Manuel Klimek4fe43002013-05-22 12:51:29 +00001981TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
1982 verifyFormat("#define A \\\n"
1983 " f({ \\\n"
1984 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001985 " });",
1986 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00001987}
1988
Manuel Klimekef2cfb12013-01-05 22:14:16 +00001989TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
1990 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
1991}
1992
Manuel Klimek52d0fd82013-01-05 22:56:06 +00001993TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001994 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00001995}
1996
Manuel Klimek1058d982013-01-06 20:07:31 +00001997TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
1998 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
1999 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2000 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
2001 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2002}
Manuel Klimek1abf7892013-01-04 23:34:14 +00002003
Daniel Jaspere2408e32015-05-06 11:16:43 +00002004TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00002005 EXPECT_EQ(
2006 "#define A \\\n int i; \\\n int j;",
2007 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002008 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00002009 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002010 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002011 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00002012}
2013
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002014TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2015 verifyFormat("#define A \\\n"
2016 " int v( \\\n"
2017 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002018 " int i;",
2019 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002020}
2021
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002022TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00002023 EXPECT_EQ(
2024 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2025 " \\\n"
2026 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2027 "\n"
2028 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2029 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2030 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
2031 "\\\n"
2032 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2033 " \n"
2034 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2035 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002036}
2037
Manuel Klimek52b15152013-01-09 15:25:02 +00002038TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2039 EXPECT_EQ("int\n"
2040 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002041 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002042 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002043 verifyFormat("functionCallTo(\n"
2044 " someOtherFunction(\n"
2045 " withSomeParameters, whichInSequence,\n"
2046 " areLongerThanALine(andAnotherCall,\n"
2047 "#define A B\n"
2048 " withMoreParamters,\n"
2049 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002050 " andMoreParameters),\n"
2051 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002052 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002053 verifyFormat("Foo::Foo()\n"
2054 "#ifdef BAR\n"
2055 " : baz(0)\n"
2056 "#endif\n"
2057 "{\n"
2058 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002059 verifyFormat("void f() {\n"
2060 " if (true)\n"
2061 "#ifdef A\n"
2062 " f(42);\n"
2063 " x();\n"
2064 "#else\n"
2065 " g();\n"
2066 " x();\n"
2067 "#endif\n"
2068 "}");
2069 verifyFormat("void f(param1, param2,\n"
2070 " param3,\n"
2071 "#ifdef A\n"
2072 " param4(param5,\n"
2073 "#ifdef A1\n"
2074 " param6,\n"
2075 "#ifdef A2\n"
2076 " param7),\n"
2077 "#else\n"
2078 " param8),\n"
2079 " param9,\n"
2080 "#endif\n"
2081 " param10,\n"
2082 "#endif\n"
2083 " param11)\n"
2084 "#else\n"
2085 " param12)\n"
2086 "#endif\n"
2087 "{\n"
2088 " x();\n"
2089 "}",
2090 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002091 verifyFormat("#if 1\n"
2092 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002093 verifyFormat("#if 1\n"
2094 "#endif\n"
2095 "#if 1\n"
2096 "#else\n"
2097 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002098 verifyFormat("DEBUG({\n"
2099 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2100 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2101 "});\n"
2102 "#if a\n"
2103 "#else\n"
2104 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002105
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002106 verifyIncompleteFormat("void f(\n"
2107 "#if A\n"
2108 " );\n"
2109 "#else\n"
2110 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002111}
2112
Manuel Klimek14bd9172014-01-29 08:49:02 +00002113TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2114 verifyFormat("#endif\n"
2115 "#if B");
2116}
2117
Manuel Klimek88033d72013-10-21 08:11:15 +00002118TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2119 FormatStyle SingleLine = getLLVMStyle();
2120 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002121 verifyFormat("#if 0\n"
2122 "#elif 1\n"
2123 "#endif\n"
2124 "void foo() {\n"
2125 " if (test) foo2();\n"
2126 "}",
2127 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002128}
2129
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002130TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002131 verifyFormat("functionCall({ int i; });");
2132 verifyFormat("functionCall({\n"
2133 " int i;\n"
2134 " int j;\n"
2135 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00002136 verifyFormat("functionCall(\n"
2137 " {\n"
2138 " int i;\n"
2139 " int j;\n"
2140 " },\n"
2141 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00002142 verifyFormat("functionA(functionB({\n"
2143 " int i;\n"
2144 " int j;\n"
2145 " }),\n"
2146 " aaaa, bbbb, cccc);");
2147 verifyFormat("functionCall(\n"
2148 " {\n"
2149 " int i;\n"
2150 " int j;\n"
2151 " },\n"
2152 " aaaa, bbbb, // comment\n"
2153 " cccc);");
2154 verifyFormat("functionA(functionB({\n"
2155 " int i;\n"
2156 " int j;\n"
2157 " }),\n"
2158 " aaaa, bbbb, // comment\n"
2159 " cccc);");
2160 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2161 verifyFormat("functionCall(aaaa, bbbb, {\n"
2162 " int i;\n"
2163 " int j;\n"
2164 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00002165 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00002166 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00002167 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002168 " int i; // break\n"
2169 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00002170 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2171 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002172 verifyFormat("DEBUG({\n"
2173 " if (a)\n"
2174 " f();\n"
2175 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002176}
2177
2178TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002179 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002180 "int i;",
2181 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002182}
2183
2184TEST_F(FormatTest, LayoutNestedBlocks) {
2185 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2186 " struct s {\n"
2187 " int i;\n"
2188 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002189 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002190 " for (int i = 0; i < 10; ++i)\n"
2191 " return;\n"
2192 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002193 verifyFormat("call(parameter, {\n"
2194 " something();\n"
2195 " // Comment using all columns.\n"
2196 " somethingelse();\n"
2197 "});",
2198 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00002199 verifyFormat("DEBUG( //\n"
2200 " { f(); }, a);");
2201 verifyFormat("DEBUG( //\n"
2202 " {\n"
2203 " f(); //\n"
2204 " },\n"
2205 " a);");
2206
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002207 EXPECT_EQ("call(parameter, {\n"
2208 " something();\n"
2209 " // Comment too\n"
2210 " // looooooooooong.\n"
2211 " somethingElse();\n"
2212 "});",
2213 format("call(parameter, {\n"
2214 " something();\n"
2215 " // Comment too looooooooooong.\n"
2216 " somethingElse();\n"
2217 "});",
2218 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002219 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00002220 EXPECT_EQ("DEBUG({ // comment\n"
2221 " int i;\n"
2222 "});",
2223 format("DEBUG({ // comment\n"
2224 "int i;\n"
2225 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002226 EXPECT_EQ("DEBUG({\n"
2227 " int i;\n"
2228 "\n"
2229 " // comment\n"
2230 " int j;\n"
2231 "});",
2232 format("DEBUG({\n"
2233 " int i;\n"
2234 "\n"
2235 " // comment\n"
2236 " int j;\n"
2237 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00002238
2239 verifyFormat("DEBUG({\n"
2240 " if (a)\n"
2241 " return;\n"
2242 "});");
2243 verifyGoogleFormat("DEBUG({\n"
2244 " if (a) return;\n"
2245 "});");
2246 FormatStyle Style = getGoogleStyle();
2247 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00002248 verifyFormat("Debug(aaaaa,\n"
2249 " {\n"
2250 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
2251 " },\n"
2252 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00002253 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002254
Daniel Jaspera87af7a2015-06-30 11:32:22 +00002255 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
2256
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002257 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00002258}
2259
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002260TEST_F(FormatTest, FormatNestedBlocksInMacros) {
2261 EXPECT_EQ("#define MACRO() \\\n"
2262 " Debug(aaa, /* force line break */ \\\n"
2263 " { \\\n"
2264 " int i; \\\n"
2265 " int j; \\\n"
2266 " })",
2267 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
2268 " { int i; int j; })",
2269 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00002270
2271 EXPECT_EQ("#define A \\\n"
2272 " [] { \\\n"
2273 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2274 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
2275 " }",
2276 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2277 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
2278 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002279}
2280
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002281TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
2282 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002283 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002284 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002285}
2286
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00002287TEST_F(FormatTest, FormatBeginBlockEndMacros) {
2288 FormatStyle Style = getLLVMStyle();
2289 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
2290 Style.MacroBlockEnd = "^[A-Z_]+_END$";
2291 verifyFormat("FOO_BEGIN\n"
2292 " FOO_ENTRY\n"
2293 "FOO_END", Style);
2294 verifyFormat("FOO_BEGIN\n"
2295 " NESTED_FOO_BEGIN\n"
2296 " NESTED_FOO_ENTRY\n"
2297 " NESTED_FOO_END\n"
2298 "FOO_END", Style);
2299 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
2300 " int x;\n"
2301 " x = 1;\n"
2302 "FOO_END(Baz)", Style);
2303}
2304
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002305//===----------------------------------------------------------------------===//
2306// Line break tests.
2307//===----------------------------------------------------------------------===//
2308
Daniel Jasperf79b0b12013-08-30 08:29:25 +00002309TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002310 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00002311 "void f() {\n"
2312 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
2313 " parameter, parameter, parameter)),\n"
2314 " SecondLongCall(parameter));\n"
2315 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002316 verifyFormat(
2317 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2318 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2319 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2320 " aaaaaaaaaaaaaaaaaaaaaaaa);");
2321 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00002322 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2323 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
2324 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
2325 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002326 verifyFormat(
2327 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
2328 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
2329 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
2330 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00002331 verifyFormat("int a = bbbb && ccc &&\n"
2332 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00002333 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00002334 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002335}
2336
Daniel Jasperd69fc772013-05-08 14:12:04 +00002337TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
2338 verifyFormat(
2339 "bool aaaaaaa =\n"
2340 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
2341 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002342 verifyFormat(
2343 "bool aaaaaaa =\n"
2344 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
2345 " bbbbbbbb();");
2346
Daniel Jasperd69fc772013-05-08 14:12:04 +00002347 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2348 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
2349 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002350 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2351 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
2352 " ccccccccc == ddddddddddd;");
2353 verifyFormat(
2354 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
2355 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
2356 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00002357
2358 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2359 " aaaaaa) &&\n"
2360 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00002361 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2362 " aaaaaa) >>\n"
2363 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00002364 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00002365 " SourceMgr.getSpellingColumnNumber(\n"
2366 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
2367 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00002368
Daniel Jasper68d888c2013-06-03 08:42:05 +00002369 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2370 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
2371 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00002372 verifyFormat("b = a &&\n"
2373 " // Comment\n"
2374 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00002375
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002376 // If the LHS of a comparison is not a binary expression itself, the
2377 // additional linebreak confuses many people.
2378 verifyFormat(
2379 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2380 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
2381 "}");
2382 verifyFormat(
2383 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2384 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2385 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00002386 verifyFormat(
2387 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
2388 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2389 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002390 // Even explicit parentheses stress the precedence enough to make the
2391 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00002392 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2393 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2394 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002395 // This cases is borderline, but with the indentation it is still readable.
2396 verifyFormat(
2397 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2398 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2399 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
2400 "}",
2401 getLLVMStyleWithColumns(75));
2402
2403 // If the LHS is a binary expression, we should still use the additional break
2404 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00002405 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2406 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2407 " 5) {\n"
2408 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002409
Daniel Jasper571f1af2013-05-14 20:39:56 +00002410 FormatStyle OnePerLine = getLLVMStyle();
2411 OnePerLine.BinPackParameters = false;
2412 verifyFormat(
2413 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2414 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2415 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
2416 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00002417
2418 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
2419 " .aaa(aaaaaaaaaaaaa) *\n"
2420 " aaaaaaa +\n"
2421 " aaaaaaa;",
2422 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00002423}
2424
Daniel Jasper6bee6822013-04-08 20:33:42 +00002425TEST_F(FormatTest, ExpressionIndentation) {
2426 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2427 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2428 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2429 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2430 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
2431 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
2432 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2433 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
2434 " ccccccccccccccccccccccccccccccccccccccccc;");
2435 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2436 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2437 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2438 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2439 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2440 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2441 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2442 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2443 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2444 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2445 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2446 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002447 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002448 "} else if (aaaaa && bbbbb > // break\n"
2449 " ccccc) {\n"
2450 "}");
2451 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00002452 "} else if (aaaaa &&\n"
2453 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002454 " ccccc &&\n"
2455 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002456 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00002457
2458 // Presence of a trailing comment used to change indentation of b.
2459 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
2460 " b;\n"
2461 "return aaaaaaaaaaaaaaaaaaa +\n"
2462 " b; //",
2463 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00002464}
2465
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002466TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
2467 // Not sure what the best system is here. Like this, the LHS can be found
2468 // immediately above an operator (everything with the same or a higher
2469 // indent). The RHS is aligned right of the operator and so compasses
2470 // everything until something with the same indent as the operator is found.
2471 // FIXME: Is this a good system?
2472 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00002473 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002474 verifyFormat(
2475 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002476 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2477 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2478 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2479 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2480 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002481 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002482 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2483 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002484 Style);
2485 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002486 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2487 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002488 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2489 Style);
2490 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002491 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2492 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002493 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2494 Style);
2495 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2496 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002497 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2498 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002499 Style);
2500 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00002501 "} else if (aaaaa\n"
2502 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002503 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002504 "}",
2505 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00002506 verifyFormat("return (a)\n"
2507 " // comment\n"
2508 " + b;",
2509 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00002510 verifyFormat(
2511 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2512 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2513 " + cc;",
2514 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00002515
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00002516 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2517 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
2518 Style);
2519
Daniel Jasper9e5ede02013-11-08 19:56:28 +00002520 // Forced by comments.
2521 verifyFormat(
2522 "unsigned ContentSize =\n"
2523 " sizeof(int16_t) // DWARF ARange version number\n"
2524 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
2525 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
2526 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00002527
2528 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
2529 " == boost::fusion::at_c<1>(iiii).second;",
2530 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00002531
2532 Style.ColumnLimit = 60;
2533 verifyFormat("zzzzzzzzzz\n"
2534 " = bbbbbbbbbbbbbbbbb\n"
2535 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
2536 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002537}
2538
Daniel Jasperb1270392017-02-01 23:27:37 +00002539TEST_F(FormatTest, EnforcedOperatorWraps) {
2540 // Here we'd like to wrap after the || operators, but a comment is forcing an
2541 // earlier wrap.
2542 verifyFormat("bool x = aaaaa //\n"
2543 " || bbbbb\n"
2544 " //\n"
2545 " || cccc;");
2546}
2547
Daniel Jasper3219e432014-12-02 13:24:51 +00002548TEST_F(FormatTest, NoOperandAlignment) {
2549 FormatStyle Style = getLLVMStyle();
2550 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00002551 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
2552 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2553 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
2554 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002555 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00002556 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2557 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2558 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2559 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2560 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2561 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2562 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2563 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2564 " > ccccccccccccccccccccccccccccccccccccccccc;",
2565 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002566
2567 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2568 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2569 " + cc;",
2570 Style);
2571 verifyFormat("int a = aa\n"
2572 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002573 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00002574 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00002575
Daniel Jasper6501f7e2015-10-27 12:38:37 +00002576 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00002577 verifyFormat("return (a > b\n"
2578 " // comment1\n"
2579 " // comment2\n"
2580 " || c);",
2581 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002582}
2583
Daniel Jasperac043c92014-09-15 11:11:00 +00002584TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
2585 FormatStyle Style = getLLVMStyle();
2586 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
2587 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
2588 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00002589 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
2590 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00002591}
2592
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002593TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002594 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002595 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
2596 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002597 verifyFormat("Constructor()\n"
2598 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002599 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002600 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002601 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002602 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002603
Daniel Jasper7b259cd2015-08-27 11:59:31 +00002604 verifyFormat("template <typename T>\n"
2605 "Constructor() : Initializer(FitsOnTheLine) {}",
2606 getLLVMStyleWithColumns(45));
2607
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002608 verifyFormat(
2609 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002610 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002611
2612 verifyFormat(
2613 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002614 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002615 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002616 verifyFormat(
2617 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002618 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002619 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00002620 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2621 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2622 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002623
2624 verifyFormat("Constructor()\n"
2625 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2626 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2627 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002628 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002629
Daniel Jasper65585ed2013-01-28 13:31:35 +00002630 verifyFormat("Constructor()\n"
2631 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002632 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00002633
Daniel Jasper62e68172013-02-25 15:59:54 +00002634 verifyFormat("Constructor(int Parameter = 0)\n"
2635 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
2636 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00002637 verifyFormat("Constructor()\n"
2638 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
2639 "}",
2640 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00002641 verifyFormat("Constructor()\n"
2642 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2643 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00002644
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002645 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002646 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00002647 verifyFormat("Constructor()\n"
2648 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
2649 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
2650 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002651
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002652 FormatStyle OnePerLine = getLLVMStyle();
2653 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00002654 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002655 verifyFormat("SomeClass::Constructor()\n"
2656 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
2657 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002658 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002659 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002660 verifyFormat("SomeClass::Constructor()\n"
2661 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
2662 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002663 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002664 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002665 verifyFormat("MyClass::MyClass(int var)\n"
2666 " : some_var_(var), // 4 space indent\n"
2667 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002668 "}",
2669 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00002670 verifyFormat("Constructor()\n"
2671 " : aaaaa(aaaaaa),\n"
2672 " aaaaa(aaaaaa),\n"
2673 " aaaaa(aaaaaa),\n"
2674 " aaaaa(aaaaaa),\n"
2675 " aaaaa(aaaaaa) {}",
2676 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00002677 verifyFormat("Constructor()\n"
2678 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
2679 " aaaaaaaaaaaaaaaaaaaaaa) {}",
2680 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00002681 OnePerLine.BinPackParameters = false;
2682 verifyFormat(
2683 "Constructor()\n"
2684 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2685 " aaaaaaaaaaa().aaa(),\n"
2686 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
2687 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00002688 OnePerLine.ColumnLimit = 60;
2689 verifyFormat("Constructor()\n"
2690 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
2691 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
2692 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00002693
2694 EXPECT_EQ("Constructor()\n"
2695 " : // Comment forcing unwanted break.\n"
2696 " aaaa(aaaa) {}",
2697 format("Constructor() :\n"
2698 " // Comment forcing unwanted break.\n"
2699 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00002700}
2701
2702TEST_F(FormatTest, MemoizationTests) {
2703 // This breaks if the memoization lookup does not take \c Indent and
2704 // \c LastSpace into account.
2705 verifyFormat(
2706 "extern CFRunLoopTimerRef\n"
2707 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
2708 " CFTimeInterval interval, CFOptionFlags flags,\n"
2709 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002710 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00002711
2712 // Deep nesting somewhat works around our memoization.
2713 verifyFormat(
2714 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2715 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2716 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2717 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2718 " aaaaa())))))))))))))))))))))))))))))))))))))));",
2719 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00002720 verifyFormat(
2721 "aaaaa(\n"
2722 " aaaaa,\n"
2723 " aaaaa(\n"
2724 " aaaaa,\n"
2725 " aaaaa(\n"
2726 " aaaaa,\n"
2727 " aaaaa(\n"
2728 " aaaaa,\n"
2729 " aaaaa(\n"
2730 " aaaaa,\n"
2731 " aaaaa(\n"
2732 " aaaaa,\n"
2733 " aaaaa(\n"
2734 " aaaaa,\n"
2735 " aaaaa(\n"
2736 " aaaaa,\n"
2737 " aaaaa(\n"
2738 " aaaaa,\n"
2739 " aaaaa(\n"
2740 " aaaaa,\n"
2741 " aaaaa(\n"
2742 " aaaaa,\n"
2743 " aaaaa(\n"
2744 " aaaaa,\n"
2745 " aaaaa))))))))))));",
2746 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00002747 verifyFormat(
2748 "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"
2749 " a),\n"
2750 " a),\n"
2751 " a),\n"
2752 " a),\n"
2753 " a),\n"
2754 " a),\n"
2755 " a),\n"
2756 " a),\n"
2757 " a),\n"
2758 " a),\n"
2759 " a),\n"
2760 " a),\n"
2761 " a),\n"
2762 " a),\n"
2763 " a),\n"
2764 " a),\n"
2765 " a)",
2766 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00002767
2768 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00002769 FormatStyle OnePerLine = getLLVMStyle();
2770 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00002771 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00002772 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00002773 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00002774 for (unsigned i = 0, e = 80; i != e; ++i) {
2775 input += " a,\n";
2776 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002777 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00002778 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002779}
2780
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002781TEST_F(FormatTest, BreaksAsHighAsPossible) {
2782 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00002783 "void f() {\n"
2784 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
2785 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
2786 " f();\n"
2787 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00002788 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00002789 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002790}
2791
Daniel Jasper6728fc12013-04-11 14:29:13 +00002792TEST_F(FormatTest, BreaksFunctionDeclarations) {
2793 // Principially, we break function declarations in a certain order:
2794 // 1) break amongst arguments.
2795 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
2796 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00002797 verifyFormat("template <class TemplateIt>\n"
2798 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
2799 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00002800
2801 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00002802 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00002803 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002804 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00002805 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002806
2807 // 3) break after (.
2808 verifyFormat(
2809 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00002810 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
2811 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002812
2813 // 4) break before after nested name specifiers.
2814 verifyFormat(
2815 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002816 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
2817 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00002818 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002819
2820 // However, there are exceptions, if a sufficient amount of lines can be
2821 // saved.
2822 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
2823 // more adjusting.
2824 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
2825 " Cccccccccccccc cccccccccc,\n"
2826 " Cccccccccccccc cccccccccc,\n"
2827 " Cccccccccccccc cccccccccc,\n"
2828 " Cccccccccccccc cccccccccc);");
2829 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00002830 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002831 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2832 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2833 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00002834 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002835 verifyFormat(
2836 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
2837 " Cccccccccccccc cccccccccc,\n"
2838 " Cccccccccccccc cccccccccc,\n"
2839 " Cccccccccccccc cccccccccc,\n"
2840 " Cccccccccccccc cccccccccc,\n"
2841 " Cccccccccccccc cccccccccc,\n"
2842 " Cccccccccccccc cccccccccc);");
2843 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
2844 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2845 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2846 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2847 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00002848
2849 // Break after multi-line parameters.
2850 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2851 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2852 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2853 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00002854 verifyFormat("void SomeLoooooooooooongFunction(\n"
2855 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
2856 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2857 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00002858
2859 // Treat overloaded operators like other functions.
2860 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2861 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00002862 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2863 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00002864 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2865 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
2866 verifyGoogleFormat(
2867 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
2868 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00002869 verifyGoogleFormat(
2870 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
2871 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00002872 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2873 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
2874 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
2875 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00002876 verifyGoogleFormat(
2877 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
2878 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2879 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00002880 verifyGoogleFormat(
2881 "template <typename T>\n"
2882 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2883 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
2884 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00002885
2886 FormatStyle Style = getLLVMStyle();
2887 Style.PointerAlignment = FormatStyle::PAS_Left;
2888 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2889 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
2890 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00002891 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
2892 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
2893 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00002894}
2895
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00002896TEST_F(FormatTest, TrailingReturnType) {
2897 verifyFormat("auto foo() -> int;\n");
2898 verifyFormat("struct S {\n"
2899 " auto bar() const -> int;\n"
2900 "};");
2901 verifyFormat("template <size_t Order, typename T>\n"
2902 "auto load_img(const std::string &filename)\n"
2903 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00002904 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
2905 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00002906 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00002907 verifyFormat("template <typename T>\n"
2908 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
2909 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00002910
2911 // Not trailing return types.
2912 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00002913}
2914
Daniel Jasper5be31f72013-05-21 09:16:31 +00002915TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002916 // Avoid breaking before trailing 'const' or other trailing annotations, if
2917 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00002918 FormatStyle Style = getGoogleStyle();
2919 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00002920 verifyFormat("void someLongFunction(\n"
2921 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00002922 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00002923 verifyFormat("LoooooongReturnType\n"
2924 "someLoooooooongFunction() const {}",
2925 getLLVMStyleWithColumns(47));
2926 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
2927 " const {}",
2928 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002929 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2930 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
2931 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2932 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
2933 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2934 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00002935 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
2936 " aaaaaaaaaaa aaaaa) const override;");
2937 verifyGoogleFormat(
2938 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
2939 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00002940
Daniel Jasper5550de62014-02-17 07:57:46 +00002941 // Even if the first parameter has to be wrapped.
2942 verifyFormat("void someLongFunction(\n"
2943 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002944 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00002945 verifyFormat("void someLongFunction(\n"
2946 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002947 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00002948 verifyFormat("void someLongFunction(\n"
2949 " int someLongParameter) override {}",
2950 Style);
2951 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00002952 " int someLongParameter) OVERRIDE {}",
2953 Style);
2954 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00002955 " int someLongParameter) final {}",
2956 Style);
2957 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00002958 " int someLongParameter) FINAL {}",
2959 Style);
2960 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00002961 " int parameter) const override {}",
2962 Style);
2963
Daniel Jaspere3f907f2014-06-02 09:52:08 +00002964 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2965 verifyFormat("void someLongFunction(\n"
2966 " int someLongParameter) const\n"
2967 "{\n"
2968 "}",
2969 Style);
2970
Daniel Jasper5550de62014-02-17 07:57:46 +00002971 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002972 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
2973 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2974 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00002975
2976 // Breaking before function-like trailing annotations is fine to keep them
2977 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00002978 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2979 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
2980 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
2981 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
2982 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
2983 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00002984 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
2985 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00002986 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00002987
2988 verifyFormat(
2989 "void aaaaaaaaaaaaaaaaaa()\n"
2990 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
2991 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
2992 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2993 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00002994 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00002995 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00002996 " GUARDED_BY(aaaaaaaaaaaa);");
2997 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00002998 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00002999 " GUARDED_BY(aaaaaaaaaaaa);");
3000 verifyGoogleFormat(
3001 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3002 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00003003 verifyGoogleFormat(
3004 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3005 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003006}
3007
Daniel Jasperf090f032015-05-18 09:47:22 +00003008TEST_F(FormatTest, FunctionAnnotations) {
3009 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00003010 "int OldFunction(const string &parameter) {}");
3011 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00003012 "string OldFunction(const string &parameter) {}");
3013 verifyFormat("template <typename T>\n"
3014 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
3015 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00003016
3017 // Not function annotations.
3018 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3019 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00003020 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
3021 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00003022 verifyFormat("MACRO(abc).function() // wrap\n"
3023 " << abc;");
3024 verifyFormat("MACRO(abc)->function() // wrap\n"
3025 " << abc;");
3026 verifyFormat("MACRO(abc)::function() // wrap\n"
3027 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00003028}
3029
Daniel Jasperf7935112012-12-03 18:12:45 +00003030TEST_F(FormatTest, BreaksDesireably) {
3031 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
3032 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003033 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00003034 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3035 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
3036 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003037
3038 verifyFormat(
3039 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003040 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003041
3042 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3043 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3044 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00003045
3046 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003047 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3048 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3049 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00003050 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3051 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003052
3053 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3054 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3055
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003056 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003057 "void f() {\n"
3058 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
3059 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3060 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00003061 verifyFormat(
3062 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3063 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3064 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003065 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3066 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3067 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003068 "aaaaaa(aaa,\n"
3069 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003070 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3071 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003072 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3073 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3074 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003075
Daniel Jasper739b85f2015-06-29 10:42:59 +00003076 // Indent consistently independent of call expression and unary operator.
3077 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3078 " dddddddddddddddddddddddddddddd));");
3079 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3080 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003081 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003082 " dddddddddddddddddddddddddddddd));");
3083
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003084 // This test case breaks on an incorrect memoization, i.e. an optimization not
3085 // taking into account the StopAt value.
3086 verifyFormat(
3087 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003088 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3089 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3090 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00003091
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003092 verifyFormat("{\n {\n {\n"
3093 " Annotation.SpaceRequiredBefore =\n"
3094 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
3095 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
3096 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00003097
3098 // Break on an outer level if there was a break on an inner level.
3099 EXPECT_EQ("f(g(h(a, // comment\n"
3100 " b, c),\n"
3101 " d, e),\n"
3102 " x, y);",
3103 format("f(g(h(a, // comment\n"
3104 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00003105
3106 // Prefer breaking similar line breaks.
3107 verifyFormat(
3108 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
3109 " NSTrackingMouseEnteredAndExited |\n"
3110 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00003111}
3112
Daniel Jasper18210d72014-10-09 09:52:05 +00003113TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
3114 FormatStyle NoBinPacking = getGoogleStyle();
3115 NoBinPacking.BinPackParameters = false;
3116 NoBinPacking.BinPackArguments = true;
3117 verifyFormat("void f() {\n"
3118 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
3119 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3120 "}",
3121 NoBinPacking);
3122 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
3123 " int aaaaaaaaaaaaaaaaaaaa,\n"
3124 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3125 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003126
Daniel Jasper00693b082016-01-09 15:56:47 +00003127 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
3128 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3129 " vector<int> bbbbbbbbbbbbbbb);",
3130 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003131 // FIXME: This behavior difference is probably not wanted. However, currently
3132 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
3133 // template arguments from BreakBeforeParameter being set because of the
3134 // one-per-line formatting.
3135 verifyFormat(
3136 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3137 " aaaaaaaaaa> aaaaaaaaaa);",
3138 NoBinPacking);
3139 verifyFormat(
3140 "void fffffffffff(\n"
3141 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
3142 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00003143}
3144
Daniel Jasper9278eb92013-01-16 14:59:02 +00003145TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00003146 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003147 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00003148 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003149 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
3150 " aaaaaaaaaaaaaaaaaaaa,\n"
3151 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
3152 NoBinPacking);
3153 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
3154 " aaaaaaaaaaaaa,\n"
3155 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
3156 NoBinPacking);
3157 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003158 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3159 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3160 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
3161 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003162 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
3163 NoBinPacking);
3164 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3165 " .aaaaaaaaaaaaaaaaaa();",
3166 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003167 verifyFormat("void f() {\n"
3168 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3169 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
3170 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003171 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003172
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003173 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00003174 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3175 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003176 " aaaaaaaaaaaa);",
3177 NoBinPacking);
3178 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003179 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
3180 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003181 " test);",
3182 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003183
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003184 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3185 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00003186 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
3187 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003188 NoBinPacking);
3189 verifyFormat("a(\"a\"\n"
3190 " \"a\",\n"
3191 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00003192
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003193 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00003194 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00003195 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00003196 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003197 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00003198 verifyFormat(
3199 "void f() {\n"
3200 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3201 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003202 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003203 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00003204 verifyFormat(
3205 "template <class SomeType, class SomeOtherType>\n"
3206 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
3207 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003208}
3209
Daniel Jasperb10cbc42013-07-10 14:02:49 +00003210TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
3211 FormatStyle Style = getLLVMStyleWithColumns(15);
3212 Style.ExperimentalAutoDetectBinPacking = true;
3213 EXPECT_EQ("aaa(aaaa,\n"
3214 " aaaa,\n"
3215 " aaaa);\n"
3216 "aaa(aaaa,\n"
3217 " aaaa,\n"
3218 " aaaa);",
3219 format("aaa(aaaa,\n" // one-per-line
3220 " aaaa,\n"
3221 " aaaa );\n"
3222 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3223 Style));
3224 EXPECT_EQ("aaa(aaaa, aaaa,\n"
3225 " aaaa);\n"
3226 "aaa(aaaa, aaaa,\n"
3227 " aaaa);",
3228 format("aaa(aaaa, aaaa,\n" // bin-packed
3229 " aaaa );\n"
3230 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3231 Style));
3232}
3233
Daniel Jasper04468962013-01-18 10:56:38 +00003234TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00003235 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
3236 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
3237 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
3238 " .StartsWith(\".init\", ORDER_INIT)\n"
3239 " .StartsWith(\".fini\", ORDER_FINI)\n"
3240 " .StartsWith(\".hash\", ORDER_HASH)\n"
3241 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00003242
Daniel Jaspereb50c672013-02-15 20:33:06 +00003243 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003244 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00003245 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00003246 "aaaaaaa->aaaaaaa\n"
3247 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3248 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00003249 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00003250 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00003251 "aaaaaaa->aaaaaaa\n"
3252 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3253 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
3254 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00003255 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00003256 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00003257 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003258 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
3259 " aaaaaa->aaaaaaaaaaaa()\n"
3260 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00003261 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003262 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00003263 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003264 "void f() {\n"
3265 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003266 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003267 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003268 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003269 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003270 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003271 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003272 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003273 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003274 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003275 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003276 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00003277
3278 verifyFormat(
3279 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
3280 verifyFormat("aaaaaaaaaaaaaaa()\n"
3281 " .aaaaaaaaaaaaaaa()\n"
3282 " .aaaaaaaaaaaaaaa()\n"
3283 " .aaaaaaaaaaaaaaa()\n"
3284 " .aaaaaaaaaaaaaaa();");
3285 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3286 " .aaaaaaaaaaaaaaa()\n"
3287 " .aaaaaaaaaaaaaaa()\n"
3288 " .aaaaaaaaaaaaaaa();");
3289 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3290 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3291 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00003292 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
3293 " ->aaaaaaaaaaaaaae(0)\n"
3294 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00003295
Daniel Jasper775954b2015-04-24 10:08:09 +00003296 // Don't linewrap after very short segments.
3297 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3298 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3299 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3300 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3301 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3302 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3303 verifyFormat("aaa()\n"
3304 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3305 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3306 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3307
Daniel Jaspercc3114d2013-10-18 15:23:06 +00003308 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3309 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3310 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
3311 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3312 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003313 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00003314
Daniel Jaspera41aa532014-09-19 08:01:25 +00003315 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00003316 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
3317 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00003318
3319 // Prefer not to create "hanging" indents.
3320 verifyFormat(
3321 "return !soooooooooooooome_map\n"
3322 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3323 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00003324 verifyFormat(
3325 "return aaaaaaaaaaaaaaaa\n"
3326 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
3327 " .aaaa(aaaaaaaaaaaaaa);");
3328 // No hanging indent here.
3329 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
3330 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3331 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
3332 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00003333 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3334 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3335 getLLVMStyleWithColumns(60));
3336 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
3337 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3338 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3339 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00003340 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3341 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3342 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00003343}
3344
Daniel Jasperde5c2072012-12-24 00:13:23 +00003345TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
3346 verifyFormat(
3347 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003348 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003349 verifyFormat(
3350 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
3351 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
3352
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003353 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003354 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003355 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
3356 " ccccccccccccccccccccccccc) {\n}");
3357
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003358 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003359 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003360 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
3361 " ccccccccccccccccccccccccc) {\n}");
3362
Daniel Jasperde5c2072012-12-24 00:13:23 +00003363 verifyFormat(
3364 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003365 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003366 verifyFormat(
3367 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
3368 " ccccccccccccccccccccccccc) {\n}");
3369
Daniel Jasper400adc62013-02-08 15:28:42 +00003370 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
3371 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
3372 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
3373 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003374 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
3375 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
3376 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
3377 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
3378
Daniel Jasper400adc62013-02-08 15:28:42 +00003379 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
3380 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
3381 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003382 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
3383 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
3384 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00003385}
3386
Daniel Jasper43b65482013-01-23 12:27:43 +00003387TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00003388 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00003389 "unsigned Cost =\n"
3390 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
3391 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00003392 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00003393 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
3394 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00003395
3396 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003397 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
3398 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00003399 verifyFormat("unsigned OriginalStartColumn =\n"
3400 " SourceMgr.getSpellingColumnNumber(\n"
3401 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
3402 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00003403}
3404
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003405TEST_F(FormatTest, AlignsAfterAssignments) {
3406 verifyFormat(
3407 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003408 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003409 verifyFormat(
3410 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003411 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003412 verifyFormat(
3413 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003414 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003415 verifyFormat(
3416 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003417 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00003418 verifyFormat(
3419 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3420 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3421 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003422}
3423
3424TEST_F(FormatTest, AlignsAfterReturn) {
3425 verifyFormat(
3426 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3427 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
3428 verifyFormat(
3429 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3430 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00003431 verifyFormat(
3432 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003433 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00003434 verifyFormat(
3435 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003436 " aaaaaaaaaaaaaaaaaaaaaa());");
3437 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3438 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3439 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3440 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
3441 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00003442 verifyFormat("return\n"
3443 " // true if code is one of a or b.\n"
3444 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003445}
3446
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003447TEST_F(FormatTest, AlignsAfterOpenBracket) {
3448 verifyFormat(
3449 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
3450 " aaaaaaaaa aaaaaaa) {}");
3451 verifyFormat(
3452 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
3453 " aaaaaaaaaaa aaaaaaaaa);");
3454 verifyFormat(
3455 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
3456 " aaaaaaaaaaaaaaaaaaaaa));");
3457 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003458 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00003459 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3460 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
3461 Style);
3462 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
3463 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
3464 Style);
3465 verifyFormat("SomeLongVariableName->someFunction(\n"
3466 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
3467 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003468 verifyFormat(
3469 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
3470 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3471 Style);
3472 verifyFormat(
3473 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
3474 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3475 Style);
3476 verifyFormat(
3477 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
3478 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
3479 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003480
Daniel Jasper2a9f7202016-02-08 09:52:54 +00003481 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
3482 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
3483 " b));",
3484 Style);
3485
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003486 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
3487 Style.BinPackArguments = false;
3488 Style.BinPackParameters = false;
3489 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3490 " aaaaaaaaaaa aaaaaaaa,\n"
3491 " aaaaaaaaa aaaaaaa,\n"
3492 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3493 Style);
3494 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
3495 " aaaaaaaaaaa aaaaaaaaa,\n"
3496 " aaaaaaaaaaa aaaaaaaaa,\n"
3497 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3498 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00003499 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
3500 " aaaaaaaaaaaaaaa,\n"
3501 " aaaaaaaaaaaaaaaaaaaaa,\n"
3502 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003503 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00003504 verifyFormat(
3505 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
3506 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
3507 Style);
3508 verifyFormat(
3509 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
3510 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
3511 Style);
3512 verifyFormat(
3513 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3514 " aaaaaaaaaaaaaaaaaaaaa(\n"
3515 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
3516 " aaaaaaaaaaaaaaaa);",
3517 Style);
3518 verifyFormat(
3519 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3520 " aaaaaaaaaaaaaaaaaaaaa(\n"
3521 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
3522 " aaaaaaaaaaaaaaaa);",
3523 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003524}
3525
Daniel Jasper3219e432014-12-02 13:24:51 +00003526TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
3527 FormatStyle Style = getLLVMStyleWithColumns(40);
3528 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3529 " bbbbbbbbbbbbbbbbbbbbbb);",
3530 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003531 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00003532 Style.AlignOperands = false;
3533 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3534 " bbbbbbbbbbbbbbbbbbbbbb);",
3535 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003536 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00003537 Style.AlignOperands = true;
3538 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3539 " bbbbbbbbbbbbbbbbbbbbbb);",
3540 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003541 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00003542 Style.AlignOperands = false;
3543 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3544 " bbbbbbbbbbbbbbbbbbbbbb);",
3545 Style);
3546}
3547
Daniel Jasper399d24b2013-01-09 07:06:56 +00003548TEST_F(FormatTest, BreaksConditionalExpressions) {
3549 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003550 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3551 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3552 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3553 verifyFormat(
3554 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003555 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3556 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00003557 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003558 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3559 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3560 verifyFormat(
3561 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003562 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3563 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00003564 verifyFormat(
3565 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
3566 " : aaaaaaaaaaaaa);");
3567 verifyFormat(
3568 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00003569 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00003570 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3571 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003572 verifyFormat(
3573 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3574 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3575 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00003576 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3577 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3578 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3579 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3580 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3581 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3582 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3583 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3584 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3585 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3586 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3587 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003588 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3589 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3590 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3591 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3592 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00003593 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3594 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3595 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00003596 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
3597 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3598 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3599 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00003600 verifyFormat(
3601 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3602 " ? aaaaaaaaaaaaaaa\n"
3603 " : aaaaaaaaaaaaaaa;");
3604 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003605 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00003606 " ? b\n"
3607 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00003608 verifyFormat("return aaaa == bbbb\n"
3609 " // comment\n"
3610 " ? aaaa\n"
3611 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003612 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003613 " format(TheLine.First,\n"
3614 " IndentForLevel[TheLine.Level] >= 0\n"
3615 " ? IndentForLevel[TheLine.Level]\n"
3616 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003617 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00003618 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00003619 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
3620 " ? aaaaaaaaaaaaaaa\n"
3621 " : bbbbbbbbbbbbbbb //\n"
3622 " ? ccccccccccccccc\n"
3623 " : ddddddddddddddd;");
3624 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
3625 " ? aaaaaaaaaaaaaaa\n"
3626 " : (bbbbbbbbbbbbbbb //\n"
3627 " ? ccccccccccccccc\n"
3628 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003629 verifyFormat(
3630 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3631 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3632 " aaaaaaaaaaaaaaaaaaaaa +\n"
3633 " aaaaaaaaaaaaaaaaaaaaa\n"
3634 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00003635 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003636 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3637 " : aaaaaaaaaaaaaaaaaaaaaa\n"
3638 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00003639
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003640 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00003641 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003642 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00003643 "void f() {\n"
3644 " g(aaa,\n"
3645 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
3646 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3647 " ? aaaaaaaaaaaaaaa\n"
3648 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003649 "}",
3650 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003651 verifyFormat(
3652 "void f() {\n"
3653 " g(aaa,\n"
3654 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
3655 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3656 " ?: aaaaaaaaaaaaaaa);\n"
3657 "}",
3658 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00003659
3660 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
3661 " // comment.\n"
3662 " ccccccccccccccccccccccccccccccccccccccc\n"
3663 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3664 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00003665
3666 // Assignments in conditional expressions. Apparently not uncommon :-(.
3667 verifyFormat("return a != b\n"
3668 " // comment\n"
3669 " ? a = b\n"
3670 " : a = b;");
3671 verifyFormat("return a != b\n"
3672 " // comment\n"
3673 " ? a = a != b\n"
3674 " // comment\n"
3675 " ? a = b\n"
3676 " : a\n"
3677 " : a;\n");
3678 verifyFormat("return a != b\n"
3679 " // comment\n"
3680 " ? a\n"
3681 " : a = a != b\n"
3682 " // comment\n"
3683 " ? a = b\n"
3684 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00003685}
3686
Daniel Jasper165b29e2013-11-08 00:57:11 +00003687TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
3688 FormatStyle Style = getLLVMStyle();
3689 Style.BreakBeforeTernaryOperators = false;
3690 Style.ColumnLimit = 70;
3691 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003692 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3693 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3694 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3695 Style);
3696 verifyFormat(
3697 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003698 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3699 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00003700 Style);
3701 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003702 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3703 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3704 Style);
3705 verifyFormat(
3706 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003707 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3708 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00003709 Style);
3710 verifyFormat(
3711 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
3712 " aaaaaaaaaaaaa);",
3713 Style);
3714 verifyFormat(
3715 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3716 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3717 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3718 " aaaaaaaaaaaaa);",
3719 Style);
3720 verifyFormat(
3721 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3722 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3723 " aaaaaaaaaaaaa);",
3724 Style);
3725 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3726 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3727 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3728 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3729 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3730 Style);
3731 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3732 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3733 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3734 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3735 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3736 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3737 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3738 Style);
3739 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3740 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
3741 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3742 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3743 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3744 Style);
3745 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3746 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3747 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3748 Style);
3749 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00003750 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00003751 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3752 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3753 Style);
3754 verifyFormat(
3755 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3756 " aaaaaaaaaaaaaaa :\n"
3757 " aaaaaaaaaaaaaaa;",
3758 Style);
3759 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
3760 " aaaaaaaaa ?\n"
3761 " b :\n"
3762 " c);",
3763 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00003764 verifyFormat("unsigned Indent =\n"
3765 " format(TheLine.First,\n"
3766 " IndentForLevel[TheLine.Level] >= 0 ?\n"
3767 " IndentForLevel[TheLine.Level] :\n"
3768 " TheLine * 2,\n"
3769 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
3770 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00003771 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
3772 " aaaaaaaaaaaaaaa :\n"
3773 " bbbbbbbbbbbbbbb ? //\n"
3774 " ccccccccccccccc :\n"
3775 " ddddddddddddddd;",
3776 Style);
3777 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
3778 " aaaaaaaaaaaaaaa :\n"
3779 " (bbbbbbbbbbbbbbb ? //\n"
3780 " ccccccccccccccc :\n"
3781 " ddddddddddddddd);",
3782 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00003783 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3784 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
3785 " ccccccccccccccccccccccccccc;",
3786 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00003787 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3788 " aaaaa :\n"
3789 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
3790 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00003791}
3792
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003793TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
3794 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
3795 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
3796 verifyFormat("bool a = true, b = false;");
3797
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003798 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00003799 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003800 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00003801 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003802 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00003803 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00003804 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003805 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00003806 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
3807 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
3808 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
3809 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
3810 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
3811 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003812
Daniel Jasperbea1ab42015-03-01 18:55:26 +00003813 FormatStyle Style = getGoogleStyle();
3814 Style.PointerAlignment = FormatStyle::PAS_Left;
3815 Style.DerivePointerAlignment = false;
3816 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3817 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
3818 " *b = bbbbbbbbbbbbbbbbbbb;",
3819 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003820 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
3821 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
3822 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00003823 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00003824 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003825}
3826
Nico Weber4a5030c2013-01-12 01:28:06 +00003827TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
3828 verifyFormat("arr[foo ? bar : baz];");
3829 verifyFormat("f()[foo ? bar : baz];");
3830 verifyFormat("(a + b)[foo ? bar : baz];");
3831 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
3832}
3833
Daniel Jasperf7935112012-12-03 18:12:45 +00003834TEST_F(FormatTest, AlignsStringLiterals) {
3835 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
3836 " \"short literal\");");
3837 verifyFormat(
3838 "looooooooooooooooooooooooongFunction(\n"
3839 " \"short literal\"\n"
3840 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003841 verifyFormat("someFunction(\"Always break between multi-line\"\n"
3842 " \" string literals\",\n"
3843 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003844 EXPECT_EQ("fun + \"1243\" /* comment */\n"
3845 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00003846 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003847 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00003848 getLLVMStyleWithColumns(28)));
3849 EXPECT_EQ(
3850 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
3851 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
3852 " \"aaaaaaaaaaaaaaaa\";",
3853 format("aaaaaa ="
3854 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
3855 "aaaaaaaaaaaaaaaaaaaaa\" "
3856 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003857 verifyFormat("a = a + \"a\"\n"
3858 " \"a\"\n"
3859 " \"a\";");
3860 verifyFormat("f(\"a\", \"b\"\n"
3861 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00003862
3863 verifyFormat(
3864 "#define LL_FORMAT \"ll\"\n"
3865 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
3866 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00003867
3868 verifyFormat("#define A(X) \\\n"
3869 " \"aaaaa\" #X \"bbbbbb\" \\\n"
3870 " \"ccccc\"",
3871 getLLVMStyleWithColumns(23));
3872 verifyFormat("#define A \"def\"\n"
3873 "f(\"abc\" A \"ghi\"\n"
3874 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00003875
3876 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00003877 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00003878 verifyFormat("#define A(X) \\\n"
3879 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
3880 " L\"ccccc\"",
3881 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00003882
3883 verifyFormat("f(@\"a\"\n"
3884 " @\"b\");");
3885 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00003886 " @\"b\"\n"
3887 " @\"c\";");
3888 verifyFormat("NSString s = @\"a\"\n"
3889 " \"b\"\n"
3890 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00003891}
3892
Zachary Turner448592e2015-12-18 22:20:15 +00003893TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003894 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00003895 // No declarations or definitions should be moved to own line.
3896 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
3897 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003898 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003899 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003900 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003901 "int f() { return 1; }\n"
3902 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003903 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00003904
3905 // All declarations and definitions should have the return type moved to its
3906 // own
3907 // line.
3908 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
3909 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003910 " int\n"
3911 " f() {\n"
3912 " return 1;\n"
3913 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003914 " int\n"
3915 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003916 "};\n"
3917 "int\n"
3918 "f() {\n"
3919 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003920 "}\n"
3921 "int\n"
3922 "g();\n",
3923 Style);
3924
3925 // Top-level definitions, and no kinds of declarations should have the
3926 // return type moved to its own line.
3927 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
3928 verifyFormat("class B {\n"
3929 " int f() { return 1; }\n"
3930 " int g();\n"
3931 "};\n"
3932 "int\n"
3933 "f() {\n"
3934 " return 1;\n"
3935 "}\n"
3936 "int g();\n",
3937 Style);
3938
3939 // Top-level definitions and declarations should have the return type moved
3940 // to its own line.
3941 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
3942 verifyFormat("class C {\n"
3943 " int f() { return 1; }\n"
3944 " int g();\n"
3945 "};\n"
3946 "int\n"
3947 "f() {\n"
3948 " return 1;\n"
3949 "}\n"
3950 "int\n"
3951 "g();\n",
3952 Style);
3953
3954 // All definitions should have the return type moved to its own line, but no
3955 // kinds of declarations.
3956 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
3957 verifyFormat("class D {\n"
3958 " int\n"
3959 " f() {\n"
3960 " return 1;\n"
3961 " }\n"
3962 " int g();\n"
3963 "};\n"
3964 "int\n"
3965 "f() {\n"
3966 " return 1;\n"
3967 "}\n"
3968 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003969 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00003970 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003971 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00003972 " return \"\";\n"
3973 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003974 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003975 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00003976 verifyFormat("template <class T>\n"
3977 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003978 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00003979 " return NULL;\n"
3980 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003981 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003982 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00003983 verifyFormat("class C {\n"
3984 " int\n"
3985 " operator+() {\n"
3986 " return 1;\n"
3987 " }\n"
3988 " int\n"
3989 " operator()() {\n"
3990 " return 1;\n"
3991 " }\n"
3992 "};\n",
3993 Style);
3994 verifyFormat("void\n"
3995 "A::operator()() {}\n"
3996 "void\n"
3997 "A::operator>>() {}\n"
3998 "void\n"
3999 "A::operator+() {}\n",
4000 Style);
4001 verifyFormat("void *operator new(std::size_t s);", // No break here.
4002 Style);
4003 verifyFormat("void *\n"
4004 "operator new(std::size_t s) {}",
4005 Style);
4006 verifyFormat("void *\n"
4007 "operator delete[](void *ptr) {}",
4008 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004009 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00004010 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004011 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004012 "{\n"
4013 " return \"\";\n"
4014 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004015 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004016 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004017 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004018 "T *\n" // Problem here: no line break
4019 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004020 "{\n"
4021 " return NULL;\n"
4022 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004023 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004024 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004025}
4026
Alexander Kornienko58611712013-07-04 12:02:44 +00004027TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
4028 FormatStyle NoBreak = getLLVMStyle();
4029 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
4030 FormatStyle Break = getLLVMStyle();
4031 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00004032 verifyFormat("aaaa = \"bbbb\"\n"
4033 " \"cccc\";",
4034 NoBreak);
4035 verifyFormat("aaaa =\n"
4036 " \"bbbb\"\n"
4037 " \"cccc\";",
4038 Break);
4039 verifyFormat("aaaa(\"bbbb\"\n"
4040 " \"cccc\");",
4041 NoBreak);
4042 verifyFormat("aaaa(\n"
4043 " \"bbbb\"\n"
4044 " \"cccc\");",
4045 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004046 verifyFormat("aaaa(qqq, \"bbbb\"\n"
4047 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004048 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004049 verifyFormat("aaaa(qqq,\n"
4050 " \"bbbb\"\n"
4051 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004052 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004053 verifyFormat("aaaa(qqq,\n"
4054 " L\"bbbb\"\n"
4055 " L\"cccc\");",
4056 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004057 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
4058 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00004059 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00004060 verifyFormat("string s = someFunction(\n"
4061 " \"abc\"\n"
4062 " \"abc\");",
4063 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00004064
Daniel Jasper3251fff2014-06-10 06:27:23 +00004065 // As we break before unary operators, breaking right after them is bad.
4066 verifyFormat("string foo = abc ? \"x\"\n"
4067 " \"blah blah blah blah blah blah\"\n"
4068 " : \"y\";",
4069 Break);
4070
Daniel Jasperc834c702013-07-17 15:38:19 +00004071 // Don't break if there is no column gain.
4072 verifyFormat("f(\"aaaa\"\n"
4073 " \"bbbb\");",
4074 Break);
4075
4076 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004077 EXPECT_EQ("x = \"a\\\n"
4078 "b\\\n"
4079 "c\";",
4080 format("x = \"a\\\n"
4081 "b\\\n"
4082 "c\";",
4083 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004084 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004085 " \"a\\\n"
4086 "b\\\n"
4087 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004088 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004089 "b\\\n"
4090 "c\";",
4091 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00004092
4093 // Exempt ObjC strings for now.
4094 EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004095 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004096 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004097 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004098 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00004099
4100 Break.ColumnLimit = 0;
4101 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00004102}
4103
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004104TEST_F(FormatTest, AlignsPipes) {
4105 verifyFormat(
4106 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4107 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4108 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4109 verifyFormat(
4110 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
4111 " << aaaaaaaaaaaaaaaaaaaa;");
4112 verifyFormat(
4113 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4114 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4115 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00004116 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4117 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4118 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004119 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
4120 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
4121 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
4122 verifyFormat(
4123 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4124 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4125 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004126 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4127 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4128 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4129 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00004130 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
4131 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00004132 verifyFormat(
4133 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4134 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04bbda92017-03-16 07:54:11 +00004135 verifyFormat(
4136 "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
4137 " aaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00004138
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004139 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
4140 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00004141 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4142 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4143 " aaaaaaaaaaaaaaaaaaaaa)\n"
4144 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00004145 verifyFormat("LOG_IF(aaa == //\n"
4146 " bbb)\n"
4147 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004148
Daniel Jasper467ddb12013-08-12 12:58:05 +00004149 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00004150 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4151 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004152 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
4153 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4154 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00004155 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
4156 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00004157 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4158 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4159 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4160 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4161 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4162 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4163 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004164
Daniel Jasperc238c872013-04-02 14:33:13 +00004165 verifyFormat(
4166 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4167 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00004168
4169 // Incomplete string literal.
4170 EXPECT_EQ("llvm::errs() << \"\n"
4171 " << a;",
4172 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00004173
4174 verifyFormat("void f() {\n"
4175 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
4176 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
4177 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00004178
4179 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00004180 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
4181 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
4182 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00004183
4184 // Handle '\n'.
4185 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
4186 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
4187 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
4188 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
4189 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
4190 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
4191 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004192}
4193
Daniel Jasper7209bb92016-12-13 11:16:42 +00004194TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
4195 verifyFormat("return out << \"somepacket = {\\n\"\n"
4196 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
4197 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
4198 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
4199 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
4200 " << \"}\";");
4201
4202 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4203 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4204 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
4205 verifyFormat(
4206 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
4207 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
4208 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
4209 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
4210 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
4211 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
4212 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
4213 verifyFormat(
4214 "void f() {\n"
4215 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
4216 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4217 "}");
4218
4219 // Breaking before the first "<<" is generally not desirable.
4220 verifyFormat(
4221 "llvm::errs()\n"
4222 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4223 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4224 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4225 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4226 getLLVMStyleWithColumns(70));
4227 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4228 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4229 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4230 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4231 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4232 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4233 getLLVMStyleWithColumns(70));
4234
4235 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4236 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4237 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
4238 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4239 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4240 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00004241 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
4242 " (aaaa + aaaa);",
4243 getLLVMStyleWithColumns(40));
4244 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
4245 " (aaaaaaa + aaaaa));",
4246 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00004247 verifyFormat(
4248 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
4249 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
4250 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00004251}
4252
Daniel Jasperf7935112012-12-03 18:12:45 +00004253TEST_F(FormatTest, UnderstandsEquals) {
4254 verifyFormat(
4255 "aaaaaaaaaaaaaaaaa =\n"
4256 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4257 verifyFormat(
4258 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004259 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004260 verifyFormat(
4261 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004262 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00004263 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004264 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
4265 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004266
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004267 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4268 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004269}
4270
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004271TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004272 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4273 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004274
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004275 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4276 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004277
4278 verifyFormat(
4279 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
4280 " Parameter2);");
4281
4282 verifyFormat(
4283 "ShortObject->shortFunction(\n"
4284 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
4285 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
4286
4287 verifyFormat("loooooooooooooongFunction(\n"
4288 " LoooooooooooooongObject->looooooooooooooooongFunction());");
4289
4290 verifyFormat(
4291 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
4292 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
4293
Daniel Jasper687af3b2013-02-14 14:26:07 +00004294 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4295 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00004296 verifyFormat("void f() {\n"
4297 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4298 " .Times(2)\n"
4299 " .WillRepeatedly(Return(SomeValue));\n"
4300 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00004301 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
4302 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00004303 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00004304 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4305 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00004306 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004307 verifyFormat("void f() {\n"
4308 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4309 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
4310 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00004311 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4312 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4313 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4314 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4315 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00004316 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4317 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4318 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4319 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
4320 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00004321
Daniel Jasperc7345cc2013-01-07 07:13:20 +00004322 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004323 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004324 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00004325 verifyFormat(
4326 "aaaaaaaaaaa->aaaaaaaaa(\n"
4327 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4328 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00004329
4330 verifyFormat(
4331 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4332 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00004333 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
4334 " aaaaaaaaa()->aaaaaa()->aaaaa());");
4335 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
4336 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004337
Daniel Jasper9b334242013-03-15 14:57:30 +00004338 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00004339 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4340 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00004341
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004342 FormatStyle NoBinPacking = getLLVMStyle();
4343 NoBinPacking.BinPackParameters = false;
4344 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4345 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4346 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
4347 " aaaaaaaaaaaaaaaaaaa,\n"
4348 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4349 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00004350
4351 // If there is a subsequent call, change to hanging indentation.
4352 verifyFormat(
4353 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4354 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
4355 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4356 verifyFormat(
4357 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4358 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00004359 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4360 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4361 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4362 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4363 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4364 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004365}
4366
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004367TEST_F(FormatTest, WrapsTemplateDeclarations) {
4368 verifyFormat("template <typename T>\n"
4369 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00004370 verifyFormat("template <typename T>\n"
4371 "// T should be one of {A, B}.\n"
4372 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004373 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00004374 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00004375 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004376 verifyFormat("template <typename T>\n"
4377 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
4378 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004379 verifyFormat(
4380 "template <typename T>\n"
4381 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
4382 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00004383 verifyFormat(
4384 "template <typename T>\n"
4385 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
4386 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
4387 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00004388 verifyFormat("template <typename T>\n"
4389 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004390 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00004391 verifyFormat(
4392 "template <typename T1, typename T2 = char, typename T3 = char,\n"
4393 " typename T4 = char>\n"
4394 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00004395 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
4396 " template <typename> class cccccccccccccccccccccc,\n"
4397 " typename ddddddddddddd>\n"
4398 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004399 verifyFormat(
4400 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
4401 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00004402
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004403 verifyFormat("void f() {\n"
4404 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
4405 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
4406 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00004407
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00004408 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00004409 verifyFormat("template <typename T> void f();");
4410 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00004411 verifyFormat(
4412 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4413 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4414 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
4415 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4416 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4417 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
4418 " bbbbbbbbbbbbbbbbbbbbbbbb);",
4419 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00004420 EXPECT_EQ("static_cast<A< //\n"
4421 " B> *>(\n"
4422 "\n"
4423 " );",
4424 format("static_cast<A<//\n"
4425 " B>*>(\n"
4426 "\n"
4427 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00004428 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4429 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00004430
4431 FormatStyle AlwaysBreak = getLLVMStyle();
4432 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
4433 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
4434 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
4435 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
4436 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4437 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
4438 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
4439 verifyFormat("template <template <typename> class Fooooooo,\n"
4440 " template <typename> class Baaaaaaar>\n"
4441 "struct C {};",
4442 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00004443 verifyFormat("template <typename T> // T can be A, B or C.\n"
4444 "struct C {};",
4445 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00004446 verifyFormat("template <enum E> class A {\n"
4447 "public:\n"
4448 " E *f();\n"
4449 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004450}
4451
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00004452TEST_F(FormatTest, WrapsTemplateParameters) {
4453 FormatStyle Style = getLLVMStyle();
4454 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4455 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4456 verifyFormat(
4457 "template <typename... a> struct q {};\n"
4458 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
4459 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
4460 " y;",
4461 Style);
4462 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4463 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4464 verifyFormat(
4465 "template <typename... a> struct r {};\n"
4466 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
4467 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
4468 " y;",
4469 Style);
4470 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4471 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4472 verifyFormat(
4473 "template <typename... a> struct s {};\n"
4474 "extern s<\n"
4475 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4476 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
4477 " y;",
4478 Style);
4479 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4480 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4481 verifyFormat(
4482 "template <typename... a> struct t {};\n"
4483 "extern t<\n"
4484 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4485 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
4486 " y;",
4487 Style);
4488}
4489
Daniel Jasper45797022013-01-25 10:57:27 +00004490TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
4491 verifyFormat(
4492 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4493 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4494 verifyFormat(
4495 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4496 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4497 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
4498
Daniel Jasper0f0234e2013-05-08 10:00:18 +00004499 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00004500 verifyFormat(
4501 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4502 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00004503 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00004504
Daniel Jasper45797022013-01-25 10:57:27 +00004505 verifyFormat(
4506 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00004507 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00004508
4509 // Breaking at nested name specifiers is generally not desirable.
4510 verifyFormat(
4511 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4512 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004513
4514 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004515 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
4516 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4517 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004518 " aaaaaaaaaaaaaaaaaaaaa);",
4519 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00004520
4521 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4522 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4523 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00004524}
4525
Daniel Jasperf7935112012-12-03 18:12:45 +00004526TEST_F(FormatTest, UnderstandsTemplateParameters) {
4527 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00004528 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004529 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
4530 verifyFormat("bool x = a < 1 || 2 > a;");
4531 verifyFormat("bool x = 5 < f<int>();");
4532 verifyFormat("bool x = f<int>() > 5;");
4533 verifyFormat("bool x = 5 < a<int>::x;");
4534 verifyFormat("bool x = a < 4 ? a > 2 : false;");
4535 verifyFormat("bool x = f() ? a < 2 : a > 2;");
4536
4537 verifyGoogleFormat("A<A<int>> a;");
4538 verifyGoogleFormat("A<A<A<int>>> a;");
4539 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00004540 verifyGoogleFormat("A<A<int> > a;");
4541 verifyGoogleFormat("A<A<A<int> > > a;");
4542 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00004543 verifyGoogleFormat("A<::A<int>> a;");
4544 verifyGoogleFormat("A<::A> a;");
4545 verifyGoogleFormat("A< ::A> a;");
4546 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00004547 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
4548 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00004549 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
4550 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00004551 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
4552 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00004553
Nico Weber7533b4d2014-09-24 17:17:32 +00004554 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
4555
Daniel Jasperf7935112012-12-03 18:12:45 +00004556 verifyFormat("test >> a >> b;");
4557 verifyFormat("test << a >> b;");
4558
4559 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004560 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00004561 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00004562 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
4563 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00004564 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00004565 verifyFormat("f(a.operator()<A>());");
4566 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4567 " .template operator()<A>());",
4568 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00004569
4570 // Not template parameters.
4571 verifyFormat("return a < b && c > d;");
4572 verifyFormat("void f() {\n"
4573 " while (a < b && c > d) {\n"
4574 " }\n"
4575 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00004576 verifyFormat("template <typename... Types>\n"
4577 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00004578
4579 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4580 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
4581 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00004582 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00004583 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00004584 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00004585}
4586
Malcolm Parsons6af3f142016-11-03 16:57:30 +00004587TEST_F(FormatTest, BitshiftOperatorWidth) {
4588 EXPECT_EQ("int a = 1 << 2; /* foo\n"
4589 " bar */",
4590 format("int a=1<<2; /* foo\n"
4591 " bar */"));
4592
4593 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
4594 " bar */",
4595 format("int b =256>>1 ; /* foo\n"
4596 " bar */"));
4597}
4598
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00004599TEST_F(FormatTest, UnderstandsBinaryOperators) {
4600 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00004601 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00004602}
4603
4604TEST_F(FormatTest, UnderstandsPointersToMembers) {
4605 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00004606 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00004607 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00004608 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00004609 verifyFormat("void f() {\n"
4610 " (a->*f)();\n"
4611 " a->*x;\n"
4612 " (a.*f)();\n"
4613 " ((*a).*f)();\n"
4614 " a.*x;\n"
4615 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00004616 verifyFormat("void f() {\n"
4617 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
4618 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
4619 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00004620 verifyFormat(
4621 "(aaaaaaaaaa->*bbbbbbb)(\n"
4622 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00004623 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00004624 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00004625 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00004626}
4627
Daniel Jasper8dd40472012-12-21 09:41:31 +00004628TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00004629 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00004630 verifyFormat("f(-1, -2, -3);");
4631 verifyFormat("a[-1] = 5;");
4632 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004633 verifyFormat("if (i == -1) {\n}");
4634 verifyFormat("if (i != -1) {\n}");
4635 verifyFormat("if (i > -1) {\n}");
4636 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00004637 verifyFormat("++(a->f());");
4638 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00004639 verifyFormat("(a->f())++;");
4640 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004641 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00004642
4643 verifyFormat("a-- > b;");
4644 verifyFormat("b ? -a : c;");
4645 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00004646 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00004647 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00004648 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00004649
4650 verifyFormat("return -1;");
4651 verifyFormat("switch (a) {\n"
4652 "case -1:\n"
4653 " break;\n"
4654 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00004655 verifyFormat("#define X -1");
4656 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00004657
Chandler Carruthf8b72662014-03-02 12:37:31 +00004658 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
4659 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00004660
4661 verifyFormat("int a = /* confusing comment */ -1;");
4662 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
4663 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004664}
4665
Daniel Jasper0c214fa2014-02-05 13:43:04 +00004666TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00004667 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00004668 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00004669 "}");
4670 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00004671 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00004672 verifyFormat("*aaa = aaaaaaa( // break\n"
4673 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00004674}
4675
Daniel Jasper8863ada2013-08-26 08:10:17 +00004676TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00004677 verifyFormat("bool operator<();");
4678 verifyFormat("bool operator>();");
4679 verifyFormat("bool operator=();");
4680 verifyFormat("bool operator==();");
4681 verifyFormat("bool operator!=();");
4682 verifyFormat("int operator+();");
4683 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00004684 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00004685 verifyFormat("bool operator();");
4686 verifyFormat("bool operator()();");
4687 verifyFormat("bool operator[]();");
4688 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004689 verifyFormat("operator int();");
4690 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00004691 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004692 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00004693 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00004694 verifyFormat("void *operator new(std::size_t size);");
4695 verifyFormat("void *operator new[](std::size_t size);");
4696 verifyFormat("void operator delete(void *ptr);");
4697 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00004698 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
4699 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00004700 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00004701 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004702
Daniel Jasper0af92eb2013-02-15 19:24:08 +00004703 verifyFormat(
4704 "ostream &operator<<(ostream &OutputStream,\n"
4705 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00004706 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
4707 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
4708 " return left.group < right.group;\n"
4709 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00004710 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00004711 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00004712
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004713 verifyGoogleFormat("operator void*();");
4714 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00004715 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00004716
4717 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00004718 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
4719 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004720}
4721
Daniel Jasper1c220482015-02-25 10:30:06 +00004722TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00004723 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
4724 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
4725 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
4726 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
4727 verifyFormat("Deleted &operator=(const Deleted &) &;");
4728 verifyFormat("Deleted &operator=(const Deleted &) &&;");
4729 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
4730 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
4731 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
4732 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
4733 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00004734 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00004735 verifyFormat("template <typename T>\n"
4736 "void F(T) && = delete;",
4737 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00004738
Daniel Jasperaf642c62015-08-25 13:40:51 +00004739 FormatStyle AlignLeft = getLLVMStyle();
4740 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00004741 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00004742 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
4743 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
4744 AlignLeft);
4745 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
4746 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00004747 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
4748 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
4749 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
4750 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00004751 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00004752
4753 FormatStyle Spaces = getLLVMStyle();
4754 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00004755 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
4756 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
4757 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
4758 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00004759
4760 Spaces.SpacesInCStyleCastParentheses = false;
4761 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00004762 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
4763 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
4764 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
4765 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00004766}
4767
Daniel Jasperd6a947f2013-01-11 16:09:04 +00004768TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00004769 verifyFormat("void f() {\n"
4770 " A *a = new A;\n"
4771 " A *a = new (placement) A;\n"
4772 " delete a;\n"
4773 " delete (A *)a;\n"
4774 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00004775 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
4776 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00004777 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4778 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
4779 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00004780 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00004781}
4782
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00004783TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004784 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004785 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00004786 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004787 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00004788 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004789 verifyIndependentOfContext("int a = b * 10;");
4790 verifyIndependentOfContext("int a = 10 * b;");
4791 verifyIndependentOfContext("int a = b * c;");
4792 verifyIndependentOfContext("int a += b * c;");
4793 verifyIndependentOfContext("int a -= b * c;");
4794 verifyIndependentOfContext("int a *= b * c;");
4795 verifyIndependentOfContext("int a /= b * c;");
4796 verifyIndependentOfContext("int a = *b;");
4797 verifyIndependentOfContext("int a = *b * c;");
4798 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00004799 verifyIndependentOfContext("int a = b * (10);");
4800 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004801 verifyIndependentOfContext("return 10 * b;");
4802 verifyIndependentOfContext("return *b * *c;");
4803 verifyIndependentOfContext("return a & ~b;");
4804 verifyIndependentOfContext("f(b ? *c : *d);");
4805 verifyIndependentOfContext("int a = b ? *c : *d;");
4806 verifyIndependentOfContext("*b = a;");
4807 verifyIndependentOfContext("a * ~b;");
4808 verifyIndependentOfContext("a * !b;");
4809 verifyIndependentOfContext("a * +b;");
4810 verifyIndependentOfContext("a * -b;");
4811 verifyIndependentOfContext("a * ++b;");
4812 verifyIndependentOfContext("a * --b;");
4813 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00004814 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004815 verifyIndependentOfContext("f() * b;");
4816 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00004817 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004818 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00004819 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004820 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00004821 verifyIndependentOfContext("return sizeof(int **);");
4822 verifyIndependentOfContext("return sizeof(int ******);");
4823 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00004824 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00004825 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00004826 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00004827 verifyGoogleFormat("return sizeof(int**);");
4828 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
4829 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00004830 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00004831 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00004832 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00004833 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00004834 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00004835 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00004836 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00004837 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00004838 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00004839 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00004840 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00004841 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00004842 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00004843 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00004844 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00004845 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00004846 verifyFormat("void f(const MyOverride &override);");
4847 verifyFormat("void f(const MyFinal &final);");
4848 verifyIndependentOfContext("bool a = f() && override.f();");
4849 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00004850
Daniel Jasper5b49f472013-01-23 12:10:53 +00004851 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00004852
Daniel Jasper5b49f472013-01-23 12:10:53 +00004853 verifyIndependentOfContext("A<int *> a;");
4854 verifyIndependentOfContext("A<int **> a;");
4855 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00004856 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00004857 verifyIndependentOfContext(
4858 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004859 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00004860 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00004861 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00004862 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00004863 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00004864
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00004865 verifyFormat(
4866 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4867 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4868
Daniel Jasper1f5d6372016-06-13 14:45:12 +00004869 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00004870 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00004871 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004872 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00004873 verifyGoogleFormat("A<int*> a;");
4874 verifyGoogleFormat("A<int**> a;");
4875 verifyGoogleFormat("A<int*, int*> a;");
4876 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00004877 verifyGoogleFormat("f(b ? *c : *d);");
4878 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00004879 verifyGoogleFormat("Type* t = **x;");
4880 verifyGoogleFormat("Type* t = *++*x;");
4881 verifyGoogleFormat("*++*x;");
4882 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
4883 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00004884 verifyGoogleFormat(
4885 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00004886 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00004887 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
4888 verifyGoogleFormat("template <typename T>\n"
4889 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00004890
Daniel Jasper1904e9b2014-08-14 10:53:19 +00004891 FormatStyle Left = getLLVMStyle();
4892 Left.PointerAlignment = FormatStyle::PAS_Left;
4893 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00004894 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00004895 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00004896
Daniel Jasper5b49f472013-01-23 12:10:53 +00004897 verifyIndependentOfContext("a = *(x + y);");
4898 verifyIndependentOfContext("a = &(x + y);");
4899 verifyIndependentOfContext("*(x + y).call();");
4900 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00004901 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00004902
Daniel Jasper5b49f472013-01-23 12:10:53 +00004903 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00004904 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00004905 "int *MyValues = {\n"
4906 " *A, // Operator detection might be confused by the '{'\n"
4907 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00004908 "};");
Nico Weber80a82762013-01-17 17:17:19 +00004909
Daniel Jasper5b49f472013-01-23 12:10:53 +00004910 verifyIndependentOfContext("if (int *a = &b)");
4911 verifyIndependentOfContext("if (int &a = *b)");
4912 verifyIndependentOfContext("if (a & b[i])");
4913 verifyIndependentOfContext("if (a::b::c::d & b[i])");
4914 verifyIndependentOfContext("if (*b[i])");
4915 verifyIndependentOfContext("if (int *a = (&b))");
4916 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00004917 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00004918 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00004919 verifyFormat("void f() {\n"
4920 " for (const int &v : Values) {\n"
4921 " }\n"
4922 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00004923 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
4924 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00004925 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00004926
Daniel Jaspera98da3d2013-11-07 19:56:07 +00004927 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00004928 verifyFormat("#define MACRO \\\n"
4929 " int *i = a * b; \\\n"
4930 " void f(a *b);",
4931 getLLVMStyleWithColumns(19));
4932
Daniel Jasper97b89482013-03-13 07:49:51 +00004933 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004934 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00004935 verifyIndependentOfContext("T **t = new T *;");
4936 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00004937 verifyGoogleFormat("A = new SomeType*[Length]();");
4938 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00004939 verifyGoogleFormat("T** t = new T*;");
4940 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00004941
Daniel Jasper990ff972013-05-07 14:17:18 +00004942 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00004943 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00004944 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00004945 verifyFormat("STATIC_ASSERT((a & b) == 0);");
4946 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00004947 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00004948 "typename t::if<x && y>::type f() {}");
4949 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00004950 verifyFormat("vector<int *> v;");
4951 verifyFormat("vector<int *const> v;");
4952 verifyFormat("vector<int *const **const *> v;");
4953 verifyFormat("vector<int *volatile> v;");
4954 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00004955 verifyFormat("foo<b && false>();");
4956 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00004957 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00004958 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004959 "template <class T, class = typename std::enable_if<\n"
4960 " std::is_integral<T>::value &&\n"
4961 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
4962 "void F();",
4963 getLLVMStyleWithColumns(70));
4964 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004965 "template <class T,\n"
4966 " class = typename std::enable_if<\n"
4967 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004968 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
4969 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00004970 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004971 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00004972 verifyFormat(
4973 "template <class T,\n"
4974 " class = typename ::std::enable_if<\n"
4975 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
4976 "void F();",
4977 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00004978
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00004979 verifyIndependentOfContext("MACRO(int *i);");
4980 verifyIndependentOfContext("MACRO(auto *a);");
4981 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00004982 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00004983 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00004984 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00004985 // FIXME: Is there a way to make this work?
4986 // verifyIndependentOfContext("MACRO(A *a);");
4987
Daniel Jasper32ccb032014-06-23 07:36:18 +00004988 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00004989 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00004990
Daniel Jasper866468a2014-04-14 13:15:29 +00004991 EXPECT_EQ("#define OP(x) \\\n"
4992 " ostream &operator<<(ostream &s, const A &a) { \\\n"
4993 " return s << a.DebugString(); \\\n"
4994 " }",
4995 format("#define OP(x) \\\n"
4996 " ostream &operator<<(ostream &s, const A &a) { \\\n"
4997 " return s << a.DebugString(); \\\n"
4998 " }",
4999 getLLVMStyleWithColumns(50)));
5000
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005001 // FIXME: We cannot handle this case yet; we might be able to figure out that
5002 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00005003 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00005004
5005 FormatStyle PointerMiddle = getLLVMStyle();
5006 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
5007 verifyFormat("delete *x;", PointerMiddle);
5008 verifyFormat("int * x;", PointerMiddle);
5009 verifyFormat("template <int * y> f() {}", PointerMiddle);
5010 verifyFormat("int * f(int * a) {}", PointerMiddle);
5011 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
5012 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
5013 verifyFormat("A<int *> a;", PointerMiddle);
5014 verifyFormat("A<int **> a;", PointerMiddle);
5015 verifyFormat("A<int *, int *> a;", PointerMiddle);
5016 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00005017 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5018 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00005019 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005020
5021 // Member function reference qualifiers aren't binary operators.
5022 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005023 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005024 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005025 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005026 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005027 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005028}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005029
Daniel Jasperee6d6502013-07-17 20:25:02 +00005030TEST_F(FormatTest, UnderstandsAttributes) {
5031 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00005032 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5033 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005034 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005035 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005036 verifyFormat("__attribute__((nodebug)) void\n"
5037 "foo() {}\n",
5038 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00005039}
5040
Daniel Jasper10cd5812013-05-06 06:35:44 +00005041TEST_F(FormatTest, UnderstandsEllipsis) {
5042 verifyFormat("int printf(const char *fmt, ...);");
5043 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005044 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5045
5046 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005047 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005048 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005049}
5050
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005051TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005052 EXPECT_EQ("int *a;\n"
5053 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005054 "int *a;",
5055 format("int *a;\n"
5056 "int* a;\n"
5057 "int *a;",
5058 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005059 EXPECT_EQ("int* a;\n"
5060 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005061 "int* a;",
5062 format("int* a;\n"
5063 "int* a;\n"
5064 "int *a;",
5065 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005066 EXPECT_EQ("int *a;\n"
5067 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005068 "int *a;",
5069 format("int *a;\n"
5070 "int * a;\n"
5071 "int * a;",
5072 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005073 EXPECT_EQ("auto x = [] {\n"
5074 " int *a;\n"
5075 " int *a;\n"
5076 " int *a;\n"
5077 "};",
5078 format("auto x=[]{int *a;\n"
5079 "int * a;\n"
5080 "int * a;};",
5081 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005082}
5083
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005084TEST_F(FormatTest, UnderstandsRvalueReferences) {
5085 verifyFormat("int f(int &&a) {}");
5086 verifyFormat("int f(int a, char &&b) {}");
5087 verifyFormat("void f() { int &&a = b; }");
5088 verifyGoogleFormat("int f(int a, char&& b) {}");
5089 verifyGoogleFormat("void f() { int&& a = b; }");
5090
Daniel Jasper1eff9082013-05-27 16:36:33 +00005091 verifyIndependentOfContext("A<int &&> a;");
5092 verifyIndependentOfContext("A<int &&, int &&> a;");
5093 verifyGoogleFormat("A<int&&> a;");
5094 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00005095
5096 // Not rvalue references:
5097 verifyFormat("template <bool B, bool C> class A {\n"
5098 " static_assert(B && C, \"Something is wrong\");\n"
5099 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00005100 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
5101 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00005102 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005103}
5104
Manuel Klimekc1237a82013-01-23 14:08:21 +00005105TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
5106 verifyFormat("void f() {\n"
5107 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005108 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005109 "}",
5110 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00005111}
5112
Daniel Jasperef906a92013-01-13 08:01:36 +00005113TEST_F(FormatTest, FormatsCasts) {
5114 verifyFormat("Type *A = static_cast<Type *>(P);");
5115 verifyFormat("Type *A = (Type *)P;");
5116 verifyFormat("Type *A = (vector<Type *, int *>)P;");
5117 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00005118 verifyFormat("int a = (int)2.0f;");
5119 verifyFormat("x[(int32)y];");
5120 verifyFormat("x = (int32)y;");
5121 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
5122 verifyFormat("int a = (int)*b;");
5123 verifyFormat("int a = (int)2.0f;");
5124 verifyFormat("int a = (int)~0;");
5125 verifyFormat("int a = (int)++a;");
5126 verifyFormat("int a = (int)sizeof(int);");
5127 verifyFormat("int a = (int)+2;");
5128 verifyFormat("my_int a = (my_int)2.0f;");
5129 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00005130 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00005131 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00005132 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00005133 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00005134 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00005135
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005136 verifyFormat("void f() { my_int a = (my_int)*b; }");
5137 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
5138 verifyFormat("my_int a = (my_int)~0;");
5139 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00005140 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005141 verifyFormat("my_int a = (my_int)1;");
5142 verifyFormat("my_int a = (my_int *)1;");
5143 verifyFormat("my_int a = (const my_int)-1;");
5144 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00005145 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00005146 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00005147 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00005148 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005149
5150 // FIXME: single value wrapped with paren will be treated as cast.
5151 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00005152
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00005153 verifyFormat("{ (void)F; }");
5154
Daniel Jasper998cabc2013-07-18 14:46:07 +00005155 // Don't break after a cast's
5156 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5157 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
5158 " bbbbbbbbbbbbbbbbbbbbbb);");
5159
Daniel Jasperef906a92013-01-13 08:01:36 +00005160 // These are not casts.
5161 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00005162 verifyFormat("f(foo)->b;");
5163 verifyFormat("f(foo).b;");
5164 verifyFormat("f(foo)(b);");
5165 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005166 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00005167 verifyFormat("(*funptr)(foo)[4];");
5168 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00005169 verifyFormat("void f(int *);");
5170 verifyFormat("void f(int *) = 0;");
5171 verifyFormat("void f(SmallVector<int>) {}");
5172 verifyFormat("void f(SmallVector<int>);");
5173 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00005174 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00005175 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005176 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00005177 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
5178 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00005179 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005180
Daniel Jasperba0bda92013-02-23 08:07:18 +00005181 // These are not casts, but at some point were confused with casts.
5182 verifyFormat("virtual void foo(int *) override;");
5183 verifyFormat("virtual void foo(char &) const;");
5184 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00005185 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005186 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00005187 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00005188 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00005189
5190 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
5191 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005192 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005193 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005194 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5195 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
5196 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00005197}
5198
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005199TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005200 verifyFormat("A<bool()> a;");
5201 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00005202 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00005203 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005204 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005205 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005206 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00005207 verifyFormat("template <class CallbackClass>\n"
5208 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00005209
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005210 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
5211 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00005212 verifyGoogleFormat(
5213 "template <class CallbackClass>\n"
5214 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00005215
Daniel Jasper5dad58e2013-05-15 07:51:51 +00005216 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00005217 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00005218 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00005219 verifyFormat("some_var = function(*some_pointer_var)[0];");
5220 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00005221 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00005222 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005223}
5224
Daniel Jasperbeaa3222015-02-26 11:30:50 +00005225TEST_F(FormatTest, FormatsPointersToArrayTypes) {
5226 verifyFormat("A (*foo_)[6];");
5227 verifyFormat("vector<int> (*foo_)[6];");
5228}
5229
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005230TEST_F(FormatTest, BreaksLongVariableDeclarations) {
5231 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5232 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
5233 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
5234 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00005235 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5236 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005237
5238 // Different ways of ()-initializiation.
5239 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5240 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
5241 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5242 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
5243 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5244 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00005245 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5246 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00005247
5248 // Lambdas should not confuse the variable declaration heuristic.
5249 verifyFormat("LooooooooooooooooongType\n"
5250 " variable(nullptr, [](A *a) {});",
5251 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005252}
5253
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005254TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00005255 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005256 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005257 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005258 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00005259 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005260 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00005261 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
5262 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00005263 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5264 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00005265 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
5266 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00005267 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
5268 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00005269 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
5270 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005271 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5272 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
5273 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5274 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00005275 FormatStyle Indented = getLLVMStyle();
5276 Indented.IndentWrappedFunctionNames = true;
5277 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5278 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
5279 Indented);
5280 verifyFormat(
5281 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5282 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5283 Indented);
5284 verifyFormat(
5285 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
5286 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5287 Indented);
5288 verifyFormat(
5289 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
5290 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5291 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00005292
5293 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00005294 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
5295 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
5296 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00005297
Daniel Jasperd2639ef2013-01-28 15:16:31 +00005298 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005299 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00005300 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00005301 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
5302 " SourceLocation L, IdentifierIn *II,\n"
5303 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005304 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005305 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005306 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005307 " const SomeType<string, SomeOtherTemplateParameter>\n"
5308 " &ReallyReallyLongParameterName,\n"
5309 " const SomeType<string, SomeOtherTemplateParameter>\n"
5310 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00005311 verifyFormat("template <typename A>\n"
5312 "SomeLoooooooooooooooooooooongType<\n"
5313 " typename some_namespace::SomeOtherType<A>::Type>\n"
5314 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005315
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00005316 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00005317 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
5318 " aaaaaaaaaaaaaaaaaaaaaaa;");
5319 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005320 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
5321 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00005322 verifyGoogleFormat(
5323 "some_namespace::LongReturnType\n"
5324 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005325 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00005326
5327 verifyGoogleFormat("template <typename T>\n"
5328 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005329 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00005330 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5331 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00005332
5333 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005334 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5335 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00005336 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5337 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
5338 " aaaaaaaaaaaaaaaaaaaaaaaa);");
5339 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5340 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
5341 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
5342 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00005343
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00005344 verifyFormat("template <typename T> // Templates on own line.\n"
5345 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00005346 "MyFunction(int a);",
5347 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00005348}
5349
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005350TEST_F(FormatTest, FormatsArrays) {
5351 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5352 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00005353 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
5354 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00005355 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
5356 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005357 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5358 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5359 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5360 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
5361 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5362 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5363 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5364 verifyFormat(
5365 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
5366 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5367 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00005368 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
5369 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00005370
5371 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
5372 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00005373 verifyFormat(
5374 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
5375 " .aaaaaaa[0]\n"
5376 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00005377 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00005378
5379 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00005380
5381 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
5382 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005383}
5384
Daniel Jaspere9de2602012-12-06 09:56:08 +00005385TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
5386 verifyFormat("(a)->b();");
5387 verifyFormat("--a;");
5388}
5389
Daniel Jasper8b529712012-12-04 13:02:32 +00005390TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00005391 verifyFormat("#include <string>\n"
5392 "#include <a/b/c.h>\n"
5393 "#include \"a/b/string\"\n"
5394 "#include \"string.h\"\n"
5395 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00005396 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005397 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00005398 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00005399 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00005400 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005401 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
5402 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00005403 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
5404 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00005405
Daniel Jasper5ef433f2013-01-13 08:12:18 +00005406 verifyFormat("#import <string>");
5407 verifyFormat("#import <a/b/c.h>");
5408 verifyFormat("#import \"a/b/string\"");
5409 verifyFormat("#import \"string.h\"");
5410 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00005411 verifyFormat("#if __has_include(<strstream>)\n"
5412 "#include <strstream>\n"
5413 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00005414
Daniel Jasper343643b2014-08-13 08:29:18 +00005415 verifyFormat("#define MY_IMPORT <a/b>");
5416
Nico Weber21088802017-02-10 19:36:52 +00005417 verifyFormat("#if __has_include(<a/b>)");
5418 verifyFormat("#if __has_include_next(<a/b>)");
5419 verifyFormat("#define F __has_include(<a/b>)");
5420 verifyFormat("#define F __has_include_next(<a/b>)");
5421
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00005422 // Protocol buffer definition or missing "#".
5423 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
5424 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00005425
5426 FormatStyle Style = getLLVMStyle();
5427 Style.AlwaysBreakBeforeMultilineStrings = true;
5428 Style.ColumnLimit = 0;
5429 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00005430
5431 // But 'import' might also be a regular C++ namespace.
5432 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5433 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00005434}
5435
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005436//===----------------------------------------------------------------------===//
5437// Error recovery tests.
5438//===----------------------------------------------------------------------===//
5439
Daniel Jasper66e9dee2013-02-14 09:19:04 +00005440TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005441 FormatStyle NoBinPacking = getLLVMStyle();
5442 NoBinPacking.BinPackParameters = false;
5443 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
5444 " double *min_x,\n"
5445 " double *max_x,\n"
5446 " double *min_y,\n"
5447 " double *max_y,\n"
5448 " double *min_z,\n"
5449 " double *max_z, ) {}",
5450 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00005451}
5452
Daniel Jasper83a54d22013-01-10 09:26:47 +00005453TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00005454 verifyFormat("void f() { return; }\n42");
5455 verifyFormat("void f() {\n"
5456 " if (0)\n"
5457 " return;\n"
5458 "}\n"
5459 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00005460 verifyFormat("void f() { return }\n42");
5461 verifyFormat("void f() {\n"
5462 " if (0)\n"
5463 " return\n"
5464 "}\n"
5465 "42");
5466}
5467
5468TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
5469 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
5470 EXPECT_EQ("void f() {\n"
5471 " if (a)\n"
5472 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005473 "}",
5474 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00005475 EXPECT_EQ("namespace N {\n"
5476 "void f()\n"
5477 "}",
5478 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00005479 EXPECT_EQ("namespace N {\n"
5480 "void f() {}\n"
5481 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00005482 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005483 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00005484}
5485
Daniel Jasper2df93312013-01-09 10:16:05 +00005486TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
5487 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00005488 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005489 " b;",
5490 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00005491 verifyFormat("function(\n"
5492 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005493 " LoooooooooooongArgument);\n",
5494 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00005495}
5496
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005497TEST_F(FormatTest, IncorrectAccessSpecifier) {
5498 verifyFormat("public:");
5499 verifyFormat("class A {\n"
5500 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005501 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005502 "};");
5503 verifyFormat("public\n"
5504 "int qwerty;");
5505 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005506 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005507 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005508 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005509 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005510 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005511}
Daniel Jasperf7935112012-12-03 18:12:45 +00005512
Daniel Jasper291f9362013-03-20 15:58:10 +00005513TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
5514 verifyFormat("{");
5515 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00005516 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00005517}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005518
5519TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005520 verifyFormat("do {\n}");
5521 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005522 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005523 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005524 "wheeee(fun);");
5525 verifyFormat("do {\n"
5526 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00005527 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005528}
5529
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005530TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00005531 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005532 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00005533 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005534 verifyFormat("while {\n foo;\n foo();\n}");
5535 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00005536}
5537
Daniel Jasperc0880a92013-01-04 18:52:56 +00005538TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00005539 verifyIncompleteFormat("namespace {\n"
5540 "class Foo { Foo (\n"
5541 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00005542 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00005543}
5544
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005545TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005546 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005547 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
5548 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005549 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005550
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005551 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005552 " {\n"
5553 " breakme(\n"
5554 " qwe);\n"
5555 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005556 format("{\n"
5557 " {\n"
5558 " breakme(qwe);\n"
5559 "}\n",
5560 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005561}
5562
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00005563TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005564 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005565 " avariable,\n"
5566 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005567 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00005568}
5569
Manuel Klimek762dd182013-01-21 10:07:49 +00005570TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005571 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00005572}
5573
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005574TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00005575 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00005576 verifyFormat("vector<int> x{\n"
5577 " 1, 2, 3, 4,\n"
5578 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005579 verifyFormat("vector<T> x{{}, {}, {}, {}};");
5580 verifyFormat("f({1, 2});");
5581 verifyFormat("auto v = Foo{-1};");
5582 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
5583 verifyFormat("Class::Class : member{1, 2, 3} {}");
5584 verifyFormat("new vector<int>{1, 2, 3};");
5585 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00005586 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005587 verifyFormat("return {arg1, arg2};");
5588 verifyFormat("return {arg1, SomeType{parameter}};");
5589 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
5590 verifyFormat("new T{arg1, arg2};");
5591 verifyFormat("f(MyMap[{composite, key}]);");
5592 verifyFormat("class Class {\n"
5593 " T member = {arg1, arg2};\n"
5594 "};");
5595 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00005596 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
5597 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00005598
Daniel Jasper438059e2014-05-22 12:11:13 +00005599 verifyFormat("int foo(int i) { return fo1{}(i); }");
5600 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005601 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00005602 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00005603 verifyFormat("Node n{1, Node{1000}, //\n"
5604 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00005605 verifyFormat("Aaaa aaaaaaa{\n"
5606 " {\n"
5607 " aaaa,\n"
5608 " },\n"
5609 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00005610 verifyFormat("class C : public D {\n"
5611 " SomeClass SC{2};\n"
5612 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00005613 verifyFormat("class C : public A {\n"
5614 " class D : public B {\n"
5615 " void f() { int i{2}; }\n"
5616 " };\n"
5617 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00005618 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00005619
Daniel Jaspere4ada022016-12-13 10:05:03 +00005620 // Cases where distinguising braced lists and blocks is hard.
5621 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
5622 verifyFormat("void f() {\n"
5623 " return; // comment\n"
5624 "}\n"
5625 "SomeType t;");
5626 verifyFormat("void f() {\n"
5627 " if (a) {\n"
5628 " f();\n"
5629 " }\n"
5630 "}\n"
5631 "SomeType t;");
5632
Daniel Jasper08434342015-05-26 07:26:26 +00005633 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005634 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00005635 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005636 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
5637 " bbbbb,\n"
5638 " ccccc,\n"
5639 " ddddd,\n"
5640 " eeeee,\n"
5641 " ffffff,\n"
5642 " ggggg,\n"
5643 " hhhhhh,\n"
5644 " iiiiii,\n"
5645 " jjjjjj,\n"
5646 " kkkkkk};",
5647 NoBinPacking);
5648 verifyFormat("const Aaaaaa aaaaa = {\n"
5649 " aaaaa,\n"
5650 " bbbbb,\n"
5651 " ccccc,\n"
5652 " ddddd,\n"
5653 " eeeee,\n"
5654 " ffffff,\n"
5655 " ggggg,\n"
5656 " hhhhhh,\n"
5657 " iiiiii,\n"
5658 " jjjjjj,\n"
5659 " kkkkkk,\n"
5660 "};",
5661 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00005662 verifyFormat(
5663 "const Aaaaaa aaaaa = {\n"
5664 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
5665 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
5666 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
5667 "};",
5668 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005669
Chandler Carruthf8b72662014-03-02 12:37:31 +00005670 // FIXME: The alignment of these trailing comments might be bad. Then again,
5671 // this might be utterly useless in real code.
5672 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00005673 " : some_value{ //\n"
5674 " aaaaaaa, //\n"
5675 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00005676
Chandler Carruthf8b72662014-03-02 12:37:31 +00005677 // In braced lists, the first comment is always assumed to belong to the
5678 // first element. Thus, it can be moved to the next or previous line as
5679 // appropriate.
5680 EXPECT_EQ("function({// First element:\n"
5681 " 1,\n"
5682 " // Second element:\n"
5683 " 2});",
5684 format("function({\n"
5685 " // First element:\n"
5686 " 1,\n"
5687 " // Second element:\n"
5688 " 2});"));
5689 EXPECT_EQ("std::vector<int> MyNumbers{\n"
5690 " // First element:\n"
5691 " 1,\n"
5692 " // Second element:\n"
5693 " 2};",
5694 format("std::vector<int> MyNumbers{// First element:\n"
5695 " 1,\n"
5696 " // Second element:\n"
5697 " 2};",
5698 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00005699 // A trailing comma should still lead to an enforced line break.
5700 EXPECT_EQ("vector<int> SomeVector = {\n"
5701 " // aaa\n"
5702 " 1, 2,\n"
5703 "};",
5704 format("vector<int> SomeVector = { // aaa\n"
5705 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00005706
Chandler Carruthf8b72662014-03-02 12:37:31 +00005707 FormatStyle ExtraSpaces = getLLVMStyle();
5708 ExtraSpaces.Cpp11BracedListStyle = false;
5709 ExtraSpaces.ColumnLimit = 75;
5710 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
5711 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
5712 verifyFormat("f({ 1, 2 });", ExtraSpaces);
5713 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
5714 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
5715 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
5716 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
5717 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
5718 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
5719 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
5720 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
5721 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
5722 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
5723 verifyFormat("class Class {\n"
5724 " T member = { arg1, arg2 };\n"
5725 "};",
5726 ExtraSpaces);
5727 verifyFormat(
5728 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5729 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
5730 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
5731 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
5732 ExtraSpaces);
5733 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00005734 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00005735 ExtraSpaces);
5736 verifyFormat(
5737 "someFunction(OtherParam,\n"
5738 " BracedList{ // comment 1 (Forcing interesting break)\n"
5739 " param1, param2,\n"
5740 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00005741 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00005742 ExtraSpaces);
5743 verifyFormat(
5744 "std::this_thread::sleep_for(\n"
5745 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
5746 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00005747 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00005748 " aaaaaaa,\n"
5749 " aaaaaaaaaa,\n"
5750 " aaaaa,\n"
5751 " aaaaaaaaaaaaaaa,\n"
5752 " aaa,\n"
5753 " aaaaaaaaaa,\n"
5754 " a,\n"
5755 " aaaaaaaaaaaaaaaaaaaaa,\n"
5756 " aaaaaaaaaaaa,\n"
5757 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
5758 " aaaaaaa,\n"
5759 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005760 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00005761}
5762
Daniel Jasper33b909c2013-10-25 14:29:37 +00005763TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00005764 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5765 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5766 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5767 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5768 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5769 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00005770 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005771 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00005772 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005773 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5774 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005775 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00005776 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5777 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5778 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
5779 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
5780 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
5781 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
5782 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005783 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005784 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5785 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00005786 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
5787 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5788 " // Separating comment.\n"
5789 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
5790 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
5791 " // Leading comment\n"
5792 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5793 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005794 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5795 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005796 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00005797 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5798 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005799 getLLVMStyleWithColumns(38));
5800 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005801 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
5802 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00005803 verifyFormat(
5804 "static unsigned SomeValues[10][3] = {\n"
5805 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
5806 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
5807 verifyFormat("static auto fields = new vector<string>{\n"
5808 " \"aaaaaaaaaaaaa\",\n"
5809 " \"aaaaaaaaaaaaa\",\n"
5810 " \"aaaaaaaaaaaa\",\n"
5811 " \"aaaaaaaaaaaaaa\",\n"
5812 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
5813 " \"aaaaaaaaaaaa\",\n"
5814 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
5815 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00005816 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
5817 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
5818 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
5819 " 3, cccccccccccccccccccccc};",
5820 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00005821
5822 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00005823 verifyFormat("vector<int> x = {\n"
5824 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
5825 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00005826 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00005827 verifyFormat("vector<int> x = {\n"
5828 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00005829 "};",
5830 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00005831 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5832 " 1, 1, 1, 1,\n"
5833 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00005834 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00005835
Daniel Jasper60c27072015-05-13 08:16:00 +00005836 // Trailing comment in the first line.
5837 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
5838 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
5839 " 111111111, 222222222, 3333333333, 444444444, //\n"
5840 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00005841 // Trailing comment in the last line.
5842 verifyFormat("int aaaaa[] = {\n"
5843 " 1, 2, 3, // comment\n"
5844 " 4, 5, 6 // comment\n"
5845 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00005846
Daniel Jaspere4c16c72015-05-08 13:51:14 +00005847 // With nested lists, we should either format one item per line or all nested
5848 // lists one on line.
5849 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00005850 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
5851 " {aaaaaaaaaaaaaaaaaaa},\n"
5852 " {aaaaaaaaaaaaaaaaaaaaa},\n"
5853 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00005854 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00005855 verifyFormat(
5856 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005857 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
5858 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
5859 " {aaa, aaa},\n"
5860 " {aaa, aaa},\n"
5861 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
5862 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
5863 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00005864
5865 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00005866 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
5867 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00005868
5869 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00005870
Daniel Jaspereb65e912015-12-21 18:31:15 +00005871 // No braced initializer here.
5872 verifyFormat("void f() {\n"
5873 " struct Dummy {};\n"
5874 " f(v);\n"
5875 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00005876
5877 // Long lists should be formatted in columns even if they are nested.
5878 verifyFormat(
5879 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5880 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5881 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5882 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5883 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5884 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00005885
5886 // Allow "single-column" layout even if that violates the column limit. There
5887 // isn't going to be a better way.
5888 verifyFormat("std::vector<int> a = {\n"
5889 " aaaaaaaa,\n"
5890 " aaaaaaaa,\n"
5891 " aaaaaaaa,\n"
5892 " aaaaaaaa,\n"
5893 " aaaaaaaaaa,\n"
5894 " aaaaaaaa,\n"
5895 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
5896 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00005897 verifyFormat("vector<int> aaaa = {\n"
5898 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5899 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5900 " aaaaaa.aaaaaaa,\n"
5901 " aaaaaa.aaaaaaa,\n"
5902 " aaaaaa.aaaaaaa,\n"
5903 " aaaaaa.aaaaaaa,\n"
5904 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00005905
5906 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005907 verifyFormat("someFunction(Param, {List1, List2,\n"
5908 " List3});",
5909 getLLVMStyleWithColumns(35));
5910 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00005911 " {List1, List2,\n"
5912 " List3});",
5913 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00005914 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
5915 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005916}
5917
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005918TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005919 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00005920 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005921
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005922 verifyFormat("void f() { return 42; }");
5923 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005924 " return 42;\n"
5925 "}",
5926 DoNotMerge);
5927 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005928 " // Comment\n"
5929 "}");
5930 verifyFormat("{\n"
5931 "#error {\n"
5932 " int a;\n"
5933 "}");
5934 verifyFormat("{\n"
5935 " int a;\n"
5936 "#error {\n"
5937 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00005938 verifyFormat("void f() {} // comment");
5939 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00005940 verifyFormat("void f() {\n"
5941 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005942 DoNotMerge);
5943 verifyFormat("void f() {\n"
5944 " int a;\n"
5945 "} // comment",
5946 DoNotMerge);
5947 verifyFormat("void f() {\n"
5948 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00005949 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005950
5951 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
5952 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
5953
5954 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
5955 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00005956 verifyFormat("class C {\n"
5957 " C()\n"
5958 " : iiiiiiii(nullptr),\n"
5959 " kkkkkkk(nullptr),\n"
5960 " mmmmmmm(nullptr),\n"
5961 " nnnnnnn(nullptr) {}\n"
5962 "};",
5963 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00005964
5965 FormatStyle NoColumnLimit = getLLVMStyle();
5966 NoColumnLimit.ColumnLimit = 0;
5967 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
5968 EXPECT_EQ("class C {\n"
5969 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005970 "};",
5971 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00005972 EXPECT_EQ("A()\n"
5973 " : b(0) {\n"
5974 "}",
5975 format("A()\n:b(0)\n{\n}", NoColumnLimit));
5976
5977 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00005978 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
5979 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00005980 EXPECT_EQ("A()\n"
5981 " : b(0) {\n"
5982 "}",
5983 format("A():b(0){}", DoNotMergeNoColumnLimit));
5984 EXPECT_EQ("A()\n"
5985 " : b(0) {\n"
5986 "}",
5987 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00005988
5989 verifyFormat("#define A \\\n"
5990 " void f() { \\\n"
5991 " int i; \\\n"
5992 " }",
5993 getLLVMStyleWithColumns(20));
5994 verifyFormat("#define A \\\n"
5995 " void f() { int i; }",
5996 getLLVMStyleWithColumns(21));
5997 verifyFormat("#define A \\\n"
5998 " void f() { \\\n"
5999 " int i; \\\n"
6000 " } \\\n"
6001 " int j;",
6002 getLLVMStyleWithColumns(22));
6003 verifyFormat("#define A \\\n"
6004 " void f() { int i; } \\\n"
6005 " int j;",
6006 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006007}
6008
Daniel Jasperd74cf402014-04-08 12:46:38 +00006009TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
6010 FormatStyle MergeInlineOnly = getLLVMStyle();
6011 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6012 verifyFormat("class C {\n"
6013 " int f() { return 42; }\n"
6014 "};",
6015 MergeInlineOnly);
6016 verifyFormat("int f() {\n"
6017 " return 42;\n"
6018 "}",
6019 MergeInlineOnly);
6020}
6021
Manuel Klimeke01bab52013-01-15 13:38:33 +00006022TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
6023 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006024 verifyFormat("struct foo a = {bar};\nint n;");
6025 verifyFormat("class foo a = {bar};\nint n;");
6026 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006027
6028 // Elaborate types inside function definitions.
6029 verifyFormat("struct foo f() {}\nint n;");
6030 verifyFormat("class foo f() {}\nint n;");
6031 verifyFormat("union foo f() {}\nint n;");
6032
6033 // Templates.
6034 verifyFormat("template <class X> void f() {}\nint n;");
6035 verifyFormat("template <struct X> void f() {}\nint n;");
6036 verifyFormat("template <union X> void f() {}\nint n;");
6037
6038 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006039 verifyFormat("struct {\n} n;");
6040 verifyFormat(
6041 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006042 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006043 verifyFormat("class MACRO Z {\n} n;");
6044 verifyFormat("class MACRO(X) Z {\n} n;");
6045 verifyFormat("class __attribute__(X) Z {\n} n;");
6046 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00006047 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00006048 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00006049 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6050 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006051
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006052 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006053 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006054
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006055 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00006056 verifyFormat(
6057 "template <typename F>\n"
6058 "Matcher(const Matcher<F> &Other,\n"
6059 " typename enable_if_c<is_base_of<F, T>::value &&\n"
6060 " !is_same<F, T>::value>::type * = 0)\n"
6061 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6062
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006063 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006064 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00006065 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006066
6067 // FIXME:
6068 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006069 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006070
Manuel Klimeke01bab52013-01-15 13:38:33 +00006071 // Elaborate types where incorrectly parsing the structural element would
6072 // break the indent.
6073 verifyFormat("if (true)\n"
6074 " class X x;\n"
6075 "else\n"
6076 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00006077
6078 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00006079 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00006080}
6081
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006082TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00006083 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
6084 format("#error Leave all white!!!!! space* alone!\n"));
6085 EXPECT_EQ(
6086 "#warning Leave all white!!!!! space* alone!\n",
6087 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006088 EXPECT_EQ("#error 1", format(" # error 1"));
6089 EXPECT_EQ("#warning 1", format(" # warning 1"));
6090}
6091
Daniel Jasper4431aa92013-04-23 13:54:04 +00006092TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00006093 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00006094 verifyFormat("#if (AAAA && BBBB)");
6095 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00006096 // FIXME: Come up with a better indentation for #elif.
6097 verifyFormat(
6098 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
6099 " defined(BBBBBBBB)\n"
6100 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
6101 " defined(BBBBBBBB)\n"
6102 "#endif",
6103 getLLVMStyleWithColumns(65));
6104}
6105
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006106TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
6107 FormatStyle AllowsMergedIf = getGoogleStyle();
6108 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
6109 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
6110 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00006111 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
6112 EXPECT_EQ("if (true) return 42;",
6113 format("if (true)\nreturn 42;", AllowsMergedIf));
6114 FormatStyle ShortMergedIf = AllowsMergedIf;
6115 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006116 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006117 " if (true) return 42;",
6118 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006119 verifyFormat("#define A \\\n"
6120 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006121 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006122 "#define B",
6123 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006124 verifyFormat("#define A \\\n"
6125 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006126 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006127 "g();",
6128 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00006129 verifyFormat("{\n"
6130 "#ifdef A\n"
6131 " // Comment\n"
6132 " if (true) continue;\n"
6133 "#endif\n"
6134 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00006135 " if (true) continue;\n"
6136 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006137 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00006138 ShortMergedIf.ColumnLimit = 29;
6139 verifyFormat("#define A \\\n"
6140 " if (aaaaaaaaaa) return 1; \\\n"
6141 " return 2;",
6142 ShortMergedIf);
6143 ShortMergedIf.ColumnLimit = 28;
6144 verifyFormat("#define A \\\n"
6145 " if (aaaaaaaaaa) \\\n"
6146 " return 1; \\\n"
6147 " return 2;",
6148 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006149}
6150
Manuel Klimekd33516e2013-01-23 10:09:28 +00006151TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00006152 verifyFormat("void f(int *a);");
6153 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00006154 verifyFormat("class A {\n void f(int *a);\n};");
6155 verifyFormat("class A {\n int *a;\n};");
6156 verifyFormat("namespace a {\n"
6157 "namespace b {\n"
6158 "class A {\n"
6159 " void f() {}\n"
6160 " int *a;\n"
6161 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006162 "} // namespace b\n"
6163 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00006164}
6165
Manuel Klimekd33516e2013-01-23 10:09:28 +00006166TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
6167 verifyFormat("while");
6168 verifyFormat("operator");
6169}
6170
Daniel Jasperfda47cd2016-10-31 13:23:00 +00006171TEST_F(FormatTest, SkipsDeeplyNestedLines) {
6172 // This code would be painfully slow to format if we didn't skip it.
6173 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
6174 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6175 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6176 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6177 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6178 "A(1, 1)\n"
6179 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
6180 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6181 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6182 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6183 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6184 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6185 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6186 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6187 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6188 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
6189 // Deeply nested part is untouched, rest is formatted.
6190 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
6191 format(std::string("int i;\n") + Code + "int j;\n",
6192 getLLVMStyle(), IC_ExpectIncomplete));
6193}
6194
Nico Weber7e6a7a12013-01-08 17:56:31 +00006195//===----------------------------------------------------------------------===//
6196// Objective-C tests.
6197//===----------------------------------------------------------------------===//
6198
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006199TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
6200 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
6201 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
6202 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00006203 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006204 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
6205 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
6206 format("-(NSInteger)Method3:(id)anObject;"));
6207 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
6208 format("-(NSInteger)Method4:(id)anObject;"));
6209 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
6210 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
6211 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
6212 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00006213 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
6214 "forAllCells:(BOOL)flag;",
6215 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
6216 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00006217
6218 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00006219 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
6220 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00006221 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
6222 " inRange:(NSRange)range\n"
6223 " outRange:(NSRange)out_range\n"
6224 " outRange1:(NSRange)out_range1\n"
6225 " outRange2:(NSRange)out_range2\n"
6226 " outRange3:(NSRange)out_range3\n"
6227 " outRange4:(NSRange)out_range4\n"
6228 " outRange5:(NSRange)out_range5\n"
6229 " outRange6:(NSRange)out_range6\n"
6230 " outRange7:(NSRange)out_range7\n"
6231 " outRange8:(NSRange)out_range8\n"
6232 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00006233
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00006234 // When the function name has to be wrapped.
6235 FormatStyle Style = getLLVMStyle();
6236 Style.IndentWrappedFunctionNames = false;
6237 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
6238 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
6239 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
6240 "}",
6241 Style);
6242 Style.IndentWrappedFunctionNames = true;
6243 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
6244 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
6245 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
6246 "}",
6247 Style);
6248
Nico Weberd6f962f2013-01-10 20:18:33 +00006249 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00006250 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00006251 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
6252 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00006253 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00006254
Daniel Jasper37194282013-05-28 08:33:00 +00006255 verifyFormat("- (int (*)())foo:(int (*)())f;");
6256 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00006257
6258 // If there's no return type (very rare in practice!), LLVM and Google style
6259 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00006260 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00006261 verifyFormat("- foo:(int)f;");
6262 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006263}
6264
Nico Weber0588b502013-02-07 00:19:29 +00006265
Alexander Kornienko64a42b82014-04-15 14:52:43 +00006266TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00006267 EXPECT_EQ("\"some text \"\n"
6268 "\"other\";",
6269 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00006270 EXPECT_EQ("\"some text \"\n"
6271 "\"other\";",
6272 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006273 EXPECT_EQ(
6274 "#define A \\\n"
6275 " \"some \" \\\n"
6276 " \"text \" \\\n"
6277 " \"other\";",
6278 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
6279 EXPECT_EQ(
6280 "#define A \\\n"
6281 " \"so \" \\\n"
6282 " \"text \" \\\n"
6283 " \"other\";",
6284 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
6285
6286 EXPECT_EQ("\"some text\"",
6287 format("\"some text\"", getLLVMStyleWithColumns(1)));
6288 EXPECT_EQ("\"some text\"",
6289 format("\"some text\"", getLLVMStyleWithColumns(11)));
6290 EXPECT_EQ("\"some \"\n"
6291 "\"text\"",
6292 format("\"some text\"", getLLVMStyleWithColumns(10)));
6293 EXPECT_EQ("\"some \"\n"
6294 "\"text\"",
6295 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00006296 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00006297 "\" tex\"\n"
6298 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00006299 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00006300 EXPECT_EQ("\"some\"\n"
6301 "\" tex\"\n"
6302 "\" and\"",
6303 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
6304 EXPECT_EQ("\"some\"\n"
6305 "\"/tex\"\n"
6306 "\"/and\"",
6307 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006308
6309 EXPECT_EQ("variable =\n"
6310 " \"long string \"\n"
6311 " \"literal\";",
6312 format("variable = \"long string literal\";",
6313 getLLVMStyleWithColumns(20)));
6314
6315 EXPECT_EQ("variable = f(\n"
6316 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006317 " \"literal\",\n"
6318 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00006319 " loooooooooooooooooooong);",
6320 format("variable = f(\"long string literal\", short, "
6321 "loooooooooooooooooooong);",
6322 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00006323
Daniel Jaspera44991332015-04-29 13:06:49 +00006324 EXPECT_EQ(
6325 "f(g(\"long string \"\n"
6326 " \"literal\"),\n"
6327 " b);",
6328 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00006329 EXPECT_EQ("f(g(\"long string \"\n"
6330 " \"literal\",\n"
6331 " a),\n"
6332 " b);",
6333 format("f(g(\"long string literal\", a), b);",
6334 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006335 EXPECT_EQ(
6336 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00006337 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00006338 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
6339 EXPECT_EQ("f(\"one two three four five six \"\n"
6340 " \"seven\".split(\n"
6341 " really_looooong_variable));",
6342 format("f(\"one two three four five six seven\"."
6343 "split(really_looooong_variable));",
6344 getLLVMStyleWithColumns(33)));
6345
6346 EXPECT_EQ("f(\"some \"\n"
6347 " \"text\",\n"
6348 " other);",
6349 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00006350
6351 // Only break as a last resort.
6352 verifyFormat(
6353 "aaaaaaaaaaaaaaaaaaaa(\n"
6354 " aaaaaaaaaaaaaaaaaaaa,\n"
6355 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00006356
Daniel Jaspera44991332015-04-29 13:06:49 +00006357 EXPECT_EQ("\"splitmea\"\n"
6358 "\"trandomp\"\n"
6359 "\"oint\"",
6360 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00006361
Daniel Jaspera44991332015-04-29 13:06:49 +00006362 EXPECT_EQ("\"split/\"\n"
6363 "\"pathat/\"\n"
6364 "\"slashes\"",
6365 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006366
Daniel Jaspera44991332015-04-29 13:06:49 +00006367 EXPECT_EQ("\"split/\"\n"
6368 "\"pathat/\"\n"
6369 "\"slashes\"",
6370 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00006371 EXPECT_EQ("\"split at \"\n"
6372 "\"spaces/at/\"\n"
6373 "\"slashes.at.any$\"\n"
6374 "\"non-alphanumeric%\"\n"
6375 "\"1111111111characte\"\n"
6376 "\"rs\"",
6377 format("\"split at "
6378 "spaces/at/"
6379 "slashes.at."
6380 "any$non-"
6381 "alphanumeric%"
6382 "1111111111characte"
6383 "rs\"",
6384 getLLVMStyleWithColumns(20)));
6385
Daniel Jasper5aad4e52013-07-12 11:37:05 +00006386 // Verify that splitting the strings understands
6387 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00006388 EXPECT_EQ(
6389 "aaaaaaaaaaaa(\n"
6390 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
6391 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
6392 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
6393 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
6394 "aaaaaaaaaaaaaaaaaaaaaa\");",
6395 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00006396 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6397 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
6398 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
6399 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
6400 "aaaaaaaaaaaaaaaaaaaaaa\";",
6401 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00006402 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6403 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
6404 format("llvm::outs() << "
6405 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
6406 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00006407 EXPECT_EQ("ffff(\n"
6408 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6409 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
6410 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
6411 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
6412 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00006413
Daniel Jaspere1a7b762016-02-01 11:21:02 +00006414 FormatStyle Style = getLLVMStyleWithColumns(12);
6415 Style.BreakStringLiterals = false;
6416 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
6417
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006418 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
6419 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00006420 EXPECT_EQ("#define A \\\n"
6421 " \"some \" \\\n"
6422 " \"text \" \\\n"
6423 " \"other\";",
6424 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006425}
6426
Manuel Klimek9e321992015-07-28 15:50:24 +00006427TEST_F(FormatTest, FullyRemoveEmptyLines) {
6428 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
6429 NoEmptyLines.MaxEmptyLinesToKeep = 0;
6430 EXPECT_EQ("int i = a(b());",
6431 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
6432}
6433
Alexander Kornienko64a42b82014-04-15 14:52:43 +00006434TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
6435 EXPECT_EQ(
6436 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
6437 "(\n"
6438 " \"x\t\");",
6439 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
6440 "aaaaaaa("
6441 "\"x\t\");"));
6442}
6443
Daniel Jasper174b0122014-01-09 14:18:12 +00006444TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00006445 EXPECT_EQ(
6446 "u8\"utf8 string \"\n"
6447 "u8\"literal\";",
6448 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
6449 EXPECT_EQ(
6450 "u\"utf16 string \"\n"
6451 "u\"literal\";",
6452 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
6453 EXPECT_EQ(
6454 "U\"utf32 string \"\n"
6455 "U\"literal\";",
6456 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
6457 EXPECT_EQ("L\"wide string \"\n"
6458 "L\"literal\";",
6459 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00006460 EXPECT_EQ("@\"NSString \"\n"
6461 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00006462 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00006463
6464 // This input makes clang-format try to split the incomplete unicode escape
6465 // sequence, which used to lead to a crasher.
6466 verifyNoCrash(
6467 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
6468 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00006469}
6470
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00006471TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
6472 FormatStyle Style = getGoogleStyleWithColumns(15);
6473 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
6474 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
6475 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
6476 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
6477 EXPECT_EQ("u8R\"x(raw literal)x\";",
6478 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00006479}
6480
6481TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
6482 FormatStyle Style = getLLVMStyleWithColumns(20);
6483 EXPECT_EQ(
6484 "_T(\"aaaaaaaaaaaaaa\")\n"
6485 "_T(\"aaaaaaaaaaaaaa\")\n"
6486 "_T(\"aaaaaaaaaaaa\")",
6487 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00006488 EXPECT_EQ("f(x,\n"
6489 " _T(\"aaaaaaaaaaaa\")\n"
6490 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00006491 " z);",
6492 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
6493
6494 // FIXME: Handle embedded spaces in one iteration.
6495 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
6496 // "_T(\"aaaaaaaaaaaaa\")\n"
6497 // "_T(\"aaaaaaaaaaaaa\")\n"
6498 // "_T(\"a\")",
6499 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
6500 // getLLVMStyleWithColumns(20)));
6501 EXPECT_EQ(
6502 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
6503 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00006504 EXPECT_EQ("f(\n"
6505 "#if !TEST\n"
6506 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
6507 "#endif\n"
6508 " );",
6509 format("f(\n"
6510 "#if !TEST\n"
6511 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
6512 "#endif\n"
6513 ");"));
6514 EXPECT_EQ("f(\n"
6515 "\n"
6516 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
6517 format("f(\n"
6518 "\n"
6519 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00006520}
6521
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00006522TEST_F(FormatTest, BreaksStringLiteralOperands) {
6523 // In a function call with two operands, the second can be broken with no line
6524 // break before it.
6525 EXPECT_EQ("func(a, \"long long \"\n"
6526 " \"long long\");",
6527 format("func(a, \"long long long long\");",
6528 getLLVMStyleWithColumns(24)));
6529 // In a function call with three operands, the second must be broken with a
6530 // line break before it.
6531 EXPECT_EQ("func(a,\n"
6532 " \"long long long \"\n"
6533 " \"long\",\n"
6534 " c);",
6535 format("func(a, \"long long long long\", c);",
6536 getLLVMStyleWithColumns(24)));
6537 // In a function call with three operands, the third must be broken with a
6538 // line break before it.
6539 EXPECT_EQ("func(a, b,\n"
6540 " \"long long long \"\n"
6541 " \"long\");",
6542 format("func(a, b, \"long long long long\");",
6543 getLLVMStyleWithColumns(24)));
6544 // In a function call with three operands, both the second and the third must
6545 // be broken with a line break before them.
6546 EXPECT_EQ("func(a,\n"
6547 " \"long long long \"\n"
6548 " \"long\",\n"
6549 " \"long long long \"\n"
6550 " \"long\");",
6551 format("func(a, \"long long long long\", \"long long long long\");",
6552 getLLVMStyleWithColumns(24)));
6553 // In a chain of << with two operands, the second can be broken with no line
6554 // break before it.
6555 EXPECT_EQ("a << \"line line \"\n"
6556 " \"line\";",
6557 format("a << \"line line line\";",
6558 getLLVMStyleWithColumns(20)));
6559 // In a chain of << with three operands, the second can be broken with no line
6560 // break before it.
6561 EXPECT_EQ("abcde << \"line \"\n"
6562 " \"line line\"\n"
6563 " << c;",
6564 format("abcde << \"line line line\" << c;",
6565 getLLVMStyleWithColumns(20)));
6566 // In a chain of << with three operands, the third must be broken with a line
6567 // break before it.
6568 EXPECT_EQ("a << b\n"
6569 " << \"line line \"\n"
6570 " \"line\";",
6571 format("a << b << \"line line line\";",
6572 getLLVMStyleWithColumns(20)));
6573 // In a chain of << with three operands, the second can be broken with no line
6574 // break before it and the third must be broken with a line break before it.
6575 EXPECT_EQ("abcd << \"line line \"\n"
6576 " \"line\"\n"
6577 " << \"line line \"\n"
6578 " \"line\";",
6579 format("abcd << \"line line line\" << \"line line line\";",
6580 getLLVMStyleWithColumns(20)));
6581 // In a chain of binary operators with two operands, the second can be broken
6582 // with no line break before it.
6583 EXPECT_EQ("abcd + \"line line \"\n"
6584 " \"line line\";",
6585 format("abcd + \"line line line line\";",
6586 getLLVMStyleWithColumns(20)));
6587 // In a chain of binary operators with three operands, the second must be
6588 // broken with a line break before it.
6589 EXPECT_EQ("abcd +\n"
6590 " \"line line \"\n"
6591 " \"line line\" +\n"
6592 " e;",
6593 format("abcd + \"line line line line\" + e;",
6594 getLLVMStyleWithColumns(20)));
6595 // In a function call with two operands, with AlignAfterOpenBracket enabled,
6596 // the first must be broken with a line break before it.
6597 FormatStyle Style = getLLVMStyleWithColumns(25);
6598 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
6599 EXPECT_EQ("someFunction(\n"
6600 " \"long long long \"\n"
6601 " \"long\",\n"
6602 " a);",
6603 format("someFunction(\"long long long long\", a);", Style));
6604}
6605
Alexander Kornienko657c67b2013-07-16 21:06:13 +00006606TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006607 EXPECT_EQ(
6608 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6609 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6610 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
6611 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6612 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6613 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
6614}
6615
6616TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
6617 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00006618 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006619 EXPECT_EQ("fffffffffff(g(R\"x(\n"
6620 "multiline raw string literal xxxxxxxxxxxxxx\n"
6621 ")x\",\n"
6622 " a),\n"
6623 " b);",
6624 format("fffffffffff(g(R\"x(\n"
6625 "multiline raw string literal xxxxxxxxxxxxxx\n"
6626 ")x\", a), b);",
6627 getGoogleStyleWithColumns(20)));
6628 EXPECT_EQ("fffffffffff(\n"
6629 " g(R\"x(qqq\n"
6630 "multiline raw string literal xxxxxxxxxxxxxx\n"
6631 ")x\",\n"
6632 " a),\n"
6633 " b);",
6634 format("fffffffffff(g(R\"x(qqq\n"
6635 "multiline raw string literal xxxxxxxxxxxxxx\n"
6636 ")x\", a), b);",
6637 getGoogleStyleWithColumns(20)));
6638
6639 EXPECT_EQ("fffffffffff(R\"x(\n"
6640 "multiline raw string literal xxxxxxxxxxxxxx\n"
6641 ")x\");",
6642 format("fffffffffff(R\"x(\n"
6643 "multiline raw string literal xxxxxxxxxxxxxx\n"
6644 ")x\");",
6645 getGoogleStyleWithColumns(20)));
6646 EXPECT_EQ("fffffffffff(R\"x(\n"
6647 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00006648 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006649 format("fffffffffff(R\"x(\n"
6650 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00006651 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006652 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00006653 EXPECT_EQ("fffffffffff(\n"
6654 " R\"x(\n"
6655 "multiline raw string literal xxxxxxxxxxxxxx\n"
6656 ")x\" +\n"
6657 " bbbbbb);",
6658 format("fffffffffff(\n"
6659 " R\"x(\n"
6660 "multiline raw string literal xxxxxxxxxxxxxx\n"
6661 ")x\" + bbbbbb);",
6662 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00006663}
6664
Alexander Kornienkobe633902013-06-14 11:46:10 +00006665TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00006666 verifyFormat("string a = \"unterminated;");
6667 EXPECT_EQ("function(\"unterminated,\n"
6668 " OtherParameter);",
6669 format("function( \"unterminated,\n"
6670 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00006671}
6672
6673TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006674 FormatStyle Style = getLLVMStyle();
6675 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00006676 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006677 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00006678}
6679
Daniel Jaspera44991332015-04-29 13:06:49 +00006680TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00006681
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00006682TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
6683 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
6684 " \"ddeeefff\");",
6685 format("someFunction(\"aaabbbcccdddeeefff\");",
6686 getLLVMStyleWithColumns(25)));
6687 EXPECT_EQ("someFunction1234567890(\n"
6688 " \"aaabbbcccdddeeefff\");",
6689 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6690 getLLVMStyleWithColumns(26)));
6691 EXPECT_EQ("someFunction1234567890(\n"
6692 " \"aaabbbcccdddeeeff\"\n"
6693 " \"f\");",
6694 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6695 getLLVMStyleWithColumns(25)));
6696 EXPECT_EQ("someFunction1234567890(\n"
6697 " \"aaabbbcccdddeeeff\"\n"
6698 " \"f\");",
6699 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6700 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00006701 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
6702 " \"ddde \"\n"
6703 " \"efff\");",
6704 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00006705 getLLVMStyleWithColumns(25)));
6706 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
6707 " \"ddeeefff\");",
6708 format("someFunction(\"aaabbbccc ddeeefff\");",
6709 getLLVMStyleWithColumns(25)));
6710 EXPECT_EQ("someFunction1234567890(\n"
6711 " \"aaabb \"\n"
6712 " \"cccdddeeefff\");",
6713 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
6714 getLLVMStyleWithColumns(25)));
6715 EXPECT_EQ("#define A \\\n"
6716 " string s = \\\n"
6717 " \"123456789\" \\\n"
6718 " \"0\"; \\\n"
6719 " int i;",
6720 format("#define A string s = \"1234567890\"; int i;",
6721 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00006722 // FIXME: Put additional penalties on breaking at non-whitespace locations.
6723 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
6724 " \"dddeeeff\"\n"
6725 " \"f\");",
6726 format("someFunction(\"aaabbbcc dddeeefff\");",
6727 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00006728}
6729
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006730TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00006731 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
6732 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006733 EXPECT_EQ("\"test\"\n"
6734 "\"\\n\"",
6735 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
6736 EXPECT_EQ("\"tes\\\\\"\n"
6737 "\"n\"",
6738 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
6739 EXPECT_EQ("\"\\\\\\\\\"\n"
6740 "\"\\n\"",
6741 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00006742 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006743 EXPECT_EQ("\"\\uff01\"\n"
6744 "\"test\"",
6745 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
6746 EXPECT_EQ("\"\\Uff01ff02\"",
6747 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
6748 EXPECT_EQ("\"\\x000000000001\"\n"
6749 "\"next\"",
6750 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
6751 EXPECT_EQ("\"\\x000000000001next\"",
6752 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
6753 EXPECT_EQ("\"\\x000000000001\"",
6754 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
6755 EXPECT_EQ("\"test\"\n"
6756 "\"\\000000\"\n"
6757 "\"000001\"",
6758 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
6759 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00006760 "\"00000000\"\n"
6761 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006762 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006763}
6764
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00006765TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
6766 verifyFormat("void f() {\n"
6767 " return g() {}\n"
6768 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006769 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00006770 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00006771 "}");
6772}
6773
Manuel Klimek421147e2014-01-24 09:25:23 +00006774TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
6775 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00006776 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00006777}
6778
Manuel Klimek13b97d82013-05-13 08:42:42 +00006779TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
6780 verifyFormat("class X {\n"
6781 " void f() {\n"
6782 " }\n"
6783 "};",
6784 getLLVMStyleWithColumns(12));
6785}
6786
6787TEST_F(FormatTest, ConfigurableIndentWidth) {
6788 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
6789 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00006790 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00006791 verifyFormat("void f() {\n"
6792 " someFunction();\n"
6793 " if (true) {\n"
6794 " f();\n"
6795 " }\n"
6796 "}",
6797 EightIndent);
6798 verifyFormat("class X {\n"
6799 " void f() {\n"
6800 " }\n"
6801 "};",
6802 EightIndent);
6803 verifyFormat("int x[] = {\n"
6804 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006805 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00006806 EightIndent);
6807}
6808
Alexander Kornienko34a87e82013-06-22 01:35:36 +00006809TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00006810 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00006811 "f();",
6812 getLLVMStyleWithColumns(8));
6813}
6814
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00006815TEST_F(FormatTest, ConfigurableUseOfTab) {
6816 FormatStyle Tab = getLLVMStyleWithColumns(42);
6817 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006818 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00006819 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00006820
6821 EXPECT_EQ("if (aaaaaaaa && // q\n"
6822 " bb)\t\t// w\n"
6823 "\t;",
6824 format("if (aaaaaaaa &&// q\n"
6825 "bb)// w\n"
6826 ";",
6827 Tab));
6828 EXPECT_EQ("if (aaa && bbb) // w\n"
6829 "\t;",
6830 format("if(aaa&&bbb)// w\n"
6831 ";",
6832 Tab));
6833
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00006834 verifyFormat("class X {\n"
6835 "\tvoid f() {\n"
6836 "\t\tsomeFunction(parameter1,\n"
6837 "\t\t\t parameter2);\n"
6838 "\t}\n"
6839 "};",
6840 Tab);
6841 verifyFormat("#define A \\\n"
6842 "\tvoid f() { \\\n"
6843 "\t\tsomeFunction( \\\n"
6844 "\t\t parameter1, \\\n"
6845 "\t\t parameter2); \\\n"
6846 "\t}",
6847 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00006848
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00006849 Tab.TabWidth = 4;
6850 Tab.IndentWidth = 8;
6851 verifyFormat("class TabWidth4Indent8 {\n"
6852 "\t\tvoid f() {\n"
6853 "\t\t\t\tsomeFunction(parameter1,\n"
6854 "\t\t\t\t\t\t\t parameter2);\n"
6855 "\t\t}\n"
6856 "};",
6857 Tab);
6858
6859 Tab.TabWidth = 4;
6860 Tab.IndentWidth = 4;
6861 verifyFormat("class TabWidth4Indent4 {\n"
6862 "\tvoid f() {\n"
6863 "\t\tsomeFunction(parameter1,\n"
6864 "\t\t\t\t\t parameter2);\n"
6865 "\t}\n"
6866 "};",
6867 Tab);
6868
6869 Tab.TabWidth = 8;
6870 Tab.IndentWidth = 4;
6871 verifyFormat("class TabWidth8Indent4 {\n"
6872 " void f() {\n"
6873 "\tsomeFunction(parameter1,\n"
6874 "\t\t parameter2);\n"
6875 " }\n"
6876 "};",
6877 Tab);
6878
Alexander Kornienko39856b72013-09-10 09:38:25 +00006879 Tab.TabWidth = 8;
6880 Tab.IndentWidth = 8;
6881 EXPECT_EQ("/*\n"
6882 "\t a\t\tcomment\n"
6883 "\t in multiple lines\n"
6884 " */",
6885 format(" /*\t \t \n"
6886 " \t \t a\t\tcomment\t \t\n"
6887 " \t \t in multiple lines\t\n"
6888 " \t */",
6889 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00006890
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006891 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00006892 verifyFormat("{\n"
6893 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6894 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6895 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6896 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6897 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6898 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00006899 "};",
6900 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00006901 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00006902 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00006903 "\ta2,\n"
6904 "\ta3\n"
6905 "};",
6906 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006907 EXPECT_EQ("if (aaaaaaaa && // q\n"
6908 " bb) // w\n"
6909 "\t;",
6910 format("if (aaaaaaaa &&// q\n"
6911 "bb)// w\n"
6912 ";",
6913 Tab));
6914 verifyFormat("class X {\n"
6915 "\tvoid f() {\n"
6916 "\t\tsomeFunction(parameter1,\n"
6917 "\t\t parameter2);\n"
6918 "\t}\n"
6919 "};",
6920 Tab);
6921 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00006922 "\tQ(\n"
6923 "\t {\n"
6924 "\t\t int a;\n"
6925 "\t\t someFunction(aaaaaaaa,\n"
6926 "\t\t bbbbbbb);\n"
6927 "\t },\n"
6928 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006929 "}",
6930 Tab);
6931 EXPECT_EQ("{\n"
6932 "\t/* aaaa\n"
6933 "\t bbbb */\n"
6934 "}",
6935 format("{\n"
6936 "/* aaaa\n"
6937 " bbbb */\n"
6938 "}",
6939 Tab));
6940 EXPECT_EQ("{\n"
6941 "\t/*\n"
6942 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6943 "\t bbbbbbbbbbbbb\n"
6944 "\t*/\n"
6945 "}",
6946 format("{\n"
6947 "/*\n"
6948 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
6949 "*/\n"
6950 "}",
6951 Tab));
6952 EXPECT_EQ("{\n"
6953 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6954 "\t// bbbbbbbbbbbbb\n"
6955 "}",
6956 format("{\n"
6957 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
6958 "}",
6959 Tab));
6960 EXPECT_EQ("{\n"
6961 "\t/*\n"
6962 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6963 "\t bbbbbbbbbbbbb\n"
6964 "\t*/\n"
6965 "}",
6966 format("{\n"
6967 "\t/*\n"
6968 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
6969 "\t*/\n"
6970 "}",
6971 Tab));
6972 EXPECT_EQ("{\n"
6973 "\t/*\n"
6974 "\n"
6975 "\t*/\n"
6976 "}",
6977 format("{\n"
6978 "\t/*\n"
6979 "\n"
6980 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00006981 "}",
6982 Tab));
6983 EXPECT_EQ("{\n"
6984 "\t/*\n"
6985 " asdf\n"
6986 "\t*/\n"
6987 "}",
6988 format("{\n"
6989 "\t/*\n"
6990 " asdf\n"
6991 "\t*/\n"
6992 "}",
6993 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006994
6995 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00006996 EXPECT_EQ("/*\n"
6997 " a\t\tcomment\n"
6998 " in multiple lines\n"
6999 " */",
7000 format(" /*\t \t \n"
7001 " \t \t a\t\tcomment\t \t\n"
7002 " \t \t in multiple lines\t\n"
7003 " \t */",
7004 Tab));
7005 EXPECT_EQ("/* some\n"
7006 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007007 format(" \t \t /* some\n"
7008 " \t \t comment */",
7009 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00007010 EXPECT_EQ("int a; /* some\n"
7011 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007012 format(" \t \t int a; /* some\n"
7013 " \t \t comment */",
7014 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00007015
Alexander Kornienko39856b72013-09-10 09:38:25 +00007016 EXPECT_EQ("int a; /* some\n"
7017 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007018 format(" \t \t int\ta; /* some\n"
7019 " \t \t comment */",
7020 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00007021 EXPECT_EQ("f(\"\t\t\"); /* some\n"
7022 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007023 format(" \t \t f(\"\t\t\"); /* some\n"
7024 " \t \t comment */",
7025 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00007026 EXPECT_EQ("{\n"
7027 " /*\n"
7028 " * Comment\n"
7029 " */\n"
7030 " int i;\n"
7031 "}",
7032 format("{\n"
7033 "\t/*\n"
7034 "\t * Comment\n"
7035 "\t */\n"
7036 "\t int i;\n"
7037 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00007038
7039 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
7040 Tab.TabWidth = 8;
7041 Tab.IndentWidth = 8;
7042 EXPECT_EQ("if (aaaaaaaa && // q\n"
7043 " bb) // w\n"
7044 "\t;",
7045 format("if (aaaaaaaa &&// q\n"
7046 "bb)// w\n"
7047 ";",
7048 Tab));
7049 EXPECT_EQ("if (aaa && bbb) // w\n"
7050 "\t;",
7051 format("if(aaa&&bbb)// w\n"
7052 ";",
7053 Tab));
7054 verifyFormat("class X {\n"
7055 "\tvoid f() {\n"
7056 "\t\tsomeFunction(parameter1,\n"
7057 "\t\t\t parameter2);\n"
7058 "\t}\n"
7059 "};",
7060 Tab);
7061 verifyFormat("#define A \\\n"
7062 "\tvoid f() { \\\n"
7063 "\t\tsomeFunction( \\\n"
7064 "\t\t parameter1, \\\n"
7065 "\t\t parameter2); \\\n"
7066 "\t}",
7067 Tab);
7068 Tab.TabWidth = 4;
7069 Tab.IndentWidth = 8;
7070 verifyFormat("class TabWidth4Indent8 {\n"
7071 "\t\tvoid f() {\n"
7072 "\t\t\t\tsomeFunction(parameter1,\n"
7073 "\t\t\t\t\t\t\t parameter2);\n"
7074 "\t\t}\n"
7075 "};",
7076 Tab);
7077 Tab.TabWidth = 4;
7078 Tab.IndentWidth = 4;
7079 verifyFormat("class TabWidth4Indent4 {\n"
7080 "\tvoid f() {\n"
7081 "\t\tsomeFunction(parameter1,\n"
7082 "\t\t\t\t\t parameter2);\n"
7083 "\t}\n"
7084 "};",
7085 Tab);
7086 Tab.TabWidth = 8;
7087 Tab.IndentWidth = 4;
7088 verifyFormat("class TabWidth8Indent4 {\n"
7089 " void f() {\n"
7090 "\tsomeFunction(parameter1,\n"
7091 "\t\t parameter2);\n"
7092 " }\n"
7093 "};",
7094 Tab);
7095 Tab.TabWidth = 8;
7096 Tab.IndentWidth = 8;
7097 EXPECT_EQ("/*\n"
7098 "\t a\t\tcomment\n"
7099 "\t in multiple lines\n"
7100 " */",
7101 format(" /*\t \t \n"
7102 " \t \t a\t\tcomment\t \t\n"
7103 " \t \t in multiple lines\t\n"
7104 " \t */",
7105 Tab));
7106 verifyFormat("{\n"
7107 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7108 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7109 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7110 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7111 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7112 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7113 "};",
7114 Tab);
7115 verifyFormat("enum AA {\n"
7116 "\ta1, // Force multiple lines\n"
7117 "\ta2,\n"
7118 "\ta3\n"
7119 "};",
7120 Tab);
7121 EXPECT_EQ("if (aaaaaaaa && // q\n"
7122 " bb) // w\n"
7123 "\t;",
7124 format("if (aaaaaaaa &&// q\n"
7125 "bb)// w\n"
7126 ";",
7127 Tab));
7128 verifyFormat("class X {\n"
7129 "\tvoid f() {\n"
7130 "\t\tsomeFunction(parameter1,\n"
7131 "\t\t\t parameter2);\n"
7132 "\t}\n"
7133 "};",
7134 Tab);
7135 verifyFormat("{\n"
7136 "\tQ(\n"
7137 "\t {\n"
7138 "\t\t int a;\n"
7139 "\t\t someFunction(aaaaaaaa,\n"
7140 "\t\t\t\t bbbbbbb);\n"
7141 "\t },\n"
7142 "\t p);\n"
7143 "}",
7144 Tab);
7145 EXPECT_EQ("{\n"
7146 "\t/* aaaa\n"
7147 "\t bbbb */\n"
7148 "}",
7149 format("{\n"
7150 "/* aaaa\n"
7151 " bbbb */\n"
7152 "}",
7153 Tab));
7154 EXPECT_EQ("{\n"
7155 "\t/*\n"
7156 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7157 "\t bbbbbbbbbbbbb\n"
7158 "\t*/\n"
7159 "}",
7160 format("{\n"
7161 "/*\n"
7162 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7163 "*/\n"
7164 "}",
7165 Tab));
7166 EXPECT_EQ("{\n"
7167 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7168 "\t// bbbbbbbbbbbbb\n"
7169 "}",
7170 format("{\n"
7171 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7172 "}",
7173 Tab));
7174 EXPECT_EQ("{\n"
7175 "\t/*\n"
7176 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7177 "\t bbbbbbbbbbbbb\n"
7178 "\t*/\n"
7179 "}",
7180 format("{\n"
7181 "\t/*\n"
7182 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7183 "\t*/\n"
7184 "}",
7185 Tab));
7186 EXPECT_EQ("{\n"
7187 "\t/*\n"
7188 "\n"
7189 "\t*/\n"
7190 "}",
7191 format("{\n"
7192 "\t/*\n"
7193 "\n"
7194 "\t*/\n"
7195 "}",
7196 Tab));
7197 EXPECT_EQ("{\n"
7198 "\t/*\n"
7199 " asdf\n"
7200 "\t*/\n"
7201 "}",
7202 format("{\n"
7203 "\t/*\n"
7204 " asdf\n"
7205 "\t*/\n"
7206 "}",
7207 Tab));
7208 EXPECT_EQ("/*\n"
7209 "\t a\t\tcomment\n"
7210 "\t in multiple lines\n"
7211 " */",
7212 format(" /*\t \t \n"
7213 " \t \t a\t\tcomment\t \t\n"
7214 " \t \t in multiple lines\t\n"
7215 " \t */",
7216 Tab));
7217 EXPECT_EQ("/* some\n"
7218 " comment */",
7219 format(" \t \t /* some\n"
7220 " \t \t comment */",
7221 Tab));
7222 EXPECT_EQ("int a; /* some\n"
7223 " comment */",
7224 format(" \t \t int a; /* some\n"
7225 " \t \t comment */",
7226 Tab));
7227 EXPECT_EQ("int a; /* some\n"
7228 "comment */",
7229 format(" \t \t int\ta; /* some\n"
7230 " \t \t comment */",
7231 Tab));
7232 EXPECT_EQ("f(\"\t\t\"); /* some\n"
7233 " comment */",
7234 format(" \t \t f(\"\t\t\"); /* some\n"
7235 " \t \t comment */",
7236 Tab));
7237 EXPECT_EQ("{\n"
7238 " /*\n"
7239 " * Comment\n"
7240 " */\n"
7241 " int i;\n"
7242 "}",
7243 format("{\n"
7244 "\t/*\n"
7245 "\t * Comment\n"
7246 "\t */\n"
7247 "\t int i;\n"
7248 "}"));
7249 Tab.AlignConsecutiveAssignments = true;
7250 Tab.AlignConsecutiveDeclarations = true;
7251 Tab.TabWidth = 4;
7252 Tab.IndentWidth = 4;
7253 verifyFormat("class Assign {\n"
7254 "\tvoid f() {\n"
7255 "\t\tint x = 123;\n"
7256 "\t\tint random = 4;\n"
7257 "\t\tstd::string alphabet =\n"
7258 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
7259 "\t}\n"
7260 "};",
7261 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007262}
7263
Alexander Kornienko917f9e02013-09-10 12:29:48 +00007264TEST_F(FormatTest, CalculatesOriginalColumn) {
7265 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7266 "q\"; /* some\n"
7267 " comment */",
7268 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7269 "q\"; /* some\n"
7270 " comment */",
7271 getLLVMStyle()));
7272 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
7273 "/* some\n"
7274 " comment */",
7275 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
7276 " /* some\n"
7277 " comment */",
7278 getLLVMStyle()));
7279 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7280 "qqq\n"
7281 "/* some\n"
7282 " comment */",
7283 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7284 "qqq\n"
7285 " /* some\n"
7286 " comment */",
7287 getLLVMStyle()));
7288 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7289 "wwww; /* some\n"
7290 " comment */",
7291 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7292 "wwww; /* some\n"
7293 " comment */",
7294 getLLVMStyle()));
7295}
7296
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007297TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00007298 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007299 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00007300
7301 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007302 " continue;",
7303 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007304 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007305 " continue;",
7306 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007307 verifyFormat("if(true)\n"
7308 " f();\n"
7309 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007310 " f();",
7311 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007312 verifyFormat("do {\n"
7313 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007314 "} while(something());",
7315 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007316 verifyFormat("switch(x) {\n"
7317 "default:\n"
7318 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007319 "}",
7320 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00007321 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00007322 verifyFormat("size_t x = sizeof(x);", NoSpace);
7323 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
7324 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
7325 verifyFormat("alignas(128) char a[128];", NoSpace);
7326 verifyFormat("size_t x = alignof(MyType);", NoSpace);
7327 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
7328 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00007329 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00007330 verifyFormat("T A::operator()();", NoSpace);
7331 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007332
7333 FormatStyle Space = getLLVMStyle();
7334 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
7335
7336 verifyFormat("int f ();", Space);
7337 verifyFormat("void f (int a, T b) {\n"
7338 " while (true)\n"
7339 " continue;\n"
7340 "}",
7341 Space);
7342 verifyFormat("if (true)\n"
7343 " f ();\n"
7344 "else if (true)\n"
7345 " f ();",
7346 Space);
7347 verifyFormat("do {\n"
7348 " do_something ();\n"
7349 "} while (something ());",
7350 Space);
7351 verifyFormat("switch (x) {\n"
7352 "default:\n"
7353 " break;\n"
7354 "}",
7355 Space);
7356 verifyFormat("A::A () : a (1) {}", Space);
7357 verifyFormat("void f () __attribute__ ((asdf));", Space);
7358 verifyFormat("*(&a + 1);\n"
7359 "&((&a)[1]);\n"
7360 "a[(b + c) * d];\n"
7361 "(((a + 1) * 2) + 3) * 4;",
7362 Space);
7363 verifyFormat("#define A(x) x", Space);
7364 verifyFormat("#define A (x) x", Space);
7365 verifyFormat("#if defined(x)\n"
7366 "#endif",
7367 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00007368 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00007369 verifyFormat("size_t x = sizeof (x);", Space);
7370 verifyFormat("auto f (int x) -> decltype (x);", Space);
7371 verifyFormat("int f (T x) noexcept (x.create ());", Space);
7372 verifyFormat("alignas (128) char a[128];", Space);
7373 verifyFormat("size_t x = alignof (MyType);", Space);
7374 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
7375 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00007376 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00007377 verifyFormat("T A::operator() ();", Space);
7378 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007379}
7380
7381TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
7382 FormatStyle Spaces = getLLVMStyle();
7383
7384 Spaces.SpacesInParentheses = true;
7385 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007386 verifyFormat("call();", Spaces);
7387 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00007388 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
7389 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007390 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007391 " continue;",
7392 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007393 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007394 " continue;",
7395 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007396 verifyFormat("if ( true )\n"
7397 " f();\n"
7398 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007399 " f();",
7400 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007401 verifyFormat("do {\n"
7402 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007403 "} while ( something() );",
7404 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007405 verifyFormat("switch ( x ) {\n"
7406 "default:\n"
7407 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007408 "}",
7409 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007410
7411 Spaces.SpacesInParentheses = false;
7412 Spaces.SpacesInCStyleCastParentheses = true;
7413 verifyFormat("Type *A = ( Type * )P;", Spaces);
7414 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
7415 verifyFormat("x = ( int32 )y;", Spaces);
7416 verifyFormat("int a = ( int )(2.0f);", Spaces);
7417 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
7418 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
7419 verifyFormat("#define x (( int )-1)", Spaces);
7420
Daniel Jasper92e09822015-03-18 12:59:19 +00007421 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00007422 Spaces.SpacesInParentheses = false;
7423 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00007424 Spaces.SpacesInCStyleCastParentheses = true;
7425 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007426 verifyFormat("call( );", Spaces);
7427 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007428 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007429 " continue;",
7430 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007431 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007432 " continue;",
7433 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007434 verifyFormat("if (true)\n"
7435 " f( );\n"
7436 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007437 " f( );",
7438 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007439 verifyFormat("do {\n"
7440 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007441 "} while (something( ));",
7442 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007443 verifyFormat("switch (x) {\n"
7444 "default:\n"
7445 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007446 "}",
7447 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007448
Daniel Jasper92e09822015-03-18 12:59:19 +00007449 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007450 Spaces.SpaceAfterCStyleCast = true;
7451 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007452 verifyFormat("call( );", Spaces);
7453 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007454 verifyFormat("while (( bool ) 1)\n"
7455 " continue;",
7456 Spaces);
7457 verifyFormat("for (;;)\n"
7458 " continue;",
7459 Spaces);
7460 verifyFormat("if (true)\n"
7461 " f( );\n"
7462 "else if (true)\n"
7463 " f( );",
7464 Spaces);
7465 verifyFormat("do {\n"
7466 " do_something(( int ) i);\n"
7467 "} while (something( ));",
7468 Spaces);
7469 verifyFormat("switch (x) {\n"
7470 "default:\n"
7471 " break;\n"
7472 "}",
7473 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007474
7475 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007476 Spaces.SpacesInCStyleCastParentheses = false;
7477 Spaces.SpaceAfterCStyleCast = true;
7478 verifyFormat("while ((bool) 1)\n"
7479 " continue;",
7480 Spaces);
7481 verifyFormat("do {\n"
7482 " do_something((int) i);\n"
7483 "} while (something( ));",
7484 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007485}
7486
Daniel Jasperad981f82014-08-26 11:41:14 +00007487TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
7488 verifyFormat("int a[5];");
7489 verifyFormat("a[3] += 42;");
7490
7491 FormatStyle Spaces = getLLVMStyle();
7492 Spaces.SpacesInSquareBrackets = true;
7493 // Lambdas unchanged.
7494 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
7495 verifyFormat("return [i, args...] {};", Spaces);
7496
7497 // Not lambdas.
7498 verifyFormat("int a[ 5 ];", Spaces);
7499 verifyFormat("a[ 3 ] += 42;", Spaces);
7500 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
7501 verifyFormat("double &operator[](int i) { return 0; }\n"
7502 "int i;",
7503 Spaces);
7504 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
7505 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
7506 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
7507}
7508
Daniel Jasperd94bff32013-09-25 15:15:02 +00007509TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
7510 verifyFormat("int a = 5;");
7511 verifyFormat("a += 42;");
7512 verifyFormat("a or_eq 8;");
7513
7514 FormatStyle Spaces = getLLVMStyle();
7515 Spaces.SpaceBeforeAssignmentOperators = false;
7516 verifyFormat("int a= 5;", Spaces);
7517 verifyFormat("a+= 42;", Spaces);
7518 verifyFormat("a or_eq 8;", Spaces);
7519}
7520
Daniel Jaspera44991332015-04-29 13:06:49 +00007521TEST_F(FormatTest, AlignConsecutiveAssignments) {
7522 FormatStyle Alignment = getLLVMStyle();
7523 Alignment.AlignConsecutiveAssignments = false;
7524 verifyFormat("int a = 5;\n"
7525 "int oneTwoThree = 123;",
7526 Alignment);
7527 verifyFormat("int a = 5;\n"
7528 "int oneTwoThree = 123;",
7529 Alignment);
7530
7531 Alignment.AlignConsecutiveAssignments = true;
7532 verifyFormat("int a = 5;\n"
7533 "int oneTwoThree = 123;",
7534 Alignment);
7535 verifyFormat("int a = method();\n"
7536 "int oneTwoThree = 133;",
7537 Alignment);
7538 verifyFormat("a &= 5;\n"
7539 "bcd *= 5;\n"
7540 "ghtyf += 5;\n"
7541 "dvfvdb -= 5;\n"
7542 "a /= 5;\n"
7543 "vdsvsv %= 5;\n"
7544 "sfdbddfbdfbb ^= 5;\n"
7545 "dvsdsv |= 5;\n"
7546 "int dsvvdvsdvvv = 123;",
7547 Alignment);
7548 verifyFormat("int i = 1, j = 10;\n"
7549 "something = 2000;",
7550 Alignment);
7551 verifyFormat("something = 2000;\n"
7552 "int i = 1, j = 10;\n",
7553 Alignment);
7554 verifyFormat("something = 2000;\n"
7555 "another = 911;\n"
7556 "int i = 1, j = 10;\n"
7557 "oneMore = 1;\n"
7558 "i = 2;",
7559 Alignment);
7560 verifyFormat("int a = 5;\n"
7561 "int one = 1;\n"
7562 "method();\n"
7563 "int oneTwoThree = 123;\n"
7564 "int oneTwo = 12;",
7565 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00007566 verifyFormat("int oneTwoThree = 123;\n"
7567 "int oneTwo = 12;\n"
7568 "method();\n",
7569 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00007570 verifyFormat("int oneTwoThree = 123; // comment\n"
7571 "int oneTwo = 12; // comment",
7572 Alignment);
7573 EXPECT_EQ("int a = 5;\n"
7574 "\n"
7575 "int oneTwoThree = 123;",
7576 format("int a = 5;\n"
7577 "\n"
7578 "int oneTwoThree= 123;",
7579 Alignment));
7580 EXPECT_EQ("int a = 5;\n"
7581 "int one = 1;\n"
7582 "\n"
7583 "int oneTwoThree = 123;",
7584 format("int a = 5;\n"
7585 "int one = 1;\n"
7586 "\n"
7587 "int oneTwoThree = 123;",
7588 Alignment));
7589 EXPECT_EQ("int a = 5;\n"
7590 "int one = 1;\n"
7591 "\n"
7592 "int oneTwoThree = 123;\n"
7593 "int oneTwo = 12;",
7594 format("int a = 5;\n"
7595 "int one = 1;\n"
7596 "\n"
7597 "int oneTwoThree = 123;\n"
7598 "int oneTwo = 12;",
7599 Alignment));
7600 Alignment.AlignEscapedNewlinesLeft = true;
7601 verifyFormat("#define A \\\n"
7602 " int aaaa = 12; \\\n"
7603 " int b = 23; \\\n"
7604 " int ccc = 234; \\\n"
7605 " int dddddddddd = 2345;",
7606 Alignment);
7607 Alignment.AlignEscapedNewlinesLeft = false;
7608 verifyFormat("#define A "
7609 " \\\n"
7610 " int aaaa = 12; "
7611 " \\\n"
7612 " int b = 23; "
7613 " \\\n"
7614 " int ccc = 234; "
7615 " \\\n"
7616 " int dddddddddd = 2345;",
7617 Alignment);
7618 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
7619 "k = 4, int l = 5,\n"
7620 " int m = 6) {\n"
7621 " int j = 10;\n"
7622 " otherThing = 1;\n"
7623 "}",
7624 Alignment);
7625 verifyFormat("void SomeFunction(int parameter = 0) {\n"
7626 " int i = 1;\n"
7627 " int j = 2;\n"
7628 " int big = 10000;\n"
7629 "}",
7630 Alignment);
7631 verifyFormat("class C {\n"
7632 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00007633 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007634 " virtual void f() = 0;\n"
7635 "};",
7636 Alignment);
7637 verifyFormat("int i = 1;\n"
7638 "if (SomeType t = getSomething()) {\n"
7639 "}\n"
7640 "int j = 2;\n"
7641 "int big = 10000;",
7642 Alignment);
7643 verifyFormat("int j = 7;\n"
7644 "for (int k = 0; k < N; ++k) {\n"
7645 "}\n"
7646 "int j = 2;\n"
7647 "int big = 10000;\n"
7648 "}",
7649 Alignment);
7650 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7651 verifyFormat("int i = 1;\n"
7652 "LooooooooooongType loooooooooooooooooooooongVariable\n"
7653 " = someLooooooooooooooooongFunction();\n"
7654 "int j = 2;",
7655 Alignment);
7656 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7657 verifyFormat("int i = 1;\n"
7658 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
7659 " someLooooooooooooooooongFunction();\n"
7660 "int j = 2;",
7661 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00007662
7663 verifyFormat("auto lambda = []() {\n"
7664 " auto i = 0;\n"
7665 " return 0;\n"
7666 "};\n"
7667 "int i = 0;\n"
7668 "auto v = type{\n"
7669 " i = 1, //\n"
7670 " (i = 2), //\n"
7671 " i = 3 //\n"
7672 "};",
7673 Alignment);
7674
Daniel Jaspera44991332015-04-29 13:06:49 +00007675 verifyFormat(
7676 "int i = 1;\n"
7677 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
7678 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00007679 "int j = 2;",
Daniel Jaspera44991332015-04-29 13:06:49 +00007680 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00007681
7682 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
7683 " typename B = very_long_type_name_1,\n"
7684 " typename T_2 = very_long_type_name_2>\n"
7685 "auto foo() {}\n",
7686 Alignment);
7687 verifyFormat("int a, b = 1;\n"
7688 "int c = 2;\n"
7689 "int dd = 3;\n",
7690 Alignment);
7691 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
7692 "float b[1][] = {{3.f}};\n",
7693 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00007694 verifyFormat("for (int i = 0; i < 1; i++)\n"
7695 " int x = 1;\n",
7696 Alignment);
7697 verifyFormat("for (i = 0; i < 1; i++)\n"
7698 " x = 1;\n"
7699 "y = 1;\n",
7700 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00007701}
7702
Daniel Jaspere12597c2015-10-01 10:06:54 +00007703TEST_F(FormatTest, AlignConsecutiveDeclarations) {
7704 FormatStyle Alignment = getLLVMStyle();
7705 Alignment.AlignConsecutiveDeclarations = false;
7706 verifyFormat("float const a = 5;\n"
7707 "int oneTwoThree = 123;",
7708 Alignment);
7709 verifyFormat("int a = 5;\n"
7710 "float const oneTwoThree = 123;",
7711 Alignment);
7712
7713 Alignment.AlignConsecutiveDeclarations = true;
7714 verifyFormat("float const a = 5;\n"
7715 "int oneTwoThree = 123;",
7716 Alignment);
7717 verifyFormat("int a = method();\n"
7718 "float const oneTwoThree = 133;",
7719 Alignment);
7720 verifyFormat("int i = 1, j = 10;\n"
7721 "something = 2000;",
7722 Alignment);
7723 verifyFormat("something = 2000;\n"
7724 "int i = 1, j = 10;\n",
7725 Alignment);
7726 verifyFormat("float something = 2000;\n"
7727 "double another = 911;\n"
7728 "int i = 1, j = 10;\n"
7729 "const int *oneMore = 1;\n"
7730 "unsigned i = 2;",
7731 Alignment);
7732 verifyFormat("float a = 5;\n"
7733 "int one = 1;\n"
7734 "method();\n"
7735 "const double oneTwoThree = 123;\n"
7736 "const unsigned int oneTwo = 12;",
7737 Alignment);
7738 verifyFormat("int oneTwoThree{0}; // comment\n"
7739 "unsigned oneTwo; // comment",
7740 Alignment);
7741 EXPECT_EQ("float const a = 5;\n"
7742 "\n"
7743 "int oneTwoThree = 123;",
7744 format("float const a = 5;\n"
7745 "\n"
7746 "int oneTwoThree= 123;",
7747 Alignment));
7748 EXPECT_EQ("float a = 5;\n"
7749 "int one = 1;\n"
7750 "\n"
7751 "unsigned oneTwoThree = 123;",
7752 format("float a = 5;\n"
7753 "int one = 1;\n"
7754 "\n"
7755 "unsigned oneTwoThree = 123;",
7756 Alignment));
7757 EXPECT_EQ("float a = 5;\n"
7758 "int one = 1;\n"
7759 "\n"
7760 "unsigned oneTwoThree = 123;\n"
7761 "int oneTwo = 12;",
7762 format("float a = 5;\n"
7763 "int one = 1;\n"
7764 "\n"
7765 "unsigned oneTwoThree = 123;\n"
7766 "int oneTwo = 12;",
7767 Alignment));
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00007768 // Function prototype alignment
7769 verifyFormat("int a();\n"
7770 "double b();",
7771 Alignment);
7772 verifyFormat("int a(int x);\n"
7773 "double b();",
7774 Alignment);
7775 unsigned OldColumnLimit = Alignment.ColumnLimit;
7776 // We need to set ColumnLimit to zero, in order to stress nested alignments,
7777 // otherwise the function parameters will be re-flowed onto a single line.
7778 Alignment.ColumnLimit = 0;
7779 EXPECT_EQ("int a(int x,\n"
7780 " float y);\n"
7781 "double b(int x,\n"
7782 " double y);",
7783 format("int a(int x,\n"
7784 " float y);\n"
7785 "double b(int x,\n"
7786 " double y);",
7787 Alignment));
7788 // This ensures that function parameters of function declarations are
7789 // correctly indented when their owning functions are indented.
7790 // The failure case here is for 'double y' to not be indented enough.
7791 EXPECT_EQ("double a(int x);\n"
7792 "int b(int y,\n"
7793 " double z);",
7794 format("double a(int x);\n"
7795 "int b(int y,\n"
7796 " double z);",
7797 Alignment));
7798 // Set ColumnLimit low so that we induce wrapping immediately after
7799 // the function name and opening paren.
7800 Alignment.ColumnLimit = 13;
7801 verifyFormat("int function(\n"
7802 " int x,\n"
7803 " bool y);",
7804 Alignment);
7805 Alignment.ColumnLimit = OldColumnLimit;
7806 // Ensure function pointers don't screw up recursive alignment
7807 verifyFormat("int a(int x, void (*fp)(int y));\n"
7808 "double b();",
7809 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00007810 Alignment.AlignConsecutiveAssignments = true;
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00007811 // Ensure recursive alignment is broken by function braces, so that the
7812 // "a = 1" does not align with subsequent assignments inside the function
7813 // body.
7814 verifyFormat("int func(int a = 1) {\n"
7815 " int b = 2;\n"
7816 " int cc = 3;\n"
7817 "}",
7818 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00007819 verifyFormat("float something = 2000;\n"
7820 "double another = 911;\n"
7821 "int i = 1, j = 10;\n"
7822 "const int *oneMore = 1;\n"
7823 "unsigned i = 2;",
7824 Alignment);
7825 verifyFormat("int oneTwoThree = {0}; // comment\n"
7826 "unsigned oneTwo = 0; // comment",
7827 Alignment);
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00007828 // Make sure that scope is correctly tracked, in the absence of braces
7829 verifyFormat("for (int i = 0; i < n; i++)\n"
7830 " j = i;\n"
7831 "double x = 1;\n",
7832 Alignment);
7833 verifyFormat("if (int i = 0)\n"
7834 " j = i;\n"
7835 "double x = 1;\n",
7836 Alignment);
7837 // Ensure operator[] and operator() are comprehended
7838 verifyFormat("struct test {\n"
7839 " long long int foo();\n"
7840 " int operator[](int a);\n"
7841 " double bar();\n"
7842 "};\n",
7843 Alignment);
7844 verifyFormat("struct test {\n"
7845 " long long int foo();\n"
7846 " int operator()(int a);\n"
7847 " double bar();\n"
7848 "};\n",
7849 Alignment);
Daniel Jaspere12597c2015-10-01 10:06:54 +00007850 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
7851 " int const i = 1;\n"
7852 " int * j = 2;\n"
7853 " int big = 10000;\n"
7854 "\n"
7855 " unsigned oneTwoThree = 123;\n"
7856 " int oneTwo = 12;\n"
7857 " method();\n"
7858 " float k = 2;\n"
7859 " int ll = 10000;\n"
7860 "}",
7861 format("void SomeFunction(int parameter= 0) {\n"
7862 " int const i= 1;\n"
7863 " int *j=2;\n"
7864 " int big = 10000;\n"
7865 "\n"
7866 "unsigned oneTwoThree =123;\n"
7867 "int oneTwo = 12;\n"
7868 " method();\n"
7869 "float k= 2;\n"
7870 "int ll=10000;\n"
7871 "}",
7872 Alignment));
7873 Alignment.AlignConsecutiveAssignments = false;
7874 Alignment.AlignEscapedNewlinesLeft = true;
7875 verifyFormat("#define A \\\n"
7876 " int aaaa = 12; \\\n"
7877 " float b = 23; \\\n"
7878 " const int ccc = 234; \\\n"
7879 " unsigned dddddddddd = 2345;",
7880 Alignment);
7881 Alignment.AlignEscapedNewlinesLeft = false;
7882 Alignment.ColumnLimit = 30;
7883 verifyFormat("#define A \\\n"
7884 " int aaaa = 12; \\\n"
7885 " float b = 23; \\\n"
7886 " const int ccc = 234; \\\n"
7887 " int dddddddddd = 2345;",
7888 Alignment);
7889 Alignment.ColumnLimit = 80;
7890 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
7891 "k = 4, int l = 5,\n"
7892 " int m = 6) {\n"
7893 " const int j = 10;\n"
7894 " otherThing = 1;\n"
7895 "}",
7896 Alignment);
7897 verifyFormat("void SomeFunction(int parameter = 0) {\n"
7898 " int const i = 1;\n"
7899 " int * j = 2;\n"
7900 " int big = 10000;\n"
7901 "}",
7902 Alignment);
7903 verifyFormat("class C {\n"
7904 "public:\n"
7905 " int i = 1;\n"
7906 " virtual void f() = 0;\n"
7907 "};",
7908 Alignment);
7909 verifyFormat("float i = 1;\n"
7910 "if (SomeType t = getSomething()) {\n"
7911 "}\n"
7912 "const unsigned j = 2;\n"
7913 "int big = 10000;",
7914 Alignment);
7915 verifyFormat("float j = 7;\n"
7916 "for (int k = 0; k < N; ++k) {\n"
7917 "}\n"
7918 "unsigned j = 2;\n"
7919 "int big = 10000;\n"
7920 "}",
7921 Alignment);
7922 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7923 verifyFormat("float i = 1;\n"
7924 "LooooooooooongType loooooooooooooooooooooongVariable\n"
7925 " = someLooooooooooooooooongFunction();\n"
7926 "int j = 2;",
7927 Alignment);
7928 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7929 verifyFormat("int i = 1;\n"
7930 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
7931 " someLooooooooooooooooongFunction();\n"
7932 "int j = 2;",
7933 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00007934
7935 Alignment.AlignConsecutiveAssignments = true;
7936 verifyFormat("auto lambda = []() {\n"
7937 " auto ii = 0;\n"
7938 " float j = 0;\n"
7939 " return 0;\n"
7940 "};\n"
7941 "int i = 0;\n"
7942 "float i2 = 0;\n"
7943 "auto v = type{\n"
7944 " i = 1, //\n"
7945 " (i = 2), //\n"
7946 " i = 3 //\n"
7947 "};",
7948 Alignment);
7949 Alignment.AlignConsecutiveAssignments = false;
7950
Daniel Jaspere12597c2015-10-01 10:06:54 +00007951 verifyFormat(
7952 "int i = 1;\n"
7953 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
7954 " loooooooooooooooooooooongParameterB);\n"
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00007955 "int j = 2;",
Daniel Jaspere12597c2015-10-01 10:06:54 +00007956 Alignment);
7957
7958 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
7959 // We expect declarations and assignments to align, as long as it doesn't
Nikola Smiljanic92b397f2017-03-23 02:51:25 +00007960 // exceed the column limit, starting a new alignment sequence whenever it
Daniel Jaspere12597c2015-10-01 10:06:54 +00007961 // happens.
7962 Alignment.AlignConsecutiveAssignments = true;
7963 Alignment.ColumnLimit = 30;
7964 verifyFormat("float ii = 1;\n"
7965 "unsigned j = 2;\n"
7966 "int someVerylongVariable = 1;\n"
7967 "AnotherLongType ll = 123456;\n"
7968 "VeryVeryLongType k = 2;\n"
7969 "int myvar = 1;",
7970 Alignment);
7971 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00007972 Alignment.AlignConsecutiveAssignments = false;
7973
7974 verifyFormat(
7975 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
7976 " typename LongType, typename B>\n"
7977 "auto foo() {}\n",
7978 Alignment);
7979 verifyFormat("float a, b = 1;\n"
7980 "int c = 2;\n"
7981 "int dd = 3;\n",
7982 Alignment);
7983 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
7984 "float b[1][] = {{3.f}};\n",
7985 Alignment);
7986 Alignment.AlignConsecutiveAssignments = true;
7987 verifyFormat("float a, b = 1;\n"
7988 "int c = 2;\n"
7989 "int dd = 3;\n",
7990 Alignment);
7991 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
7992 "float b[1][] = {{3.f}};\n",
7993 Alignment);
7994 Alignment.AlignConsecutiveAssignments = false;
7995
7996 Alignment.ColumnLimit = 30;
7997 Alignment.BinPackParameters = false;
7998 verifyFormat("void foo(float a,\n"
7999 " float b,\n"
8000 " int c,\n"
8001 " uint32_t *d) {\n"
8002 " int * e = 0;\n"
8003 " float f = 0;\n"
8004 " double g = 0;\n"
8005 "}\n"
8006 "void bar(ino_t a,\n"
8007 " int b,\n"
8008 " uint32_t *c,\n"
8009 " bool d) {}\n",
8010 Alignment);
8011 Alignment.BinPackParameters = true;
8012 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00008013}
8014
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008015TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008016 FormatStyle LinuxBraceStyle = getLLVMStyle();
8017 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008018 verifyFormat("namespace a\n"
8019 "{\n"
8020 "class A\n"
8021 "{\n"
8022 " void f()\n"
8023 " {\n"
8024 " if (true) {\n"
8025 " a();\n"
8026 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00008027 " } else {\n"
8028 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008029 " }\n"
8030 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008031 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008032 "};\n"
8033 "struct B {\n"
8034 " int x;\n"
8035 "};\n"
8036 "}\n",
8037 LinuxBraceStyle);
8038 verifyFormat("enum X {\n"
8039 " Y = 0,\n"
8040 "}\n",
8041 LinuxBraceStyle);
8042 verifyFormat("struct S {\n"
8043 " int Type;\n"
8044 " union {\n"
8045 " int x;\n"
8046 " double y;\n"
8047 " } Value;\n"
8048 " class C\n"
8049 " {\n"
8050 " MyFavoriteType Value;\n"
8051 " } Class;\n"
8052 "}\n",
8053 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008054}
8055
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00008056TEST_F(FormatTest, MozillaBraceBreaking) {
8057 FormatStyle MozillaBraceStyle = getLLVMStyle();
8058 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00008059 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00008060 verifyFormat("namespace a {\n"
8061 "class A\n"
8062 "{\n"
8063 " void f()\n"
8064 " {\n"
8065 " if (true) {\n"
8066 " a();\n"
8067 " b();\n"
8068 " }\n"
8069 " }\n"
8070 " void g() { return; }\n"
8071 "};\n"
8072 "enum E\n"
8073 "{\n"
8074 " A,\n"
8075 " // foo\n"
8076 " B,\n"
8077 " C\n"
8078 "};\n"
8079 "struct B\n"
8080 "{\n"
8081 " int x;\n"
8082 "};\n"
8083 "}\n",
8084 MozillaBraceStyle);
8085 verifyFormat("struct S\n"
8086 "{\n"
8087 " int Type;\n"
8088 " union\n"
8089 " {\n"
8090 " int x;\n"
8091 " double y;\n"
8092 " } Value;\n"
8093 " class C\n"
8094 " {\n"
8095 " MyFavoriteType Value;\n"
8096 " } Class;\n"
8097 "}\n",
8098 MozillaBraceStyle);
8099}
8100
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008101TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008102 FormatStyle StroustrupBraceStyle = getLLVMStyle();
8103 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008104 verifyFormat("namespace a {\n"
8105 "class A {\n"
8106 " void f()\n"
8107 " {\n"
8108 " if (true) {\n"
8109 " a();\n"
8110 " b();\n"
8111 " }\n"
8112 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008113 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008114 "};\n"
8115 "struct B {\n"
8116 " int x;\n"
8117 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00008118 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008119 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008120
Daniel Jasperd9670872014-08-05 12:06:20 +00008121 verifyFormat("void foo()\n"
8122 "{\n"
8123 " if (a) {\n"
8124 " a();\n"
8125 " }\n"
8126 " else {\n"
8127 " b();\n"
8128 " }\n"
8129 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008130 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00008131
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008132 verifyFormat("#ifdef _DEBUG\n"
8133 "int foo(int i = 0)\n"
8134 "#else\n"
8135 "int foo(int i = 5)\n"
8136 "#endif\n"
8137 "{\n"
8138 " return i;\n"
8139 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008140 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008141
8142 verifyFormat("void foo() {}\n"
8143 "void bar()\n"
8144 "#ifdef _DEBUG\n"
8145 "{\n"
8146 " foo();\n"
8147 "}\n"
8148 "#else\n"
8149 "{\n"
8150 "}\n"
8151 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008152 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008153
8154 verifyFormat("void foobar() { int i = 5; }\n"
8155 "#ifdef _DEBUG\n"
8156 "void bar() {}\n"
8157 "#else\n"
8158 "void bar() { foobar(); }\n"
8159 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008160 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008161}
8162
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008163TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008164 FormatStyle AllmanBraceStyle = getLLVMStyle();
8165 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008166 verifyFormat("namespace a\n"
8167 "{\n"
8168 "class A\n"
8169 "{\n"
8170 " void f()\n"
8171 " {\n"
8172 " if (true)\n"
8173 " {\n"
8174 " a();\n"
8175 " b();\n"
8176 " }\n"
8177 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008178 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008179 "};\n"
8180 "struct B\n"
8181 "{\n"
8182 " int x;\n"
8183 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008184 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008185 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008186
8187 verifyFormat("void f()\n"
8188 "{\n"
8189 " if (true)\n"
8190 " {\n"
8191 " a();\n"
8192 " }\n"
8193 " else if (false)\n"
8194 " {\n"
8195 " b();\n"
8196 " }\n"
8197 " else\n"
8198 " {\n"
8199 " c();\n"
8200 " }\n"
8201 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008202 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008203
8204 verifyFormat("void f()\n"
8205 "{\n"
8206 " for (int i = 0; i < 10; ++i)\n"
8207 " {\n"
8208 " a();\n"
8209 " }\n"
8210 " while (false)\n"
8211 " {\n"
8212 " b();\n"
8213 " }\n"
8214 " do\n"
8215 " {\n"
8216 " c();\n"
8217 " } while (false)\n"
8218 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008219 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008220
8221 verifyFormat("void f(int a)\n"
8222 "{\n"
8223 " switch (a)\n"
8224 " {\n"
8225 " case 0:\n"
8226 " break;\n"
8227 " case 1:\n"
8228 " {\n"
8229 " break;\n"
8230 " }\n"
8231 " case 2:\n"
8232 " {\n"
8233 " }\n"
8234 " break;\n"
8235 " default:\n"
8236 " break;\n"
8237 " }\n"
8238 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008239 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00008240
8241 verifyFormat("enum X\n"
8242 "{\n"
8243 " Y = 0,\n"
8244 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008245 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00008246 verifyFormat("enum X\n"
8247 "{\n"
8248 " Y = 0\n"
8249 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008250 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00008251
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008252 verifyFormat("@interface BSApplicationController ()\n"
8253 "{\n"
8254 "@private\n"
8255 " id _extraIvar;\n"
8256 "}\n"
8257 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008258 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008259
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008260 verifyFormat("#ifdef _DEBUG\n"
8261 "int foo(int i = 0)\n"
8262 "#else\n"
8263 "int foo(int i = 5)\n"
8264 "#endif\n"
8265 "{\n"
8266 " return i;\n"
8267 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008268 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008269
8270 verifyFormat("void foo() {}\n"
8271 "void bar()\n"
8272 "#ifdef _DEBUG\n"
8273 "{\n"
8274 " foo();\n"
8275 "}\n"
8276 "#else\n"
8277 "{\n"
8278 "}\n"
8279 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008280 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008281
8282 verifyFormat("void foobar() { int i = 5; }\n"
8283 "#ifdef _DEBUG\n"
8284 "void bar() {}\n"
8285 "#else\n"
8286 "void bar() { foobar(); }\n"
8287 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008288 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008289
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008290 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008291 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00008292 " // ...\n"
8293 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008294 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008295 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008296 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00008297 " // ...\n"
8298 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008299 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008300 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008301 // .. or dict literals.
8302 verifyFormat("void f()\n"
8303 "{\n"
8304 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
8305 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008306 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00008307 verifyFormat("int f()\n"
8308 "{ // comment\n"
8309 " return 42;\n"
8310 "}",
8311 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008312
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008313 AllmanBraceStyle.ColumnLimit = 19;
8314 verifyFormat("void f() { int i; }", AllmanBraceStyle);
8315 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00008316 verifyFormat("void f()\n"
8317 "{\n"
8318 " int i;\n"
8319 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008320 AllmanBraceStyle);
8321 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00008322
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008323 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00008324 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
8325 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
8326 verifyFormat("void f(bool b)\n"
8327 "{\n"
8328 " if (b)\n"
8329 " {\n"
8330 " return;\n"
8331 " }\n"
8332 "}\n",
8333 BreakBeforeBraceShortIfs);
8334 verifyFormat("void f(bool b)\n"
8335 "{\n"
8336 " if (b) return;\n"
8337 "}\n",
8338 BreakBeforeBraceShortIfs);
8339 verifyFormat("void f(bool b)\n"
8340 "{\n"
8341 " while (b)\n"
8342 " {\n"
8343 " return;\n"
8344 " }\n"
8345 "}\n",
8346 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008347}
8348
Alexander Kornienko3a33f022013-12-12 09:49:52 +00008349TEST_F(FormatTest, GNUBraceBreaking) {
8350 FormatStyle GNUBraceStyle = getLLVMStyle();
8351 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
8352 verifyFormat("namespace a\n"
8353 "{\n"
8354 "class A\n"
8355 "{\n"
8356 " void f()\n"
8357 " {\n"
8358 " int a;\n"
8359 " {\n"
8360 " int b;\n"
8361 " }\n"
8362 " if (true)\n"
8363 " {\n"
8364 " a();\n"
8365 " b();\n"
8366 " }\n"
8367 " }\n"
8368 " void g() { return; }\n"
8369 "}\n"
8370 "}",
8371 GNUBraceStyle);
8372
8373 verifyFormat("void f()\n"
8374 "{\n"
8375 " if (true)\n"
8376 " {\n"
8377 " a();\n"
8378 " }\n"
8379 " else if (false)\n"
8380 " {\n"
8381 " b();\n"
8382 " }\n"
8383 " else\n"
8384 " {\n"
8385 " c();\n"
8386 " }\n"
8387 "}\n",
8388 GNUBraceStyle);
8389
8390 verifyFormat("void f()\n"
8391 "{\n"
8392 " for (int i = 0; i < 10; ++i)\n"
8393 " {\n"
8394 " a();\n"
8395 " }\n"
8396 " while (false)\n"
8397 " {\n"
8398 " b();\n"
8399 " }\n"
8400 " do\n"
8401 " {\n"
8402 " c();\n"
8403 " }\n"
8404 " while (false);\n"
8405 "}\n",
8406 GNUBraceStyle);
8407
8408 verifyFormat("void f(int a)\n"
8409 "{\n"
8410 " switch (a)\n"
8411 " {\n"
8412 " case 0:\n"
8413 " break;\n"
8414 " case 1:\n"
8415 " {\n"
8416 " break;\n"
8417 " }\n"
8418 " case 2:\n"
8419 " {\n"
8420 " }\n"
8421 " break;\n"
8422 " default:\n"
8423 " break;\n"
8424 " }\n"
8425 "}\n",
8426 GNUBraceStyle);
8427
8428 verifyFormat("enum X\n"
8429 "{\n"
8430 " Y = 0,\n"
8431 "}\n",
8432 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008433
8434 verifyFormat("@interface BSApplicationController ()\n"
8435 "{\n"
8436 "@private\n"
8437 " id _extraIvar;\n"
8438 "}\n"
8439 "@end\n",
8440 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008441
8442 verifyFormat("#ifdef _DEBUG\n"
8443 "int foo(int i = 0)\n"
8444 "#else\n"
8445 "int foo(int i = 5)\n"
8446 "#endif\n"
8447 "{\n"
8448 " return i;\n"
8449 "}",
8450 GNUBraceStyle);
8451
8452 verifyFormat("void foo() {}\n"
8453 "void bar()\n"
8454 "#ifdef _DEBUG\n"
8455 "{\n"
8456 " foo();\n"
8457 "}\n"
8458 "#else\n"
8459 "{\n"
8460 "}\n"
8461 "#endif",
8462 GNUBraceStyle);
8463
8464 verifyFormat("void foobar() { int i = 5; }\n"
8465 "#ifdef _DEBUG\n"
8466 "void bar() {}\n"
8467 "#else\n"
8468 "void bar() { foobar(); }\n"
8469 "#endif",
8470 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00008471}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00008472
8473TEST_F(FormatTest, WebKitBraceBreaking) {
8474 FormatStyle WebKitBraceStyle = getLLVMStyle();
8475 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00008476 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00008477 verifyFormat("namespace a {\n"
8478 "class A {\n"
8479 " void f()\n"
8480 " {\n"
8481 " if (true) {\n"
8482 " a();\n"
8483 " b();\n"
8484 " }\n"
8485 " }\n"
8486 " void g() { return; }\n"
8487 "};\n"
8488 "enum E {\n"
8489 " A,\n"
8490 " // foo\n"
8491 " B,\n"
8492 " C\n"
8493 "};\n"
8494 "struct B {\n"
8495 " int x;\n"
8496 "};\n"
8497 "}\n",
8498 WebKitBraceStyle);
8499 verifyFormat("struct S {\n"
8500 " int Type;\n"
8501 " union {\n"
8502 " int x;\n"
8503 " double y;\n"
8504 " } Value;\n"
8505 " class C {\n"
8506 " MyFavoriteType Value;\n"
8507 " } Class;\n"
8508 "};\n",
8509 WebKitBraceStyle);
8510}
8511
Manuel Klimekd5735502013-08-12 03:51:17 +00008512TEST_F(FormatTest, CatchExceptionReferenceBinding) {
8513 verifyFormat("void f() {\n"
8514 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00008515 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00008516 " }\n"
8517 "}\n",
8518 getLLVMStyle());
8519}
8520
Daniel Jasper9613c812013-08-07 16:29:23 +00008521TEST_F(FormatTest, UnderstandsPragmas) {
8522 verifyFormat("#pragma omp reduction(| : var)");
8523 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00008524
8525 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
8526 "(including parentheses).",
8527 format("#pragma mark Any non-hyphenated or hyphenated string "
8528 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +00008529}
8530
Daniel Jasperee4a8a12015-04-22 09:45:42 +00008531TEST_F(FormatTest, UnderstandPragmaOption) {
8532 verifyFormat("#pragma option -C -A");
8533
8534 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
8535}
8536
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008537#define EXPECT_ALL_STYLES_EQUAL(Styles) \
8538 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +00008539 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
8540 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +00008541
8542TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008543 SmallVector<FormatStyle, 3> Styles;
8544 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008545
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008546 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008547 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
8548 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
8549 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008550
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008551 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008552 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
8553 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
8554 EXPECT_ALL_STYLES_EQUAL(Styles);
8555
Nico Weber514ecc82014-02-02 20:50:45 +00008556 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008557 EXPECT_TRUE(
8558 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
8559 EXPECT_TRUE(
8560 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
8561 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008562
Nico Weber514ecc82014-02-02 20:50:45 +00008563 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008564 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
8565 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
8566 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008567
8568 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008569 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
8570 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
8571 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008572
Daniel Jasperffefb3d2013-07-24 13:10:59 +00008573 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008574 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
8575 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
8576 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00008577
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +00008578 Styles[0] = getGNUStyle();
8579 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
8580 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
8581 EXPECT_ALL_STYLES_EQUAL(Styles);
8582
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008583 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
8584}
8585
8586TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
8587 SmallVector<FormatStyle, 8> Styles;
8588 Styles.resize(2);
8589
8590 Styles[0] = getGoogleStyle();
8591 Styles[1] = getLLVMStyle();
8592 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
8593 EXPECT_ALL_STYLES_EQUAL(Styles);
8594
8595 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +00008596 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008597 Styles[1] = getLLVMStyle();
8598 Styles[1].Language = FormatStyle::LK_JavaScript;
8599 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
8600
8601 Styles[2] = getLLVMStyle();
8602 Styles[2].Language = FormatStyle::LK_JavaScript;
8603 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
8604 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008605 &Styles[2])
8606 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008607
8608 Styles[3] = getLLVMStyle();
8609 Styles[3].Language = FormatStyle::LK_JavaScript;
8610 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
8611 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008612 &Styles[3])
8613 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008614
8615 Styles[4] = getLLVMStyle();
8616 Styles[4].Language = FormatStyle::LK_JavaScript;
8617 EXPECT_EQ(0, parseConfiguration("---\n"
8618 "BasedOnStyle: LLVM\n"
8619 "IndentWidth: 123\n"
8620 "---\n"
8621 "BasedOnStyle: Google\n"
8622 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008623 &Styles[4])
8624 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008625 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008626}
8627
Daniel Jasper91881d92014-09-29 08:07:46 +00008628#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +00008629 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +00008630 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008631 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +00008632 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +00008633 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008634
Daniel Jasper91881d92014-09-29 08:07:46 +00008635#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
8636
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00008637#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
8638 Style.STRUCT.FIELD = false; \
8639 EXPECT_EQ(0, \
8640 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
8641 .value()); \
8642 EXPECT_TRUE(Style.STRUCT.FIELD); \
8643 EXPECT_EQ(0, \
8644 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
8645 .value()); \
8646 EXPECT_FALSE(Style.STRUCT.FIELD);
8647
8648#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
8649 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
8650
Daniel Jasper00853002014-09-16 16:22:30 +00008651#define CHECK_PARSE(TEXT, FIELD, VALUE) \
8652 EXPECT_NE(VALUE, Style.FIELD); \
8653 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
8654 EXPECT_EQ(VALUE, Style.FIELD)
8655
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008656TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008657 FormatStyle Style = {};
8658 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00008659 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +00008660 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +00008661 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +00008662 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008663 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008664 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +00008665 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +00008666 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008667 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +00008668 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00008669 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +00008670 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00008671 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008672 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +00008673 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00008674 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008675 CHECK_PARSE_BOOL(BreakStringLiterals);
Andi-Bogdan Postelnicu0ef8ee12017-03-10 15:10:37 +00008676 CHECK_PARSE_BOOL(BreakBeforeInheritanceComma)
Alexander Kornienkod6538332013-05-07 15:32:14 +00008677 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +00008678 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +00008679 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +00008680 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008681 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00008682 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +00008683 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +00008684 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008685 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +00008686 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +00008687 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +00008688 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008689 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +00008690 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00008691 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008692 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +00008693 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008694 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008695 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00008696 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +00008697 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00008698
8699 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
8700 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
8701 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
8702 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
8703 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
8704 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
8705 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
8706 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
8707 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
8708 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
8709 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008710}
Alexander Kornienkod6538332013-05-07 15:32:14 +00008711
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008712#undef CHECK_PARSE_BOOL
8713
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008714TEST_F(FormatTest, ParsesConfiguration) {
8715 FormatStyle Style = {};
8716 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00008717 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00008718 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
8719 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +00008720 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008721 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
8722 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +00008723 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
8724 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008725 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
8726 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
8727 PenaltyReturnTypeOnItsOwnLine, 1234u);
8728 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
8729 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +00008730 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +00008731 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00008732 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +00008733
Daniel Jasper553d4872014-06-17 12:40:34 +00008734 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +00008735 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
8736 FormatStyle::PAS_Left);
8737 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
8738 FormatStyle::PAS_Right);
8739 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
8740 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +00008741 // For backward compatibility:
8742 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
8743 FormatStyle::PAS_Left);
8744 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
8745 FormatStyle::PAS_Right);
8746 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
8747 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +00008748
Alexander Kornienkod6538332013-05-07 15:32:14 +00008749 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +00008750 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
8751 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008752 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
8753 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
8754 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
8755
Daniel Jasperac043c92014-09-15 11:11:00 +00008756 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +00008757 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
8758 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +00008759 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
8760 FormatStyle::BOS_None);
8761 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
8762 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00008763 // For backward compatibility:
8764 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
8765 FormatStyle::BOS_None);
8766 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
8767 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +00008768
Daniel Jasper6501f7e2015-10-27 12:38:37 +00008769 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8770 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
8771 FormatStyle::BAS_Align);
8772 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
8773 FormatStyle::BAS_DontAlign);
8774 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
8775 FormatStyle::BAS_AlwaysBreak);
8776 // For backward compatibility:
8777 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
8778 FormatStyle::BAS_DontAlign);
8779 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
8780 FormatStyle::BAS_Align);
8781
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008782 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008783 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
8784 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
8785 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008786 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
8787 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +00008788 // For backward compatibility:
8789 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
8790 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008791
Daniel Jasperd74cf402014-04-08 12:46:38 +00008792 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +00008793 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
8794 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
8795 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
8796 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +00008797 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
8798 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +00008799 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
8800 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00008801 // For backward compatibility:
8802 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
8803 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
8804 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
8805 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +00008806
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008807 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
8808 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
8809 FormatStyle::SBPO_Never);
8810 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
8811 FormatStyle::SBPO_Always);
8812 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
8813 FormatStyle::SBPO_ControlStatements);
8814 // For backward compatibility:
8815 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
8816 FormatStyle::SBPO_Never);
8817 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
8818 FormatStyle::SBPO_ControlStatements);
8819
Alexander Kornienkod6538332013-05-07 15:32:14 +00008820 Style.ColumnLimit = 123;
8821 FormatStyle BaseStyle = getLLVMStyle();
8822 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
8823 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
8824
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008825 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
8826 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
8827 FormatStyle::BS_Attach);
8828 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
8829 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00008830 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
8831 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008832 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
8833 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00008834 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
8835 FormatStyle::BS_Allman);
8836 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00008837 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
8838 FormatStyle::BS_WebKit);
8839 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
8840 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008841
Zachary Turner448592e2015-12-18 22:20:15 +00008842 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
8843 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
8844 FormatStyle::RTBS_None);
8845 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
8846 FormatStyle::RTBS_All);
8847 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +00008848 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +00008849 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
8850 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
8851 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
8852 AlwaysBreakAfterReturnType,
8853 FormatStyle::RTBS_TopLevelDefinitions);
8854
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00008855 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
8856 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
8857 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
8858 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
8859 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
8860 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
8861 AlwaysBreakAfterDefinitionReturnType,
8862 FormatStyle::DRTBS_TopLevel);
8863
Daniel Jasper65ee3472013-07-31 23:16:02 +00008864 Style.NamespaceIndentation = FormatStyle::NI_All;
8865 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
8866 FormatStyle::NI_None);
8867 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
8868 FormatStyle::NI_Inner);
8869 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
8870 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +00008871
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00008872 // FIXME: This is required because parsing a configuration simply overwrites
8873 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +00008874 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +00008875 std::vector<std::string> BoostForeach;
8876 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00008877 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +00008878 std::vector<std::string> BoostAndQForeach;
8879 BoostAndQForeach.push_back("BOOST_FOREACH");
8880 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00008881 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
8882 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00008883
8884 Style.IncludeCategories.clear();
8885 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
8886 {".*", 1}};
8887 CHECK_PARSE("IncludeCategories:\n"
8888 " - Regex: abc/.*\n"
8889 " Priority: 2\n"
8890 " - Regex: .*\n"
8891 " Priority: 1",
8892 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00008893 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008894}
8895
8896TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
8897 FormatStyle Style = {};
8898 Style.Language = FormatStyle::LK_Cpp;
8899 CHECK_PARSE("Language: Cpp\n"
8900 "IndentWidth: 12",
8901 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +00008902 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
8903 "IndentWidth: 34",
8904 &Style),
8905 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008906 EXPECT_EQ(12u, Style.IndentWidth);
8907 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
8908 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
8909
8910 Style.Language = FormatStyle::LK_JavaScript;
8911 CHECK_PARSE("Language: JavaScript\n"
8912 "IndentWidth: 12",
8913 IndentWidth, 12u);
8914 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +00008915 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
8916 "IndentWidth: 34",
8917 &Style),
8918 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008919 EXPECT_EQ(23u, Style.IndentWidth);
8920 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
8921 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
8922
8923 CHECK_PARSE("BasedOnStyle: LLVM\n"
8924 "IndentWidth: 67",
8925 IndentWidth, 67u);
8926
8927 CHECK_PARSE("---\n"
8928 "Language: JavaScript\n"
8929 "IndentWidth: 12\n"
8930 "---\n"
8931 "Language: Cpp\n"
8932 "IndentWidth: 34\n"
8933 "...\n",
8934 IndentWidth, 12u);
8935
8936 Style.Language = FormatStyle::LK_Cpp;
8937 CHECK_PARSE("---\n"
8938 "Language: JavaScript\n"
8939 "IndentWidth: 12\n"
8940 "---\n"
8941 "Language: Cpp\n"
8942 "IndentWidth: 34\n"
8943 "...\n",
8944 IndentWidth, 34u);
8945 CHECK_PARSE("---\n"
8946 "IndentWidth: 78\n"
8947 "---\n"
8948 "Language: JavaScript\n"
8949 "IndentWidth: 56\n"
8950 "...\n",
8951 IndentWidth, 78u);
8952
8953 Style.ColumnLimit = 123;
8954 Style.IndentWidth = 234;
8955 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
8956 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +00008957 EXPECT_FALSE(parseConfiguration("---\n"
8958 "IndentWidth: 456\n"
8959 "BreakBeforeBraces: Allman\n"
8960 "---\n"
8961 "Language: JavaScript\n"
8962 "IndentWidth: 111\n"
8963 "TabWidth: 111\n"
8964 "---\n"
8965 "Language: Cpp\n"
8966 "BreakBeforeBraces: Stroustrup\n"
8967 "TabWidth: 789\n"
8968 "...\n",
8969 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008970 EXPECT_EQ(123u, Style.ColumnLimit);
8971 EXPECT_EQ(456u, Style.IndentWidth);
8972 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
8973 EXPECT_EQ(789u, Style.TabWidth);
8974
Rafael Espindola1f243172014-06-12 11:35:17 +00008975 EXPECT_EQ(parseConfiguration("---\n"
8976 "Language: JavaScript\n"
8977 "IndentWidth: 56\n"
8978 "---\n"
8979 "IndentWidth: 78\n"
8980 "...\n",
8981 &Style),
8982 ParseError::Error);
8983 EXPECT_EQ(parseConfiguration("---\n"
8984 "Language: JavaScript\n"
8985 "IndentWidth: 56\n"
8986 "---\n"
8987 "Language: JavaScript\n"
8988 "IndentWidth: 78\n"
8989 "...\n",
8990 &Style),
8991 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008992
8993 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
8994}
Daniel Jasper65ee3472013-07-31 23:16:02 +00008995
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008996#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008997
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008998TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
8999 FormatStyle Style = {};
9000 Style.Language = FormatStyle::LK_JavaScript;
9001 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009002 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00009003 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009004
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009005 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009006 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009007 "BasedOnStyle: Google\n"
9008 "---\n"
9009 "Language: JavaScript\n"
9010 "IndentWidth: 76\n"
9011 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009012 &Style)
9013 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00009014 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009015 EXPECT_EQ(76u, Style.IndentWidth);
9016 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
9017}
9018
Alexander Kornienkod6538332013-05-07 15:32:14 +00009019TEST_F(FormatTest, ConfigurationRoundTripTest) {
9020 FormatStyle Style = getLLVMStyle();
9021 std::string YAML = configurationAsText(Style);
9022 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009023 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009024 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
9025 EXPECT_EQ(Style, ParsedStyle);
9026}
9027
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009028TEST_F(FormatTest, WorksFor8bitEncodings) {
9029 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
9030 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
9031 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
9032 "\"\xef\xee\xf0\xf3...\"",
9033 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
9034 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
9035 "\xef\xee\xf0\xf3...\"",
9036 getLLVMStyleWithColumns(12)));
9037}
9038
Alexander Kornienko393e3082013-11-13 14:04:17 +00009039TEST_F(FormatTest, HandlesUTF8BOM) {
9040 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
9041 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
9042 format("\xef\xbb\xbf#include <iostream>"));
9043 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
9044 format("\xef\xbb\xbf\n#include <iostream>"));
9045}
9046
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +00009047// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
9048#if !defined(_MSC_VER)
9049
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009050TEST_F(FormatTest, CountsUTF8CharactersProperly) {
9051 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
9052 getLLVMStyleWithColumns(35));
9053 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009054 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009055 verifyFormat("// Однажды в студёную зимнюю пору...",
9056 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +00009057 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009058 verifyFormat("/* Однажды в студёную зимнюю пору... */",
9059 getLLVMStyleWithColumns(39));
9060 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009061 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009062}
9063
9064TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +00009065 // Non-printable characters' width is currently considered to be the length in
9066 // bytes in UTF8. The characters can be displayed in very different manner
9067 // (zero-width, single width with a substitution glyph, expanded to their code
9068 // (e.g. "<8d>"), so there's no single correct way to handle them.
9069 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00009070 "\"\xc2\x8d\";",
9071 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +00009072 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00009073 "\"\xc2\x8d\";",
9074 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +00009075 EXPECT_EQ("\"Однажды, в \"\n"
9076 "\"студёную \"\n"
9077 "\"зимнюю \"\n"
9078 "\"пору,\"",
9079 format("\"Однажды, в студёную зимнюю пору,\"",
9080 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009081 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +00009082 "\"一 二 三 \"\n"
9083 "\"四 五六 \"\n"
9084 "\"七 八 九 \"\n"
9085 "\"十\"",
9086 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009087 EXPECT_EQ("\"一\t二 \"\n"
9088 "\"\t三 \"\n"
9089 "\"四 五\t六 \"\n"
9090 "\"\t七 \"\n"
9091 "\"八九十\tqq\"",
9092 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
9093 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +00009094
9095 // UTF8 character in an escape sequence.
9096 EXPECT_EQ("\"aaaaaa\"\n"
9097 "\"\\\xC2\x8D\"",
9098 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009099}
9100
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009101TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
9102 EXPECT_EQ("const char *sssss =\n"
9103 " \"一二三四五六七八\\\n"
9104 " 九 十\";",
9105 format("const char *sssss = \"一二三四五六七八\\\n"
9106 " 九 十\";",
9107 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009108}
9109
9110TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00009111 EXPECT_EQ("// aaaaÄ\xc2\x8d",
9112 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009113 EXPECT_EQ("// Я из лесу\n"
9114 "// вышел; был\n"
9115 "// сильный\n"
9116 "// мороз.",
9117 format("// Я из лесу вышел; был сильный мороз.",
9118 getLLVMStyleWithColumns(13)));
9119 EXPECT_EQ("// 一二三\n"
9120 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009121 "// 八 九\n"
9122 "// 十",
9123 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009124}
9125
9126TEST_F(FormatTest, SplitsUTF8BlockComments) {
9127 EXPECT_EQ("/* Гляжу,\n"
9128 " * поднимается\n"
9129 " * медленно в\n"
9130 " * гору\n"
9131 " * Лошадка,\n"
9132 " * везущая\n"
9133 " * хворосту\n"
9134 " * воз. */",
9135 format("/* Гляжу, поднимается медленно в гору\n"
9136 " * Лошадка, везущая хворосту воз. */",
9137 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009138 EXPECT_EQ(
9139 "/* 一二三\n"
9140 " * 四五六七\n"
9141 " * 八 九\n"
9142 " * 十 */",
9143 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +00009144 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
9145 " * 𝕓𝕪𝕥𝕖\n"
9146 " * 𝖀𝕿𝕱-𝟠 */",
9147 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009148}
9149
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009150#endif // _MSC_VER
9151
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009152TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
9153 FormatStyle Style = getLLVMStyle();
9154
9155 Style.ConstructorInitializerIndentWidth = 4;
9156 verifyFormat(
9157 "SomeClass::Constructor()\n"
9158 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
9159 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
9160 Style);
9161
9162 Style.ConstructorInitializerIndentWidth = 2;
9163 verifyFormat(
9164 "SomeClass::Constructor()\n"
9165 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
9166 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
9167 Style);
9168
9169 Style.ConstructorInitializerIndentWidth = 0;
9170 verifyFormat(
9171 "SomeClass::Constructor()\n"
9172 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
9173 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
9174 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +00009175 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9176 verifyFormat(
9177 "SomeLongTemplateVariableName<\n"
9178 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
9179 Style);
9180 verifyFormat(
9181 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
9182 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
9183 Style);
Daniel Jasper00853002014-09-16 16:22:30 +00009184}
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009185
Daniel Jasper00853002014-09-16 16:22:30 +00009186TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
9187 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009188 Style.BreakConstructorInitializersBeforeComma = true;
9189 Style.ConstructorInitializerIndentWidth = 4;
9190 verifyFormat("SomeClass::Constructor()\n"
9191 " : a(a)\n"
9192 " , b(b)\n"
9193 " , c(c) {}",
9194 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009195 verifyFormat("SomeClass::Constructor()\n"
9196 " : a(a) {}",
9197 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009198
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009199 Style.ColumnLimit = 0;
9200 verifyFormat("SomeClass::Constructor()\n"
9201 " : a(a) {}",
9202 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +00009203 verifyFormat("SomeClass::Constructor() noexcept\n"
9204 " : a(a) {}",
9205 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009206 verifyFormat("SomeClass::Constructor()\n"
9207 " : a(a)\n"
9208 " , b(b)\n"
9209 " , c(c) {}",
9210 Style);
9211 verifyFormat("SomeClass::Constructor()\n"
9212 " : a(a) {\n"
9213 " foo();\n"
9214 " bar();\n"
9215 "}",
9216 Style);
9217
Daniel Jasperd74cf402014-04-08 12:46:38 +00009218 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009219 verifyFormat("SomeClass::Constructor()\n"
9220 " : a(a)\n"
9221 " , b(b)\n"
9222 " , c(c) {\n}",
9223 Style);
9224 verifyFormat("SomeClass::Constructor()\n"
9225 " : a(a) {\n}",
9226 Style);
9227
9228 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +00009229 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009230 Style.ConstructorInitializerIndentWidth = 2;
9231 verifyFormat("SomeClass::Constructor()\n"
9232 " : a(a)\n"
9233 " , b(b)\n"
9234 " , c(c) {}",
9235 Style);
9236
9237 Style.ConstructorInitializerIndentWidth = 0;
9238 verifyFormat("SomeClass::Constructor()\n"
9239 ": a(a)\n"
9240 ", b(b)\n"
9241 ", c(c) {}",
9242 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +00009243
9244 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
9245 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009246 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
9247 verifyFormat(
9248 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
9249 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +00009250 verifyFormat(
9251 "SomeClass::Constructor()\n"
9252 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
9253 Style);
9254 Style.ConstructorInitializerIndentWidth = 4;
9255 Style.ColumnLimit = 60;
9256 verifyFormat("SomeClass::Constructor()\n"
9257 " : aaaaaaaa(aaaaaaaa)\n"
9258 " , aaaaaaaa(aaaaaaaa)\n"
9259 " , aaaaaaaa(aaaaaaaa) {}",
9260 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009261}
9262
Daniel Jasper38efc132014-10-21 07:51:54 +00009263TEST_F(FormatTest, Destructors) {
9264 verifyFormat("void F(int &i) { i.~int(); }");
9265 verifyFormat("void F(int &i) { i->~int(); }");
9266}
9267
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009268TEST_F(FormatTest, FormatsWithWebKitStyle) {
9269 FormatStyle Style = getWebKitStyle();
9270
9271 // Don't indent in outer namespaces.
9272 verifyFormat("namespace outer {\n"
9273 "int i;\n"
9274 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00009275 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009276 "} // namespace inner\n"
9277 "} // namespace outer\n"
9278 "namespace other_outer {\n"
9279 "int i;\n"
9280 "}",
9281 Style);
9282
9283 // Don't indent case labels.
9284 verifyFormat("switch (variable) {\n"
9285 "case 1:\n"
9286 "case 2:\n"
9287 " doSomething();\n"
9288 " break;\n"
9289 "default:\n"
9290 " ++variable;\n"
9291 "}",
9292 Style);
9293
9294 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +00009295 EXPECT_EQ("void f()\n"
9296 "{\n"
9297 " if (aaaaaaaaaaaaaaaa\n"
9298 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
9299 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
9300 " return;\n"
9301 "}",
9302 format("void f() {\n"
9303 "if (aaaaaaaaaaaaaaaa\n"
9304 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
9305 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
9306 "return;\n"
9307 "}",
9308 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009309
Daniel Jasper35995672014-04-29 14:05:20 +00009310 // Allow functions on a single line.
9311 verifyFormat("void f() { return; }", Style);
9312
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009313 // Constructor initializers are formatted one per line with the "," on the
9314 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009315 verifyFormat("Constructor()\n"
9316 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
9317 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00009318 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +00009319 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
9320 "{\n"
9321 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009322 Style);
9323 verifyFormat("SomeClass::Constructor()\n"
9324 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +00009325 "{\n"
9326 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009327 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +00009328 EXPECT_EQ("SomeClass::Constructor()\n"
9329 " : a(a)\n"
9330 "{\n"
9331 "}",
9332 format("SomeClass::Constructor():a(a){}", Style));
9333 verifyFormat("SomeClass::Constructor()\n"
9334 " : a(a)\n"
9335 " , b(b)\n"
9336 " , c(c)\n"
9337 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009338 "}",
9339 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009340 verifyFormat("SomeClass::Constructor()\n"
9341 " : a(a)\n"
9342 "{\n"
9343 " foo();\n"
9344 " bar();\n"
9345 "}",
9346 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009347
Daniel Jasper65ee3472013-07-31 23:16:02 +00009348 // Access specifiers should be aligned left.
9349 verifyFormat("class C {\n"
9350 "public:\n"
9351 " int i;\n"
9352 "};",
9353 Style);
9354
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009355 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +00009356 verifyFormat("int a; // Do not\n"
9357 "double b; // align comments.",
9358 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009359
Daniel Jasper3219e432014-12-02 13:24:51 +00009360 // Do not align operands.
9361 EXPECT_EQ("ASSERT(aaaa\n"
9362 " || bbbb);",
9363 format("ASSERT ( aaaa\n||bbbb);", Style));
9364
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009365 // Accept input's line breaks.
9366 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
9367 " || bbbbbbbbbbbbbbb) {\n"
9368 " i++;\n"
9369 "}",
9370 format("if (aaaaaaaaaaaaaaa\n"
9371 "|| bbbbbbbbbbbbbbb) { i++; }",
9372 Style));
9373 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
9374 " i++;\n"
9375 "}",
9376 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +00009377
9378 // Don't automatically break all macro definitions (llvm.org/PR17842).
9379 verifyFormat("#define aNumber 10", Style);
9380 // However, generally keep the line breaks that the user authored.
9381 EXPECT_EQ("#define aNumber \\\n"
9382 " 10",
9383 format("#define aNumber \\\n"
9384 " 10",
9385 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +00009386
9387 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +00009388 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
9389 " copyItems:YES];",
9390 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
9391 "copyItems:YES];",
9392 Style));
9393 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
9394 " copyItems:YES];",
9395 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
9396 " copyItems:YES];",
9397 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +00009398 // FIXME: This does not seem right, there should be more indentation before
9399 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +00009400 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +00009401 " @\"a\",\n"
9402 " @\"a\"\n"
9403 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +00009404 " copyItems:YES];",
9405 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
9406 " @\"a\",\n"
9407 " @\"a\"\n"
9408 " ]\n"
9409 " copyItems:YES];",
9410 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +00009411 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +00009412 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
9413 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +00009414 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
9415 " copyItems:YES];",
9416 Style));
9417
9418 verifyFormat("[self.a b:c c:d];", Style);
9419 EXPECT_EQ("[self.a b:c\n"
9420 " c:d];",
9421 format("[self.a b:c\n"
9422 "c:d];",
9423 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009424}
9425
Manuel Klimekffdeb592013-09-03 15:10:01 +00009426TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +00009427 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
9428 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
9429 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
9430 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
9431 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +00009432 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +00009433 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00009434 verifyFormat("void f() {\n"
9435 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
9436 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00009437 verifyFormat("void f() {\n"
9438 " other(x.begin(), //\n"
9439 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +00009440 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00009441 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +00009442 verifyFormat("SomeFunction([]() { // A cool function...\n"
9443 " return 43;\n"
9444 "});");
Daniel Jasper56346192014-10-27 16:31:46 +00009445 EXPECT_EQ("SomeFunction([]() {\n"
9446 "#define A a\n"
9447 " return 43;\n"
9448 "});",
9449 format("SomeFunction([](){\n"
9450 "#define A a\n"
9451 "return 43;\n"
9452 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +00009453 verifyFormat("void f() {\n"
9454 " SomeFunction([](decltype(x), A *a) {});\n"
9455 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +00009456 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
9457 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +00009458 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
9459 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
9460 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +00009461 verifyFormat("Constructor()\n"
9462 " : Field([] { // comment\n"
9463 " int i;\n"
9464 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +00009465 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
9466 " return some_parameter.size();\n"
9467 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +00009468 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
9469 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +00009470 verifyFormat("int i = aaaaaa ? 1 //\n"
9471 " : [] {\n"
9472 " return 2; //\n"
9473 " }();");
9474 verifyFormat("llvm::errs() << \"number of twos is \"\n"
9475 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
9476 " return x == 2; // force break\n"
9477 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +00009478 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
9479 " [=](int iiiiiiiiiiii) {\n"
9480 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
9481 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
9482 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +00009483 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +00009484 verifyFormat("SomeFunction({[&] {\n"
9485 " // comment\n"
9486 " },\n"
9487 " [&] {\n"
9488 " // comment\n"
9489 " }});");
9490 verifyFormat("SomeFunction({[&] {\n"
9491 " // comment\n"
9492 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00009493 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
9494 " [&]() { return true; },\n"
9495 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +00009496
Daniel Jaspercb51cf42014-01-16 09:11:55 +00009497 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +00009498 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +00009499 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +00009500 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
9501 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +00009502 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +00009503 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +00009504 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
9505 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +00009506 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +00009507 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
9508 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +00009509 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +00009510 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +00009511 verifyFormat(
9512 "aaaaaaaaaaaaaaaaaaaaaa(\n"
9513 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
9514 " return aaaaaaaaaaaaaaaaa;\n"
9515 " });",
9516 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +00009517 verifyFormat("[]() //\n"
9518 " -> int {\n"
9519 " return 1; //\n"
9520 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +00009521
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +00009522 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +00009523 verifyFormat("SomeFunction(\n"
9524 " []() {\n"
9525 " int i = 42;\n"
9526 " return i;\n"
9527 " },\n"
9528 " []() {\n"
9529 " int j = 43;\n"
9530 " return j;\n"
9531 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +00009532
Daniel Jasperda18fd82014-06-10 06:39:03 +00009533 // More complex introducers.
9534 verifyFormat("return [i, args...] {};");
9535
Daniel Jasperbf02b2c12013-09-05 11:49:39 +00009536 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +00009537 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +00009538 verifyFormat("double &operator[](int i) { return 0; }\n"
9539 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +00009540 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +00009541 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +00009542 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +00009543
9544 // Other corner cases.
9545 verifyFormat("void f() {\n"
9546 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
9547 " );\n"
9548 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +00009549
9550 // Lambdas created through weird macros.
9551 verifyFormat("void f() {\n"
9552 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +00009553 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +00009554 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +00009555
9556 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
9557 " doo_dah();\n"
9558 " doo_dah();\n"
9559 " })) {\n"
9560 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +00009561 verifyFormat("auto lambda = []() {\n"
9562 " int a = 2\n"
9563 "#if A\n"
9564 " + 2\n"
9565 "#endif\n"
9566 " ;\n"
9567 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +00009568
9569 // Lambdas with complex multiline introducers.
9570 verifyFormat(
9571 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
9572 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
9573 " -> ::std::unordered_set<\n"
9574 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
9575 " //\n"
9576 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +00009577}
9578
Manuel Klimek516e0542013-09-04 13:25:30 +00009579TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +00009580 FormatStyle ShortBlocks = getLLVMStyle();
9581 ShortBlocks.AllowShortBlocksOnASingleLine = true;
9582 verifyFormat("int (^Block)(int, int);", ShortBlocks);
9583 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
9584 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
9585 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
9586 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
9587 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +00009588
Daniel Jasper76284682014-10-22 09:12:44 +00009589 verifyFormat("foo(^{ bar(); });", ShortBlocks);
9590 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
9591 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +00009592
Daniel Jasper76284682014-10-22 09:12:44 +00009593 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009594 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009595 "}];");
9596 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009597 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009598 "}]};");
9599 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009600 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009601 "}];");
9602 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009603 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009604 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +00009605 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009606 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009607 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009608 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +00009609 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009610
9611 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009612 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009613 "}];",
9614 getLLVMStyleWithColumns(60));
9615 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009616 " NSString *path = [self sessionFilePath];\n"
9617 " if (path) {\n"
9618 " // ...\n"
9619 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009620 "});");
9621 verifyFormat("[[SessionService sharedService]\n"
9622 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009623 " if (window) {\n"
9624 " [self windowDidLoad:window];\n"
9625 " } else {\n"
9626 " [self errorLoadingWindow];\n"
9627 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009628 " }];");
9629 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009630 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009631 "};\n",
9632 getLLVMStyleWithColumns(40));
9633 verifyFormat("[[SessionService sharedService]\n"
9634 " loadWindowWithCompletionBlock: //\n"
9635 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009636 " if (window) {\n"
9637 " [self windowDidLoad:window];\n"
9638 " } else {\n"
9639 " [self errorLoadingWindow];\n"
9640 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009641 " }];",
9642 getLLVMStyleWithColumns(60));
9643 verifyFormat("[myObject doSomethingWith:arg1\n"
9644 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009645 " // ...\n"
9646 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009647 " }\n"
9648 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009649 " // ...\n"
9650 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +00009651 " }\n"
9652 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009653 " // ...\n"
9654 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009655 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +00009656 verifyFormat("[myObject doSomethingWith:arg1\n"
9657 " firstBlock:-1\n"
9658 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009659 " // ...\n"
9660 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +00009661 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +00009662
9663 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009664 " @autoreleasepool {\n"
9665 " if (a) {\n"
9666 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +00009667 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009668 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +00009669 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +00009670 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +00009671 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
9672 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +00009673
9674 FormatStyle FourIndent = getLLVMStyle();
9675 FourIndent.ObjCBlockIndentWidth = 4;
9676 verifyFormat("[operation setCompletionBlock:^{\n"
9677 " [self onOperationDone];\n"
9678 "}];",
9679 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +00009680}
9681
Daniel Jasper289afc02015-04-23 09:23:17 +00009682TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
9683 FormatStyle ZeroColumn = getLLVMStyle();
9684 ZeroColumn.ColumnLimit = 0;
9685
9686 verifyFormat("[[SessionService sharedService] "
9687 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9688 " if (window) {\n"
9689 " [self windowDidLoad:window];\n"
9690 " } else {\n"
9691 " [self errorLoadingWindow];\n"
9692 " }\n"
9693 "}];",
9694 ZeroColumn);
9695 EXPECT_EQ("[[SessionService sharedService]\n"
9696 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9697 " if (window) {\n"
9698 " [self windowDidLoad:window];\n"
9699 " } else {\n"
9700 " [self errorLoadingWindow];\n"
9701 " }\n"
9702 " }];",
9703 format("[[SessionService sharedService]\n"
9704 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9705 " if (window) {\n"
9706 " [self windowDidLoad:window];\n"
9707 " } else {\n"
9708 " [self errorLoadingWindow];\n"
9709 " }\n"
9710 "}];",
9711 ZeroColumn));
9712 verifyFormat("[myObject doSomethingWith:arg1\n"
9713 " firstBlock:^(Foo *a) {\n"
9714 " // ...\n"
9715 " int i;\n"
9716 " }\n"
9717 " secondBlock:^(Bar *b) {\n"
9718 " // ...\n"
9719 " int i;\n"
9720 " }\n"
9721 " thirdBlock:^Foo(Bar *b) {\n"
9722 " // ...\n"
9723 " int i;\n"
9724 " }];",
9725 ZeroColumn);
9726 verifyFormat("f(^{\n"
9727 " @autoreleasepool {\n"
9728 " if (a) {\n"
9729 " g();\n"
9730 " }\n"
9731 " }\n"
9732 "});",
9733 ZeroColumn);
9734 verifyFormat("void (^largeBlock)(void) = ^{\n"
9735 " // ...\n"
9736 "};",
9737 ZeroColumn);
9738
9739 ZeroColumn.AllowShortBlocksOnASingleLine = true;
9740 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009741 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +00009742 ZeroColumn.AllowShortBlocksOnASingleLine = false;
9743 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
9744 " int i;\n"
9745 "};",
9746 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
9747}
9748
Alexander Kornienko9e649af2013-09-11 12:25:57 +00009749TEST_F(FormatTest, SupportsCRLF) {
9750 EXPECT_EQ("int a;\r\n"
9751 "int b;\r\n"
9752 "int c;\r\n",
9753 format("int a;\r\n"
9754 " int b;\r\n"
9755 " int c;\r\n",
9756 getLLVMStyle()));
9757 EXPECT_EQ("int a;\r\n"
9758 "int b;\r\n"
9759 "int c;\r\n",
9760 format("int a;\r\n"
9761 " int b;\n"
9762 " int c;\r\n",
9763 getLLVMStyle()));
9764 EXPECT_EQ("int a;\n"
9765 "int b;\n"
9766 "int c;\n",
9767 format("int a;\r\n"
9768 " int b;\n"
9769 " int c;\n",
9770 getLLVMStyle()));
9771 EXPECT_EQ("\"aaaaaaa \"\r\n"
9772 "\"bbbbbbb\";\r\n",
9773 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
9774 EXPECT_EQ("#define A \\\r\n"
9775 " b; \\\r\n"
9776 " c; \\\r\n"
9777 " d;\r\n",
9778 format("#define A \\\r\n"
9779 " b; \\\r\n"
9780 " c; d; \r\n",
9781 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +00009782
9783 EXPECT_EQ("/*\r\n"
9784 "multi line block comments\r\n"
9785 "should not introduce\r\n"
9786 "an extra carriage return\r\n"
9787 "*/\r\n",
9788 format("/*\r\n"
9789 "multi line block comments\r\n"
9790 "should not introduce\r\n"
9791 "an extra carriage return\r\n"
9792 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +00009793}
9794
Manuel Klimekb212f3b2013-10-12 22:46:56 +00009795TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
9796 verifyFormat("MY_CLASS(C) {\n"
9797 " int i;\n"
9798 " int j;\n"
9799 "};");
9800}
9801
Daniel Jasper6633ab82013-10-18 10:38:14 +00009802TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
9803 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
9804 TwoIndent.ContinuationIndentWidth = 2;
9805
9806 EXPECT_EQ("int i =\n"
9807 " longFunction(\n"
9808 " arg);",
9809 format("int i = longFunction(arg);", TwoIndent));
9810
9811 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
9812 SixIndent.ContinuationIndentWidth = 6;
9813
9814 EXPECT_EQ("int i =\n"
9815 " longFunction(\n"
9816 " arg);",
9817 format("int i = longFunction(arg);", SixIndent));
9818}
9819
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009820TEST_F(FormatTest, SpacesInAngles) {
9821 FormatStyle Spaces = getLLVMStyle();
9822 Spaces.SpacesInAngles = true;
9823
9824 verifyFormat("static_cast< int >(arg);", Spaces);
9825 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
9826 verifyFormat("f< int, float >();", Spaces);
9827 verifyFormat("template <> g() {}", Spaces);
9828 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00009829 verifyFormat("std::function< void(int, int) > fct;", Spaces);
9830 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
9831 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009832
9833 Spaces.Standard = FormatStyle::LS_Cpp03;
9834 Spaces.SpacesInAngles = true;
9835 verifyFormat("A< A< int > >();", Spaces);
9836
9837 Spaces.SpacesInAngles = false;
9838 verifyFormat("A<A<int> >();", Spaces);
9839
9840 Spaces.Standard = FormatStyle::LS_Cpp11;
9841 Spaces.SpacesInAngles = true;
9842 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00009843
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009844 Spaces.SpacesInAngles = false;
9845 verifyFormat("A<A<int>>();", Spaces);
9846}
9847
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00009848TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
9849 FormatStyle Style = getLLVMStyle();
9850 Style.SpaceAfterTemplateKeyword = false;
9851 verifyFormat("template<int> void foo();", Style);
9852}
9853
Jacques Pienaarfc275112015-02-18 23:48:37 +00009854TEST_F(FormatTest, TripleAngleBrackets) {
9855 verifyFormat("f<<<1, 1>>>();");
9856 verifyFormat("f<<<1, 1, 1, s>>>();");
9857 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +00009858 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +00009859 verifyFormat("f<param><<<1, 1>>>();");
9860 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +00009861 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +00009862 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9863 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +00009864 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
9865 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +00009866}
9867
9868TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +00009869 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +00009870 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +00009871 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9872 "aaallvm::outs() <<");
9873 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9874 "aaaallvm::outs()\n <<");
9875}
9876
Manuel Klimek819788d2014-03-18 11:22:45 +00009877TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
9878 std::string code = "#if A\n"
9879 "#if B\n"
9880 "a.\n"
9881 "#endif\n"
9882 " a = 1;\n"
9883 "#else\n"
9884 "#endif\n"
9885 "#if C\n"
9886 "#else\n"
9887 "#endif\n";
9888 EXPECT_EQ(code, format(code));
9889}
9890
Manuel Klimek68b03042014-04-14 09:14:11 +00009891TEST_F(FormatTest, HandleConflictMarkers) {
9892 // Git/SVN conflict markers.
9893 EXPECT_EQ("int a;\n"
9894 "void f() {\n"
9895 " callme(some(parameter1,\n"
9896 "<<<<<<< text by the vcs\n"
9897 " parameter2),\n"
9898 "||||||| text by the vcs\n"
9899 " parameter2),\n"
9900 " parameter3,\n"
9901 "======= text by the vcs\n"
9902 " parameter2, parameter3),\n"
9903 ">>>>>>> text by the vcs\n"
9904 " otherparameter);\n",
9905 format("int a;\n"
9906 "void f() {\n"
9907 " callme(some(parameter1,\n"
9908 "<<<<<<< text by the vcs\n"
9909 " parameter2),\n"
9910 "||||||| text by the vcs\n"
9911 " parameter2),\n"
9912 " parameter3,\n"
9913 "======= text by the vcs\n"
9914 " parameter2,\n"
9915 " parameter3),\n"
9916 ">>>>>>> text by the vcs\n"
9917 " otherparameter);\n"));
9918
9919 // Perforce markers.
9920 EXPECT_EQ("void f() {\n"
9921 " function(\n"
9922 ">>>> text by the vcs\n"
9923 " parameter,\n"
9924 "==== text by the vcs\n"
9925 " parameter,\n"
9926 "==== text by the vcs\n"
9927 " parameter,\n"
9928 "<<<< text by the vcs\n"
9929 " parameter);\n",
9930 format("void f() {\n"
9931 " function(\n"
9932 ">>>> text by the vcs\n"
9933 " parameter,\n"
9934 "==== text by the vcs\n"
9935 " parameter,\n"
9936 "==== text by the vcs\n"
9937 " parameter,\n"
9938 "<<<< text by the vcs\n"
9939 " parameter);\n"));
9940
9941 EXPECT_EQ("<<<<<<<\n"
9942 "|||||||\n"
9943 "=======\n"
9944 ">>>>>>>",
9945 format("<<<<<<<\n"
9946 "|||||||\n"
9947 "=======\n"
9948 ">>>>>>>"));
9949
9950 EXPECT_EQ("<<<<<<<\n"
9951 "|||||||\n"
9952 "int i;\n"
9953 "=======\n"
9954 ">>>>>>>",
9955 format("<<<<<<<\n"
9956 "|||||||\n"
9957 "int i;\n"
9958 "=======\n"
9959 ">>>>>>>"));
9960
9961 // FIXME: Handle parsing of macros around conflict markers correctly:
9962 EXPECT_EQ("#define Macro \\\n"
9963 "<<<<<<<\n"
9964 "Something \\\n"
9965 "|||||||\n"
9966 "Else \\\n"
9967 "=======\n"
9968 "Other \\\n"
9969 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00009970 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +00009971 format("#define Macro \\\n"
9972 "<<<<<<<\n"
9973 " Something \\\n"
9974 "|||||||\n"
9975 " Else \\\n"
9976 "=======\n"
9977 " Other \\\n"
9978 ">>>>>>>\n"
9979 " End\n"
9980 "int i;\n"));
9981}
9982
Daniel Jasper471894432014-08-06 13:40:26 +00009983TEST_F(FormatTest, DisableRegions) {
9984 EXPECT_EQ("int i;\n"
9985 "// clang-format off\n"
9986 " int j;\n"
9987 "// clang-format on\n"
9988 "int k;",
9989 format(" int i;\n"
9990 " // clang-format off\n"
9991 " int j;\n"
9992 " // clang-format on\n"
9993 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +00009994 EXPECT_EQ("int i;\n"
9995 "/* clang-format off */\n"
9996 " int j;\n"
9997 "/* clang-format on */\n"
9998 "int k;",
9999 format(" int i;\n"
10000 " /* clang-format off */\n"
10001 " int j;\n"
10002 " /* clang-format on */\n"
10003 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000010004
10005 // Don't reflow comments within disabled regions.
10006 EXPECT_EQ(
10007 "// clang-format off\n"
10008 "// long long long long long long line\n"
10009 "/* clang-format on */\n"
10010 "/* long long long\n"
10011 " * long long long\n"
10012 " * line */\n"
10013 "int i;\n"
10014 "/* clang-format off */\n"
10015 "/* long long long long long long line */\n",
10016 format("// clang-format off\n"
10017 "// long long long long long long line\n"
10018 "/* clang-format on */\n"
10019 "/* long long long long long long line */\n"
10020 "int i;\n"
10021 "/* clang-format off */\n"
10022 "/* long long long long long long line */\n",
10023 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000010024}
10025
Manuel Klimekf0c95b32015-06-11 10:14:13 +000010026TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
10027 format("? ) =");
10028 verifyNoCrash("#define a\\\n /**/}");
10029}
Manuel Klimek5f594f82014-08-13 14:00:41 +000010030
Daniel Jasper498f5582015-12-25 08:53:31 +000010031TEST_F(FormatTest, FormatsTableGenCode) {
10032 FormatStyle Style = getLLVMStyle();
10033 Style.Language = FormatStyle::LK_TableGen;
10034 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
10035}
10036
Nico Weberb2673a12016-11-10 21:49:25 +000010037TEST_F(FormatTest, ArrayOfTemplates) {
10038 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
10039 format("auto a = new unique_ptr<int > [ 10];"));
10040
10041 FormatStyle Spaces = getLLVMStyle();
10042 Spaces.SpacesInSquareBrackets = true;
10043 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
10044 format("auto a = new unique_ptr<int > [10];", Spaces));
10045}
10046
10047TEST_F(FormatTest, ArrayAsTemplateType) {
10048 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
10049 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
10050
10051 FormatStyle Spaces = getLLVMStyle();
10052 Spaces.SpacesInSquareBrackets = true;
10053 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
10054 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
10055}
10056
Martin Probstc9c51c42017-03-16 10:21:35 +000010057TEST_F(FormatTest, NoSpaceAfterSuper) {
10058 verifyFormat("__super::FooBar();");
10059}
10060
Eric Liu547d8792016-03-24 13:22:42 +000010061TEST(FormatStyle, GetStyleOfFile) {
10062 vfs::InMemoryFileSystem FS;
10063 // Test 1: format file in the same directory.
10064 ASSERT_TRUE(
10065 FS.addFile("/a/.clang-format", 0,
10066 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
10067 ASSERT_TRUE(
10068 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010069 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000010070 ASSERT_TRUE((bool)Style1);
10071 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000010072
Antonio Maiorano7eb75072017-01-20 01:22:42 +000010073 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000010074 ASSERT_TRUE(
10075 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010076 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000010077 ASSERT_TRUE((bool)Style2);
10078 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000010079
Antonio Maiorano7eb75072017-01-20 01:22:42 +000010080 // Test 2.2: no format on 'none' fallback style.
10081 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
10082 ASSERT_TRUE((bool)Style2);
10083 ASSERT_EQ(*Style2, getNoStyle());
10084
10085 // Test 2.3: format if config is found with no based style while fallback is
10086 // 'none'.
10087 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
10088 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
10089 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
10090 ASSERT_TRUE((bool)Style2);
10091 ASSERT_EQ(*Style2, getLLVMStyle());
10092
10093 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
10094 Style2 = getStyle("{}", "a.h", "none", "", &FS);
10095 ASSERT_TRUE((bool)Style2);
10096 ASSERT_EQ(*Style2, getLLVMStyle());
10097
Eric Liu547d8792016-03-24 13:22:42 +000010098 // Test 3: format file in parent directory.
10099 ASSERT_TRUE(
10100 FS.addFile("/c/.clang-format", 0,
10101 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
10102 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
10103 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010104 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000010105 ASSERT_TRUE((bool)Style3);
10106 ASSERT_EQ(*Style3, getGoogleStyle());
10107
10108 // Test 4: error on invalid fallback style
10109 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
10110 ASSERT_FALSE((bool)Style4);
10111 llvm::consumeError(Style4.takeError());
10112
10113 // Test 5: error on invalid yaml on command line
10114 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
10115 ASSERT_FALSE((bool)Style5);
10116 llvm::consumeError(Style5.takeError());
10117
10118 // Test 6: error on invalid style
10119 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
10120 ASSERT_FALSE((bool)Style6);
10121 llvm::consumeError(Style6.takeError());
10122
10123 // Test 7: found config file, error on parsing it
10124 ASSERT_TRUE(
10125 FS.addFile("/d/.clang-format", 0,
10126 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
10127 "InvalidKey: InvalidValue")));
10128 ASSERT_TRUE(
10129 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
10130 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
10131 ASSERT_FALSE((bool)Style7);
10132 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000010133}
10134
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010135TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
10136 // Column limit is 20.
10137 std::string Code = "Type *a =\n"
10138 " new Type();\n"
10139 "g(iiiii, 0, jjjjj,\n"
10140 " 0, kkkkk, 0, mm);\n"
10141 "int bad = format ;";
10142 std::string Expected = "auto a = new Type();\n"
10143 "g(iiiii, nullptr,\n"
10144 " jjjjj, nullptr,\n"
10145 " kkkkk, nullptr,\n"
10146 " mm);\n"
10147 "int bad = format ;";
10148 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000010149 tooling::Replacements Replaces = toReplacements(
10150 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
10151 "auto "),
10152 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
10153 "nullptr"),
10154 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
10155 "nullptr"),
10156 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
10157 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010158
10159 format::FormatStyle Style = format::getLLVMStyle();
10160 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000010161 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
10162 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
10163 << llvm::toString(FormattedReplaces.takeError()) << "\n";
10164 auto Result = applyAllReplacements(Code, *FormattedReplaces);
10165 EXPECT_TRUE(static_cast<bool>(Result));
10166 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010167}
10168
Eric Liubaf58c22016-05-18 13:43:48 +000010169TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
10170 std::string Code = "#include \"a.h\"\n"
10171 "#include \"c.h\"\n"
10172 "\n"
10173 "int main() {\n"
10174 " return 0;\n"
10175 "}";
10176 std::string Expected = "#include \"a.h\"\n"
10177 "#include \"b.h\"\n"
10178 "#include \"c.h\"\n"
10179 "\n"
10180 "int main() {\n"
10181 " return 0;\n"
10182 "}";
10183 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000010184 tooling::Replacements Replaces = toReplacements(
10185 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
10186 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000010187
10188 format::FormatStyle Style = format::getLLVMStyle();
10189 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000010190 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
10191 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
10192 << llvm::toString(FormattedReplaces.takeError()) << "\n";
10193 auto Result = applyAllReplacements(Code, *FormattedReplaces);
10194 EXPECT_TRUE(static_cast<bool>(Result));
10195 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000010196}
10197
Daniel Jasperd246a5a2015-06-15 15:25:11 +000010198} // end namespace
10199} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000010200} // end namespace clang