blob: 0c91b63a5285d38a426fe6190a9052235eca6333 [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
Manuel Klimek28cacc72013-01-07 18:10:23 +00001032TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001033 verifyFormat("class A {\n} a, b;");
1034 verifyFormat("struct A {\n} a, b;");
1035 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001036}
1037
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001038TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001039 verifyFormat("enum {\n"
1040 " Zero,\n"
1041 " One = 1,\n"
1042 " Two = One + 1,\n"
1043 " Three = (One + Two),\n"
1044 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1045 " Five = (One, Two, Three, Four, 5)\n"
1046 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001047 verifyGoogleFormat("enum {\n"
1048 " Zero,\n"
1049 " One = 1,\n"
1050 " Two = One + 1,\n"
1051 " Three = (One + Two),\n"
1052 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1053 " Five = (One, Two, Three, Four, 5)\n"
1054 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001055 verifyFormat("enum Enum {};");
1056 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001057 verifyFormat("enum X E {} d;");
1058 verifyFormat("enum __attribute__((...)) E {} d;");
1059 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001060 verifyFormat("enum {\n"
1061 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001062 "};",
1063 getLLVMStyleWithColumns(30));
1064
1065 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001066 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001067
1068 EXPECT_EQ("enum KeepEmptyLines {\n"
1069 " ONE,\n"
1070 "\n"
1071 " TWO,\n"
1072 "\n"
1073 " THREE\n"
1074 "}",
1075 format("enum KeepEmptyLines {\n"
1076 " ONE,\n"
1077 "\n"
1078 " TWO,\n"
1079 "\n"
1080 "\n"
1081 " THREE\n"
1082 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001083 verifyFormat("enum E { // comment\n"
1084 " ONE,\n"
1085 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001086 "};\n"
1087 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001088 // Not enums.
1089 verifyFormat("enum X f() {\n"
1090 " a();\n"
1091 " return 42;\n"
1092 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001093 verifyFormat("enum X Type::f() {\n"
1094 " a();\n"
1095 " return 42;\n"
1096 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001097 verifyFormat("enum ::X f() {\n"
1098 " a();\n"
1099 " return 42;\n"
1100 "}");
1101 verifyFormat("enum ns::X f() {\n"
1102 " a();\n"
1103 " return 42;\n"
1104 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001105}
1106
Daniel Jasperb7150872013-08-30 10:10:19 +00001107TEST_F(FormatTest, FormatsEnumsWithErrors) {
1108 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001109 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001110 " Two = 1;\n"
1111 "};");
1112 verifyFormat("namespace n {\n"
1113 "enum Type {\n"
1114 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001115 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001116 " int i;\n"
1117 "}\n"
1118 "void g() {}");
1119}
1120
Daniel Jasper2b41a822013-08-20 12:42:50 +00001121TEST_F(FormatTest, FormatsEnumStruct) {
1122 verifyFormat("enum struct {\n"
1123 " Zero,\n"
1124 " One = 1,\n"
1125 " Two = One + 1,\n"
1126 " Three = (One + Two),\n"
1127 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1128 " Five = (One, Two, Three, Four, 5)\n"
1129 "};");
1130 verifyFormat("enum struct Enum {};");
1131 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001132 verifyFormat("enum struct X E {} d;");
1133 verifyFormat("enum struct __attribute__((...)) E {} d;");
1134 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001135 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1136}
1137
1138TEST_F(FormatTest, FormatsEnumClass) {
1139 verifyFormat("enum class {\n"
1140 " Zero,\n"
1141 " One = 1,\n"
1142 " Two = One + 1,\n"
1143 " Three = (One + Two),\n"
1144 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1145 " Five = (One, Two, Three, Four, 5)\n"
1146 "};");
1147 verifyFormat("enum class Enum {};");
1148 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001149 verifyFormat("enum class X E {} d;");
1150 verifyFormat("enum class __attribute__((...)) E {} d;");
1151 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001152 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1153}
1154
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001155TEST_F(FormatTest, FormatsEnumTypes) {
1156 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001157 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001158 " B\n"
1159 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001160 verifyFormat("enum X : int { A, B };");
1161 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001162}
1163
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001164TEST_F(FormatTest, FormatsNSEnums) {
1165 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1166 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1167 " // Information about someDecentlyLongValue.\n"
1168 " someDecentlyLongValue,\n"
1169 " // Information about anotherDecentlyLongValue.\n"
1170 " anotherDecentlyLongValue,\n"
1171 " // Information about aThirdDecentlyLongValue.\n"
1172 " aThirdDecentlyLongValue\n"
1173 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001174 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1175 " a = 1,\n"
1176 " b = 2,\n"
1177 " c = 3,\n"
1178 "};");
1179 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1180 " a = 1,\n"
1181 " b = 2,\n"
1182 " c = 3,\n"
1183 "};");
1184 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1185 " a = 1,\n"
1186 " b = 2,\n"
1187 " c = 3,\n"
1188 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001189}
1190
Nico Weber7769a902013-01-14 05:49:49 +00001191TEST_F(FormatTest, FormatsBitfields) {
1192 verifyFormat("struct Bitfields {\n"
1193 " unsigned sClass : 8;\n"
1194 " unsigned ValueKind : 2;\n"
1195 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001196 verifyFormat("struct A {\n"
1197 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1198 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1199 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001200 verifyFormat("struct MyStruct {\n"
1201 " uchar data;\n"
1202 " uchar : 8;\n"
1203 " uchar : 8;\n"
1204 " uchar other;\n"
1205 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001206}
1207
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001208TEST_F(FormatTest, FormatsNamespaces) {
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001209 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1210 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1211
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001212 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001213 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001214 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001215 "}",
1216 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001217 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001218 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001219 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001220 "}",
1221 LLVMWithNoNamespaceFix);
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001222 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001223 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001224 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001225 "}",
1226 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001227 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001228 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001229 "void f() { f(); }",
1230 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001231
1232 // This code is more common than we thought; if we
1233 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001234 // its own line, which is undesirable.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001235 verifyFormat("namespace {};",
1236 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001237 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001238 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001239 "};",
1240 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001241
1242 verifyFormat("namespace {\n"
1243 "int SomeVariable = 0; // comment\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001244 "} // namespace",
1245 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001246 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1247 "#define HEADER_GUARD\n"
1248 "namespace my_namespace {\n"
1249 "int i;\n"
1250 "} // my_namespace\n"
1251 "#endif // HEADER_GUARD",
1252 format("#ifndef HEADER_GUARD\n"
1253 " #define HEADER_GUARD\n"
1254 " namespace my_namespace {\n"
1255 "int i;\n"
1256 "} // my_namespace\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001257 "#endif // HEADER_GUARD",
1258 LLVMWithNoNamespaceFix));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001259
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001260 EXPECT_EQ("namespace A::B {\n"
1261 "class C {};\n"
1262 "}",
1263 format("namespace A::B {\n"
1264 "class C {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001265 "}",
1266 LLVMWithNoNamespaceFix));
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001267
Daniel Jasper65ee3472013-07-31 23:16:02 +00001268 FormatStyle Style = getLLVMStyle();
1269 Style.NamespaceIndentation = FormatStyle::NI_All;
1270 EXPECT_EQ("namespace out {\n"
1271 " int i;\n"
1272 " namespace in {\n"
1273 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001274 " } // namespace in\n"
1275 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001276 format("namespace out {\n"
1277 "int i;\n"
1278 "namespace in {\n"
1279 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001280 "} // namespace in\n"
1281 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001282 Style));
1283
1284 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1285 EXPECT_EQ("namespace out {\n"
1286 "int i;\n"
1287 "namespace in {\n"
1288 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001289 "} // namespace in\n"
1290 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001291 format("namespace out {\n"
1292 "int i;\n"
1293 "namespace in {\n"
1294 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001295 "} // namespace in\n"
1296 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001297 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001298}
1299
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001300TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00001301
Daniel Jasper40aacf42013-03-14 13:45:21 +00001302TEST_F(FormatTest, FormatsInlineASM) {
1303 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001304 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001305 verifyFormat(
1306 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1307 " \"cpuid\\n\\t\"\n"
1308 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001309 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001310 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001311 EXPECT_EQ(
1312 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001313 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001314 " mov edx,[that] // vtable in edx\n"
1315 " mov eax,methodIndex\n"
1316 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001317 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001318 "}",
1319 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1320 " __asm {\n"
1321 " mov edx,[that] // vtable in edx\n"
1322 " mov eax,methodIndex\n"
1323 " call [edx][eax*4] // stdcall\n"
1324 " }\n"
1325 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001326 EXPECT_EQ("_asm {\n"
1327 " xor eax, eax;\n"
1328 " cpuid;\n"
1329 "}",
1330 format("_asm {\n"
1331 " xor eax, eax;\n"
1332 " cpuid;\n"
1333 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00001334 verifyFormat("void function() {\n"
1335 " // comment\n"
1336 " asm(\"\");\n"
1337 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00001338 EXPECT_EQ("__asm {\n"
1339 "}\n"
1340 "int i;",
1341 format("__asm {\n"
1342 "}\n"
1343 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00001344}
1345
Nico Weberd5650bd2013-01-07 16:36:17 +00001346TEST_F(FormatTest, FormatTryCatch) {
1347 verifyFormat("try {\n"
1348 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001349 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001350 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001351 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001352 " exit(42);\n"
1353 "}");
1354
1355 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00001356 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001357 " return 5;\n"
1358 "}");
1359 verifyFormat("class A {\n"
1360 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001361 " A() try : a(0) {\n"
1362 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001363 " throw;\n"
1364 " }\n"
1365 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00001366
1367 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001368 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00001369}
1370
Nico Weberfac23712015-02-04 15:26:27 +00001371TEST_F(FormatTest, FormatSEHTryCatch) {
1372 verifyFormat("__try {\n"
1373 " int a = b * c;\n"
1374 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
1375 " // Do nothing.\n"
1376 "}");
1377
1378 verifyFormat("__try {\n"
1379 " int a = b * c;\n"
1380 "} __finally {\n"
1381 " // Do nothing.\n"
1382 "}");
1383
1384 verifyFormat("DEBUG({\n"
1385 " __try {\n"
1386 " } __finally {\n"
1387 " }\n"
1388 "});\n");
1389}
1390
Daniel Jasper04a71a42014-05-08 11:58:24 +00001391TEST_F(FormatTest, IncompleteTryCatchBlocks) {
1392 verifyFormat("try {\n"
1393 " f();\n"
1394 "} catch {\n"
1395 " g();\n"
1396 "}");
1397 verifyFormat("try {\n"
1398 " f();\n"
1399 "} catch (A a) MACRO(x) {\n"
1400 " g();\n"
1401 "} catch (B b) MACRO(x) {\n"
1402 " g();\n"
1403 "}");
1404}
1405
1406TEST_F(FormatTest, FormatTryCatchBraceStyles) {
1407 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00001408 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
1409 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00001410 Style.BreakBeforeBraces = BraceStyle;
1411 verifyFormat("try {\n"
1412 " // something\n"
1413 "} catch (...) {\n"
1414 " // something\n"
1415 "}",
1416 Style);
1417 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00001418 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
1419 verifyFormat("try {\n"
1420 " // something\n"
1421 "}\n"
1422 "catch (...) {\n"
1423 " // something\n"
1424 "}",
1425 Style);
Nico Weberfac23712015-02-04 15:26:27 +00001426 verifyFormat("__try {\n"
1427 " // something\n"
1428 "}\n"
1429 "__finally {\n"
1430 " // something\n"
1431 "}",
1432 Style);
Nico Weber33381f52015-02-07 01:57:32 +00001433 verifyFormat("@try {\n"
1434 " // something\n"
1435 "}\n"
1436 "@finally {\n"
1437 " // something\n"
1438 "}",
1439 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001440 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
1441 verifyFormat("try\n"
1442 "{\n"
1443 " // something\n"
1444 "}\n"
1445 "catch (...)\n"
1446 "{\n"
1447 " // something\n"
1448 "}",
1449 Style);
1450 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
1451 verifyFormat("try\n"
1452 " {\n"
1453 " // something\n"
1454 " }\n"
1455 "catch (...)\n"
1456 " {\n"
1457 " // something\n"
1458 " }",
1459 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00001460 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1461 Style.BraceWrapping.BeforeCatch = true;
1462 verifyFormat("try {\n"
1463 " // something\n"
1464 "}\n"
1465 "catch (...) {\n"
1466 " // something\n"
1467 "}",
1468 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001469}
1470
Daniel Jaspere25509f2012-12-17 11:29:41 +00001471TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001472 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00001473
Daniel Jaspera44991332015-04-29 13:06:49 +00001474 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
1475 " 100000000, "
1476 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00001477
Daniel Jasper473c62c2013-05-17 09:35:01 +00001478 // Here, everything other than the "}" would fit on a line.
1479 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001480 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001481 EXPECT_EQ("S s = {a,\n"
1482 "\n"
1483 " b};",
1484 format("S s = {\n"
1485 " a,\n"
1486 "\n"
1487 " b\n"
1488 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00001489
1490 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
1491 // line. However, the formatting looks a bit off and this probably doesn't
1492 // happen often in practice.
1493 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001494 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00001495 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001496}
1497
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001498TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001499 verifyFormat("const struct A a = {.a = 1, .b = 2};");
1500 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
1501 " .bbbbbbbbbb = 2,\n"
1502 " .cccccccccc = 3,\n"
1503 " .dddddddddd = 4,\n"
1504 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001505 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001506 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
1507 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
1508 " .ccccccccccccccccccccccccccc = 3,\n"
1509 " .ddddddddddddddddddddddddddd = 4,\n"
1510 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001511
1512 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
1513}
1514
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001515TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001516 verifyFormat("static A x = {{{}}};\n");
1517 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
1518 " {init1, init2, init3, init4}}};",
1519 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00001520
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001521 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001522 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1523 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1524 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
1525 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00001526 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001527 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1528 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1529 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00001530 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
1531 " {rect.fRight - rect.fLeft, rect.fBottom - "
1532 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001533
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001534 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001535 "SomeArrayOfSomeType a = {\n"
1536 " {{1, 2, 3},\n"
1537 " {1, 2, 3},\n"
1538 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
1539 " 333333333333333333333333333333},\n"
1540 " {1, 2, 3},\n"
1541 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00001542 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00001543 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001544 " {{1, 2, 3}},\n"
1545 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001546 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
1547 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001548 " {{1, 2, 3}},\n"
1549 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001550
Daniel Jaspera44991332015-04-29 13:06:49 +00001551 verifyFormat("struct {\n"
1552 " unsigned bit;\n"
1553 " const char *const name;\n"
1554 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
1555 " {kOsWin, \"Windows\"},\n"
1556 " {kOsLinux, \"Linux\"},\n"
1557 " {kOsCrOS, \"Chrome OS\"}};");
1558 verifyFormat("struct {\n"
1559 " unsigned bit;\n"
1560 " const char *const name;\n"
1561 "} kBitsToOs[] = {\n"
1562 " {kOsMac, \"Mac\"},\n"
1563 " {kOsWin, \"Windows\"},\n"
1564 " {kOsLinux, \"Linux\"},\n"
1565 " {kOsCrOS, \"Chrome OS\"},\n"
1566 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001567}
1568
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001569TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
1570 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
1571 " \\\n"
1572 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
1573}
1574
Daniel Jasperda16db32013-01-07 10:48:50 +00001575TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00001576 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
1577 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00001578
1579 // Do break defaulted and deleted functions.
1580 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1581 " default;",
1582 getLLVMStyleWithColumns(40));
1583 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1584 " delete;",
1585 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00001586}
1587
1588TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
1589 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
1590 getLLVMStyleWithColumns(40));
1591 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1592 getLLVMStyleWithColumns(40));
1593 EXPECT_EQ("#define Q \\\n"
1594 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
1595 " \"aaaaaaaa.cpp\"",
1596 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1597 getLLVMStyleWithColumns(40)));
1598}
1599
1600TEST_F(FormatTest, UnderstandsLinePPDirective) {
1601 EXPECT_EQ("# 123 \"A string literal\"",
1602 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00001603}
1604
Manuel Klimek591b5802013-01-31 15:58:48 +00001605TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00001606 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00001607 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001608}
1609
1610TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
1611 EXPECT_EQ("#line 42 \"test\"\n",
1612 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001613 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
1614 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001615}
1616
1617TEST_F(FormatTest, EndOfFileEndsPPDirective) {
1618 EXPECT_EQ("#line 42 \"test\"",
1619 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001620 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001621}
1622
Daniel Jasper877615c2013-10-11 19:45:02 +00001623TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
1624 verifyFormat("#define A \\x20");
1625 verifyFormat("#define A \\ x20");
1626 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
1627 verifyFormat("#define A ''");
1628 verifyFormat("#define A ''qqq");
1629 verifyFormat("#define A `qqq");
1630 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00001631 EXPECT_EQ("const char *c = STRINGIFY(\n"
1632 "\\na : b);",
1633 format("const char * c = STRINGIFY(\n"
1634 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00001635
1636 verifyFormat("a\r\\");
1637 verifyFormat("a\v\\");
1638 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00001639}
1640
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001641TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001642 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
1643 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001644 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001645 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00001646 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00001647
1648 verifyFormat("#define A A\n#define A A");
1649 verifyFormat("#define A(X) A\n#define A A");
1650
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001651 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
1652 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001653}
1654
1655TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001656 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001657 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001658 "#define A( \\\n"
1659 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001660 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001661 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001662 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001663 " #include \"a.h\"\n"
1664 "#define A(A,\\\n"
1665 " B)\n"
1666 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001667 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001668 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001669}
1670
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001671TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00001672
1673TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
1674 EXPECT_EQ("#define A \\\n"
1675 " c; \\\n"
1676 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001677 "f;",
1678 format("#define A c; e;\n"
1679 "f;",
1680 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00001681}
1682
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001683TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00001684
Manuel Klimek1abf7892013-01-04 23:34:14 +00001685TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00001686 EXPECT_EQ("int x,\n"
1687 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001688 " y;",
1689 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00001690}
1691
Manuel Klimek09e07972013-01-05 21:34:55 +00001692TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00001693 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00001694 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00001695 verifyFormat("#define A \\\n"
1696 " { \\\n"
1697 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001698 " }",
1699 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00001700
1701 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001702 " void function##X()",
1703 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00001704
1705 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001706 " void a##b##c()",
1707 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00001708
Daniel Jasper39825ea2013-01-14 15:40:57 +00001709 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00001710}
1711
Manuel Klimekd053c5b2013-01-23 14:37:36 +00001712TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00001713 EXPECT_EQ("#define A (x)", format("#define A (x)"));
1714 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00001715}
1716
Manuel Klimek0c137952013-02-11 12:33:24 +00001717TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
1718 EXPECT_EQ("#define A b;", format("#define A \\\n"
1719 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001720 " b;",
1721 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001722 EXPECT_EQ("#define A \\\n"
1723 " \\\n"
1724 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001725 " b;",
1726 format("#define A \\\n"
1727 " \\\n"
1728 " a; \\\n"
1729 " b;",
1730 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001731 EXPECT_EQ("#define A \\\n"
1732 " a; \\\n"
1733 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001734 " b;",
1735 format("#define A \\\n"
1736 " a; \\\n"
1737 " \\\n"
1738 " b;",
1739 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001740}
1741
Daniel Jasper00475962013-02-19 17:14:38 +00001742TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001743 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00001744 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00001745 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00001746 " case 2\n",
1747 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00001748 verifyFormat("#define MACRO(a) \\\n"
1749 " if (a) \\\n"
1750 " f(); \\\n"
1751 " else \\\n"
1752 " g()",
1753 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00001754 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001755 verifyIncompleteFormat("#define STR(x) #x\n"
1756 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00001757 verifyFormat("#pragma omp threadprivate( \\\n"
1758 " y)), // expected-warning",
1759 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00001760 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00001761 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001762 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00001763 "#define b \\\n"
1764 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001765 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00001766 "a",
1767 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00001768 verifyFormat("#define A \\\n"
1769 " { \\\n"
1770 " {\n"
1771 "#define B \\\n"
1772 " } \\\n"
1773 " }",
1774 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00001775 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00001776 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00001777 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00001778 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00001779}
1780
Daniel Jasper40e19212013-05-29 13:16:10 +00001781TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
1782 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
1783 EXPECT_EQ("class A : public QObject {\n"
1784 " Q_OBJECT\n"
1785 "\n"
1786 " A() {}\n"
1787 "};",
1788 format("class A : public QObject {\n"
1789 " Q_OBJECT\n"
1790 "\n"
1791 " A() {\n}\n"
1792 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00001793 EXPECT_EQ("MACRO\n"
1794 "/*static*/ int i;",
1795 format("MACRO\n"
1796 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00001797 EXPECT_EQ("SOME_MACRO\n"
1798 "namespace {\n"
1799 "void f();\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001800 "} // namespace",
Daniel Jasper41a0f782013-05-29 14:09:17 +00001801 format("SOME_MACRO\n"
1802 " namespace {\n"
1803 "void f( );\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001804 "} // namespace"));
Daniel Jasper40e19212013-05-29 13:16:10 +00001805 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00001806 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
1807 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00001808 // Only if everything is upper case.
1809 EXPECT_EQ("class A : public QObject {\n"
1810 " Q_Object A() {}\n"
1811 "};",
1812 format("class A : public QObject {\n"
1813 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00001814 " A() {\n}\n"
1815 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00001816
1817 // Only if the next line can actually start an unwrapped line.
1818 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
1819 format("SOME_WEIRD_LOG_MACRO\n"
1820 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00001821
1822 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00001823 "(n, buffers))\n",
1824 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00001825}
1826
Alexander Kornienkode644272013-04-08 22:16:06 +00001827TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
1828 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
1829 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
1830 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001831 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00001832 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
1833 "int *createScopDetectionPass() { return 0; }",
1834 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
1835 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
1836 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
1837 " class X {};\n"
1838 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
1839 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001840 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
1841 // braces, so that inner block is indented one level more.
1842 EXPECT_EQ("int q() {\n"
1843 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
1844 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
1845 " IPC_END_MESSAGE_MAP()\n"
1846 "}",
1847 format("int q() {\n"
1848 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
1849 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
1850 " IPC_END_MESSAGE_MAP()\n"
1851 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00001852
Daniel Jasper352dae12014-01-03 11:50:46 +00001853 // Same inside macros.
1854 EXPECT_EQ("#define LIST(L) \\\n"
1855 " L(A) \\\n"
1856 " L(B) \\\n"
1857 " L(C)",
1858 format("#define LIST(L) \\\n"
1859 " L(A) \\\n"
1860 " L(B) \\\n"
1861 " L(C)",
1862 getGoogleStyle()));
1863
Daniel Jasper545c6522013-09-17 09:26:07 +00001864 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001865 EXPECT_EQ("int q() {\n"
1866 " f(x);\n"
1867 " f(x) {}\n"
1868 " f(x)->g();\n"
1869 " f(x)->*g();\n"
1870 " f(x).g();\n"
1871 " f(x) = x;\n"
1872 " f(x) += x;\n"
1873 " f(x) -= x;\n"
1874 " f(x) *= x;\n"
1875 " f(x) /= x;\n"
1876 " f(x) %= x;\n"
1877 " f(x) &= x;\n"
1878 " f(x) |= x;\n"
1879 " f(x) ^= x;\n"
1880 " f(x) >>= x;\n"
1881 " f(x) <<= x;\n"
1882 " f(x)[y].z();\n"
1883 " LOG(INFO) << x;\n"
1884 " ifstream(x) >> x;\n"
1885 "}\n",
1886 format("int q() {\n"
1887 " f(x)\n;\n"
1888 " f(x)\n {}\n"
1889 " f(x)\n->g();\n"
1890 " f(x)\n->*g();\n"
1891 " f(x)\n.g();\n"
1892 " f(x)\n = x;\n"
1893 " f(x)\n += x;\n"
1894 " f(x)\n -= x;\n"
1895 " f(x)\n *= x;\n"
1896 " f(x)\n /= x;\n"
1897 " f(x)\n %= x;\n"
1898 " f(x)\n &= x;\n"
1899 " f(x)\n |= x;\n"
1900 " f(x)\n ^= x;\n"
1901 " f(x)\n >>= x;\n"
1902 " f(x)\n <<= x;\n"
1903 " f(x)\n[y].z();\n"
1904 " LOG(INFO)\n << x;\n"
1905 " ifstream(x)\n >> x;\n"
1906 "}\n"));
1907 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001908 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001909 " if (1) {\n"
1910 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001911 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001912 " while (1) {\n"
1913 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001914 " F(x)\n"
1915 " G(x);\n"
1916 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001917 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001918 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001919 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001920 " }\n"
1921 "}\n",
1922 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001923 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001924 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001925 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001926 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001927 "F(x)\n"
1928 "G(x);\n"
1929 "F(x)\n"
1930 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001931 "}\n"));
1932 EXPECT_EQ("class A {\n"
1933 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00001934 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001935 " A(X x)\n" // FIXME: function-level try blocks are broken.
1936 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001937 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001938 " }\n"
1939 "};",
1940 format("class A {\n"
1941 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00001942 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001943 " A(X x)\n"
1944 " try : t(0) {} catch (...) {}\n"
1945 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00001946 EXPECT_EQ("class SomeClass {\n"
1947 "public:\n"
1948 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1949 "};",
1950 format("class SomeClass {\n"
1951 "public:\n"
1952 " SomeClass()\n"
1953 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1954 "};"));
1955 EXPECT_EQ("class SomeClass {\n"
1956 "public:\n"
1957 " SomeClass()\n"
1958 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1959 "};",
1960 format("class SomeClass {\n"
1961 "public:\n"
1962 " SomeClass()\n"
1963 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1964 "};",
1965 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00001966
1967 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00001968}
1969
Manuel Klimek4fe43002013-05-22 12:51:29 +00001970TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
1971 verifyFormat("#define A \\\n"
1972 " f({ \\\n"
1973 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001974 " });",
1975 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00001976}
1977
Manuel Klimekef2cfb12013-01-05 22:14:16 +00001978TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
1979 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
1980}
1981
Manuel Klimek52d0fd82013-01-05 22:56:06 +00001982TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001983 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00001984}
1985
Manuel Klimek1058d982013-01-06 20:07:31 +00001986TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
1987 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
1988 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
1989 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
1990 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
1991}
Manuel Klimek1abf7892013-01-04 23:34:14 +00001992
Daniel Jaspere2408e32015-05-06 11:16:43 +00001993TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00001994 EXPECT_EQ(
1995 "#define A \\\n int i; \\\n int j;",
1996 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00001997 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00001998 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00001999 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002000 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00002001}
2002
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002003TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2004 verifyFormat("#define A \\\n"
2005 " int v( \\\n"
2006 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002007 " int i;",
2008 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002009}
2010
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002011TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00002012 EXPECT_EQ(
2013 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2014 " \\\n"
2015 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2016 "\n"
2017 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2018 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2019 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
2020 "\\\n"
2021 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2022 " \n"
2023 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2024 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002025}
2026
Manuel Klimek52b15152013-01-09 15:25:02 +00002027TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2028 EXPECT_EQ("int\n"
2029 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002030 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002031 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002032 verifyFormat("functionCallTo(\n"
2033 " someOtherFunction(\n"
2034 " withSomeParameters, whichInSequence,\n"
2035 " areLongerThanALine(andAnotherCall,\n"
2036 "#define A B\n"
2037 " withMoreParamters,\n"
2038 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002039 " andMoreParameters),\n"
2040 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002041 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002042 verifyFormat("Foo::Foo()\n"
2043 "#ifdef BAR\n"
2044 " : baz(0)\n"
2045 "#endif\n"
2046 "{\n"
2047 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002048 verifyFormat("void f() {\n"
2049 " if (true)\n"
2050 "#ifdef A\n"
2051 " f(42);\n"
2052 " x();\n"
2053 "#else\n"
2054 " g();\n"
2055 " x();\n"
2056 "#endif\n"
2057 "}");
2058 verifyFormat("void f(param1, param2,\n"
2059 " param3,\n"
2060 "#ifdef A\n"
2061 " param4(param5,\n"
2062 "#ifdef A1\n"
2063 " param6,\n"
2064 "#ifdef A2\n"
2065 " param7),\n"
2066 "#else\n"
2067 " param8),\n"
2068 " param9,\n"
2069 "#endif\n"
2070 " param10,\n"
2071 "#endif\n"
2072 " param11)\n"
2073 "#else\n"
2074 " param12)\n"
2075 "#endif\n"
2076 "{\n"
2077 " x();\n"
2078 "}",
2079 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002080 verifyFormat("#if 1\n"
2081 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002082 verifyFormat("#if 1\n"
2083 "#endif\n"
2084 "#if 1\n"
2085 "#else\n"
2086 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002087 verifyFormat("DEBUG({\n"
2088 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2089 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2090 "});\n"
2091 "#if a\n"
2092 "#else\n"
2093 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002094
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002095 verifyIncompleteFormat("void f(\n"
2096 "#if A\n"
2097 " );\n"
2098 "#else\n"
2099 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002100}
2101
Manuel Klimek14bd9172014-01-29 08:49:02 +00002102TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2103 verifyFormat("#endif\n"
2104 "#if B");
2105}
2106
Manuel Klimek88033d72013-10-21 08:11:15 +00002107TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2108 FormatStyle SingleLine = getLLVMStyle();
2109 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002110 verifyFormat("#if 0\n"
2111 "#elif 1\n"
2112 "#endif\n"
2113 "void foo() {\n"
2114 " if (test) foo2();\n"
2115 "}",
2116 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002117}
2118
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002119TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002120 verifyFormat("functionCall({ int i; });");
2121 verifyFormat("functionCall({\n"
2122 " int i;\n"
2123 " int j;\n"
2124 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00002125 verifyFormat("functionCall(\n"
2126 " {\n"
2127 " int i;\n"
2128 " int j;\n"
2129 " },\n"
2130 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00002131 verifyFormat("functionA(functionB({\n"
2132 " int i;\n"
2133 " int j;\n"
2134 " }),\n"
2135 " aaaa, bbbb, cccc);");
2136 verifyFormat("functionCall(\n"
2137 " {\n"
2138 " int i;\n"
2139 " int j;\n"
2140 " },\n"
2141 " aaaa, bbbb, // comment\n"
2142 " cccc);");
2143 verifyFormat("functionA(functionB({\n"
2144 " int i;\n"
2145 " int j;\n"
2146 " }),\n"
2147 " aaaa, bbbb, // comment\n"
2148 " cccc);");
2149 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2150 verifyFormat("functionCall(aaaa, bbbb, {\n"
2151 " int i;\n"
2152 " int j;\n"
2153 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00002154 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00002155 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00002156 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002157 " int i; // break\n"
2158 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00002159 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2160 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002161 verifyFormat("DEBUG({\n"
2162 " if (a)\n"
2163 " f();\n"
2164 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002165}
2166
2167TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002168 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002169 "int i;",
2170 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002171}
2172
2173TEST_F(FormatTest, LayoutNestedBlocks) {
2174 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2175 " struct s {\n"
2176 " int i;\n"
2177 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002178 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002179 " for (int i = 0; i < 10; ++i)\n"
2180 " return;\n"
2181 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002182 verifyFormat("call(parameter, {\n"
2183 " something();\n"
2184 " // Comment using all columns.\n"
2185 " somethingelse();\n"
2186 "});",
2187 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00002188 verifyFormat("DEBUG( //\n"
2189 " { f(); }, a);");
2190 verifyFormat("DEBUG( //\n"
2191 " {\n"
2192 " f(); //\n"
2193 " },\n"
2194 " a);");
2195
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002196 EXPECT_EQ("call(parameter, {\n"
2197 " something();\n"
2198 " // Comment too\n"
2199 " // looooooooooong.\n"
2200 " somethingElse();\n"
2201 "});",
2202 format("call(parameter, {\n"
2203 " something();\n"
2204 " // Comment too looooooooooong.\n"
2205 " somethingElse();\n"
2206 "});",
2207 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002208 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00002209 EXPECT_EQ("DEBUG({ // comment\n"
2210 " int i;\n"
2211 "});",
2212 format("DEBUG({ // comment\n"
2213 "int i;\n"
2214 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002215 EXPECT_EQ("DEBUG({\n"
2216 " int i;\n"
2217 "\n"
2218 " // comment\n"
2219 " int j;\n"
2220 "});",
2221 format("DEBUG({\n"
2222 " int i;\n"
2223 "\n"
2224 " // comment\n"
2225 " int j;\n"
2226 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00002227
2228 verifyFormat("DEBUG({\n"
2229 " if (a)\n"
2230 " return;\n"
2231 "});");
2232 verifyGoogleFormat("DEBUG({\n"
2233 " if (a) return;\n"
2234 "});");
2235 FormatStyle Style = getGoogleStyle();
2236 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00002237 verifyFormat("Debug(aaaaa,\n"
2238 " {\n"
2239 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
2240 " },\n"
2241 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00002242 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002243
Daniel Jaspera87af7a2015-06-30 11:32:22 +00002244 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
2245
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002246 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00002247}
2248
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002249TEST_F(FormatTest, FormatNestedBlocksInMacros) {
2250 EXPECT_EQ("#define MACRO() \\\n"
2251 " Debug(aaa, /* force line break */ \\\n"
2252 " { \\\n"
2253 " int i; \\\n"
2254 " int j; \\\n"
2255 " })",
2256 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
2257 " { int i; int j; })",
2258 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00002259
2260 EXPECT_EQ("#define A \\\n"
2261 " [] { \\\n"
2262 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2263 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
2264 " }",
2265 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2266 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
2267 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002268}
2269
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002270TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
2271 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002272 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002273 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002274}
2275
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00002276TEST_F(FormatTest, FormatBeginBlockEndMacros) {
2277 FormatStyle Style = getLLVMStyle();
2278 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
2279 Style.MacroBlockEnd = "^[A-Z_]+_END$";
2280 verifyFormat("FOO_BEGIN\n"
2281 " FOO_ENTRY\n"
2282 "FOO_END", Style);
2283 verifyFormat("FOO_BEGIN\n"
2284 " NESTED_FOO_BEGIN\n"
2285 " NESTED_FOO_ENTRY\n"
2286 " NESTED_FOO_END\n"
2287 "FOO_END", Style);
2288 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
2289 " int x;\n"
2290 " x = 1;\n"
2291 "FOO_END(Baz)", Style);
2292}
2293
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002294//===----------------------------------------------------------------------===//
2295// Line break tests.
2296//===----------------------------------------------------------------------===//
2297
Daniel Jasperf79b0b12013-08-30 08:29:25 +00002298TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002299 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00002300 "void f() {\n"
2301 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
2302 " parameter, parameter, parameter)),\n"
2303 " SecondLongCall(parameter));\n"
2304 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002305 verifyFormat(
2306 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2307 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2308 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2309 " aaaaaaaaaaaaaaaaaaaaaaaa);");
2310 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00002311 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2312 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
2313 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
2314 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002315 verifyFormat(
2316 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
2317 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
2318 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
2319 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00002320 verifyFormat("int a = bbbb && ccc &&\n"
2321 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00002322 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00002323 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002324}
2325
Daniel Jasperd69fc772013-05-08 14:12:04 +00002326TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
2327 verifyFormat(
2328 "bool aaaaaaa =\n"
2329 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
2330 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002331 verifyFormat(
2332 "bool aaaaaaa =\n"
2333 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
2334 " bbbbbbbb();");
2335
Daniel Jasperd69fc772013-05-08 14:12:04 +00002336 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2337 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
2338 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002339 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2340 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
2341 " ccccccccc == ddddddddddd;");
2342 verifyFormat(
2343 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
2344 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
2345 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00002346
2347 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2348 " aaaaaa) &&\n"
2349 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00002350 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2351 " aaaaaa) >>\n"
2352 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00002353 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00002354 " SourceMgr.getSpellingColumnNumber(\n"
2355 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
2356 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00002357
Daniel Jasper68d888c2013-06-03 08:42:05 +00002358 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2359 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
2360 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00002361 verifyFormat("b = a &&\n"
2362 " // Comment\n"
2363 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00002364
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002365 // If the LHS of a comparison is not a binary expression itself, the
2366 // additional linebreak confuses many people.
2367 verifyFormat(
2368 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2369 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
2370 "}");
2371 verifyFormat(
2372 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2373 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2374 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00002375 verifyFormat(
2376 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
2377 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2378 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002379 // Even explicit parentheses stress the precedence enough to make the
2380 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00002381 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2382 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2383 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002384 // This cases is borderline, but with the indentation it is still readable.
2385 verifyFormat(
2386 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2387 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2388 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
2389 "}",
2390 getLLVMStyleWithColumns(75));
2391
2392 // If the LHS is a binary expression, we should still use the additional break
2393 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00002394 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2395 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2396 " 5) {\n"
2397 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002398
Daniel Jasper571f1af2013-05-14 20:39:56 +00002399 FormatStyle OnePerLine = getLLVMStyle();
2400 OnePerLine.BinPackParameters = false;
2401 verifyFormat(
2402 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2403 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2404 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
2405 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00002406
2407 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
2408 " .aaa(aaaaaaaaaaaaa) *\n"
2409 " aaaaaaa +\n"
2410 " aaaaaaa;",
2411 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00002412}
2413
Daniel Jasper6bee6822013-04-08 20:33:42 +00002414TEST_F(FormatTest, ExpressionIndentation) {
2415 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2416 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2417 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2418 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2419 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
2420 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
2421 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2422 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
2423 " ccccccccccccccccccccccccccccccccccccccccc;");
2424 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2425 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2426 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2427 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2428 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2429 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2430 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2431 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2432 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2433 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2434 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2435 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002436 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002437 "} else if (aaaaa && bbbbb > // break\n"
2438 " ccccc) {\n"
2439 "}");
2440 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00002441 "} else if (aaaaa &&\n"
2442 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002443 " ccccc &&\n"
2444 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002445 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00002446
2447 // Presence of a trailing comment used to change indentation of b.
2448 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
2449 " b;\n"
2450 "return aaaaaaaaaaaaaaaaaaa +\n"
2451 " b; //",
2452 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00002453}
2454
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002455TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
2456 // Not sure what the best system is here. Like this, the LHS can be found
2457 // immediately above an operator (everything with the same or a higher
2458 // indent). The RHS is aligned right of the operator and so compasses
2459 // everything until something with the same indent as the operator is found.
2460 // FIXME: Is this a good system?
2461 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00002462 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002463 verifyFormat(
2464 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002465 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2466 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2467 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2468 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2469 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002470 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002471 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2472 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002473 Style);
2474 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002475 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2476 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002477 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2478 Style);
2479 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002480 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2481 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002482 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2483 Style);
2484 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2485 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002486 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2487 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002488 Style);
2489 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00002490 "} else if (aaaaa\n"
2491 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002492 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002493 "}",
2494 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00002495 verifyFormat("return (a)\n"
2496 " // comment\n"
2497 " + b;",
2498 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00002499 verifyFormat(
2500 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2501 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2502 " + cc;",
2503 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00002504
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00002505 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2506 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
2507 Style);
2508
Daniel Jasper9e5ede02013-11-08 19:56:28 +00002509 // Forced by comments.
2510 verifyFormat(
2511 "unsigned ContentSize =\n"
2512 " sizeof(int16_t) // DWARF ARange version number\n"
2513 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
2514 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
2515 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00002516
2517 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
2518 " == boost::fusion::at_c<1>(iiii).second;",
2519 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00002520
2521 Style.ColumnLimit = 60;
2522 verifyFormat("zzzzzzzzzz\n"
2523 " = bbbbbbbbbbbbbbbbb\n"
2524 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
2525 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002526}
2527
Daniel Jasperb1270392017-02-01 23:27:37 +00002528TEST_F(FormatTest, EnforcedOperatorWraps) {
2529 // Here we'd like to wrap after the || operators, but a comment is forcing an
2530 // earlier wrap.
2531 verifyFormat("bool x = aaaaa //\n"
2532 " || bbbbb\n"
2533 " //\n"
2534 " || cccc;");
2535}
2536
Daniel Jasper3219e432014-12-02 13:24:51 +00002537TEST_F(FormatTest, NoOperandAlignment) {
2538 FormatStyle Style = getLLVMStyle();
2539 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00002540 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
2541 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2542 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
2543 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002544 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00002545 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2546 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2547 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2548 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2549 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2550 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2551 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2552 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2553 " > ccccccccccccccccccccccccccccccccccccccccc;",
2554 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002555
2556 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2557 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2558 " + cc;",
2559 Style);
2560 verifyFormat("int a = aa\n"
2561 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002562 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00002563 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00002564
Daniel Jasper6501f7e2015-10-27 12:38:37 +00002565 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00002566 verifyFormat("return (a > b\n"
2567 " // comment1\n"
2568 " // comment2\n"
2569 " || c);",
2570 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002571}
2572
Daniel Jasperac043c92014-09-15 11:11:00 +00002573TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
2574 FormatStyle Style = getLLVMStyle();
2575 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
2576 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
2577 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00002578 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
2579 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00002580}
2581
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002582TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002583 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002584 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
2585 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002586 verifyFormat("Constructor()\n"
2587 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002588 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002589 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002590 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002591 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002592
Daniel Jasper7b259cd2015-08-27 11:59:31 +00002593 verifyFormat("template <typename T>\n"
2594 "Constructor() : Initializer(FitsOnTheLine) {}",
2595 getLLVMStyleWithColumns(45));
2596
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002597 verifyFormat(
2598 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002599 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002600
2601 verifyFormat(
2602 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002603 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002604 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002605 verifyFormat(
2606 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002607 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002608 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00002609 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2610 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2611 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002612
2613 verifyFormat("Constructor()\n"
2614 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2615 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2616 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002617 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002618
Daniel Jasper65585ed2013-01-28 13:31:35 +00002619 verifyFormat("Constructor()\n"
2620 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002621 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00002622
Daniel Jasper62e68172013-02-25 15:59:54 +00002623 verifyFormat("Constructor(int Parameter = 0)\n"
2624 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
2625 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00002626 verifyFormat("Constructor()\n"
2627 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
2628 "}",
2629 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00002630 verifyFormat("Constructor()\n"
2631 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2632 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00002633
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002634 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002635 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00002636 verifyFormat("Constructor()\n"
2637 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
2638 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
2639 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002640
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002641 FormatStyle OnePerLine = getLLVMStyle();
2642 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00002643 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002644 verifyFormat("SomeClass::Constructor()\n"
2645 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
2646 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002647 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002648 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002649 verifyFormat("SomeClass::Constructor()\n"
2650 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
2651 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002652 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002653 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002654 verifyFormat("MyClass::MyClass(int var)\n"
2655 " : some_var_(var), // 4 space indent\n"
2656 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002657 "}",
2658 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00002659 verifyFormat("Constructor()\n"
2660 " : aaaaa(aaaaaa),\n"
2661 " aaaaa(aaaaaa),\n"
2662 " aaaaa(aaaaaa),\n"
2663 " aaaaa(aaaaaa),\n"
2664 " aaaaa(aaaaaa) {}",
2665 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00002666 verifyFormat("Constructor()\n"
2667 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
2668 " aaaaaaaaaaaaaaaaaaaaaa) {}",
2669 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00002670 OnePerLine.BinPackParameters = false;
2671 verifyFormat(
2672 "Constructor()\n"
2673 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2674 " aaaaaaaaaaa().aaa(),\n"
2675 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
2676 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00002677 OnePerLine.ColumnLimit = 60;
2678 verifyFormat("Constructor()\n"
2679 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
2680 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
2681 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00002682
2683 EXPECT_EQ("Constructor()\n"
2684 " : // Comment forcing unwanted break.\n"
2685 " aaaa(aaaa) {}",
2686 format("Constructor() :\n"
2687 " // Comment forcing unwanted break.\n"
2688 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00002689}
2690
2691TEST_F(FormatTest, MemoizationTests) {
2692 // This breaks if the memoization lookup does not take \c Indent and
2693 // \c LastSpace into account.
2694 verifyFormat(
2695 "extern CFRunLoopTimerRef\n"
2696 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
2697 " CFTimeInterval interval, CFOptionFlags flags,\n"
2698 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002699 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00002700
2701 // Deep nesting somewhat works around our memoization.
2702 verifyFormat(
2703 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2704 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2705 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2706 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2707 " aaaaa())))))))))))))))))))))))))))))))))))))));",
2708 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00002709 verifyFormat(
2710 "aaaaa(\n"
2711 " aaaaa,\n"
2712 " aaaaa(\n"
2713 " aaaaa,\n"
2714 " aaaaa(\n"
2715 " aaaaa,\n"
2716 " aaaaa(\n"
2717 " aaaaa,\n"
2718 " aaaaa(\n"
2719 " aaaaa,\n"
2720 " aaaaa(\n"
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))))))))))));",
2735 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00002736 verifyFormat(
2737 "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"
2738 " a),\n"
2739 " a),\n"
2740 " a),\n"
2741 " a),\n"
2742 " a),\n"
2743 " a),\n"
2744 " a),\n"
2745 " a),\n"
2746 " a),\n"
2747 " a),\n"
2748 " a),\n"
2749 " a),\n"
2750 " a),\n"
2751 " a),\n"
2752 " a),\n"
2753 " a),\n"
2754 " a)",
2755 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00002756
2757 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00002758 FormatStyle OnePerLine = getLLVMStyle();
2759 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00002760 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00002761 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00002762 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00002763 for (unsigned i = 0, e = 80; i != e; ++i) {
2764 input += " a,\n";
2765 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002766 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00002767 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002768}
2769
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002770TEST_F(FormatTest, BreaksAsHighAsPossible) {
2771 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00002772 "void f() {\n"
2773 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
2774 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
2775 " f();\n"
2776 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00002777 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00002778 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002779}
2780
Daniel Jasper6728fc12013-04-11 14:29:13 +00002781TEST_F(FormatTest, BreaksFunctionDeclarations) {
2782 // Principially, we break function declarations in a certain order:
2783 // 1) break amongst arguments.
2784 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
2785 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00002786 verifyFormat("template <class TemplateIt>\n"
2787 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
2788 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00002789
2790 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00002791 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00002792 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002793 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00002794 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002795
2796 // 3) break after (.
2797 verifyFormat(
2798 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00002799 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
2800 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002801
2802 // 4) break before after nested name specifiers.
2803 verifyFormat(
2804 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002805 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
2806 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00002807 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002808
2809 // However, there are exceptions, if a sufficient amount of lines can be
2810 // saved.
2811 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
2812 // more adjusting.
2813 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
2814 " Cccccccccccccc cccccccccc,\n"
2815 " Cccccccccccccc cccccccccc,\n"
2816 " Cccccccccccccc cccccccccc,\n"
2817 " Cccccccccccccc cccccccccc);");
2818 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00002819 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002820 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2821 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2822 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00002823 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002824 verifyFormat(
2825 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
2826 " Cccccccccccccc cccccccccc,\n"
2827 " Cccccccccccccc cccccccccc,\n"
2828 " Cccccccccccccc cccccccccc,\n"
2829 " Cccccccccccccc cccccccccc,\n"
2830 " Cccccccccccccc cccccccccc,\n"
2831 " Cccccccccccccc cccccccccc);");
2832 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
2833 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2834 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2835 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2836 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00002837
2838 // Break after multi-line parameters.
2839 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2840 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2841 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2842 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00002843 verifyFormat("void SomeLoooooooooooongFunction(\n"
2844 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
2845 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2846 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00002847
2848 // Treat overloaded operators like other functions.
2849 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2850 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00002851 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2852 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00002853 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2854 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
2855 verifyGoogleFormat(
2856 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
2857 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00002858 verifyGoogleFormat(
2859 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
2860 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00002861 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2862 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
2863 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
2864 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00002865 verifyGoogleFormat(
2866 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
2867 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2868 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00002869 verifyGoogleFormat(
2870 "template <typename T>\n"
2871 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2872 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
2873 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00002874
2875 FormatStyle Style = getLLVMStyle();
2876 Style.PointerAlignment = FormatStyle::PAS_Left;
2877 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2878 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
2879 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00002880 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
2881 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
2882 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00002883}
2884
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00002885TEST_F(FormatTest, TrailingReturnType) {
2886 verifyFormat("auto foo() -> int;\n");
2887 verifyFormat("struct S {\n"
2888 " auto bar() const -> int;\n"
2889 "};");
2890 verifyFormat("template <size_t Order, typename T>\n"
2891 "auto load_img(const std::string &filename)\n"
2892 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00002893 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
2894 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00002895 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00002896 verifyFormat("template <typename T>\n"
2897 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
2898 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00002899
2900 // Not trailing return types.
2901 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00002902}
2903
Daniel Jasper5be31f72013-05-21 09:16:31 +00002904TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002905 // Avoid breaking before trailing 'const' or other trailing annotations, if
2906 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00002907 FormatStyle Style = getGoogleStyle();
2908 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00002909 verifyFormat("void someLongFunction(\n"
2910 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00002911 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00002912 verifyFormat("LoooooongReturnType\n"
2913 "someLoooooooongFunction() const {}",
2914 getLLVMStyleWithColumns(47));
2915 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
2916 " const {}",
2917 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002918 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2919 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
2920 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2921 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
2922 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2923 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00002924 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
2925 " aaaaaaaaaaa aaaaa) const override;");
2926 verifyGoogleFormat(
2927 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
2928 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00002929
Daniel Jasper5550de62014-02-17 07:57:46 +00002930 // Even if the first parameter has to be wrapped.
2931 verifyFormat("void someLongFunction(\n"
2932 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002933 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00002934 verifyFormat("void someLongFunction(\n"
2935 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002936 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00002937 verifyFormat("void someLongFunction(\n"
2938 " int someLongParameter) override {}",
2939 Style);
2940 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00002941 " int someLongParameter) OVERRIDE {}",
2942 Style);
2943 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00002944 " int someLongParameter) final {}",
2945 Style);
2946 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00002947 " int someLongParameter) FINAL {}",
2948 Style);
2949 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00002950 " int parameter) const override {}",
2951 Style);
2952
Daniel Jaspere3f907f2014-06-02 09:52:08 +00002953 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2954 verifyFormat("void someLongFunction(\n"
2955 " int someLongParameter) const\n"
2956 "{\n"
2957 "}",
2958 Style);
2959
Daniel Jasper5550de62014-02-17 07:57:46 +00002960 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002961 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
2962 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2963 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00002964
2965 // Breaking before function-like trailing annotations is fine to keep them
2966 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00002967 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2968 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
2969 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
2970 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
2971 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
2972 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00002973 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
2974 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00002975 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00002976
2977 verifyFormat(
2978 "void aaaaaaaaaaaaaaaaaa()\n"
2979 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
2980 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
2981 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2982 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00002983 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00002984 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00002985 " GUARDED_BY(aaaaaaaaaaaa);");
2986 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00002987 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00002988 " GUARDED_BY(aaaaaaaaaaaa);");
2989 verifyGoogleFormat(
2990 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
2991 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00002992 verifyGoogleFormat(
2993 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
2994 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00002995}
2996
Daniel Jasperf090f032015-05-18 09:47:22 +00002997TEST_F(FormatTest, FunctionAnnotations) {
2998 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00002999 "int OldFunction(const string &parameter) {}");
3000 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00003001 "string OldFunction(const string &parameter) {}");
3002 verifyFormat("template <typename T>\n"
3003 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
3004 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00003005
3006 // Not function annotations.
3007 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3008 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00003009 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
3010 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00003011 verifyFormat("MACRO(abc).function() // wrap\n"
3012 " << abc;");
3013 verifyFormat("MACRO(abc)->function() // wrap\n"
3014 " << abc;");
3015 verifyFormat("MACRO(abc)::function() // wrap\n"
3016 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00003017}
3018
Daniel Jasperf7935112012-12-03 18:12:45 +00003019TEST_F(FormatTest, BreaksDesireably) {
3020 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
3021 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003022 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00003023 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3024 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
3025 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003026
3027 verifyFormat(
3028 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003029 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003030
3031 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3032 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3033 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00003034
3035 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003036 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3037 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3038 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00003039 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3040 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003041
3042 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3043 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3044
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003045 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003046 "void f() {\n"
3047 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
3048 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3049 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00003050 verifyFormat(
3051 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3052 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3053 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003054 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3055 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3056 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003057 "aaaaaa(aaa,\n"
3058 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003059 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3060 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003061 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3062 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3063 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003064
Daniel Jasper739b85f2015-06-29 10:42:59 +00003065 // Indent consistently independent of call expression and unary operator.
3066 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3067 " dddddddddddddddddddddddddddddd));");
3068 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3069 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003070 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003071 " dddddddddddddddddddddddddddddd));");
3072
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003073 // This test case breaks on an incorrect memoization, i.e. an optimization not
3074 // taking into account the StopAt value.
3075 verifyFormat(
3076 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003077 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3078 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3079 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00003080
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003081 verifyFormat("{\n {\n {\n"
3082 " Annotation.SpaceRequiredBefore =\n"
3083 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
3084 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
3085 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00003086
3087 // Break on an outer level if there was a break on an inner level.
3088 EXPECT_EQ("f(g(h(a, // comment\n"
3089 " b, c),\n"
3090 " d, e),\n"
3091 " x, y);",
3092 format("f(g(h(a, // comment\n"
3093 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00003094
3095 // Prefer breaking similar line breaks.
3096 verifyFormat(
3097 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
3098 " NSTrackingMouseEnteredAndExited |\n"
3099 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00003100}
3101
Daniel Jasper18210d72014-10-09 09:52:05 +00003102TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
3103 FormatStyle NoBinPacking = getGoogleStyle();
3104 NoBinPacking.BinPackParameters = false;
3105 NoBinPacking.BinPackArguments = true;
3106 verifyFormat("void f() {\n"
3107 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
3108 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3109 "}",
3110 NoBinPacking);
3111 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
3112 " int aaaaaaaaaaaaaaaaaaaa,\n"
3113 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3114 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003115
Daniel Jasper00693b082016-01-09 15:56:47 +00003116 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
3117 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3118 " vector<int> bbbbbbbbbbbbbbb);",
3119 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003120 // FIXME: This behavior difference is probably not wanted. However, currently
3121 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
3122 // template arguments from BreakBeforeParameter being set because of the
3123 // one-per-line formatting.
3124 verifyFormat(
3125 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3126 " aaaaaaaaaa> aaaaaaaaaa);",
3127 NoBinPacking);
3128 verifyFormat(
3129 "void fffffffffff(\n"
3130 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
3131 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00003132}
3133
Daniel Jasper9278eb92013-01-16 14:59:02 +00003134TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00003135 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003136 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00003137 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003138 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
3139 " aaaaaaaaaaaaaaaaaaaa,\n"
3140 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
3141 NoBinPacking);
3142 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
3143 " aaaaaaaaaaaaa,\n"
3144 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
3145 NoBinPacking);
3146 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003147 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3148 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3149 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
3150 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003151 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
3152 NoBinPacking);
3153 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3154 " .aaaaaaaaaaaaaaaaaa();",
3155 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003156 verifyFormat("void f() {\n"
3157 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3158 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
3159 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003160 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003161
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003162 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00003163 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3164 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003165 " aaaaaaaaaaaa);",
3166 NoBinPacking);
3167 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003168 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
3169 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003170 " test);",
3171 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003172
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003173 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3174 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00003175 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
3176 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003177 NoBinPacking);
3178 verifyFormat("a(\"a\"\n"
3179 " \"a\",\n"
3180 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00003181
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003182 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00003183 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00003184 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00003185 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003186 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00003187 verifyFormat(
3188 "void f() {\n"
3189 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3190 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003191 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003192 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00003193 verifyFormat(
3194 "template <class SomeType, class SomeOtherType>\n"
3195 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
3196 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003197}
3198
Daniel Jasperb10cbc42013-07-10 14:02:49 +00003199TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
3200 FormatStyle Style = getLLVMStyleWithColumns(15);
3201 Style.ExperimentalAutoDetectBinPacking = true;
3202 EXPECT_EQ("aaa(aaaa,\n"
3203 " aaaa,\n"
3204 " aaaa);\n"
3205 "aaa(aaaa,\n"
3206 " aaaa,\n"
3207 " aaaa);",
3208 format("aaa(aaaa,\n" // one-per-line
3209 " aaaa,\n"
3210 " aaaa );\n"
3211 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3212 Style));
3213 EXPECT_EQ("aaa(aaaa, aaaa,\n"
3214 " aaaa);\n"
3215 "aaa(aaaa, aaaa,\n"
3216 " aaaa);",
3217 format("aaa(aaaa, aaaa,\n" // bin-packed
3218 " aaaa );\n"
3219 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3220 Style));
3221}
3222
Daniel Jasper04468962013-01-18 10:56:38 +00003223TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00003224 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
3225 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
3226 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
3227 " .StartsWith(\".init\", ORDER_INIT)\n"
3228 " .StartsWith(\".fini\", ORDER_FINI)\n"
3229 " .StartsWith(\".hash\", ORDER_HASH)\n"
3230 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00003231
Daniel Jaspereb50c672013-02-15 20:33:06 +00003232 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003233 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00003234 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00003235 "aaaaaaa->aaaaaaa\n"
3236 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3237 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00003238 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00003239 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00003240 "aaaaaaa->aaaaaaa\n"
3241 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3242 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
3243 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00003244 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00003245 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00003246 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003247 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
3248 " aaaaaa->aaaaaaaaaaaa()\n"
3249 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00003250 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003251 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00003252 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003253 "void f() {\n"
3254 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003255 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003256 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003257 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003258 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003259 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003260 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003261 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003262 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003263 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003264 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003265 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00003266
3267 verifyFormat(
3268 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
3269 verifyFormat("aaaaaaaaaaaaaaa()\n"
3270 " .aaaaaaaaaaaaaaa()\n"
3271 " .aaaaaaaaaaaaaaa()\n"
3272 " .aaaaaaaaaaaaaaa()\n"
3273 " .aaaaaaaaaaaaaaa();");
3274 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3275 " .aaaaaaaaaaaaaaa()\n"
3276 " .aaaaaaaaaaaaaaa()\n"
3277 " .aaaaaaaaaaaaaaa();");
3278 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3279 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3280 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00003281 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
3282 " ->aaaaaaaaaaaaaae(0)\n"
3283 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00003284
Daniel Jasper775954b2015-04-24 10:08:09 +00003285 // Don't linewrap after very short segments.
3286 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3287 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3288 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3289 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3290 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3291 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3292 verifyFormat("aaa()\n"
3293 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3294 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3295 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3296
Daniel Jaspercc3114d2013-10-18 15:23:06 +00003297 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3298 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3299 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
3300 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3301 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003302 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00003303
Daniel Jaspera41aa532014-09-19 08:01:25 +00003304 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00003305 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
3306 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00003307
3308 // Prefer not to create "hanging" indents.
3309 verifyFormat(
3310 "return !soooooooooooooome_map\n"
3311 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3312 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00003313 verifyFormat(
3314 "return aaaaaaaaaaaaaaaa\n"
3315 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
3316 " .aaaa(aaaaaaaaaaaaaa);");
3317 // No hanging indent here.
3318 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
3319 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3320 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
3321 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00003322 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3323 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3324 getLLVMStyleWithColumns(60));
3325 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
3326 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3327 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3328 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00003329 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3330 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3331 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00003332}
3333
Daniel Jasperde5c2072012-12-24 00:13:23 +00003334TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
3335 verifyFormat(
3336 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003337 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003338 verifyFormat(
3339 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
3340 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
3341
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003342 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003343 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003344 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
3345 " ccccccccccccccccccccccccc) {\n}");
3346
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003347 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003348 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003349 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
3350 " ccccccccccccccccccccccccc) {\n}");
3351
Daniel Jasperde5c2072012-12-24 00:13:23 +00003352 verifyFormat(
3353 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003354 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003355 verifyFormat(
3356 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
3357 " ccccccccccccccccccccccccc) {\n}");
3358
Daniel Jasper400adc62013-02-08 15:28:42 +00003359 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
3360 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
3361 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
3362 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003363 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
3364 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
3365 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
3366 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
3367
Daniel Jasper400adc62013-02-08 15:28:42 +00003368 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
3369 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
3370 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003371 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
3372 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
3373 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00003374}
3375
Daniel Jasper43b65482013-01-23 12:27:43 +00003376TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00003377 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00003378 "unsigned Cost =\n"
3379 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
3380 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00003381 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00003382 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
3383 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00003384
3385 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003386 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
3387 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00003388 verifyFormat("unsigned OriginalStartColumn =\n"
3389 " SourceMgr.getSpellingColumnNumber(\n"
3390 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
3391 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00003392}
3393
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003394TEST_F(FormatTest, AlignsAfterAssignments) {
3395 verifyFormat(
3396 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003397 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003398 verifyFormat(
3399 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003400 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003401 verifyFormat(
3402 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003403 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003404 verifyFormat(
3405 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003406 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00003407 verifyFormat(
3408 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3409 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3410 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003411}
3412
3413TEST_F(FormatTest, AlignsAfterReturn) {
3414 verifyFormat(
3415 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3416 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
3417 verifyFormat(
3418 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3419 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00003420 verifyFormat(
3421 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003422 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00003423 verifyFormat(
3424 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003425 " aaaaaaaaaaaaaaaaaaaaaa());");
3426 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3427 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3428 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3429 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
3430 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00003431 verifyFormat("return\n"
3432 " // true if code is one of a or b.\n"
3433 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003434}
3435
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003436TEST_F(FormatTest, AlignsAfterOpenBracket) {
3437 verifyFormat(
3438 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
3439 " aaaaaaaaa aaaaaaa) {}");
3440 verifyFormat(
3441 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
3442 " aaaaaaaaaaa aaaaaaaaa);");
3443 verifyFormat(
3444 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
3445 " aaaaaaaaaaaaaaaaaaaaa));");
3446 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003447 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00003448 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3449 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
3450 Style);
3451 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
3452 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
3453 Style);
3454 verifyFormat("SomeLongVariableName->someFunction(\n"
3455 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
3456 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003457 verifyFormat(
3458 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
3459 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3460 Style);
3461 verifyFormat(
3462 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
3463 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3464 Style);
3465 verifyFormat(
3466 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
3467 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
3468 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003469
Daniel Jasper2a9f7202016-02-08 09:52:54 +00003470 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
3471 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
3472 " b));",
3473 Style);
3474
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003475 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
3476 Style.BinPackArguments = false;
3477 Style.BinPackParameters = false;
3478 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3479 " aaaaaaaaaaa aaaaaaaa,\n"
3480 " aaaaaaaaa aaaaaaa,\n"
3481 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3482 Style);
3483 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
3484 " aaaaaaaaaaa aaaaaaaaa,\n"
3485 " aaaaaaaaaaa aaaaaaaaa,\n"
3486 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3487 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00003488 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
3489 " aaaaaaaaaaaaaaa,\n"
3490 " aaaaaaaaaaaaaaaaaaaaa,\n"
3491 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003492 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00003493 verifyFormat(
3494 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
3495 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
3496 Style);
3497 verifyFormat(
3498 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
3499 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
3500 Style);
3501 verifyFormat(
3502 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3503 " aaaaaaaaaaaaaaaaaaaaa(\n"
3504 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
3505 " aaaaaaaaaaaaaaaa);",
3506 Style);
3507 verifyFormat(
3508 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3509 " aaaaaaaaaaaaaaaaaaaaa(\n"
3510 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
3511 " aaaaaaaaaaaaaaaa);",
3512 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003513}
3514
Daniel Jasper3219e432014-12-02 13:24:51 +00003515TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
3516 FormatStyle Style = getLLVMStyleWithColumns(40);
3517 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3518 " bbbbbbbbbbbbbbbbbbbbbb);",
3519 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003520 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00003521 Style.AlignOperands = false;
3522 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3523 " bbbbbbbbbbbbbbbbbbbbbb);",
3524 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003525 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00003526 Style.AlignOperands = true;
3527 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3528 " bbbbbbbbbbbbbbbbbbbbbb);",
3529 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003530 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00003531 Style.AlignOperands = false;
3532 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3533 " bbbbbbbbbbbbbbbbbbbbbb);",
3534 Style);
3535}
3536
Daniel Jasper399d24b2013-01-09 07:06:56 +00003537TEST_F(FormatTest, BreaksConditionalExpressions) {
3538 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003539 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3540 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3541 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3542 verifyFormat(
3543 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003544 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3545 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00003546 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003547 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3548 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3549 verifyFormat(
3550 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003551 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3552 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00003553 verifyFormat(
3554 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
3555 " : aaaaaaaaaaaaa);");
3556 verifyFormat(
3557 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00003558 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00003559 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3560 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003561 verifyFormat(
3562 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3563 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3564 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00003565 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3566 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3567 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3568 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3569 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3570 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3571 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3572 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3573 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3574 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3575 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3576 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003577 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3578 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3579 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3580 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3581 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00003582 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3583 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3584 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00003585 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
3586 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3587 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3588 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00003589 verifyFormat(
3590 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3591 " ? aaaaaaaaaaaaaaa\n"
3592 " : aaaaaaaaaaaaaaa;");
3593 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003594 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00003595 " ? b\n"
3596 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00003597 verifyFormat("return aaaa == bbbb\n"
3598 " // comment\n"
3599 " ? aaaa\n"
3600 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003601 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003602 " format(TheLine.First,\n"
3603 " IndentForLevel[TheLine.Level] >= 0\n"
3604 " ? IndentForLevel[TheLine.Level]\n"
3605 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003606 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00003607 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00003608 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
3609 " ? aaaaaaaaaaaaaaa\n"
3610 " : bbbbbbbbbbbbbbb //\n"
3611 " ? ccccccccccccccc\n"
3612 " : ddddddddddddddd;");
3613 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
3614 " ? aaaaaaaaaaaaaaa\n"
3615 " : (bbbbbbbbbbbbbbb //\n"
3616 " ? ccccccccccccccc\n"
3617 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003618 verifyFormat(
3619 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3620 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3621 " aaaaaaaaaaaaaaaaaaaaa +\n"
3622 " aaaaaaaaaaaaaaaaaaaaa\n"
3623 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00003624 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003625 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3626 " : aaaaaaaaaaaaaaaaaaaaaa\n"
3627 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00003628
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003629 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00003630 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003631 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00003632 "void f() {\n"
3633 " g(aaa,\n"
3634 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
3635 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3636 " ? aaaaaaaaaaaaaaa\n"
3637 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003638 "}",
3639 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003640 verifyFormat(
3641 "void f() {\n"
3642 " g(aaa,\n"
3643 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
3644 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3645 " ?: aaaaaaaaaaaaaaa);\n"
3646 "}",
3647 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00003648
3649 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
3650 " // comment.\n"
3651 " ccccccccccccccccccccccccccccccccccccccc\n"
3652 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3653 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00003654
3655 // Assignments in conditional expressions. Apparently not uncommon :-(.
3656 verifyFormat("return a != b\n"
3657 " // comment\n"
3658 " ? a = b\n"
3659 " : a = b;");
3660 verifyFormat("return a != b\n"
3661 " // comment\n"
3662 " ? a = a != b\n"
3663 " // comment\n"
3664 " ? a = b\n"
3665 " : a\n"
3666 " : a;\n");
3667 verifyFormat("return a != b\n"
3668 " // comment\n"
3669 " ? a\n"
3670 " : a = a != b\n"
3671 " // comment\n"
3672 " ? a = b\n"
3673 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00003674}
3675
Daniel Jasper165b29e2013-11-08 00:57:11 +00003676TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
3677 FormatStyle Style = getLLVMStyle();
3678 Style.BreakBeforeTernaryOperators = false;
3679 Style.ColumnLimit = 70;
3680 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003681 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3682 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3683 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3684 Style);
3685 verifyFormat(
3686 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003687 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3688 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00003689 Style);
3690 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003691 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3692 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3693 Style);
3694 verifyFormat(
3695 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003696 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3697 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00003698 Style);
3699 verifyFormat(
3700 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
3701 " aaaaaaaaaaaaa);",
3702 Style);
3703 verifyFormat(
3704 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3705 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3706 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3707 " aaaaaaaaaaaaa);",
3708 Style);
3709 verifyFormat(
3710 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3711 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3712 " aaaaaaaaaaaaa);",
3713 Style);
3714 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3715 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3716 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3717 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3718 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3719 Style);
3720 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3721 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3722 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3723 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3724 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3725 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3726 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3727 Style);
3728 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3729 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
3730 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3731 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3732 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3733 Style);
3734 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3735 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3736 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3737 Style);
3738 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00003739 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00003740 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3741 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3742 Style);
3743 verifyFormat(
3744 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3745 " aaaaaaaaaaaaaaa :\n"
3746 " aaaaaaaaaaaaaaa;",
3747 Style);
3748 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
3749 " aaaaaaaaa ?\n"
3750 " b :\n"
3751 " c);",
3752 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00003753 verifyFormat("unsigned Indent =\n"
3754 " format(TheLine.First,\n"
3755 " IndentForLevel[TheLine.Level] >= 0 ?\n"
3756 " IndentForLevel[TheLine.Level] :\n"
3757 " TheLine * 2,\n"
3758 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
3759 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00003760 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
3761 " aaaaaaaaaaaaaaa :\n"
3762 " bbbbbbbbbbbbbbb ? //\n"
3763 " ccccccccccccccc :\n"
3764 " ddddddddddddddd;",
3765 Style);
3766 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
3767 " aaaaaaaaaaaaaaa :\n"
3768 " (bbbbbbbbbbbbbbb ? //\n"
3769 " ccccccccccccccc :\n"
3770 " ddddddddddddddd);",
3771 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00003772 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3773 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
3774 " ccccccccccccccccccccccccccc;",
3775 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00003776 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3777 " aaaaa :\n"
3778 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
3779 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00003780}
3781
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003782TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
3783 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
3784 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
3785 verifyFormat("bool a = true, b = false;");
3786
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003787 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00003788 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003789 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00003790 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003791 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00003792 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00003793 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003794 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00003795 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
3796 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
3797 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
3798 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
3799 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
3800 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003801
Daniel Jasperbea1ab42015-03-01 18:55:26 +00003802 FormatStyle Style = getGoogleStyle();
3803 Style.PointerAlignment = FormatStyle::PAS_Left;
3804 Style.DerivePointerAlignment = false;
3805 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3806 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
3807 " *b = bbbbbbbbbbbbbbbbbbb;",
3808 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003809 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
3810 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
3811 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00003812 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00003813 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003814}
3815
Nico Weber4a5030c2013-01-12 01:28:06 +00003816TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
3817 verifyFormat("arr[foo ? bar : baz];");
3818 verifyFormat("f()[foo ? bar : baz];");
3819 verifyFormat("(a + b)[foo ? bar : baz];");
3820 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
3821}
3822
Daniel Jasperf7935112012-12-03 18:12:45 +00003823TEST_F(FormatTest, AlignsStringLiterals) {
3824 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
3825 " \"short literal\");");
3826 verifyFormat(
3827 "looooooooooooooooooooooooongFunction(\n"
3828 " \"short literal\"\n"
3829 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003830 verifyFormat("someFunction(\"Always break between multi-line\"\n"
3831 " \" string literals\",\n"
3832 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003833 EXPECT_EQ("fun + \"1243\" /* comment */\n"
3834 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00003835 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003836 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00003837 getLLVMStyleWithColumns(28)));
3838 EXPECT_EQ(
3839 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
3840 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
3841 " \"aaaaaaaaaaaaaaaa\";",
3842 format("aaaaaa ="
3843 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
3844 "aaaaaaaaaaaaaaaaaaaaa\" "
3845 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003846 verifyFormat("a = a + \"a\"\n"
3847 " \"a\"\n"
3848 " \"a\";");
3849 verifyFormat("f(\"a\", \"b\"\n"
3850 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00003851
3852 verifyFormat(
3853 "#define LL_FORMAT \"ll\"\n"
3854 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
3855 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00003856
3857 verifyFormat("#define A(X) \\\n"
3858 " \"aaaaa\" #X \"bbbbbb\" \\\n"
3859 " \"ccccc\"",
3860 getLLVMStyleWithColumns(23));
3861 verifyFormat("#define A \"def\"\n"
3862 "f(\"abc\" A \"ghi\"\n"
3863 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00003864
3865 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00003866 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00003867 verifyFormat("#define A(X) \\\n"
3868 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
3869 " L\"ccccc\"",
3870 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00003871
3872 verifyFormat("f(@\"a\"\n"
3873 " @\"b\");");
3874 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00003875 " @\"b\"\n"
3876 " @\"c\";");
3877 verifyFormat("NSString s = @\"a\"\n"
3878 " \"b\"\n"
3879 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00003880}
3881
Zachary Turner448592e2015-12-18 22:20:15 +00003882TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003883 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00003884 // No declarations or definitions should be moved to own line.
3885 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
3886 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003887 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003888 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003889 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003890 "int f() { return 1; }\n"
3891 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003892 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00003893
3894 // All declarations and definitions should have the return type moved to its
3895 // own
3896 // line.
3897 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
3898 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003899 " int\n"
3900 " f() {\n"
3901 " return 1;\n"
3902 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003903 " int\n"
3904 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003905 "};\n"
3906 "int\n"
3907 "f() {\n"
3908 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003909 "}\n"
3910 "int\n"
3911 "g();\n",
3912 Style);
3913
3914 // Top-level definitions, and no kinds of declarations should have the
3915 // return type moved to its own line.
3916 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
3917 verifyFormat("class B {\n"
3918 " int f() { return 1; }\n"
3919 " int g();\n"
3920 "};\n"
3921 "int\n"
3922 "f() {\n"
3923 " return 1;\n"
3924 "}\n"
3925 "int g();\n",
3926 Style);
3927
3928 // Top-level definitions and declarations should have the return type moved
3929 // to its own line.
3930 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
3931 verifyFormat("class C {\n"
3932 " int f() { return 1; }\n"
3933 " int g();\n"
3934 "};\n"
3935 "int\n"
3936 "f() {\n"
3937 " return 1;\n"
3938 "}\n"
3939 "int\n"
3940 "g();\n",
3941 Style);
3942
3943 // All definitions should have the return type moved to its own line, but no
3944 // kinds of declarations.
3945 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
3946 verifyFormat("class D {\n"
3947 " int\n"
3948 " f() {\n"
3949 " return 1;\n"
3950 " }\n"
3951 " int g();\n"
3952 "};\n"
3953 "int\n"
3954 "f() {\n"
3955 " return 1;\n"
3956 "}\n"
3957 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003958 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00003959 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003960 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00003961 " return \"\";\n"
3962 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003963 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003964 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00003965 verifyFormat("template <class T>\n"
3966 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003967 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00003968 " return NULL;\n"
3969 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003970 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003971 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00003972 verifyFormat("class C {\n"
3973 " int\n"
3974 " operator+() {\n"
3975 " return 1;\n"
3976 " }\n"
3977 " int\n"
3978 " operator()() {\n"
3979 " return 1;\n"
3980 " }\n"
3981 "};\n",
3982 Style);
3983 verifyFormat("void\n"
3984 "A::operator()() {}\n"
3985 "void\n"
3986 "A::operator>>() {}\n"
3987 "void\n"
3988 "A::operator+() {}\n",
3989 Style);
3990 verifyFormat("void *operator new(std::size_t s);", // No break here.
3991 Style);
3992 verifyFormat("void *\n"
3993 "operator new(std::size_t s) {}",
3994 Style);
3995 verifyFormat("void *\n"
3996 "operator delete[](void *ptr) {}",
3997 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003998 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00003999 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004000 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004001 "{\n"
4002 " return \"\";\n"
4003 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004004 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004005 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004006 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004007 "T *\n" // Problem here: no line break
4008 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004009 "{\n"
4010 " return NULL;\n"
4011 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004012 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004013 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004014}
4015
Alexander Kornienko58611712013-07-04 12:02:44 +00004016TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
4017 FormatStyle NoBreak = getLLVMStyle();
4018 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
4019 FormatStyle Break = getLLVMStyle();
4020 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00004021 verifyFormat("aaaa = \"bbbb\"\n"
4022 " \"cccc\";",
4023 NoBreak);
4024 verifyFormat("aaaa =\n"
4025 " \"bbbb\"\n"
4026 " \"cccc\";",
4027 Break);
4028 verifyFormat("aaaa(\"bbbb\"\n"
4029 " \"cccc\");",
4030 NoBreak);
4031 verifyFormat("aaaa(\n"
4032 " \"bbbb\"\n"
4033 " \"cccc\");",
4034 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004035 verifyFormat("aaaa(qqq, \"bbbb\"\n"
4036 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004037 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004038 verifyFormat("aaaa(qqq,\n"
4039 " \"bbbb\"\n"
4040 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004041 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004042 verifyFormat("aaaa(qqq,\n"
4043 " L\"bbbb\"\n"
4044 " L\"cccc\");",
4045 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004046 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
4047 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00004048 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00004049 verifyFormat("string s = someFunction(\n"
4050 " \"abc\"\n"
4051 " \"abc\");",
4052 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00004053
Daniel Jasper3251fff2014-06-10 06:27:23 +00004054 // As we break before unary operators, breaking right after them is bad.
4055 verifyFormat("string foo = abc ? \"x\"\n"
4056 " \"blah blah blah blah blah blah\"\n"
4057 " : \"y\";",
4058 Break);
4059
Daniel Jasperc834c702013-07-17 15:38:19 +00004060 // Don't break if there is no column gain.
4061 verifyFormat("f(\"aaaa\"\n"
4062 " \"bbbb\");",
4063 Break);
4064
4065 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004066 EXPECT_EQ("x = \"a\\\n"
4067 "b\\\n"
4068 "c\";",
4069 format("x = \"a\\\n"
4070 "b\\\n"
4071 "c\";",
4072 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004073 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004074 " \"a\\\n"
4075 "b\\\n"
4076 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004077 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004078 "b\\\n"
4079 "c\";",
4080 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00004081
4082 // Exempt ObjC strings for now.
4083 EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004084 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004085 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004086 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004087 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00004088
4089 Break.ColumnLimit = 0;
4090 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00004091}
4092
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004093TEST_F(FormatTest, AlignsPipes) {
4094 verifyFormat(
4095 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4096 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4097 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4098 verifyFormat(
4099 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
4100 " << aaaaaaaaaaaaaaaaaaaa;");
4101 verifyFormat(
4102 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4103 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4104 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00004105 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4106 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4107 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004108 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
4109 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
4110 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
4111 verifyFormat(
4112 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4113 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4114 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004115 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4116 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4117 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4118 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00004119 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
4120 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00004121 verifyFormat(
4122 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4123 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00004124
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004125 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
4126 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00004127 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4128 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4129 " aaaaaaaaaaaaaaaaaaaaa)\n"
4130 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00004131 verifyFormat("LOG_IF(aaa == //\n"
4132 " bbb)\n"
4133 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004134
Daniel Jasper467ddb12013-08-12 12:58:05 +00004135 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00004136 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4137 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004138 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
4139 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4140 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00004141 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
4142 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00004143 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4144 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4145 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4146 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4147 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4148 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4149 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004150
Daniel Jasperc238c872013-04-02 14:33:13 +00004151 verifyFormat(
4152 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4153 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00004154
4155 // Incomplete string literal.
4156 EXPECT_EQ("llvm::errs() << \"\n"
4157 " << a;",
4158 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00004159
4160 verifyFormat("void f() {\n"
4161 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
4162 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
4163 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00004164
4165 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00004166 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
4167 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
4168 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00004169
4170 // Handle '\n'.
4171 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
4172 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
4173 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
4174 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
4175 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
4176 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
4177 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004178}
4179
Daniel Jasper7209bb92016-12-13 11:16:42 +00004180TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
4181 verifyFormat("return out << \"somepacket = {\\n\"\n"
4182 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
4183 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
4184 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
4185 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
4186 " << \"}\";");
4187
4188 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4189 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4190 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
4191 verifyFormat(
4192 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
4193 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
4194 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
4195 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
4196 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
4197 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
4198 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
4199 verifyFormat(
4200 "void f() {\n"
4201 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
4202 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4203 "}");
4204
4205 // Breaking before the first "<<" is generally not desirable.
4206 verifyFormat(
4207 "llvm::errs()\n"
4208 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4209 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4210 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4211 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4212 getLLVMStyleWithColumns(70));
4213 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4214 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4215 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4216 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4217 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4218 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4219 getLLVMStyleWithColumns(70));
4220
4221 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4222 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4223 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
4224 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4225 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4226 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00004227 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
4228 " (aaaa + aaaa);",
4229 getLLVMStyleWithColumns(40));
4230 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
4231 " (aaaaaaa + aaaaa));",
4232 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00004233 verifyFormat(
4234 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
4235 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
4236 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00004237}
4238
Daniel Jasperf7935112012-12-03 18:12:45 +00004239TEST_F(FormatTest, UnderstandsEquals) {
4240 verifyFormat(
4241 "aaaaaaaaaaaaaaaaa =\n"
4242 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4243 verifyFormat(
4244 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004245 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004246 verifyFormat(
4247 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004248 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00004249 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004250 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
4251 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004252
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004253 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4254 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004255}
4256
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004257TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004258 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4259 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004260
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004261 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4262 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004263
4264 verifyFormat(
4265 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
4266 " Parameter2);");
4267
4268 verifyFormat(
4269 "ShortObject->shortFunction(\n"
4270 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
4271 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
4272
4273 verifyFormat("loooooooooooooongFunction(\n"
4274 " LoooooooooooooongObject->looooooooooooooooongFunction());");
4275
4276 verifyFormat(
4277 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
4278 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
4279
Daniel Jasper687af3b2013-02-14 14:26:07 +00004280 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4281 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00004282 verifyFormat("void f() {\n"
4283 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4284 " .Times(2)\n"
4285 " .WillRepeatedly(Return(SomeValue));\n"
4286 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00004287 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
4288 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00004289 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00004290 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4291 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00004292 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004293 verifyFormat("void f() {\n"
4294 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4295 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
4296 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00004297 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4298 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4299 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4300 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4301 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00004302 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4303 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4304 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4305 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
4306 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00004307
Daniel Jasperc7345cc2013-01-07 07:13:20 +00004308 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004309 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004310 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00004311 verifyFormat(
4312 "aaaaaaaaaaa->aaaaaaaaa(\n"
4313 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4314 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00004315
4316 verifyFormat(
4317 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4318 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00004319 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
4320 " aaaaaaaaa()->aaaaaa()->aaaaa());");
4321 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
4322 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004323
Daniel Jasper9b334242013-03-15 14:57:30 +00004324 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00004325 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4326 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00004327
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004328 FormatStyle NoBinPacking = getLLVMStyle();
4329 NoBinPacking.BinPackParameters = false;
4330 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4331 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4332 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
4333 " aaaaaaaaaaaaaaaaaaa,\n"
4334 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4335 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00004336
4337 // If there is a subsequent call, change to hanging indentation.
4338 verifyFormat(
4339 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4340 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
4341 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4342 verifyFormat(
4343 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4344 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00004345 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4346 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4347 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4348 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4349 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4350 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004351}
4352
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004353TEST_F(FormatTest, WrapsTemplateDeclarations) {
4354 verifyFormat("template <typename T>\n"
4355 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00004356 verifyFormat("template <typename T>\n"
4357 "// T should be one of {A, B}.\n"
4358 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004359 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00004360 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00004361 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004362 verifyFormat("template <typename T>\n"
4363 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
4364 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004365 verifyFormat(
4366 "template <typename T>\n"
4367 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
4368 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00004369 verifyFormat(
4370 "template <typename T>\n"
4371 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
4372 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
4373 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00004374 verifyFormat("template <typename T>\n"
4375 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004376 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00004377 verifyFormat(
4378 "template <typename T1, typename T2 = char, typename T3 = char,\n"
4379 " typename T4 = char>\n"
4380 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00004381 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
4382 " template <typename> class cccccccccccccccccccccc,\n"
4383 " typename ddddddddddddd>\n"
4384 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004385 verifyFormat(
4386 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
4387 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00004388
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004389 verifyFormat("void f() {\n"
4390 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
4391 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
4392 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00004393
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00004394 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00004395 verifyFormat("template <typename T> void f();");
4396 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00004397 verifyFormat(
4398 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4399 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4400 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
4401 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4402 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4403 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
4404 " bbbbbbbbbbbbbbbbbbbbbbbb);",
4405 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00004406 EXPECT_EQ("static_cast<A< //\n"
4407 " B> *>(\n"
4408 "\n"
4409 " );",
4410 format("static_cast<A<//\n"
4411 " B>*>(\n"
4412 "\n"
4413 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00004414 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4415 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00004416
4417 FormatStyle AlwaysBreak = getLLVMStyle();
4418 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
4419 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
4420 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
4421 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
4422 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4423 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
4424 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
4425 verifyFormat("template <template <typename> class Fooooooo,\n"
4426 " template <typename> class Baaaaaaar>\n"
4427 "struct C {};",
4428 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00004429 verifyFormat("template <typename T> // T can be A, B or C.\n"
4430 "struct C {};",
4431 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00004432 verifyFormat("template <enum E> class A {\n"
4433 "public:\n"
4434 " E *f();\n"
4435 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004436}
4437
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00004438TEST_F(FormatTest, WrapsTemplateParameters) {
4439 FormatStyle Style = getLLVMStyle();
4440 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4441 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4442 verifyFormat(
4443 "template <typename... a> struct q {};\n"
4444 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
4445 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
4446 " y;",
4447 Style);
4448 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4449 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4450 verifyFormat(
4451 "template <typename... a> struct r {};\n"
4452 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
4453 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
4454 " y;",
4455 Style);
4456 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4457 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4458 verifyFormat(
4459 "template <typename... a> struct s {};\n"
4460 "extern s<\n"
4461 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4462 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
4463 " y;",
4464 Style);
4465 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4466 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4467 verifyFormat(
4468 "template <typename... a> struct t {};\n"
4469 "extern t<\n"
4470 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4471 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
4472 " y;",
4473 Style);
4474}
4475
Daniel Jasper45797022013-01-25 10:57:27 +00004476TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
4477 verifyFormat(
4478 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4479 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4480 verifyFormat(
4481 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4482 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4483 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
4484
Daniel Jasper0f0234e2013-05-08 10:00:18 +00004485 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00004486 verifyFormat(
4487 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4488 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00004489 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00004490
Daniel Jasper45797022013-01-25 10:57:27 +00004491 verifyFormat(
4492 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00004493 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00004494
4495 // Breaking at nested name specifiers is generally not desirable.
4496 verifyFormat(
4497 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4498 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004499
4500 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004501 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
4502 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4503 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004504 " aaaaaaaaaaaaaaaaaaaaa);",
4505 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00004506
4507 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4508 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4509 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00004510}
4511
Daniel Jasperf7935112012-12-03 18:12:45 +00004512TEST_F(FormatTest, UnderstandsTemplateParameters) {
4513 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00004514 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004515 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
4516 verifyFormat("bool x = a < 1 || 2 > a;");
4517 verifyFormat("bool x = 5 < f<int>();");
4518 verifyFormat("bool x = f<int>() > 5;");
4519 verifyFormat("bool x = 5 < a<int>::x;");
4520 verifyFormat("bool x = a < 4 ? a > 2 : false;");
4521 verifyFormat("bool x = f() ? a < 2 : a > 2;");
4522
4523 verifyGoogleFormat("A<A<int>> a;");
4524 verifyGoogleFormat("A<A<A<int>>> a;");
4525 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00004526 verifyGoogleFormat("A<A<int> > a;");
4527 verifyGoogleFormat("A<A<A<int> > > a;");
4528 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00004529 verifyGoogleFormat("A<::A<int>> a;");
4530 verifyGoogleFormat("A<::A> a;");
4531 verifyGoogleFormat("A< ::A> a;");
4532 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00004533 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
4534 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00004535 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
4536 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00004537 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
4538 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00004539
Nico Weber7533b4d2014-09-24 17:17:32 +00004540 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
4541
Daniel Jasperf7935112012-12-03 18:12:45 +00004542 verifyFormat("test >> a >> b;");
4543 verifyFormat("test << a >> b;");
4544
4545 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004546 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00004547 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00004548 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
4549 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00004550 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00004551 verifyFormat("f(a.operator()<A>());");
4552 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4553 " .template operator()<A>());",
4554 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00004555
4556 // Not template parameters.
4557 verifyFormat("return a < b && c > d;");
4558 verifyFormat("void f() {\n"
4559 " while (a < b && c > d) {\n"
4560 " }\n"
4561 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00004562 verifyFormat("template <typename... Types>\n"
4563 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00004564
4565 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4566 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
4567 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00004568 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00004569 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00004570 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00004571}
4572
Malcolm Parsons6af3f142016-11-03 16:57:30 +00004573TEST_F(FormatTest, BitshiftOperatorWidth) {
4574 EXPECT_EQ("int a = 1 << 2; /* foo\n"
4575 " bar */",
4576 format("int a=1<<2; /* foo\n"
4577 " bar */"));
4578
4579 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
4580 " bar */",
4581 format("int b =256>>1 ; /* foo\n"
4582 " bar */"));
4583}
4584
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00004585TEST_F(FormatTest, UnderstandsBinaryOperators) {
4586 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00004587 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00004588}
4589
4590TEST_F(FormatTest, UnderstandsPointersToMembers) {
4591 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00004592 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00004593 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00004594 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00004595 verifyFormat("void f() {\n"
4596 " (a->*f)();\n"
4597 " a->*x;\n"
4598 " (a.*f)();\n"
4599 " ((*a).*f)();\n"
4600 " a.*x;\n"
4601 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00004602 verifyFormat("void f() {\n"
4603 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
4604 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
4605 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00004606 verifyFormat(
4607 "(aaaaaaaaaa->*bbbbbbb)(\n"
4608 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00004609 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00004610 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00004611 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00004612}
4613
Daniel Jasper8dd40472012-12-21 09:41:31 +00004614TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00004615 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00004616 verifyFormat("f(-1, -2, -3);");
4617 verifyFormat("a[-1] = 5;");
4618 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004619 verifyFormat("if (i == -1) {\n}");
4620 verifyFormat("if (i != -1) {\n}");
4621 verifyFormat("if (i > -1) {\n}");
4622 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00004623 verifyFormat("++(a->f());");
4624 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00004625 verifyFormat("(a->f())++;");
4626 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004627 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00004628
4629 verifyFormat("a-- > b;");
4630 verifyFormat("b ? -a : c;");
4631 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00004632 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00004633 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00004634 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00004635
4636 verifyFormat("return -1;");
4637 verifyFormat("switch (a) {\n"
4638 "case -1:\n"
4639 " break;\n"
4640 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00004641 verifyFormat("#define X -1");
4642 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00004643
Chandler Carruthf8b72662014-03-02 12:37:31 +00004644 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
4645 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00004646
4647 verifyFormat("int a = /* confusing comment */ -1;");
4648 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
4649 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004650}
4651
Daniel Jasper0c214fa2014-02-05 13:43:04 +00004652TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00004653 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00004654 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00004655 "}");
4656 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00004657 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00004658 verifyFormat("*aaa = aaaaaaa( // break\n"
4659 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00004660}
4661
Daniel Jasper8863ada2013-08-26 08:10:17 +00004662TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00004663 verifyFormat("bool operator<();");
4664 verifyFormat("bool operator>();");
4665 verifyFormat("bool operator=();");
4666 verifyFormat("bool operator==();");
4667 verifyFormat("bool operator!=();");
4668 verifyFormat("int operator+();");
4669 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00004670 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00004671 verifyFormat("bool operator();");
4672 verifyFormat("bool operator()();");
4673 verifyFormat("bool operator[]();");
4674 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004675 verifyFormat("operator int();");
4676 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00004677 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004678 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00004679 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00004680 verifyFormat("void *operator new(std::size_t size);");
4681 verifyFormat("void *operator new[](std::size_t size);");
4682 verifyFormat("void operator delete(void *ptr);");
4683 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00004684 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
4685 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00004686 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00004687 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004688
Daniel Jasper0af92eb2013-02-15 19:24:08 +00004689 verifyFormat(
4690 "ostream &operator<<(ostream &OutputStream,\n"
4691 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00004692 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
4693 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
4694 " return left.group < right.group;\n"
4695 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00004696 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00004697 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00004698
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004699 verifyGoogleFormat("operator void*();");
4700 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00004701 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00004702
4703 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00004704 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
4705 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004706}
4707
Daniel Jasper1c220482015-02-25 10:30:06 +00004708TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00004709 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
4710 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
4711 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
4712 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
4713 verifyFormat("Deleted &operator=(const Deleted &) &;");
4714 verifyFormat("Deleted &operator=(const Deleted &) &&;");
4715 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
4716 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
4717 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
4718 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
4719 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00004720 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00004721 verifyFormat("template <typename T>\n"
4722 "void F(T) && = delete;",
4723 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00004724
Daniel Jasperaf642c62015-08-25 13:40:51 +00004725 FormatStyle AlignLeft = getLLVMStyle();
4726 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00004727 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00004728 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
4729 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
4730 AlignLeft);
4731 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
4732 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00004733 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
4734 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
4735 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
4736 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00004737 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00004738
4739 FormatStyle Spaces = getLLVMStyle();
4740 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00004741 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
4742 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
4743 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
4744 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00004745
4746 Spaces.SpacesInCStyleCastParentheses = false;
4747 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00004748 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
4749 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
4750 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
4751 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00004752}
4753
Daniel Jasperd6a947f2013-01-11 16:09:04 +00004754TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00004755 verifyFormat("void f() {\n"
4756 " A *a = new A;\n"
4757 " A *a = new (placement) A;\n"
4758 " delete a;\n"
4759 " delete (A *)a;\n"
4760 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00004761 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
4762 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00004763 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4764 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
4765 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00004766 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00004767}
4768
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00004769TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004770 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004771 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00004772 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004773 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00004774 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004775 verifyIndependentOfContext("int a = b * 10;");
4776 verifyIndependentOfContext("int a = 10 * b;");
4777 verifyIndependentOfContext("int a = b * c;");
4778 verifyIndependentOfContext("int a += b * c;");
4779 verifyIndependentOfContext("int a -= b * c;");
4780 verifyIndependentOfContext("int a *= b * c;");
4781 verifyIndependentOfContext("int a /= b * c;");
4782 verifyIndependentOfContext("int a = *b;");
4783 verifyIndependentOfContext("int a = *b * c;");
4784 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00004785 verifyIndependentOfContext("int a = b * (10);");
4786 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004787 verifyIndependentOfContext("return 10 * b;");
4788 verifyIndependentOfContext("return *b * *c;");
4789 verifyIndependentOfContext("return a & ~b;");
4790 verifyIndependentOfContext("f(b ? *c : *d);");
4791 verifyIndependentOfContext("int a = b ? *c : *d;");
4792 verifyIndependentOfContext("*b = a;");
4793 verifyIndependentOfContext("a * ~b;");
4794 verifyIndependentOfContext("a * !b;");
4795 verifyIndependentOfContext("a * +b;");
4796 verifyIndependentOfContext("a * -b;");
4797 verifyIndependentOfContext("a * ++b;");
4798 verifyIndependentOfContext("a * --b;");
4799 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00004800 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004801 verifyIndependentOfContext("f() * b;");
4802 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00004803 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004804 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00004805 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004806 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00004807 verifyIndependentOfContext("return sizeof(int **);");
4808 verifyIndependentOfContext("return sizeof(int ******);");
4809 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00004810 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00004811 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00004812 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00004813 verifyGoogleFormat("return sizeof(int**);");
4814 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
4815 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00004816 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00004817 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00004818 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00004819 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00004820 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00004821 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00004822 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00004823 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00004824 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00004825 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00004826 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00004827 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00004828 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00004829 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00004830 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00004831 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00004832 verifyFormat("void f(const MyOverride &override);");
4833 verifyFormat("void f(const MyFinal &final);");
4834 verifyIndependentOfContext("bool a = f() && override.f();");
4835 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00004836
Daniel Jasper5b49f472013-01-23 12:10:53 +00004837 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00004838
Daniel Jasper5b49f472013-01-23 12:10:53 +00004839 verifyIndependentOfContext("A<int *> a;");
4840 verifyIndependentOfContext("A<int **> a;");
4841 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00004842 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00004843 verifyIndependentOfContext(
4844 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004845 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00004846 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00004847 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00004848 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00004849 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00004850
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00004851 verifyFormat(
4852 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4853 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4854
Daniel Jasper1f5d6372016-06-13 14:45:12 +00004855 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00004856 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00004857 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004858 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00004859 verifyGoogleFormat("A<int*> a;");
4860 verifyGoogleFormat("A<int**> a;");
4861 verifyGoogleFormat("A<int*, int*> a;");
4862 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00004863 verifyGoogleFormat("f(b ? *c : *d);");
4864 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00004865 verifyGoogleFormat("Type* t = **x;");
4866 verifyGoogleFormat("Type* t = *++*x;");
4867 verifyGoogleFormat("*++*x;");
4868 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
4869 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00004870 verifyGoogleFormat(
4871 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00004872 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00004873 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
4874 verifyGoogleFormat("template <typename T>\n"
4875 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00004876
Daniel Jasper1904e9b2014-08-14 10:53:19 +00004877 FormatStyle Left = getLLVMStyle();
4878 Left.PointerAlignment = FormatStyle::PAS_Left;
4879 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00004880 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00004881 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00004882
Daniel Jasper5b49f472013-01-23 12:10:53 +00004883 verifyIndependentOfContext("a = *(x + y);");
4884 verifyIndependentOfContext("a = &(x + y);");
4885 verifyIndependentOfContext("*(x + y).call();");
4886 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00004887 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00004888
Daniel Jasper5b49f472013-01-23 12:10:53 +00004889 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00004890 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00004891 "int *MyValues = {\n"
4892 " *A, // Operator detection might be confused by the '{'\n"
4893 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00004894 "};");
Nico Weber80a82762013-01-17 17:17:19 +00004895
Daniel Jasper5b49f472013-01-23 12:10:53 +00004896 verifyIndependentOfContext("if (int *a = &b)");
4897 verifyIndependentOfContext("if (int &a = *b)");
4898 verifyIndependentOfContext("if (a & b[i])");
4899 verifyIndependentOfContext("if (a::b::c::d & b[i])");
4900 verifyIndependentOfContext("if (*b[i])");
4901 verifyIndependentOfContext("if (int *a = (&b))");
4902 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00004903 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00004904 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00004905 verifyFormat("void f() {\n"
4906 " for (const int &v : Values) {\n"
4907 " }\n"
4908 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00004909 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
4910 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00004911 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00004912
Daniel Jaspera98da3d2013-11-07 19:56:07 +00004913 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00004914 verifyFormat("#define MACRO \\\n"
4915 " int *i = a * b; \\\n"
4916 " void f(a *b);",
4917 getLLVMStyleWithColumns(19));
4918
Daniel Jasper97b89482013-03-13 07:49:51 +00004919 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004920 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00004921 verifyIndependentOfContext("T **t = new T *;");
4922 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00004923 verifyGoogleFormat("A = new SomeType*[Length]();");
4924 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00004925 verifyGoogleFormat("T** t = new T*;");
4926 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00004927
Daniel Jasper990ff972013-05-07 14:17:18 +00004928 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00004929 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00004930 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00004931 verifyFormat("STATIC_ASSERT((a & b) == 0);");
4932 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00004933 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00004934 "typename t::if<x && y>::type f() {}");
4935 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00004936 verifyFormat("vector<int *> v;");
4937 verifyFormat("vector<int *const> v;");
4938 verifyFormat("vector<int *const **const *> v;");
4939 verifyFormat("vector<int *volatile> v;");
4940 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00004941 verifyFormat("foo<b && false>();");
4942 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00004943 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00004944 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004945 "template <class T, class = typename std::enable_if<\n"
4946 " std::is_integral<T>::value &&\n"
4947 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
4948 "void F();",
4949 getLLVMStyleWithColumns(70));
4950 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004951 "template <class T,\n"
4952 " class = typename std::enable_if<\n"
4953 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004954 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
4955 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00004956 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004957 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00004958 verifyFormat(
4959 "template <class T,\n"
4960 " class = typename ::std::enable_if<\n"
4961 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
4962 "void F();",
4963 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00004964
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00004965 verifyIndependentOfContext("MACRO(int *i);");
4966 verifyIndependentOfContext("MACRO(auto *a);");
4967 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper628dd852017-03-08 09:49:12 +00004968 verifyIndependentOfContext("MACRO(A *const a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00004969 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00004970 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00004971 // FIXME: Is there a way to make this work?
4972 // verifyIndependentOfContext("MACRO(A *a);");
4973
Daniel Jasper32ccb032014-06-23 07:36:18 +00004974 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00004975 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00004976
Daniel Jasper866468a2014-04-14 13:15:29 +00004977 EXPECT_EQ("#define OP(x) \\\n"
4978 " ostream &operator<<(ostream &s, const A &a) { \\\n"
4979 " return s << a.DebugString(); \\\n"
4980 " }",
4981 format("#define OP(x) \\\n"
4982 " ostream &operator<<(ostream &s, const A &a) { \\\n"
4983 " return s << a.DebugString(); \\\n"
4984 " }",
4985 getLLVMStyleWithColumns(50)));
4986
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00004987 // FIXME: We cannot handle this case yet; we might be able to figure out that
4988 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00004989 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00004990
4991 FormatStyle PointerMiddle = getLLVMStyle();
4992 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
4993 verifyFormat("delete *x;", PointerMiddle);
4994 verifyFormat("int * x;", PointerMiddle);
4995 verifyFormat("template <int * y> f() {}", PointerMiddle);
4996 verifyFormat("int * f(int * a) {}", PointerMiddle);
4997 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
4998 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
4999 verifyFormat("A<int *> a;", PointerMiddle);
5000 verifyFormat("A<int **> a;", PointerMiddle);
5001 verifyFormat("A<int *, int *> a;", PointerMiddle);
5002 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00005003 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5004 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00005005 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005006
5007 // Member function reference qualifiers aren't binary operators.
5008 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005009 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005010 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005011 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005012 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005013 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005014}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005015
Daniel Jasperee6d6502013-07-17 20:25:02 +00005016TEST_F(FormatTest, UnderstandsAttributes) {
5017 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00005018 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5019 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005020 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005021 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005022 verifyFormat("__attribute__((nodebug)) void\n"
5023 "foo() {}\n",
5024 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00005025}
5026
Daniel Jasper10cd5812013-05-06 06:35:44 +00005027TEST_F(FormatTest, UnderstandsEllipsis) {
5028 verifyFormat("int printf(const char *fmt, ...);");
5029 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005030 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5031
5032 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005033 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005034 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005035}
5036
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005037TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005038 EXPECT_EQ("int *a;\n"
5039 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005040 "int *a;",
5041 format("int *a;\n"
5042 "int* a;\n"
5043 "int *a;",
5044 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005045 EXPECT_EQ("int* a;\n"
5046 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005047 "int* a;",
5048 format("int* a;\n"
5049 "int* a;\n"
5050 "int *a;",
5051 getGoogleStyle()));
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 Jasper352f0df2015-07-18 16:35:30 +00005059 EXPECT_EQ("auto x = [] {\n"
5060 " int *a;\n"
5061 " int *a;\n"
5062 " int *a;\n"
5063 "};",
5064 format("auto x=[]{int *a;\n"
5065 "int * a;\n"
5066 "int * a;};",
5067 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005068}
5069
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005070TEST_F(FormatTest, UnderstandsRvalueReferences) {
5071 verifyFormat("int f(int &&a) {}");
5072 verifyFormat("int f(int a, char &&b) {}");
5073 verifyFormat("void f() { int &&a = b; }");
5074 verifyGoogleFormat("int f(int a, char&& b) {}");
5075 verifyGoogleFormat("void f() { int&& a = b; }");
5076
Daniel Jasper1eff9082013-05-27 16:36:33 +00005077 verifyIndependentOfContext("A<int &&> a;");
5078 verifyIndependentOfContext("A<int &&, int &&> a;");
5079 verifyGoogleFormat("A<int&&> a;");
5080 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00005081
5082 // Not rvalue references:
5083 verifyFormat("template <bool B, bool C> class A {\n"
5084 " static_assert(B && C, \"Something is wrong\");\n"
5085 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00005086 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
5087 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00005088 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00005089}
5090
Manuel Klimekc1237a82013-01-23 14:08:21 +00005091TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
5092 verifyFormat("void f() {\n"
5093 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005094 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005095 "}",
5096 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00005097}
5098
Daniel Jasperef906a92013-01-13 08:01:36 +00005099TEST_F(FormatTest, FormatsCasts) {
5100 verifyFormat("Type *A = static_cast<Type *>(P);");
5101 verifyFormat("Type *A = (Type *)P;");
5102 verifyFormat("Type *A = (vector<Type *, int *>)P;");
5103 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00005104 verifyFormat("int a = (int)2.0f;");
5105 verifyFormat("x[(int32)y];");
5106 verifyFormat("x = (int32)y;");
5107 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
5108 verifyFormat("int a = (int)*b;");
5109 verifyFormat("int a = (int)2.0f;");
5110 verifyFormat("int a = (int)~0;");
5111 verifyFormat("int a = (int)++a;");
5112 verifyFormat("int a = (int)sizeof(int);");
5113 verifyFormat("int a = (int)+2;");
5114 verifyFormat("my_int a = (my_int)2.0f;");
5115 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00005116 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00005117 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00005118 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00005119 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00005120 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00005121
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005122 verifyFormat("void f() { my_int a = (my_int)*b; }");
5123 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
5124 verifyFormat("my_int a = (my_int)~0;");
5125 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00005126 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005127 verifyFormat("my_int a = (my_int)1;");
5128 verifyFormat("my_int a = (my_int *)1;");
5129 verifyFormat("my_int a = (const my_int)-1;");
5130 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00005131 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00005132 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00005133 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00005134 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00005135
5136 // FIXME: single value wrapped with paren will be treated as cast.
5137 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00005138
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00005139 verifyFormat("{ (void)F; }");
5140
Daniel Jasper998cabc2013-07-18 14:46:07 +00005141 // Don't break after a cast's
5142 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5143 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
5144 " bbbbbbbbbbbbbbbbbbbbbb);");
5145
Daniel Jasperef906a92013-01-13 08:01:36 +00005146 // These are not casts.
5147 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00005148 verifyFormat("f(foo)->b;");
5149 verifyFormat("f(foo).b;");
5150 verifyFormat("f(foo)(b);");
5151 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005152 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00005153 verifyFormat("(*funptr)(foo)[4];");
5154 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00005155 verifyFormat("void f(int *);");
5156 verifyFormat("void f(int *) = 0;");
5157 verifyFormat("void f(SmallVector<int>) {}");
5158 verifyFormat("void f(SmallVector<int>);");
5159 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00005160 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00005161 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005162 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00005163 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
5164 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00005165 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005166
Daniel Jasperba0bda92013-02-23 08:07:18 +00005167 // These are not casts, but at some point were confused with casts.
5168 verifyFormat("virtual void foo(int *) override;");
5169 verifyFormat("virtual void foo(char &) const;");
5170 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00005171 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005172 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00005173 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00005174 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00005175
5176 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
5177 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005178 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005179 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005180 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5181 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
5182 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00005183}
5184
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005185TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005186 verifyFormat("A<bool()> a;");
5187 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00005188 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00005189 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005190 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005191 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005192 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00005193 verifyFormat("template <class CallbackClass>\n"
5194 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00005195
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005196 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
5197 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00005198 verifyGoogleFormat(
5199 "template <class CallbackClass>\n"
5200 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00005201
Daniel Jasper5dad58e2013-05-15 07:51:51 +00005202 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00005203 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00005204 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00005205 verifyFormat("some_var = function(*some_pointer_var)[0];");
5206 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00005207 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00005208 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00005209}
5210
Daniel Jasperbeaa3222015-02-26 11:30:50 +00005211TEST_F(FormatTest, FormatsPointersToArrayTypes) {
5212 verifyFormat("A (*foo_)[6];");
5213 verifyFormat("vector<int> (*foo_)[6];");
5214}
5215
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005216TEST_F(FormatTest, BreaksLongVariableDeclarations) {
5217 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5218 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
5219 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
5220 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00005221 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5222 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005223
5224 // Different ways of ()-initializiation.
5225 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5226 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
5227 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5228 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
5229 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5230 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00005231 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5232 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper697a8ec2017-02-07 21:38:16 +00005233
5234 // Lambdas should not confuse the variable declaration heuristic.
5235 verifyFormat("LooooooooooooooooongType\n"
5236 " variable(nullptr, [](A *a) {});",
5237 getLLVMStyleWithColumns(40));
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005238}
5239
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005240TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00005241 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005242 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005243 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005244 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00005245 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00005246 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00005247 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
5248 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00005249 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5250 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00005251 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
5252 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00005253 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
5254 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00005255 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
5256 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005257 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5258 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
5259 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5260 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00005261 FormatStyle Indented = getLLVMStyle();
5262 Indented.IndentWrappedFunctionNames = true;
5263 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5264 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
5265 Indented);
5266 verifyFormat(
5267 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5268 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5269 Indented);
5270 verifyFormat(
5271 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
5272 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5273 Indented);
5274 verifyFormat(
5275 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
5276 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5277 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00005278
5279 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00005280 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
5281 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
5282 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00005283
Daniel Jasperd2639ef2013-01-28 15:16:31 +00005284 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005285 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00005286 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00005287 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
5288 " SourceLocation L, IdentifierIn *II,\n"
5289 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005290 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005291 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005292 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005293 " const SomeType<string, SomeOtherTemplateParameter>\n"
5294 " &ReallyReallyLongParameterName,\n"
5295 " const SomeType<string, SomeOtherTemplateParameter>\n"
5296 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00005297 verifyFormat("template <typename A>\n"
5298 "SomeLoooooooooooooooooooooongType<\n"
5299 " typename some_namespace::SomeOtherType<A>::Type>\n"
5300 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00005301
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00005302 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00005303 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
5304 " aaaaaaaaaaaaaaaaaaaaaaa;");
5305 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005306 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
5307 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00005308 verifyGoogleFormat(
5309 "some_namespace::LongReturnType\n"
5310 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005311 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00005312
5313 verifyGoogleFormat("template <typename T>\n"
5314 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00005315 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00005316 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5317 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00005318
5319 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00005320 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5321 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00005322 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5323 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
5324 " aaaaaaaaaaaaaaaaaaaaaaaa);");
5325 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5326 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
5327 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
5328 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00005329
Andi-Bogdan Postelnicu4743e2d2017-03-07 15:20:31 +00005330 verifyFormat("template <typename T> // Templates on own line.\n"
5331 "static int // Some comment.\n"
Andi-Bogdan Postelnicu67329892017-03-07 14:48:02 +00005332 "MyFunction(int a);",
5333 getLLVMStyle());
Daniel Jasperd1926a32013-01-02 08:44:14 +00005334}
5335
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005336TEST_F(FormatTest, FormatsArrays) {
5337 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5338 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00005339 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
5340 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00005341 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
5342 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005343 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5344 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5345 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5346 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
5347 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5348 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5349 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5350 verifyFormat(
5351 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
5352 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5353 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00005354 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
5355 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00005356
5357 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
5358 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00005359 verifyFormat(
5360 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
5361 " .aaaaaaa[0]\n"
5362 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00005363 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00005364
5365 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00005366
5367 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
5368 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005369}
5370
Daniel Jaspere9de2602012-12-06 09:56:08 +00005371TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
5372 verifyFormat("(a)->b();");
5373 verifyFormat("--a;");
5374}
5375
Daniel Jasper8b529712012-12-04 13:02:32 +00005376TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00005377 verifyFormat("#include <string>\n"
5378 "#include <a/b/c.h>\n"
5379 "#include \"a/b/string\"\n"
5380 "#include \"string.h\"\n"
5381 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00005382 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005383 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00005384 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00005385 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00005386 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005387 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
5388 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00005389 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
5390 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00005391
Daniel Jasper5ef433f2013-01-13 08:12:18 +00005392 verifyFormat("#import <string>");
5393 verifyFormat("#import <a/b/c.h>");
5394 verifyFormat("#import \"a/b/string\"");
5395 verifyFormat("#import \"string.h\"");
5396 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00005397 verifyFormat("#if __has_include(<strstream>)\n"
5398 "#include <strstream>\n"
5399 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00005400
Daniel Jasper343643b2014-08-13 08:29:18 +00005401 verifyFormat("#define MY_IMPORT <a/b>");
5402
Nico Weber21088802017-02-10 19:36:52 +00005403 verifyFormat("#if __has_include(<a/b>)");
5404 verifyFormat("#if __has_include_next(<a/b>)");
5405 verifyFormat("#define F __has_include(<a/b>)");
5406 verifyFormat("#define F __has_include_next(<a/b>)");
5407
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00005408 // Protocol buffer definition or missing "#".
5409 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
5410 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00005411
5412 FormatStyle Style = getLLVMStyle();
5413 Style.AlwaysBreakBeforeMultilineStrings = true;
5414 Style.ColumnLimit = 0;
5415 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00005416
5417 // But 'import' might also be a regular C++ namespace.
5418 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5419 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00005420}
5421
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005422//===----------------------------------------------------------------------===//
5423// Error recovery tests.
5424//===----------------------------------------------------------------------===//
5425
Daniel Jasper66e9dee2013-02-14 09:19:04 +00005426TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005427 FormatStyle NoBinPacking = getLLVMStyle();
5428 NoBinPacking.BinPackParameters = false;
5429 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
5430 " double *min_x,\n"
5431 " double *max_x,\n"
5432 " double *min_y,\n"
5433 " double *max_y,\n"
5434 " double *min_z,\n"
5435 " double *max_z, ) {}",
5436 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00005437}
5438
Daniel Jasper83a54d22013-01-10 09:26:47 +00005439TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00005440 verifyFormat("void f() { return; }\n42");
5441 verifyFormat("void f() {\n"
5442 " if (0)\n"
5443 " return;\n"
5444 "}\n"
5445 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00005446 verifyFormat("void f() { return }\n42");
5447 verifyFormat("void f() {\n"
5448 " if (0)\n"
5449 " return\n"
5450 "}\n"
5451 "42");
5452}
5453
5454TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
5455 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
5456 EXPECT_EQ("void f() {\n"
5457 " if (a)\n"
5458 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005459 "}",
5460 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00005461 EXPECT_EQ("namespace N {\n"
5462 "void f()\n"
5463 "}",
5464 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00005465 EXPECT_EQ("namespace N {\n"
5466 "void f() {}\n"
5467 "void g()\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00005468 "} // namespace N",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005469 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00005470}
5471
Daniel Jasper2df93312013-01-09 10:16:05 +00005472TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
5473 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00005474 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005475 " b;",
5476 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00005477 verifyFormat("function(\n"
5478 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005479 " LoooooooooooongArgument);\n",
5480 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00005481}
5482
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005483TEST_F(FormatTest, IncorrectAccessSpecifier) {
5484 verifyFormat("public:");
5485 verifyFormat("class A {\n"
5486 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005487 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005488 "};");
5489 verifyFormat("public\n"
5490 "int qwerty;");
5491 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005492 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005493 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005494 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005495 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005496 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005497}
Daniel Jasperf7935112012-12-03 18:12:45 +00005498
Daniel Jasper291f9362013-03-20 15:58:10 +00005499TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
5500 verifyFormat("{");
5501 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00005502 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00005503}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005504
5505TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005506 verifyFormat("do {\n}");
5507 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005508 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005509 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005510 "wheeee(fun);");
5511 verifyFormat("do {\n"
5512 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00005513 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005514}
5515
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005516TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00005517 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005518 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00005519 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005520 verifyFormat("while {\n foo;\n foo();\n}");
5521 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00005522}
5523
Daniel Jasperc0880a92013-01-04 18:52:56 +00005524TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00005525 verifyIncompleteFormat("namespace {\n"
5526 "class Foo { Foo (\n"
5527 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00005528 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00005529}
5530
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005531TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005532 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005533 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
5534 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005535 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005536
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005537 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005538 " {\n"
5539 " breakme(\n"
5540 " qwe);\n"
5541 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005542 format("{\n"
5543 " {\n"
5544 " breakme(qwe);\n"
5545 "}\n",
5546 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005547}
5548
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00005549TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005550 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005551 " avariable,\n"
5552 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005553 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00005554}
5555
Manuel Klimek762dd182013-01-21 10:07:49 +00005556TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005557 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00005558}
5559
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005560TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00005561 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00005562 verifyFormat("vector<int> x{\n"
5563 " 1, 2, 3, 4,\n"
5564 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005565 verifyFormat("vector<T> x{{}, {}, {}, {}};");
5566 verifyFormat("f({1, 2});");
5567 verifyFormat("auto v = Foo{-1};");
5568 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
5569 verifyFormat("Class::Class : member{1, 2, 3} {}");
5570 verifyFormat("new vector<int>{1, 2, 3};");
5571 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00005572 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005573 verifyFormat("return {arg1, arg2};");
5574 verifyFormat("return {arg1, SomeType{parameter}};");
5575 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
5576 verifyFormat("new T{arg1, arg2};");
5577 verifyFormat("f(MyMap[{composite, key}]);");
5578 verifyFormat("class Class {\n"
5579 " T member = {arg1, arg2};\n"
5580 "};");
5581 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00005582 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
5583 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00005584
Daniel Jasper438059e2014-05-22 12:11:13 +00005585 verifyFormat("int foo(int i) { return fo1{}(i); }");
5586 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005587 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00005588 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00005589 verifyFormat("Node n{1, Node{1000}, //\n"
5590 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00005591 verifyFormat("Aaaa aaaaaaa{\n"
5592 " {\n"
5593 " aaaa,\n"
5594 " },\n"
5595 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00005596 verifyFormat("class C : public D {\n"
5597 " SomeClass SC{2};\n"
5598 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00005599 verifyFormat("class C : public A {\n"
5600 " class D : public B {\n"
5601 " void f() { int i{2}; }\n"
5602 " };\n"
5603 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00005604 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00005605
Daniel Jaspere4ada022016-12-13 10:05:03 +00005606 // Cases where distinguising braced lists and blocks is hard.
5607 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
5608 verifyFormat("void f() {\n"
5609 " return; // comment\n"
5610 "}\n"
5611 "SomeType t;");
5612 verifyFormat("void f() {\n"
5613 " if (a) {\n"
5614 " f();\n"
5615 " }\n"
5616 "}\n"
5617 "SomeType t;");
5618
Daniel Jasper08434342015-05-26 07:26:26 +00005619 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005620 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00005621 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005622 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
5623 " bbbbb,\n"
5624 " ccccc,\n"
5625 " ddddd,\n"
5626 " eeeee,\n"
5627 " ffffff,\n"
5628 " ggggg,\n"
5629 " hhhhhh,\n"
5630 " iiiiii,\n"
5631 " jjjjjj,\n"
5632 " kkkkkk};",
5633 NoBinPacking);
5634 verifyFormat("const Aaaaaa aaaaa = {\n"
5635 " aaaaa,\n"
5636 " bbbbb,\n"
5637 " ccccc,\n"
5638 " ddddd,\n"
5639 " eeeee,\n"
5640 " ffffff,\n"
5641 " ggggg,\n"
5642 " hhhhhh,\n"
5643 " iiiiii,\n"
5644 " jjjjjj,\n"
5645 " kkkkkk,\n"
5646 "};",
5647 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00005648 verifyFormat(
5649 "const Aaaaaa aaaaa = {\n"
5650 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
5651 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
5652 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
5653 "};",
5654 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005655
Chandler Carruthf8b72662014-03-02 12:37:31 +00005656 // FIXME: The alignment of these trailing comments might be bad. Then again,
5657 // this might be utterly useless in real code.
5658 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00005659 " : some_value{ //\n"
5660 " aaaaaaa, //\n"
5661 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00005662
Chandler Carruthf8b72662014-03-02 12:37:31 +00005663 // In braced lists, the first comment is always assumed to belong to the
5664 // first element. Thus, it can be moved to the next or previous line as
5665 // appropriate.
5666 EXPECT_EQ("function({// First element:\n"
5667 " 1,\n"
5668 " // Second element:\n"
5669 " 2});",
5670 format("function({\n"
5671 " // First element:\n"
5672 " 1,\n"
5673 " // Second element:\n"
5674 " 2});"));
5675 EXPECT_EQ("std::vector<int> MyNumbers{\n"
5676 " // First element:\n"
5677 " 1,\n"
5678 " // Second element:\n"
5679 " 2};",
5680 format("std::vector<int> MyNumbers{// First element:\n"
5681 " 1,\n"
5682 " // Second element:\n"
5683 " 2};",
5684 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00005685 // A trailing comma should still lead to an enforced line break.
5686 EXPECT_EQ("vector<int> SomeVector = {\n"
5687 " // aaa\n"
5688 " 1, 2,\n"
5689 "};",
5690 format("vector<int> SomeVector = { // aaa\n"
5691 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00005692
Chandler Carruthf8b72662014-03-02 12:37:31 +00005693 FormatStyle ExtraSpaces = getLLVMStyle();
5694 ExtraSpaces.Cpp11BracedListStyle = false;
5695 ExtraSpaces.ColumnLimit = 75;
5696 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
5697 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
5698 verifyFormat("f({ 1, 2 });", ExtraSpaces);
5699 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
5700 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
5701 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
5702 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
5703 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
5704 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
5705 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
5706 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
5707 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
5708 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
5709 verifyFormat("class Class {\n"
5710 " T member = { arg1, arg2 };\n"
5711 "};",
5712 ExtraSpaces);
5713 verifyFormat(
5714 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5715 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
5716 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
5717 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
5718 ExtraSpaces);
5719 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00005720 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00005721 ExtraSpaces);
5722 verifyFormat(
5723 "someFunction(OtherParam,\n"
5724 " BracedList{ // comment 1 (Forcing interesting break)\n"
5725 " param1, param2,\n"
5726 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00005727 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00005728 ExtraSpaces);
5729 verifyFormat(
5730 "std::this_thread::sleep_for(\n"
5731 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
5732 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00005733 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00005734 " aaaaaaa,\n"
5735 " aaaaaaaaaa,\n"
5736 " aaaaa,\n"
5737 " aaaaaaaaaaaaaaa,\n"
5738 " aaa,\n"
5739 " aaaaaaaaaa,\n"
5740 " a,\n"
5741 " aaaaaaaaaaaaaaaaaaaaa,\n"
5742 " aaaaaaaaaaaa,\n"
5743 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
5744 " aaaaaaa,\n"
5745 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005746 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00005747}
5748
Daniel Jasper33b909c2013-10-25 14:29:37 +00005749TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00005750 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5751 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5752 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5753 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5754 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5755 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00005756 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005757 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00005758 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005759 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5760 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005761 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00005762 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5763 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5764 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
5765 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
5766 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
5767 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
5768 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005769 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005770 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5771 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00005772 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
5773 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5774 " // Separating comment.\n"
5775 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
5776 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
5777 " // Leading comment\n"
5778 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5779 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005780 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5781 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005782 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00005783 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5784 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005785 getLLVMStyleWithColumns(38));
5786 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005787 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
5788 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00005789 verifyFormat(
5790 "static unsigned SomeValues[10][3] = {\n"
5791 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
5792 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
5793 verifyFormat("static auto fields = new vector<string>{\n"
5794 " \"aaaaaaaaaaaaa\",\n"
5795 " \"aaaaaaaaaaaaa\",\n"
5796 " \"aaaaaaaaaaaa\",\n"
5797 " \"aaaaaaaaaaaaaa\",\n"
5798 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
5799 " \"aaaaaaaaaaaa\",\n"
5800 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
5801 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00005802 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
5803 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
5804 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
5805 " 3, cccccccccccccccccccccc};",
5806 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00005807
5808 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00005809 verifyFormat("vector<int> x = {\n"
5810 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
5811 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00005812 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00005813 verifyFormat("vector<int> x = {\n"
5814 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00005815 "};",
5816 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00005817 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5818 " 1, 1, 1, 1,\n"
5819 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00005820 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00005821
Daniel Jasper60c27072015-05-13 08:16:00 +00005822 // Trailing comment in the first line.
5823 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
5824 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
5825 " 111111111, 222222222, 3333333333, 444444444, //\n"
5826 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00005827 // Trailing comment in the last line.
5828 verifyFormat("int aaaaa[] = {\n"
5829 " 1, 2, 3, // comment\n"
5830 " 4, 5, 6 // comment\n"
5831 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00005832
Daniel Jaspere4c16c72015-05-08 13:51:14 +00005833 // With nested lists, we should either format one item per line or all nested
5834 // lists one on line.
5835 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00005836 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
5837 " {aaaaaaaaaaaaaaaaaaa},\n"
5838 " {aaaaaaaaaaaaaaaaaaaaa},\n"
5839 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00005840 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00005841 verifyFormat(
5842 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005843 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
5844 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
5845 " {aaa, aaa},\n"
5846 " {aaa, aaa},\n"
5847 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
5848 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
5849 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00005850
5851 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00005852 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
5853 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00005854
5855 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00005856
Daniel Jaspereb65e912015-12-21 18:31:15 +00005857 // No braced initializer here.
5858 verifyFormat("void f() {\n"
5859 " struct Dummy {};\n"
5860 " f(v);\n"
5861 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00005862
5863 // Long lists should be formatted in columns even if they are nested.
5864 verifyFormat(
5865 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5866 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5867 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5868 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5869 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5870 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00005871
5872 // Allow "single-column" layout even if that violates the column limit. There
5873 // isn't going to be a better way.
5874 verifyFormat("std::vector<int> a = {\n"
5875 " aaaaaaaa,\n"
5876 " aaaaaaaa,\n"
5877 " aaaaaaaa,\n"
5878 " aaaaaaaa,\n"
5879 " aaaaaaaaaa,\n"
5880 " aaaaaaaa,\n"
5881 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
5882 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00005883 verifyFormat("vector<int> aaaa = {\n"
5884 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5885 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5886 " aaaaaa.aaaaaaa,\n"
5887 " aaaaaa.aaaaaaa,\n"
5888 " aaaaaa.aaaaaaa,\n"
5889 " aaaaaa.aaaaaaa,\n"
5890 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00005891
5892 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005893 verifyFormat("someFunction(Param, {List1, List2,\n"
5894 " List3});",
5895 getLLVMStyleWithColumns(35));
5896 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00005897 " {List1, List2,\n"
5898 " List3});",
5899 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00005900 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
5901 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005902}
5903
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005904TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005905 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00005906 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005907
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005908 verifyFormat("void f() { return 42; }");
5909 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005910 " return 42;\n"
5911 "}",
5912 DoNotMerge);
5913 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005914 " // Comment\n"
5915 "}");
5916 verifyFormat("{\n"
5917 "#error {\n"
5918 " int a;\n"
5919 "}");
5920 verifyFormat("{\n"
5921 " int a;\n"
5922 "#error {\n"
5923 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00005924 verifyFormat("void f() {} // comment");
5925 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00005926 verifyFormat("void f() {\n"
5927 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005928 DoNotMerge);
5929 verifyFormat("void f() {\n"
5930 " int a;\n"
5931 "} // comment",
5932 DoNotMerge);
5933 verifyFormat("void f() {\n"
5934 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00005935 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005936
5937 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
5938 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
5939
5940 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
5941 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00005942 verifyFormat("class C {\n"
5943 " C()\n"
5944 " : iiiiiiii(nullptr),\n"
5945 " kkkkkkk(nullptr),\n"
5946 " mmmmmmm(nullptr),\n"
5947 " nnnnnnn(nullptr) {}\n"
5948 "};",
5949 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00005950
5951 FormatStyle NoColumnLimit = getLLVMStyle();
5952 NoColumnLimit.ColumnLimit = 0;
5953 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
5954 EXPECT_EQ("class C {\n"
5955 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005956 "};",
5957 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00005958 EXPECT_EQ("A()\n"
5959 " : b(0) {\n"
5960 "}",
5961 format("A()\n:b(0)\n{\n}", NoColumnLimit));
5962
5963 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00005964 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
5965 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00005966 EXPECT_EQ("A()\n"
5967 " : b(0) {\n"
5968 "}",
5969 format("A():b(0){}", DoNotMergeNoColumnLimit));
5970 EXPECT_EQ("A()\n"
5971 " : b(0) {\n"
5972 "}",
5973 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00005974
5975 verifyFormat("#define A \\\n"
5976 " void f() { \\\n"
5977 " int i; \\\n"
5978 " }",
5979 getLLVMStyleWithColumns(20));
5980 verifyFormat("#define A \\\n"
5981 " void f() { int i; }",
5982 getLLVMStyleWithColumns(21));
5983 verifyFormat("#define A \\\n"
5984 " void f() { \\\n"
5985 " int i; \\\n"
5986 " } \\\n"
5987 " int j;",
5988 getLLVMStyleWithColumns(22));
5989 verifyFormat("#define A \\\n"
5990 " void f() { int i; } \\\n"
5991 " int j;",
5992 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005993}
5994
Daniel Jasperd74cf402014-04-08 12:46:38 +00005995TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
5996 FormatStyle MergeInlineOnly = getLLVMStyle();
5997 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
5998 verifyFormat("class C {\n"
5999 " int f() { return 42; }\n"
6000 "};",
6001 MergeInlineOnly);
6002 verifyFormat("int f() {\n"
6003 " return 42;\n"
6004 "}",
6005 MergeInlineOnly);
6006}
6007
Manuel Klimeke01bab52013-01-15 13:38:33 +00006008TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
6009 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006010 verifyFormat("struct foo a = {bar};\nint n;");
6011 verifyFormat("class foo a = {bar};\nint n;");
6012 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006013
6014 // Elaborate types inside function definitions.
6015 verifyFormat("struct foo f() {}\nint n;");
6016 verifyFormat("class foo f() {}\nint n;");
6017 verifyFormat("union foo f() {}\nint n;");
6018
6019 // Templates.
6020 verifyFormat("template <class X> void f() {}\nint n;");
6021 verifyFormat("template <struct X> void f() {}\nint n;");
6022 verifyFormat("template <union X> void f() {}\nint n;");
6023
6024 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006025 verifyFormat("struct {\n} n;");
6026 verifyFormat(
6027 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006028 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006029 verifyFormat("class MACRO Z {\n} n;");
6030 verifyFormat("class MACRO(X) Z {\n} n;");
6031 verifyFormat("class __attribute__(X) Z {\n} n;");
6032 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00006033 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00006034 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00006035 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6036 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006037
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006038 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006039 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006040
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006041 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00006042 verifyFormat(
6043 "template <typename F>\n"
6044 "Matcher(const Matcher<F> &Other,\n"
6045 " typename enable_if_c<is_base_of<F, T>::value &&\n"
6046 " !is_same<F, T>::value>::type * = 0)\n"
6047 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6048
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006049 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006050 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00006051 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006052
6053 // FIXME:
6054 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006055 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006056
Manuel Klimeke01bab52013-01-15 13:38:33 +00006057 // Elaborate types where incorrectly parsing the structural element would
6058 // break the indent.
6059 verifyFormat("if (true)\n"
6060 " class X x;\n"
6061 "else\n"
6062 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00006063
6064 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00006065 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00006066}
6067
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006068TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00006069 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
6070 format("#error Leave all white!!!!! space* alone!\n"));
6071 EXPECT_EQ(
6072 "#warning Leave all white!!!!! space* alone!\n",
6073 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006074 EXPECT_EQ("#error 1", format(" # error 1"));
6075 EXPECT_EQ("#warning 1", format(" # warning 1"));
6076}
6077
Daniel Jasper4431aa92013-04-23 13:54:04 +00006078TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00006079 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00006080 verifyFormat("#if (AAAA && BBBB)");
6081 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00006082 // FIXME: Come up with a better indentation for #elif.
6083 verifyFormat(
6084 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
6085 " defined(BBBBBBBB)\n"
6086 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
6087 " defined(BBBBBBBB)\n"
6088 "#endif",
6089 getLLVMStyleWithColumns(65));
6090}
6091
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006092TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
6093 FormatStyle AllowsMergedIf = getGoogleStyle();
6094 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
6095 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
6096 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00006097 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
6098 EXPECT_EQ("if (true) return 42;",
6099 format("if (true)\nreturn 42;", AllowsMergedIf));
6100 FormatStyle ShortMergedIf = AllowsMergedIf;
6101 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006102 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006103 " if (true) return 42;",
6104 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006105 verifyFormat("#define A \\\n"
6106 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006107 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006108 "#define B",
6109 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006110 verifyFormat("#define A \\\n"
6111 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006112 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006113 "g();",
6114 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00006115 verifyFormat("{\n"
6116 "#ifdef A\n"
6117 " // Comment\n"
6118 " if (true) continue;\n"
6119 "#endif\n"
6120 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00006121 " if (true) continue;\n"
6122 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006123 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00006124 ShortMergedIf.ColumnLimit = 29;
6125 verifyFormat("#define A \\\n"
6126 " if (aaaaaaaaaa) return 1; \\\n"
6127 " return 2;",
6128 ShortMergedIf);
6129 ShortMergedIf.ColumnLimit = 28;
6130 verifyFormat("#define A \\\n"
6131 " if (aaaaaaaaaa) \\\n"
6132 " return 1; \\\n"
6133 " return 2;",
6134 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006135}
6136
Manuel Klimekd33516e2013-01-23 10:09:28 +00006137TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00006138 verifyFormat("void f(int *a);");
6139 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00006140 verifyFormat("class A {\n void f(int *a);\n};");
6141 verifyFormat("class A {\n int *a;\n};");
6142 verifyFormat("namespace a {\n"
6143 "namespace b {\n"
6144 "class A {\n"
6145 " void f() {}\n"
6146 " int *a;\n"
6147 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00006148 "} // namespace b\n"
6149 "} // namespace a");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00006150}
6151
Manuel Klimekd33516e2013-01-23 10:09:28 +00006152TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
6153 verifyFormat("while");
6154 verifyFormat("operator");
6155}
6156
Daniel Jasperfda47cd2016-10-31 13:23:00 +00006157TEST_F(FormatTest, SkipsDeeplyNestedLines) {
6158 // This code would be painfully slow to format if we didn't skip it.
6159 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
6160 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6161 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6162 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6163 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6164 "A(1, 1)\n"
6165 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
6166 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6167 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6168 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6169 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6170 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6171 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6172 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6173 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6174 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
6175 // Deeply nested part is untouched, rest is formatted.
6176 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
6177 format(std::string("int i;\n") + Code + "int j;\n",
6178 getLLVMStyle(), IC_ExpectIncomplete));
6179}
6180
Nico Weber7e6a7a12013-01-08 17:56:31 +00006181//===----------------------------------------------------------------------===//
6182// Objective-C tests.
6183//===----------------------------------------------------------------------===//
6184
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006185TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
6186 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
6187 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
6188 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00006189 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006190 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
6191 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
6192 format("-(NSInteger)Method3:(id)anObject;"));
6193 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
6194 format("-(NSInteger)Method4:(id)anObject;"));
6195 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
6196 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
6197 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
6198 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00006199 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
6200 "forAllCells:(BOOL)flag;",
6201 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
6202 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00006203
6204 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00006205 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
6206 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00006207 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
6208 " inRange:(NSRange)range\n"
6209 " outRange:(NSRange)out_range\n"
6210 " outRange1:(NSRange)out_range1\n"
6211 " outRange2:(NSRange)out_range2\n"
6212 " outRange3:(NSRange)out_range3\n"
6213 " outRange4:(NSRange)out_range4\n"
6214 " outRange5:(NSRange)out_range5\n"
6215 " outRange6:(NSRange)out_range6\n"
6216 " outRange7:(NSRange)out_range7\n"
6217 " outRange8:(NSRange)out_range8\n"
6218 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00006219
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00006220 // When the function name has to be wrapped.
6221 FormatStyle Style = getLLVMStyle();
6222 Style.IndentWrappedFunctionNames = false;
6223 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
6224 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
6225 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
6226 "}",
6227 Style);
6228 Style.IndentWrappedFunctionNames = true;
6229 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
6230 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
6231 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
6232 "}",
6233 Style);
6234
Nico Weberd6f962f2013-01-10 20:18:33 +00006235 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00006236 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00006237 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
6238 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00006239 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00006240
Daniel Jasper37194282013-05-28 08:33:00 +00006241 verifyFormat("- (int (*)())foo:(int (*)())f;");
6242 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00006243
6244 // If there's no return type (very rare in practice!), LLVM and Google style
6245 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00006246 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00006247 verifyFormat("- foo:(int)f;");
6248 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006249}
6250
Nico Weber0588b502013-02-07 00:19:29 +00006251
Alexander Kornienko64a42b82014-04-15 14:52:43 +00006252TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00006253 EXPECT_EQ("\"some text \"\n"
6254 "\"other\";",
6255 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00006256 EXPECT_EQ("\"some text \"\n"
6257 "\"other\";",
6258 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006259 EXPECT_EQ(
6260 "#define A \\\n"
6261 " \"some \" \\\n"
6262 " \"text \" \\\n"
6263 " \"other\";",
6264 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
6265 EXPECT_EQ(
6266 "#define A \\\n"
6267 " \"so \" \\\n"
6268 " \"text \" \\\n"
6269 " \"other\";",
6270 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
6271
6272 EXPECT_EQ("\"some text\"",
6273 format("\"some text\"", getLLVMStyleWithColumns(1)));
6274 EXPECT_EQ("\"some text\"",
6275 format("\"some text\"", getLLVMStyleWithColumns(11)));
6276 EXPECT_EQ("\"some \"\n"
6277 "\"text\"",
6278 format("\"some text\"", getLLVMStyleWithColumns(10)));
6279 EXPECT_EQ("\"some \"\n"
6280 "\"text\"",
6281 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00006282 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00006283 "\" tex\"\n"
6284 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00006285 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00006286 EXPECT_EQ("\"some\"\n"
6287 "\" tex\"\n"
6288 "\" and\"",
6289 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
6290 EXPECT_EQ("\"some\"\n"
6291 "\"/tex\"\n"
6292 "\"/and\"",
6293 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006294
6295 EXPECT_EQ("variable =\n"
6296 " \"long string \"\n"
6297 " \"literal\";",
6298 format("variable = \"long string literal\";",
6299 getLLVMStyleWithColumns(20)));
6300
6301 EXPECT_EQ("variable = f(\n"
6302 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006303 " \"literal\",\n"
6304 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00006305 " loooooooooooooooooooong);",
6306 format("variable = f(\"long string literal\", short, "
6307 "loooooooooooooooooooong);",
6308 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00006309
Daniel Jaspera44991332015-04-29 13:06:49 +00006310 EXPECT_EQ(
6311 "f(g(\"long string \"\n"
6312 " \"literal\"),\n"
6313 " b);",
6314 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00006315 EXPECT_EQ("f(g(\"long string \"\n"
6316 " \"literal\",\n"
6317 " a),\n"
6318 " b);",
6319 format("f(g(\"long string literal\", a), b);",
6320 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006321 EXPECT_EQ(
6322 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00006323 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00006324 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
6325 EXPECT_EQ("f(\"one two three four five six \"\n"
6326 " \"seven\".split(\n"
6327 " really_looooong_variable));",
6328 format("f(\"one two three four five six seven\"."
6329 "split(really_looooong_variable));",
6330 getLLVMStyleWithColumns(33)));
6331
6332 EXPECT_EQ("f(\"some \"\n"
6333 " \"text\",\n"
6334 " other);",
6335 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00006336
6337 // Only break as a last resort.
6338 verifyFormat(
6339 "aaaaaaaaaaaaaaaaaaaa(\n"
6340 " aaaaaaaaaaaaaaaaaaaa,\n"
6341 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00006342
Daniel Jaspera44991332015-04-29 13:06:49 +00006343 EXPECT_EQ("\"splitmea\"\n"
6344 "\"trandomp\"\n"
6345 "\"oint\"",
6346 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00006347
Daniel Jaspera44991332015-04-29 13:06:49 +00006348 EXPECT_EQ("\"split/\"\n"
6349 "\"pathat/\"\n"
6350 "\"slashes\"",
6351 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006352
Daniel Jaspera44991332015-04-29 13:06:49 +00006353 EXPECT_EQ("\"split/\"\n"
6354 "\"pathat/\"\n"
6355 "\"slashes\"",
6356 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00006357 EXPECT_EQ("\"split at \"\n"
6358 "\"spaces/at/\"\n"
6359 "\"slashes.at.any$\"\n"
6360 "\"non-alphanumeric%\"\n"
6361 "\"1111111111characte\"\n"
6362 "\"rs\"",
6363 format("\"split at "
6364 "spaces/at/"
6365 "slashes.at."
6366 "any$non-"
6367 "alphanumeric%"
6368 "1111111111characte"
6369 "rs\"",
6370 getLLVMStyleWithColumns(20)));
6371
Daniel Jasper5aad4e52013-07-12 11:37:05 +00006372 // Verify that splitting the strings understands
6373 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00006374 EXPECT_EQ(
6375 "aaaaaaaaaaaa(\n"
6376 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
6377 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
6378 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
6379 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
6380 "aaaaaaaaaaaaaaaaaaaaaa\");",
6381 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00006382 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6383 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
6384 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
6385 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
6386 "aaaaaaaaaaaaaaaaaaaaaa\";",
6387 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00006388 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6389 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
6390 format("llvm::outs() << "
6391 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
6392 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00006393 EXPECT_EQ("ffff(\n"
6394 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6395 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
6396 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
6397 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
6398 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00006399
Daniel Jaspere1a7b762016-02-01 11:21:02 +00006400 FormatStyle Style = getLLVMStyleWithColumns(12);
6401 Style.BreakStringLiterals = false;
6402 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
6403
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006404 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
6405 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00006406 EXPECT_EQ("#define A \\\n"
6407 " \"some \" \\\n"
6408 " \"text \" \\\n"
6409 " \"other\";",
6410 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006411}
6412
Manuel Klimek9e321992015-07-28 15:50:24 +00006413TEST_F(FormatTest, FullyRemoveEmptyLines) {
6414 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
6415 NoEmptyLines.MaxEmptyLinesToKeep = 0;
6416 EXPECT_EQ("int i = a(b());",
6417 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
6418}
6419
Alexander Kornienko64a42b82014-04-15 14:52:43 +00006420TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
6421 EXPECT_EQ(
6422 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
6423 "(\n"
6424 " \"x\t\");",
6425 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
6426 "aaaaaaa("
6427 "\"x\t\");"));
6428}
6429
Daniel Jasper174b0122014-01-09 14:18:12 +00006430TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00006431 EXPECT_EQ(
6432 "u8\"utf8 string \"\n"
6433 "u8\"literal\";",
6434 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
6435 EXPECT_EQ(
6436 "u\"utf16 string \"\n"
6437 "u\"literal\";",
6438 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
6439 EXPECT_EQ(
6440 "U\"utf32 string \"\n"
6441 "U\"literal\";",
6442 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
6443 EXPECT_EQ("L\"wide string \"\n"
6444 "L\"literal\";",
6445 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00006446 EXPECT_EQ("@\"NSString \"\n"
6447 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00006448 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00006449
6450 // This input makes clang-format try to split the incomplete unicode escape
6451 // sequence, which used to lead to a crasher.
6452 verifyNoCrash(
6453 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
6454 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00006455}
6456
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00006457TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
6458 FormatStyle Style = getGoogleStyleWithColumns(15);
6459 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
6460 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
6461 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
6462 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
6463 EXPECT_EQ("u8R\"x(raw literal)x\";",
6464 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00006465}
6466
6467TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
6468 FormatStyle Style = getLLVMStyleWithColumns(20);
6469 EXPECT_EQ(
6470 "_T(\"aaaaaaaaaaaaaa\")\n"
6471 "_T(\"aaaaaaaaaaaaaa\")\n"
6472 "_T(\"aaaaaaaaaaaa\")",
6473 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00006474 EXPECT_EQ("f(x,\n"
6475 " _T(\"aaaaaaaaaaaa\")\n"
6476 " _T(\"aaa\"),\n"
Alexander Kornienko81e32942013-09-16 20:20:49 +00006477 " z);",
6478 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
6479
6480 // FIXME: Handle embedded spaces in one iteration.
6481 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
6482 // "_T(\"aaaaaaaaaaaaa\")\n"
6483 // "_T(\"aaaaaaaaaaaaa\")\n"
6484 // "_T(\"a\")",
6485 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
6486 // getLLVMStyleWithColumns(20)));
6487 EXPECT_EQ(
6488 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
6489 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00006490 EXPECT_EQ("f(\n"
6491 "#if !TEST\n"
6492 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
6493 "#endif\n"
6494 " );",
6495 format("f(\n"
6496 "#if !TEST\n"
6497 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
6498 "#endif\n"
6499 ");"));
6500 EXPECT_EQ("f(\n"
6501 "\n"
6502 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
6503 format("f(\n"
6504 "\n"
6505 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00006506}
6507
Krasimir Georgievbc05eba2017-03-08 12:54:50 +00006508TEST_F(FormatTest, BreaksStringLiteralOperands) {
6509 // In a function call with two operands, the second can be broken with no line
6510 // break before it.
6511 EXPECT_EQ("func(a, \"long long \"\n"
6512 " \"long long\");",
6513 format("func(a, \"long long long long\");",
6514 getLLVMStyleWithColumns(24)));
6515 // In a function call with three operands, the second must be broken with a
6516 // line break before it.
6517 EXPECT_EQ("func(a,\n"
6518 " \"long long long \"\n"
6519 " \"long\",\n"
6520 " c);",
6521 format("func(a, \"long long long long\", c);",
6522 getLLVMStyleWithColumns(24)));
6523 // In a function call with three operands, the third must be broken with a
6524 // line break before it.
6525 EXPECT_EQ("func(a, b,\n"
6526 " \"long long long \"\n"
6527 " \"long\");",
6528 format("func(a, b, \"long long long long\");",
6529 getLLVMStyleWithColumns(24)));
6530 // In a function call with three operands, both the second and the third must
6531 // be broken with a line break before them.
6532 EXPECT_EQ("func(a,\n"
6533 " \"long long long \"\n"
6534 " \"long\",\n"
6535 " \"long long long \"\n"
6536 " \"long\");",
6537 format("func(a, \"long long long long\", \"long long long long\");",
6538 getLLVMStyleWithColumns(24)));
6539 // In a chain of << with two operands, the second can be broken with no line
6540 // break before it.
6541 EXPECT_EQ("a << \"line line \"\n"
6542 " \"line\";",
6543 format("a << \"line line line\";",
6544 getLLVMStyleWithColumns(20)));
6545 // In a chain of << with three operands, the second can be broken with no line
6546 // break before it.
6547 EXPECT_EQ("abcde << \"line \"\n"
6548 " \"line line\"\n"
6549 " << c;",
6550 format("abcde << \"line line line\" << c;",
6551 getLLVMStyleWithColumns(20)));
6552 // In a chain of << with three operands, the third must be broken with a line
6553 // break before it.
6554 EXPECT_EQ("a << b\n"
6555 " << \"line line \"\n"
6556 " \"line\";",
6557 format("a << b << \"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 and the third must be broken with a line break before it.
6561 EXPECT_EQ("abcd << \"line line \"\n"
6562 " \"line\"\n"
6563 " << \"line line \"\n"
6564 " \"line\";",
6565 format("abcd << \"line line line\" << \"line line line\";",
6566 getLLVMStyleWithColumns(20)));
6567 // In a chain of binary operators with two operands, the second can be broken
6568 // with no line break before it.
6569 EXPECT_EQ("abcd + \"line line \"\n"
6570 " \"line line\";",
6571 format("abcd + \"line line line line\";",
6572 getLLVMStyleWithColumns(20)));
6573 // In a chain of binary operators with three operands, the second must be
6574 // broken with a line break before it.
6575 EXPECT_EQ("abcd +\n"
6576 " \"line line \"\n"
6577 " \"line line\" +\n"
6578 " e;",
6579 format("abcd + \"line line line line\" + e;",
6580 getLLVMStyleWithColumns(20)));
6581 // In a function call with two operands, with AlignAfterOpenBracket enabled,
6582 // the first must be broken with a line break before it.
6583 FormatStyle Style = getLLVMStyleWithColumns(25);
6584 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
6585 EXPECT_EQ("someFunction(\n"
6586 " \"long long long \"\n"
6587 " \"long\",\n"
6588 " a);",
6589 format("someFunction(\"long long long long\", a);", Style));
6590}
6591
Alexander Kornienko657c67b2013-07-16 21:06:13 +00006592TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006593 EXPECT_EQ(
6594 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6595 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6596 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
6597 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6598 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6599 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
6600}
6601
6602TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
6603 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00006604 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006605 EXPECT_EQ("fffffffffff(g(R\"x(\n"
6606 "multiline raw string literal xxxxxxxxxxxxxx\n"
6607 ")x\",\n"
6608 " a),\n"
6609 " b);",
6610 format("fffffffffff(g(R\"x(\n"
6611 "multiline raw string literal xxxxxxxxxxxxxx\n"
6612 ")x\", a), b);",
6613 getGoogleStyleWithColumns(20)));
6614 EXPECT_EQ("fffffffffff(\n"
6615 " g(R\"x(qqq\n"
6616 "multiline raw string literal xxxxxxxxxxxxxx\n"
6617 ")x\",\n"
6618 " a),\n"
6619 " b);",
6620 format("fffffffffff(g(R\"x(qqq\n"
6621 "multiline raw string literal xxxxxxxxxxxxxx\n"
6622 ")x\", a), b);",
6623 getGoogleStyleWithColumns(20)));
6624
6625 EXPECT_EQ("fffffffffff(R\"x(\n"
6626 "multiline raw string literal xxxxxxxxxxxxxx\n"
6627 ")x\");",
6628 format("fffffffffff(R\"x(\n"
6629 "multiline raw string literal xxxxxxxxxxxxxx\n"
6630 ")x\");",
6631 getGoogleStyleWithColumns(20)));
6632 EXPECT_EQ("fffffffffff(R\"x(\n"
6633 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00006634 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006635 format("fffffffffff(R\"x(\n"
6636 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00006637 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006638 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00006639 EXPECT_EQ("fffffffffff(\n"
6640 " R\"x(\n"
6641 "multiline raw string literal xxxxxxxxxxxxxx\n"
6642 ")x\" +\n"
6643 " bbbbbb);",
6644 format("fffffffffff(\n"
6645 " R\"x(\n"
6646 "multiline raw string literal xxxxxxxxxxxxxx\n"
6647 ")x\" + bbbbbb);",
6648 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00006649}
6650
Alexander Kornienkobe633902013-06-14 11:46:10 +00006651TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00006652 verifyFormat("string a = \"unterminated;");
6653 EXPECT_EQ("function(\"unterminated,\n"
6654 " OtherParameter);",
6655 format("function( \"unterminated,\n"
6656 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00006657}
6658
6659TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006660 FormatStyle Style = getLLVMStyle();
6661 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00006662 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006663 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00006664}
6665
Daniel Jaspera44991332015-04-29 13:06:49 +00006666TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00006667
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00006668TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
6669 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
6670 " \"ddeeefff\");",
6671 format("someFunction(\"aaabbbcccdddeeefff\");",
6672 getLLVMStyleWithColumns(25)));
6673 EXPECT_EQ("someFunction1234567890(\n"
6674 " \"aaabbbcccdddeeefff\");",
6675 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6676 getLLVMStyleWithColumns(26)));
6677 EXPECT_EQ("someFunction1234567890(\n"
6678 " \"aaabbbcccdddeeeff\"\n"
6679 " \"f\");",
6680 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6681 getLLVMStyleWithColumns(25)));
6682 EXPECT_EQ("someFunction1234567890(\n"
6683 " \"aaabbbcccdddeeeff\"\n"
6684 " \"f\");",
6685 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6686 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00006687 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
6688 " \"ddde \"\n"
6689 " \"efff\");",
6690 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00006691 getLLVMStyleWithColumns(25)));
6692 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
6693 " \"ddeeefff\");",
6694 format("someFunction(\"aaabbbccc ddeeefff\");",
6695 getLLVMStyleWithColumns(25)));
6696 EXPECT_EQ("someFunction1234567890(\n"
6697 " \"aaabb \"\n"
6698 " \"cccdddeeefff\");",
6699 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
6700 getLLVMStyleWithColumns(25)));
6701 EXPECT_EQ("#define A \\\n"
6702 " string s = \\\n"
6703 " \"123456789\" \\\n"
6704 " \"0\"; \\\n"
6705 " int i;",
6706 format("#define A string s = \"1234567890\"; int i;",
6707 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00006708 // FIXME: Put additional penalties on breaking at non-whitespace locations.
6709 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
6710 " \"dddeeeff\"\n"
6711 " \"f\");",
6712 format("someFunction(\"aaabbbcc dddeeefff\");",
6713 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00006714}
6715
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006716TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00006717 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
6718 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006719 EXPECT_EQ("\"test\"\n"
6720 "\"\\n\"",
6721 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
6722 EXPECT_EQ("\"tes\\\\\"\n"
6723 "\"n\"",
6724 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
6725 EXPECT_EQ("\"\\\\\\\\\"\n"
6726 "\"\\n\"",
6727 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00006728 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006729 EXPECT_EQ("\"\\uff01\"\n"
6730 "\"test\"",
6731 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
6732 EXPECT_EQ("\"\\Uff01ff02\"",
6733 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
6734 EXPECT_EQ("\"\\x000000000001\"\n"
6735 "\"next\"",
6736 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
6737 EXPECT_EQ("\"\\x000000000001next\"",
6738 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
6739 EXPECT_EQ("\"\\x000000000001\"",
6740 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
6741 EXPECT_EQ("\"test\"\n"
6742 "\"\\000000\"\n"
6743 "\"000001\"",
6744 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
6745 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00006746 "\"00000000\"\n"
6747 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006748 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006749}
6750
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00006751TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
6752 verifyFormat("void f() {\n"
6753 " return g() {}\n"
6754 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006755 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00006756 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00006757 "}");
6758}
6759
Manuel Klimek421147e2014-01-24 09:25:23 +00006760TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
6761 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00006762 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00006763}
6764
Manuel Klimek13b97d82013-05-13 08:42:42 +00006765TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
6766 verifyFormat("class X {\n"
6767 " void f() {\n"
6768 " }\n"
6769 "};",
6770 getLLVMStyleWithColumns(12));
6771}
6772
6773TEST_F(FormatTest, ConfigurableIndentWidth) {
6774 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
6775 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00006776 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00006777 verifyFormat("void f() {\n"
6778 " someFunction();\n"
6779 " if (true) {\n"
6780 " f();\n"
6781 " }\n"
6782 "}",
6783 EightIndent);
6784 verifyFormat("class X {\n"
6785 " void f() {\n"
6786 " }\n"
6787 "};",
6788 EightIndent);
6789 verifyFormat("int x[] = {\n"
6790 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006791 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00006792 EightIndent);
6793}
6794
Alexander Kornienko34a87e82013-06-22 01:35:36 +00006795TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00006796 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00006797 "f();",
6798 getLLVMStyleWithColumns(8));
6799}
6800
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00006801TEST_F(FormatTest, ConfigurableUseOfTab) {
6802 FormatStyle Tab = getLLVMStyleWithColumns(42);
6803 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006804 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00006805 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00006806
6807 EXPECT_EQ("if (aaaaaaaa && // q\n"
6808 " bb)\t\t// w\n"
6809 "\t;",
6810 format("if (aaaaaaaa &&// q\n"
6811 "bb)// w\n"
6812 ";",
6813 Tab));
6814 EXPECT_EQ("if (aaa && bbb) // w\n"
6815 "\t;",
6816 format("if(aaa&&bbb)// w\n"
6817 ";",
6818 Tab));
6819
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00006820 verifyFormat("class X {\n"
6821 "\tvoid f() {\n"
6822 "\t\tsomeFunction(parameter1,\n"
6823 "\t\t\t parameter2);\n"
6824 "\t}\n"
6825 "};",
6826 Tab);
6827 verifyFormat("#define A \\\n"
6828 "\tvoid f() { \\\n"
6829 "\t\tsomeFunction( \\\n"
6830 "\t\t parameter1, \\\n"
6831 "\t\t parameter2); \\\n"
6832 "\t}",
6833 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00006834
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00006835 Tab.TabWidth = 4;
6836 Tab.IndentWidth = 8;
6837 verifyFormat("class TabWidth4Indent8 {\n"
6838 "\t\tvoid f() {\n"
6839 "\t\t\t\tsomeFunction(parameter1,\n"
6840 "\t\t\t\t\t\t\t parameter2);\n"
6841 "\t\t}\n"
6842 "};",
6843 Tab);
6844
6845 Tab.TabWidth = 4;
6846 Tab.IndentWidth = 4;
6847 verifyFormat("class TabWidth4Indent4 {\n"
6848 "\tvoid f() {\n"
6849 "\t\tsomeFunction(parameter1,\n"
6850 "\t\t\t\t\t parameter2);\n"
6851 "\t}\n"
6852 "};",
6853 Tab);
6854
6855 Tab.TabWidth = 8;
6856 Tab.IndentWidth = 4;
6857 verifyFormat("class TabWidth8Indent4 {\n"
6858 " void f() {\n"
6859 "\tsomeFunction(parameter1,\n"
6860 "\t\t parameter2);\n"
6861 " }\n"
6862 "};",
6863 Tab);
6864
Alexander Kornienko39856b72013-09-10 09:38:25 +00006865 Tab.TabWidth = 8;
6866 Tab.IndentWidth = 8;
6867 EXPECT_EQ("/*\n"
6868 "\t a\t\tcomment\n"
6869 "\t in multiple lines\n"
6870 " */",
6871 format(" /*\t \t \n"
6872 " \t \t a\t\tcomment\t \t\n"
6873 " \t \t in multiple lines\t\n"
6874 " \t */",
6875 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00006876
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006877 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00006878 verifyFormat("{\n"
6879 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6880 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6881 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6882 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6883 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6884 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00006885 "};",
6886 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00006887 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00006888 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00006889 "\ta2,\n"
6890 "\ta3\n"
6891 "};",
6892 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006893 EXPECT_EQ("if (aaaaaaaa && // q\n"
6894 " bb) // w\n"
6895 "\t;",
6896 format("if (aaaaaaaa &&// q\n"
6897 "bb)// w\n"
6898 ";",
6899 Tab));
6900 verifyFormat("class X {\n"
6901 "\tvoid f() {\n"
6902 "\t\tsomeFunction(parameter1,\n"
6903 "\t\t parameter2);\n"
6904 "\t}\n"
6905 "};",
6906 Tab);
6907 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00006908 "\tQ(\n"
6909 "\t {\n"
6910 "\t\t int a;\n"
6911 "\t\t someFunction(aaaaaaaa,\n"
6912 "\t\t bbbbbbb);\n"
6913 "\t },\n"
6914 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006915 "}",
6916 Tab);
6917 EXPECT_EQ("{\n"
6918 "\t/* aaaa\n"
6919 "\t bbbb */\n"
6920 "}",
6921 format("{\n"
6922 "/* aaaa\n"
6923 " bbbb */\n"
6924 "}",
6925 Tab));
6926 EXPECT_EQ("{\n"
6927 "\t/*\n"
6928 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6929 "\t bbbbbbbbbbbbb\n"
6930 "\t*/\n"
6931 "}",
6932 format("{\n"
6933 "/*\n"
6934 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
6935 "*/\n"
6936 "}",
6937 Tab));
6938 EXPECT_EQ("{\n"
6939 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6940 "\t// bbbbbbbbbbbbb\n"
6941 "}",
6942 format("{\n"
6943 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
6944 "}",
6945 Tab));
6946 EXPECT_EQ("{\n"
6947 "\t/*\n"
6948 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6949 "\t bbbbbbbbbbbbb\n"
6950 "\t*/\n"
6951 "}",
6952 format("{\n"
6953 "\t/*\n"
6954 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
6955 "\t*/\n"
6956 "}",
6957 Tab));
6958 EXPECT_EQ("{\n"
6959 "\t/*\n"
6960 "\n"
6961 "\t*/\n"
6962 "}",
6963 format("{\n"
6964 "\t/*\n"
6965 "\n"
6966 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00006967 "}",
6968 Tab));
6969 EXPECT_EQ("{\n"
6970 "\t/*\n"
6971 " asdf\n"
6972 "\t*/\n"
6973 "}",
6974 format("{\n"
6975 "\t/*\n"
6976 " asdf\n"
6977 "\t*/\n"
6978 "}",
6979 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006980
6981 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00006982 EXPECT_EQ("/*\n"
6983 " a\t\tcomment\n"
6984 " in multiple lines\n"
6985 " */",
6986 format(" /*\t \t \n"
6987 " \t \t a\t\tcomment\t \t\n"
6988 " \t \t in multiple lines\t\n"
6989 " \t */",
6990 Tab));
6991 EXPECT_EQ("/* some\n"
6992 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00006993 format(" \t \t /* some\n"
6994 " \t \t comment */",
6995 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00006996 EXPECT_EQ("int a; /* some\n"
6997 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00006998 format(" \t \t int a; /* some\n"
6999 " \t \t comment */",
7000 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00007001
Alexander Kornienko39856b72013-09-10 09:38:25 +00007002 EXPECT_EQ("int a; /* some\n"
7003 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007004 format(" \t \t int\ta; /* some\n"
7005 " \t \t comment */",
7006 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00007007 EXPECT_EQ("f(\"\t\t\"); /* some\n"
7008 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007009 format(" \t \t f(\"\t\t\"); /* some\n"
7010 " \t \t comment */",
7011 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00007012 EXPECT_EQ("{\n"
7013 " /*\n"
7014 " * Comment\n"
7015 " */\n"
7016 " int i;\n"
7017 "}",
7018 format("{\n"
7019 "\t/*\n"
7020 "\t * Comment\n"
7021 "\t */\n"
7022 "\t int i;\n"
7023 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00007024
7025 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
7026 Tab.TabWidth = 8;
7027 Tab.IndentWidth = 8;
7028 EXPECT_EQ("if (aaaaaaaa && // q\n"
7029 " bb) // w\n"
7030 "\t;",
7031 format("if (aaaaaaaa &&// q\n"
7032 "bb)// w\n"
7033 ";",
7034 Tab));
7035 EXPECT_EQ("if (aaa && bbb) // w\n"
7036 "\t;",
7037 format("if(aaa&&bbb)// w\n"
7038 ";",
7039 Tab));
7040 verifyFormat("class X {\n"
7041 "\tvoid f() {\n"
7042 "\t\tsomeFunction(parameter1,\n"
7043 "\t\t\t parameter2);\n"
7044 "\t}\n"
7045 "};",
7046 Tab);
7047 verifyFormat("#define A \\\n"
7048 "\tvoid f() { \\\n"
7049 "\t\tsomeFunction( \\\n"
7050 "\t\t parameter1, \\\n"
7051 "\t\t parameter2); \\\n"
7052 "\t}",
7053 Tab);
7054 Tab.TabWidth = 4;
7055 Tab.IndentWidth = 8;
7056 verifyFormat("class TabWidth4Indent8 {\n"
7057 "\t\tvoid f() {\n"
7058 "\t\t\t\tsomeFunction(parameter1,\n"
7059 "\t\t\t\t\t\t\t parameter2);\n"
7060 "\t\t}\n"
7061 "};",
7062 Tab);
7063 Tab.TabWidth = 4;
7064 Tab.IndentWidth = 4;
7065 verifyFormat("class TabWidth4Indent4 {\n"
7066 "\tvoid f() {\n"
7067 "\t\tsomeFunction(parameter1,\n"
7068 "\t\t\t\t\t parameter2);\n"
7069 "\t}\n"
7070 "};",
7071 Tab);
7072 Tab.TabWidth = 8;
7073 Tab.IndentWidth = 4;
7074 verifyFormat("class TabWidth8Indent4 {\n"
7075 " void f() {\n"
7076 "\tsomeFunction(parameter1,\n"
7077 "\t\t parameter2);\n"
7078 " }\n"
7079 "};",
7080 Tab);
7081 Tab.TabWidth = 8;
7082 Tab.IndentWidth = 8;
7083 EXPECT_EQ("/*\n"
7084 "\t a\t\tcomment\n"
7085 "\t in multiple lines\n"
7086 " */",
7087 format(" /*\t \t \n"
7088 " \t \t a\t\tcomment\t \t\n"
7089 " \t \t in multiple lines\t\n"
7090 " \t */",
7091 Tab));
7092 verifyFormat("{\n"
7093 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7094 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7095 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7096 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7097 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7098 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7099 "};",
7100 Tab);
7101 verifyFormat("enum AA {\n"
7102 "\ta1, // Force multiple lines\n"
7103 "\ta2,\n"
7104 "\ta3\n"
7105 "};",
7106 Tab);
7107 EXPECT_EQ("if (aaaaaaaa && // q\n"
7108 " bb) // w\n"
7109 "\t;",
7110 format("if (aaaaaaaa &&// q\n"
7111 "bb)// w\n"
7112 ";",
7113 Tab));
7114 verifyFormat("class X {\n"
7115 "\tvoid f() {\n"
7116 "\t\tsomeFunction(parameter1,\n"
7117 "\t\t\t parameter2);\n"
7118 "\t}\n"
7119 "};",
7120 Tab);
7121 verifyFormat("{\n"
7122 "\tQ(\n"
7123 "\t {\n"
7124 "\t\t int a;\n"
7125 "\t\t someFunction(aaaaaaaa,\n"
7126 "\t\t\t\t bbbbbbb);\n"
7127 "\t },\n"
7128 "\t p);\n"
7129 "}",
7130 Tab);
7131 EXPECT_EQ("{\n"
7132 "\t/* aaaa\n"
7133 "\t bbbb */\n"
7134 "}",
7135 format("{\n"
7136 "/* aaaa\n"
7137 " bbbb */\n"
7138 "}",
7139 Tab));
7140 EXPECT_EQ("{\n"
7141 "\t/*\n"
7142 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7143 "\t bbbbbbbbbbbbb\n"
7144 "\t*/\n"
7145 "}",
7146 format("{\n"
7147 "/*\n"
7148 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7149 "*/\n"
7150 "}",
7151 Tab));
7152 EXPECT_EQ("{\n"
7153 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7154 "\t// bbbbbbbbbbbbb\n"
7155 "}",
7156 format("{\n"
7157 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7158 "}",
7159 Tab));
7160 EXPECT_EQ("{\n"
7161 "\t/*\n"
7162 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7163 "\t bbbbbbbbbbbbb\n"
7164 "\t*/\n"
7165 "}",
7166 format("{\n"
7167 "\t/*\n"
7168 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7169 "\t*/\n"
7170 "}",
7171 Tab));
7172 EXPECT_EQ("{\n"
7173 "\t/*\n"
7174 "\n"
7175 "\t*/\n"
7176 "}",
7177 format("{\n"
7178 "\t/*\n"
7179 "\n"
7180 "\t*/\n"
7181 "}",
7182 Tab));
7183 EXPECT_EQ("{\n"
7184 "\t/*\n"
7185 " asdf\n"
7186 "\t*/\n"
7187 "}",
7188 format("{\n"
7189 "\t/*\n"
7190 " asdf\n"
7191 "\t*/\n"
7192 "}",
7193 Tab));
7194 EXPECT_EQ("/*\n"
7195 "\t a\t\tcomment\n"
7196 "\t in multiple lines\n"
7197 " */",
7198 format(" /*\t \t \n"
7199 " \t \t a\t\tcomment\t \t\n"
7200 " \t \t in multiple lines\t\n"
7201 " \t */",
7202 Tab));
7203 EXPECT_EQ("/* some\n"
7204 " comment */",
7205 format(" \t \t /* some\n"
7206 " \t \t comment */",
7207 Tab));
7208 EXPECT_EQ("int a; /* some\n"
7209 " comment */",
7210 format(" \t \t int a; /* some\n"
7211 " \t \t comment */",
7212 Tab));
7213 EXPECT_EQ("int a; /* some\n"
7214 "comment */",
7215 format(" \t \t int\ta; /* some\n"
7216 " \t \t comment */",
7217 Tab));
7218 EXPECT_EQ("f(\"\t\t\"); /* some\n"
7219 " comment */",
7220 format(" \t \t f(\"\t\t\"); /* some\n"
7221 " \t \t comment */",
7222 Tab));
7223 EXPECT_EQ("{\n"
7224 " /*\n"
7225 " * Comment\n"
7226 " */\n"
7227 " int i;\n"
7228 "}",
7229 format("{\n"
7230 "\t/*\n"
7231 "\t * Comment\n"
7232 "\t */\n"
7233 "\t int i;\n"
7234 "}"));
7235 Tab.AlignConsecutiveAssignments = true;
7236 Tab.AlignConsecutiveDeclarations = true;
7237 Tab.TabWidth = 4;
7238 Tab.IndentWidth = 4;
7239 verifyFormat("class Assign {\n"
7240 "\tvoid f() {\n"
7241 "\t\tint x = 123;\n"
7242 "\t\tint random = 4;\n"
7243 "\t\tstd::string alphabet =\n"
7244 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
7245 "\t}\n"
7246 "};",
7247 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007248}
7249
Alexander Kornienko917f9e02013-09-10 12:29:48 +00007250TEST_F(FormatTest, CalculatesOriginalColumn) {
7251 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7252 "q\"; /* some\n"
7253 " comment */",
7254 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7255 "q\"; /* some\n"
7256 " comment */",
7257 getLLVMStyle()));
7258 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
7259 "/* some\n"
7260 " comment */",
7261 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
7262 " /* some\n"
7263 " comment */",
7264 getLLVMStyle()));
7265 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7266 "qqq\n"
7267 "/* some\n"
7268 " comment */",
7269 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7270 "qqq\n"
7271 " /* some\n"
7272 " comment */",
7273 getLLVMStyle()));
7274 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7275 "wwww; /* some\n"
7276 " comment */",
7277 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7278 "wwww; /* some\n"
7279 " comment */",
7280 getLLVMStyle()));
7281}
7282
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007283TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00007284 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007285 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00007286
7287 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007288 " continue;",
7289 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007290 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007291 " continue;",
7292 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007293 verifyFormat("if(true)\n"
7294 " f();\n"
7295 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007296 " f();",
7297 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007298 verifyFormat("do {\n"
7299 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007300 "} while(something());",
7301 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007302 verifyFormat("switch(x) {\n"
7303 "default:\n"
7304 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007305 "}",
7306 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00007307 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00007308 verifyFormat("size_t x = sizeof(x);", NoSpace);
7309 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
7310 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
7311 verifyFormat("alignas(128) char a[128];", NoSpace);
7312 verifyFormat("size_t x = alignof(MyType);", NoSpace);
7313 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
7314 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00007315 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00007316 verifyFormat("T A::operator()();", NoSpace);
7317 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007318
7319 FormatStyle Space = getLLVMStyle();
7320 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
7321
7322 verifyFormat("int f ();", Space);
7323 verifyFormat("void f (int a, T b) {\n"
7324 " while (true)\n"
7325 " continue;\n"
7326 "}",
7327 Space);
7328 verifyFormat("if (true)\n"
7329 " f ();\n"
7330 "else if (true)\n"
7331 " f ();",
7332 Space);
7333 verifyFormat("do {\n"
7334 " do_something ();\n"
7335 "} while (something ());",
7336 Space);
7337 verifyFormat("switch (x) {\n"
7338 "default:\n"
7339 " break;\n"
7340 "}",
7341 Space);
7342 verifyFormat("A::A () : a (1) {}", Space);
7343 verifyFormat("void f () __attribute__ ((asdf));", Space);
7344 verifyFormat("*(&a + 1);\n"
7345 "&((&a)[1]);\n"
7346 "a[(b + c) * d];\n"
7347 "(((a + 1) * 2) + 3) * 4;",
7348 Space);
7349 verifyFormat("#define A(x) x", Space);
7350 verifyFormat("#define A (x) x", Space);
7351 verifyFormat("#if defined(x)\n"
7352 "#endif",
7353 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00007354 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00007355 verifyFormat("size_t x = sizeof (x);", Space);
7356 verifyFormat("auto f (int x) -> decltype (x);", Space);
7357 verifyFormat("int f (T x) noexcept (x.create ());", Space);
7358 verifyFormat("alignas (128) char a[128];", Space);
7359 verifyFormat("size_t x = alignof (MyType);", Space);
7360 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
7361 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00007362 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00007363 verifyFormat("T A::operator() ();", Space);
7364 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007365}
7366
7367TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
7368 FormatStyle Spaces = getLLVMStyle();
7369
7370 Spaces.SpacesInParentheses = true;
7371 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007372 verifyFormat("call();", Spaces);
7373 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00007374 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
7375 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007376 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007377 " continue;",
7378 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007379 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007380 " continue;",
7381 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007382 verifyFormat("if ( true )\n"
7383 " f();\n"
7384 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007385 " f();",
7386 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007387 verifyFormat("do {\n"
7388 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007389 "} while ( something() );",
7390 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007391 verifyFormat("switch ( x ) {\n"
7392 "default:\n"
7393 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007394 "}",
7395 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007396
7397 Spaces.SpacesInParentheses = false;
7398 Spaces.SpacesInCStyleCastParentheses = true;
7399 verifyFormat("Type *A = ( Type * )P;", Spaces);
7400 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
7401 verifyFormat("x = ( int32 )y;", Spaces);
7402 verifyFormat("int a = ( int )(2.0f);", Spaces);
7403 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
7404 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
7405 verifyFormat("#define x (( int )-1)", Spaces);
7406
Daniel Jasper92e09822015-03-18 12:59:19 +00007407 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00007408 Spaces.SpacesInParentheses = false;
7409 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00007410 Spaces.SpacesInCStyleCastParentheses = true;
7411 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007412 verifyFormat("call( );", Spaces);
7413 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007414 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007415 " continue;",
7416 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007417 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007418 " continue;",
7419 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007420 verifyFormat("if (true)\n"
7421 " f( );\n"
7422 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007423 " f( );",
7424 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007425 verifyFormat("do {\n"
7426 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007427 "} while (something( ));",
7428 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007429 verifyFormat("switch (x) {\n"
7430 "default:\n"
7431 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007432 "}",
7433 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007434
Daniel Jasper92e09822015-03-18 12:59:19 +00007435 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007436 Spaces.SpaceAfterCStyleCast = true;
7437 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007438 verifyFormat("call( );", Spaces);
7439 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007440 verifyFormat("while (( bool ) 1)\n"
7441 " continue;",
7442 Spaces);
7443 verifyFormat("for (;;)\n"
7444 " continue;",
7445 Spaces);
7446 verifyFormat("if (true)\n"
7447 " f( );\n"
7448 "else if (true)\n"
7449 " f( );",
7450 Spaces);
7451 verifyFormat("do {\n"
7452 " do_something(( int ) i);\n"
7453 "} while (something( ));",
7454 Spaces);
7455 verifyFormat("switch (x) {\n"
7456 "default:\n"
7457 " break;\n"
7458 "}",
7459 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007460
7461 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007462 Spaces.SpacesInCStyleCastParentheses = false;
7463 Spaces.SpaceAfterCStyleCast = true;
7464 verifyFormat("while ((bool) 1)\n"
7465 " continue;",
7466 Spaces);
7467 verifyFormat("do {\n"
7468 " do_something((int) i);\n"
7469 "} while (something( ));",
7470 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007471}
7472
Daniel Jasperad981f82014-08-26 11:41:14 +00007473TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
7474 verifyFormat("int a[5];");
7475 verifyFormat("a[3] += 42;");
7476
7477 FormatStyle Spaces = getLLVMStyle();
7478 Spaces.SpacesInSquareBrackets = true;
7479 // Lambdas unchanged.
7480 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
7481 verifyFormat("return [i, args...] {};", Spaces);
7482
7483 // Not lambdas.
7484 verifyFormat("int a[ 5 ];", Spaces);
7485 verifyFormat("a[ 3 ] += 42;", Spaces);
7486 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
7487 verifyFormat("double &operator[](int i) { return 0; }\n"
7488 "int i;",
7489 Spaces);
7490 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
7491 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
7492 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
7493}
7494
Daniel Jasperd94bff32013-09-25 15:15:02 +00007495TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
7496 verifyFormat("int a = 5;");
7497 verifyFormat("a += 42;");
7498 verifyFormat("a or_eq 8;");
7499
7500 FormatStyle Spaces = getLLVMStyle();
7501 Spaces.SpaceBeforeAssignmentOperators = false;
7502 verifyFormat("int a= 5;", Spaces);
7503 verifyFormat("a+= 42;", Spaces);
7504 verifyFormat("a or_eq 8;", Spaces);
7505}
7506
Daniel Jaspera44991332015-04-29 13:06:49 +00007507TEST_F(FormatTest, AlignConsecutiveAssignments) {
7508 FormatStyle Alignment = getLLVMStyle();
7509 Alignment.AlignConsecutiveAssignments = false;
7510 verifyFormat("int a = 5;\n"
7511 "int oneTwoThree = 123;",
7512 Alignment);
7513 verifyFormat("int a = 5;\n"
7514 "int oneTwoThree = 123;",
7515 Alignment);
7516
7517 Alignment.AlignConsecutiveAssignments = true;
7518 verifyFormat("int a = 5;\n"
7519 "int oneTwoThree = 123;",
7520 Alignment);
7521 verifyFormat("int a = method();\n"
7522 "int oneTwoThree = 133;",
7523 Alignment);
7524 verifyFormat("a &= 5;\n"
7525 "bcd *= 5;\n"
7526 "ghtyf += 5;\n"
7527 "dvfvdb -= 5;\n"
7528 "a /= 5;\n"
7529 "vdsvsv %= 5;\n"
7530 "sfdbddfbdfbb ^= 5;\n"
7531 "dvsdsv |= 5;\n"
7532 "int dsvvdvsdvvv = 123;",
7533 Alignment);
7534 verifyFormat("int i = 1, j = 10;\n"
7535 "something = 2000;",
7536 Alignment);
7537 verifyFormat("something = 2000;\n"
7538 "int i = 1, j = 10;\n",
7539 Alignment);
7540 verifyFormat("something = 2000;\n"
7541 "another = 911;\n"
7542 "int i = 1, j = 10;\n"
7543 "oneMore = 1;\n"
7544 "i = 2;",
7545 Alignment);
7546 verifyFormat("int a = 5;\n"
7547 "int one = 1;\n"
7548 "method();\n"
7549 "int oneTwoThree = 123;\n"
7550 "int oneTwo = 12;",
7551 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00007552 verifyFormat("int oneTwoThree = 123;\n"
7553 "int oneTwo = 12;\n"
7554 "method();\n",
7555 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00007556 verifyFormat("int oneTwoThree = 123; // comment\n"
7557 "int oneTwo = 12; // comment",
7558 Alignment);
7559 EXPECT_EQ("int a = 5;\n"
7560 "\n"
7561 "int oneTwoThree = 123;",
7562 format("int a = 5;\n"
7563 "\n"
7564 "int oneTwoThree= 123;",
7565 Alignment));
7566 EXPECT_EQ("int a = 5;\n"
7567 "int one = 1;\n"
7568 "\n"
7569 "int oneTwoThree = 123;",
7570 format("int a = 5;\n"
7571 "int one = 1;\n"
7572 "\n"
7573 "int oneTwoThree = 123;",
7574 Alignment));
7575 EXPECT_EQ("int a = 5;\n"
7576 "int one = 1;\n"
7577 "\n"
7578 "int oneTwoThree = 123;\n"
7579 "int oneTwo = 12;",
7580 format("int a = 5;\n"
7581 "int one = 1;\n"
7582 "\n"
7583 "int oneTwoThree = 123;\n"
7584 "int oneTwo = 12;",
7585 Alignment));
7586 Alignment.AlignEscapedNewlinesLeft = true;
7587 verifyFormat("#define A \\\n"
7588 " int aaaa = 12; \\\n"
7589 " int b = 23; \\\n"
7590 " int ccc = 234; \\\n"
7591 " int dddddddddd = 2345;",
7592 Alignment);
7593 Alignment.AlignEscapedNewlinesLeft = false;
7594 verifyFormat("#define A "
7595 " \\\n"
7596 " int aaaa = 12; "
7597 " \\\n"
7598 " int b = 23; "
7599 " \\\n"
7600 " int ccc = 234; "
7601 " \\\n"
7602 " int dddddddddd = 2345;",
7603 Alignment);
7604 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
7605 "k = 4, int l = 5,\n"
7606 " int m = 6) {\n"
7607 " int j = 10;\n"
7608 " otherThing = 1;\n"
7609 "}",
7610 Alignment);
7611 verifyFormat("void SomeFunction(int parameter = 0) {\n"
7612 " int i = 1;\n"
7613 " int j = 2;\n"
7614 " int big = 10000;\n"
7615 "}",
7616 Alignment);
7617 verifyFormat("class C {\n"
7618 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00007619 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007620 " virtual void f() = 0;\n"
7621 "};",
7622 Alignment);
7623 verifyFormat("int i = 1;\n"
7624 "if (SomeType t = getSomething()) {\n"
7625 "}\n"
7626 "int j = 2;\n"
7627 "int big = 10000;",
7628 Alignment);
7629 verifyFormat("int j = 7;\n"
7630 "for (int k = 0; k < N; ++k) {\n"
7631 "}\n"
7632 "int j = 2;\n"
7633 "int big = 10000;\n"
7634 "}",
7635 Alignment);
7636 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7637 verifyFormat("int i = 1;\n"
7638 "LooooooooooongType loooooooooooooooooooooongVariable\n"
7639 " = someLooooooooooooooooongFunction();\n"
7640 "int j = 2;",
7641 Alignment);
7642 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7643 verifyFormat("int i = 1;\n"
7644 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
7645 " someLooooooooooooooooongFunction();\n"
7646 "int j = 2;",
7647 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00007648
7649 verifyFormat("auto lambda = []() {\n"
7650 " auto i = 0;\n"
7651 " return 0;\n"
7652 "};\n"
7653 "int i = 0;\n"
7654 "auto v = type{\n"
7655 " i = 1, //\n"
7656 " (i = 2), //\n"
7657 " i = 3 //\n"
7658 "};",
7659 Alignment);
7660
Daniel Jaspera44991332015-04-29 13:06:49 +00007661 // FIXME: Should align all three assignments
7662 verifyFormat(
7663 "int i = 1;\n"
7664 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
7665 " loooooooooooooooooooooongParameterB);\n"
7666 "int j = 2;",
7667 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00007668
7669 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
7670 " typename B = very_long_type_name_1,\n"
7671 " typename T_2 = very_long_type_name_2>\n"
7672 "auto foo() {}\n",
7673 Alignment);
7674 verifyFormat("int a, b = 1;\n"
7675 "int c = 2;\n"
7676 "int dd = 3;\n",
7677 Alignment);
7678 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
7679 "float b[1][] = {{3.f}};\n",
7680 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00007681}
7682
Daniel Jaspere12597c2015-10-01 10:06:54 +00007683TEST_F(FormatTest, AlignConsecutiveDeclarations) {
7684 FormatStyle Alignment = getLLVMStyle();
7685 Alignment.AlignConsecutiveDeclarations = false;
7686 verifyFormat("float const a = 5;\n"
7687 "int oneTwoThree = 123;",
7688 Alignment);
7689 verifyFormat("int a = 5;\n"
7690 "float const oneTwoThree = 123;",
7691 Alignment);
7692
7693 Alignment.AlignConsecutiveDeclarations = true;
7694 verifyFormat("float const a = 5;\n"
7695 "int oneTwoThree = 123;",
7696 Alignment);
7697 verifyFormat("int a = method();\n"
7698 "float const oneTwoThree = 133;",
7699 Alignment);
7700 verifyFormat("int i = 1, j = 10;\n"
7701 "something = 2000;",
7702 Alignment);
7703 verifyFormat("something = 2000;\n"
7704 "int i = 1, j = 10;\n",
7705 Alignment);
7706 verifyFormat("float something = 2000;\n"
7707 "double another = 911;\n"
7708 "int i = 1, j = 10;\n"
7709 "const int *oneMore = 1;\n"
7710 "unsigned i = 2;",
7711 Alignment);
7712 verifyFormat("float a = 5;\n"
7713 "int one = 1;\n"
7714 "method();\n"
7715 "const double oneTwoThree = 123;\n"
7716 "const unsigned int oneTwo = 12;",
7717 Alignment);
7718 verifyFormat("int oneTwoThree{0}; // comment\n"
7719 "unsigned oneTwo; // comment",
7720 Alignment);
7721 EXPECT_EQ("float const a = 5;\n"
7722 "\n"
7723 "int oneTwoThree = 123;",
7724 format("float const a = 5;\n"
7725 "\n"
7726 "int oneTwoThree= 123;",
7727 Alignment));
7728 EXPECT_EQ("float a = 5;\n"
7729 "int one = 1;\n"
7730 "\n"
7731 "unsigned oneTwoThree = 123;",
7732 format("float a = 5;\n"
7733 "int one = 1;\n"
7734 "\n"
7735 "unsigned oneTwoThree = 123;",
7736 Alignment));
7737 EXPECT_EQ("float a = 5;\n"
7738 "int one = 1;\n"
7739 "\n"
7740 "unsigned oneTwoThree = 123;\n"
7741 "int oneTwo = 12;",
7742 format("float a = 5;\n"
7743 "int one = 1;\n"
7744 "\n"
7745 "unsigned oneTwoThree = 123;\n"
7746 "int oneTwo = 12;",
7747 Alignment));
7748 Alignment.AlignConsecutiveAssignments = true;
7749 verifyFormat("float something = 2000;\n"
7750 "double another = 911;\n"
7751 "int i = 1, j = 10;\n"
7752 "const int *oneMore = 1;\n"
7753 "unsigned i = 2;",
7754 Alignment);
7755 verifyFormat("int oneTwoThree = {0}; // comment\n"
7756 "unsigned oneTwo = 0; // comment",
7757 Alignment);
7758 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
7759 " int const i = 1;\n"
7760 " int * j = 2;\n"
7761 " int big = 10000;\n"
7762 "\n"
7763 " unsigned oneTwoThree = 123;\n"
7764 " int oneTwo = 12;\n"
7765 " method();\n"
7766 " float k = 2;\n"
7767 " int ll = 10000;\n"
7768 "}",
7769 format("void SomeFunction(int parameter= 0) {\n"
7770 " int const i= 1;\n"
7771 " int *j=2;\n"
7772 " int big = 10000;\n"
7773 "\n"
7774 "unsigned oneTwoThree =123;\n"
7775 "int oneTwo = 12;\n"
7776 " method();\n"
7777 "float k= 2;\n"
7778 "int ll=10000;\n"
7779 "}",
7780 Alignment));
7781 Alignment.AlignConsecutiveAssignments = false;
7782 Alignment.AlignEscapedNewlinesLeft = true;
7783 verifyFormat("#define A \\\n"
7784 " int aaaa = 12; \\\n"
7785 " float b = 23; \\\n"
7786 " const int ccc = 234; \\\n"
7787 " unsigned dddddddddd = 2345;",
7788 Alignment);
7789 Alignment.AlignEscapedNewlinesLeft = false;
7790 Alignment.ColumnLimit = 30;
7791 verifyFormat("#define A \\\n"
7792 " int aaaa = 12; \\\n"
7793 " float b = 23; \\\n"
7794 " const int ccc = 234; \\\n"
7795 " int dddddddddd = 2345;",
7796 Alignment);
7797 Alignment.ColumnLimit = 80;
7798 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
7799 "k = 4, int l = 5,\n"
7800 " int m = 6) {\n"
7801 " const int j = 10;\n"
7802 " otherThing = 1;\n"
7803 "}",
7804 Alignment);
7805 verifyFormat("void SomeFunction(int parameter = 0) {\n"
7806 " int const i = 1;\n"
7807 " int * j = 2;\n"
7808 " int big = 10000;\n"
7809 "}",
7810 Alignment);
7811 verifyFormat("class C {\n"
7812 "public:\n"
7813 " int i = 1;\n"
7814 " virtual void f() = 0;\n"
7815 "};",
7816 Alignment);
7817 verifyFormat("float i = 1;\n"
7818 "if (SomeType t = getSomething()) {\n"
7819 "}\n"
7820 "const unsigned j = 2;\n"
7821 "int big = 10000;",
7822 Alignment);
7823 verifyFormat("float j = 7;\n"
7824 "for (int k = 0; k < N; ++k) {\n"
7825 "}\n"
7826 "unsigned j = 2;\n"
7827 "int big = 10000;\n"
7828 "}",
7829 Alignment);
7830 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7831 verifyFormat("float i = 1;\n"
7832 "LooooooooooongType loooooooooooooooooooooongVariable\n"
7833 " = someLooooooooooooooooongFunction();\n"
7834 "int j = 2;",
7835 Alignment);
7836 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7837 verifyFormat("int i = 1;\n"
7838 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
7839 " someLooooooooooooooooongFunction();\n"
7840 "int j = 2;",
7841 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00007842
7843 Alignment.AlignConsecutiveAssignments = true;
7844 verifyFormat("auto lambda = []() {\n"
7845 " auto ii = 0;\n"
7846 " float j = 0;\n"
7847 " return 0;\n"
7848 "};\n"
7849 "int i = 0;\n"
7850 "float i2 = 0;\n"
7851 "auto v = type{\n"
7852 " i = 1, //\n"
7853 " (i = 2), //\n"
7854 " i = 3 //\n"
7855 "};",
7856 Alignment);
7857 Alignment.AlignConsecutiveAssignments = false;
7858
Daniel Jaspere12597c2015-10-01 10:06:54 +00007859 // FIXME: Should align all three declarations
7860 verifyFormat(
7861 "int i = 1;\n"
7862 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
7863 " loooooooooooooooooooooongParameterB);\n"
7864 "int j = 2;",
7865 Alignment);
7866
7867 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
7868 // We expect declarations and assignments to align, as long as it doesn't
7869 // exceed the column limit, starting a new alignemnt sequence whenever it
7870 // happens.
7871 Alignment.AlignConsecutiveAssignments = true;
7872 Alignment.ColumnLimit = 30;
7873 verifyFormat("float ii = 1;\n"
7874 "unsigned j = 2;\n"
7875 "int someVerylongVariable = 1;\n"
7876 "AnotherLongType ll = 123456;\n"
7877 "VeryVeryLongType k = 2;\n"
7878 "int myvar = 1;",
7879 Alignment);
7880 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00007881 Alignment.AlignConsecutiveAssignments = false;
7882
7883 verifyFormat(
7884 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
7885 " typename LongType, typename B>\n"
7886 "auto foo() {}\n",
7887 Alignment);
7888 verifyFormat("float a, b = 1;\n"
7889 "int c = 2;\n"
7890 "int dd = 3;\n",
7891 Alignment);
7892 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
7893 "float b[1][] = {{3.f}};\n",
7894 Alignment);
7895 Alignment.AlignConsecutiveAssignments = true;
7896 verifyFormat("float a, b = 1;\n"
7897 "int c = 2;\n"
7898 "int dd = 3;\n",
7899 Alignment);
7900 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
7901 "float b[1][] = {{3.f}};\n",
7902 Alignment);
7903 Alignment.AlignConsecutiveAssignments = false;
7904
7905 Alignment.ColumnLimit = 30;
7906 Alignment.BinPackParameters = false;
7907 verifyFormat("void foo(float a,\n"
7908 " float b,\n"
7909 " int c,\n"
7910 " uint32_t *d) {\n"
7911 " int * e = 0;\n"
7912 " float f = 0;\n"
7913 " double g = 0;\n"
7914 "}\n"
7915 "void bar(ino_t a,\n"
7916 " int b,\n"
7917 " uint32_t *c,\n"
7918 " bool d) {}\n",
7919 Alignment);
7920 Alignment.BinPackParameters = true;
7921 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00007922}
7923
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007924TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007925 FormatStyle LinuxBraceStyle = getLLVMStyle();
7926 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007927 verifyFormat("namespace a\n"
7928 "{\n"
7929 "class A\n"
7930 "{\n"
7931 " void f()\n"
7932 " {\n"
7933 " if (true) {\n"
7934 " a();\n"
7935 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00007936 " } else {\n"
7937 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007938 " }\n"
7939 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007940 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007941 "};\n"
7942 "struct B {\n"
7943 " int x;\n"
7944 "};\n"
7945 "}\n",
7946 LinuxBraceStyle);
7947 verifyFormat("enum X {\n"
7948 " Y = 0,\n"
7949 "}\n",
7950 LinuxBraceStyle);
7951 verifyFormat("struct S {\n"
7952 " int Type;\n"
7953 " union {\n"
7954 " int x;\n"
7955 " double y;\n"
7956 " } Value;\n"
7957 " class C\n"
7958 " {\n"
7959 " MyFavoriteType Value;\n"
7960 " } Class;\n"
7961 "}\n",
7962 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007963}
7964
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00007965TEST_F(FormatTest, MozillaBraceBreaking) {
7966 FormatStyle MozillaBraceStyle = getLLVMStyle();
7967 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00007968 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00007969 verifyFormat("namespace a {\n"
7970 "class A\n"
7971 "{\n"
7972 " void f()\n"
7973 " {\n"
7974 " if (true) {\n"
7975 " a();\n"
7976 " b();\n"
7977 " }\n"
7978 " }\n"
7979 " void g() { return; }\n"
7980 "};\n"
7981 "enum E\n"
7982 "{\n"
7983 " A,\n"
7984 " // foo\n"
7985 " B,\n"
7986 " C\n"
7987 "};\n"
7988 "struct B\n"
7989 "{\n"
7990 " int x;\n"
7991 "};\n"
7992 "}\n",
7993 MozillaBraceStyle);
7994 verifyFormat("struct S\n"
7995 "{\n"
7996 " int Type;\n"
7997 " union\n"
7998 " {\n"
7999 " int x;\n"
8000 " double y;\n"
8001 " } Value;\n"
8002 " class C\n"
8003 " {\n"
8004 " MyFavoriteType Value;\n"
8005 " } Class;\n"
8006 "}\n",
8007 MozillaBraceStyle);
8008}
8009
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008010TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008011 FormatStyle StroustrupBraceStyle = getLLVMStyle();
8012 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008013 verifyFormat("namespace a {\n"
8014 "class A {\n"
8015 " void f()\n"
8016 " {\n"
8017 " if (true) {\n"
8018 " a();\n"
8019 " b();\n"
8020 " }\n"
8021 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008022 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008023 "};\n"
8024 "struct B {\n"
8025 " int x;\n"
8026 "};\n"
Krasimir Georgiev9163fe22017-03-02 09:54:44 +00008027 "} // namespace a\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008028 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008029
Daniel Jasperd9670872014-08-05 12:06:20 +00008030 verifyFormat("void foo()\n"
8031 "{\n"
8032 " if (a) {\n"
8033 " a();\n"
8034 " }\n"
8035 " else {\n"
8036 " b();\n"
8037 " }\n"
8038 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008039 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00008040
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008041 verifyFormat("#ifdef _DEBUG\n"
8042 "int foo(int i = 0)\n"
8043 "#else\n"
8044 "int foo(int i = 5)\n"
8045 "#endif\n"
8046 "{\n"
8047 " return i;\n"
8048 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008049 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008050
8051 verifyFormat("void foo() {}\n"
8052 "void bar()\n"
8053 "#ifdef _DEBUG\n"
8054 "{\n"
8055 " foo();\n"
8056 "}\n"
8057 "#else\n"
8058 "{\n"
8059 "}\n"
8060 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008061 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008062
8063 verifyFormat("void foobar() { int i = 5; }\n"
8064 "#ifdef _DEBUG\n"
8065 "void bar() {}\n"
8066 "#else\n"
8067 "void bar() { foobar(); }\n"
8068 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008069 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008070}
8071
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008072TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008073 FormatStyle AllmanBraceStyle = getLLVMStyle();
8074 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008075 verifyFormat("namespace a\n"
8076 "{\n"
8077 "class A\n"
8078 "{\n"
8079 " void f()\n"
8080 " {\n"
8081 " if (true)\n"
8082 " {\n"
8083 " a();\n"
8084 " b();\n"
8085 " }\n"
8086 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008087 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008088 "};\n"
8089 "struct B\n"
8090 "{\n"
8091 " int x;\n"
8092 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008093 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008094 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008095
8096 verifyFormat("void f()\n"
8097 "{\n"
8098 " if (true)\n"
8099 " {\n"
8100 " a();\n"
8101 " }\n"
8102 " else if (false)\n"
8103 " {\n"
8104 " b();\n"
8105 " }\n"
8106 " else\n"
8107 " {\n"
8108 " c();\n"
8109 " }\n"
8110 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008111 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008112
8113 verifyFormat("void f()\n"
8114 "{\n"
8115 " for (int i = 0; i < 10; ++i)\n"
8116 " {\n"
8117 " a();\n"
8118 " }\n"
8119 " while (false)\n"
8120 " {\n"
8121 " b();\n"
8122 " }\n"
8123 " do\n"
8124 " {\n"
8125 " c();\n"
8126 " } while (false)\n"
8127 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008128 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008129
8130 verifyFormat("void f(int a)\n"
8131 "{\n"
8132 " switch (a)\n"
8133 " {\n"
8134 " case 0:\n"
8135 " break;\n"
8136 " case 1:\n"
8137 " {\n"
8138 " break;\n"
8139 " }\n"
8140 " case 2:\n"
8141 " {\n"
8142 " }\n"
8143 " break;\n"
8144 " default:\n"
8145 " break;\n"
8146 " }\n"
8147 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008148 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00008149
8150 verifyFormat("enum X\n"
8151 "{\n"
8152 " Y = 0,\n"
8153 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008154 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00008155 verifyFormat("enum X\n"
8156 "{\n"
8157 " Y = 0\n"
8158 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008159 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00008160
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008161 verifyFormat("@interface BSApplicationController ()\n"
8162 "{\n"
8163 "@private\n"
8164 " id _extraIvar;\n"
8165 "}\n"
8166 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008167 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008168
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008169 verifyFormat("#ifdef _DEBUG\n"
8170 "int foo(int i = 0)\n"
8171 "#else\n"
8172 "int foo(int i = 5)\n"
8173 "#endif\n"
8174 "{\n"
8175 " return i;\n"
8176 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008177 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008178
8179 verifyFormat("void foo() {}\n"
8180 "void bar()\n"
8181 "#ifdef _DEBUG\n"
8182 "{\n"
8183 " foo();\n"
8184 "}\n"
8185 "#else\n"
8186 "{\n"
8187 "}\n"
8188 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008189 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008190
8191 verifyFormat("void foobar() { int i = 5; }\n"
8192 "#ifdef _DEBUG\n"
8193 "void bar() {}\n"
8194 "#else\n"
8195 "void bar() { foobar(); }\n"
8196 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008197 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008198
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008199 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008200 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00008201 " // ...\n"
8202 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008203 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008204 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008205 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00008206 " // ...\n"
8207 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008208 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008209 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008210 // .. or dict literals.
8211 verifyFormat("void f()\n"
8212 "{\n"
8213 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
8214 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008215 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00008216 verifyFormat("int f()\n"
8217 "{ // comment\n"
8218 " return 42;\n"
8219 "}",
8220 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008221
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008222 AllmanBraceStyle.ColumnLimit = 19;
8223 verifyFormat("void f() { int i; }", AllmanBraceStyle);
8224 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00008225 verifyFormat("void f()\n"
8226 "{\n"
8227 " int i;\n"
8228 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008229 AllmanBraceStyle);
8230 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00008231
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008232 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00008233 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
8234 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
8235 verifyFormat("void f(bool b)\n"
8236 "{\n"
8237 " if (b)\n"
8238 " {\n"
8239 " return;\n"
8240 " }\n"
8241 "}\n",
8242 BreakBeforeBraceShortIfs);
8243 verifyFormat("void f(bool b)\n"
8244 "{\n"
8245 " if (b) return;\n"
8246 "}\n",
8247 BreakBeforeBraceShortIfs);
8248 verifyFormat("void f(bool b)\n"
8249 "{\n"
8250 " while (b)\n"
8251 " {\n"
8252 " return;\n"
8253 " }\n"
8254 "}\n",
8255 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008256}
8257
Alexander Kornienko3a33f022013-12-12 09:49:52 +00008258TEST_F(FormatTest, GNUBraceBreaking) {
8259 FormatStyle GNUBraceStyle = getLLVMStyle();
8260 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
8261 verifyFormat("namespace a\n"
8262 "{\n"
8263 "class A\n"
8264 "{\n"
8265 " void f()\n"
8266 " {\n"
8267 " int a;\n"
8268 " {\n"
8269 " int b;\n"
8270 " }\n"
8271 " if (true)\n"
8272 " {\n"
8273 " a();\n"
8274 " b();\n"
8275 " }\n"
8276 " }\n"
8277 " void g() { return; }\n"
8278 "}\n"
8279 "}",
8280 GNUBraceStyle);
8281
8282 verifyFormat("void f()\n"
8283 "{\n"
8284 " if (true)\n"
8285 " {\n"
8286 " a();\n"
8287 " }\n"
8288 " else if (false)\n"
8289 " {\n"
8290 " b();\n"
8291 " }\n"
8292 " else\n"
8293 " {\n"
8294 " c();\n"
8295 " }\n"
8296 "}\n",
8297 GNUBraceStyle);
8298
8299 verifyFormat("void f()\n"
8300 "{\n"
8301 " for (int i = 0; i < 10; ++i)\n"
8302 " {\n"
8303 " a();\n"
8304 " }\n"
8305 " while (false)\n"
8306 " {\n"
8307 " b();\n"
8308 " }\n"
8309 " do\n"
8310 " {\n"
8311 " c();\n"
8312 " }\n"
8313 " while (false);\n"
8314 "}\n",
8315 GNUBraceStyle);
8316
8317 verifyFormat("void f(int a)\n"
8318 "{\n"
8319 " switch (a)\n"
8320 " {\n"
8321 " case 0:\n"
8322 " break;\n"
8323 " case 1:\n"
8324 " {\n"
8325 " break;\n"
8326 " }\n"
8327 " case 2:\n"
8328 " {\n"
8329 " }\n"
8330 " break;\n"
8331 " default:\n"
8332 " break;\n"
8333 " }\n"
8334 "}\n",
8335 GNUBraceStyle);
8336
8337 verifyFormat("enum X\n"
8338 "{\n"
8339 " Y = 0,\n"
8340 "}\n",
8341 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008342
8343 verifyFormat("@interface BSApplicationController ()\n"
8344 "{\n"
8345 "@private\n"
8346 " id _extraIvar;\n"
8347 "}\n"
8348 "@end\n",
8349 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008350
8351 verifyFormat("#ifdef _DEBUG\n"
8352 "int foo(int i = 0)\n"
8353 "#else\n"
8354 "int foo(int i = 5)\n"
8355 "#endif\n"
8356 "{\n"
8357 " return i;\n"
8358 "}",
8359 GNUBraceStyle);
8360
8361 verifyFormat("void foo() {}\n"
8362 "void bar()\n"
8363 "#ifdef _DEBUG\n"
8364 "{\n"
8365 " foo();\n"
8366 "}\n"
8367 "#else\n"
8368 "{\n"
8369 "}\n"
8370 "#endif",
8371 GNUBraceStyle);
8372
8373 verifyFormat("void foobar() { int i = 5; }\n"
8374 "#ifdef _DEBUG\n"
8375 "void bar() {}\n"
8376 "#else\n"
8377 "void bar() { foobar(); }\n"
8378 "#endif",
8379 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00008380}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00008381
8382TEST_F(FormatTest, WebKitBraceBreaking) {
8383 FormatStyle WebKitBraceStyle = getLLVMStyle();
8384 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00008385 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00008386 verifyFormat("namespace a {\n"
8387 "class A {\n"
8388 " void f()\n"
8389 " {\n"
8390 " if (true) {\n"
8391 " a();\n"
8392 " b();\n"
8393 " }\n"
8394 " }\n"
8395 " void g() { return; }\n"
8396 "};\n"
8397 "enum E {\n"
8398 " A,\n"
8399 " // foo\n"
8400 " B,\n"
8401 " C\n"
8402 "};\n"
8403 "struct B {\n"
8404 " int x;\n"
8405 "};\n"
8406 "}\n",
8407 WebKitBraceStyle);
8408 verifyFormat("struct S {\n"
8409 " int Type;\n"
8410 " union {\n"
8411 " int x;\n"
8412 " double y;\n"
8413 " } Value;\n"
8414 " class C {\n"
8415 " MyFavoriteType Value;\n"
8416 " } Class;\n"
8417 "};\n",
8418 WebKitBraceStyle);
8419}
8420
Manuel Klimekd5735502013-08-12 03:51:17 +00008421TEST_F(FormatTest, CatchExceptionReferenceBinding) {
8422 verifyFormat("void f() {\n"
8423 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00008424 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00008425 " }\n"
8426 "}\n",
8427 getLLVMStyle());
8428}
8429
Daniel Jasper9613c812013-08-07 16:29:23 +00008430TEST_F(FormatTest, UnderstandsPragmas) {
8431 verifyFormat("#pragma omp reduction(| : var)");
8432 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00008433
8434 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
8435 "(including parentheses).",
8436 format("#pragma mark Any non-hyphenated or hyphenated string "
8437 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +00008438}
8439
Daniel Jasperee4a8a12015-04-22 09:45:42 +00008440TEST_F(FormatTest, UnderstandPragmaOption) {
8441 verifyFormat("#pragma option -C -A");
8442
8443 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
8444}
8445
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008446#define EXPECT_ALL_STYLES_EQUAL(Styles) \
8447 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +00008448 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
8449 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +00008450
8451TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008452 SmallVector<FormatStyle, 3> Styles;
8453 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008454
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008455 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008456 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
8457 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
8458 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008459
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008460 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008461 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
8462 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
8463 EXPECT_ALL_STYLES_EQUAL(Styles);
8464
Nico Weber514ecc82014-02-02 20:50:45 +00008465 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008466 EXPECT_TRUE(
8467 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
8468 EXPECT_TRUE(
8469 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
8470 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008471
Nico Weber514ecc82014-02-02 20:50:45 +00008472 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008473 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
8474 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
8475 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008476
8477 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008478 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
8479 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
8480 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008481
Daniel Jasperffefb3d2013-07-24 13:10:59 +00008482 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008483 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
8484 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
8485 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00008486
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +00008487 Styles[0] = getGNUStyle();
8488 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
8489 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
8490 EXPECT_ALL_STYLES_EQUAL(Styles);
8491
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008492 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
8493}
8494
8495TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
8496 SmallVector<FormatStyle, 8> Styles;
8497 Styles.resize(2);
8498
8499 Styles[0] = getGoogleStyle();
8500 Styles[1] = getLLVMStyle();
8501 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
8502 EXPECT_ALL_STYLES_EQUAL(Styles);
8503
8504 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +00008505 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008506 Styles[1] = getLLVMStyle();
8507 Styles[1].Language = FormatStyle::LK_JavaScript;
8508 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
8509
8510 Styles[2] = getLLVMStyle();
8511 Styles[2].Language = FormatStyle::LK_JavaScript;
8512 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
8513 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008514 &Styles[2])
8515 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008516
8517 Styles[3] = getLLVMStyle();
8518 Styles[3].Language = FormatStyle::LK_JavaScript;
8519 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
8520 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008521 &Styles[3])
8522 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008523
8524 Styles[4] = getLLVMStyle();
8525 Styles[4].Language = FormatStyle::LK_JavaScript;
8526 EXPECT_EQ(0, parseConfiguration("---\n"
8527 "BasedOnStyle: LLVM\n"
8528 "IndentWidth: 123\n"
8529 "---\n"
8530 "BasedOnStyle: Google\n"
8531 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008532 &Styles[4])
8533 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008534 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008535}
8536
Daniel Jasper91881d92014-09-29 08:07:46 +00008537#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +00008538 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +00008539 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008540 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +00008541 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +00008542 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008543
Daniel Jasper91881d92014-09-29 08:07:46 +00008544#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
8545
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00008546#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
8547 Style.STRUCT.FIELD = false; \
8548 EXPECT_EQ(0, \
8549 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
8550 .value()); \
8551 EXPECT_TRUE(Style.STRUCT.FIELD); \
8552 EXPECT_EQ(0, \
8553 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
8554 .value()); \
8555 EXPECT_FALSE(Style.STRUCT.FIELD);
8556
8557#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
8558 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
8559
Daniel Jasper00853002014-09-16 16:22:30 +00008560#define CHECK_PARSE(TEXT, FIELD, VALUE) \
8561 EXPECT_NE(VALUE, Style.FIELD); \
8562 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
8563 EXPECT_EQ(VALUE, Style.FIELD)
8564
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008565TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008566 FormatStyle Style = {};
8567 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00008568 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +00008569 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +00008570 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +00008571 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008572 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008573 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +00008574 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +00008575 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008576 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +00008577 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00008578 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +00008579 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00008580 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008581 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +00008582 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00008583 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008584 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008585 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +00008586 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +00008587 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +00008588 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008589 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00008590 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +00008591 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +00008592 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008593 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +00008594 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +00008595 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +00008596 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008597 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +00008598 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00008599 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008600 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +00008601 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008602 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008603 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00008604 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +00008605 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00008606
8607 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
8608 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
8609 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
8610 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
8611 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
8612 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
8613 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
8614 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
8615 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
8616 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
8617 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008618}
Alexander Kornienkod6538332013-05-07 15:32:14 +00008619
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008620#undef CHECK_PARSE_BOOL
8621
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008622TEST_F(FormatTest, ParsesConfiguration) {
8623 FormatStyle Style = {};
8624 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00008625 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00008626 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
8627 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +00008628 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008629 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
8630 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +00008631 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
8632 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008633 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
8634 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
8635 PenaltyReturnTypeOnItsOwnLine, 1234u);
8636 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
8637 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +00008638 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +00008639 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00008640 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +00008641
Daniel Jasper553d4872014-06-17 12:40:34 +00008642 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +00008643 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
8644 FormatStyle::PAS_Left);
8645 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
8646 FormatStyle::PAS_Right);
8647 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
8648 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +00008649 // For backward compatibility:
8650 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
8651 FormatStyle::PAS_Left);
8652 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
8653 FormatStyle::PAS_Right);
8654 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
8655 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +00008656
Alexander Kornienkod6538332013-05-07 15:32:14 +00008657 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +00008658 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
8659 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008660 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
8661 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
8662 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
8663
Daniel Jasperac043c92014-09-15 11:11:00 +00008664 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +00008665 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
8666 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +00008667 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
8668 FormatStyle::BOS_None);
8669 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
8670 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00008671 // For backward compatibility:
8672 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
8673 FormatStyle::BOS_None);
8674 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
8675 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +00008676
Daniel Jasper6501f7e2015-10-27 12:38:37 +00008677 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8678 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
8679 FormatStyle::BAS_Align);
8680 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
8681 FormatStyle::BAS_DontAlign);
8682 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
8683 FormatStyle::BAS_AlwaysBreak);
8684 // For backward compatibility:
8685 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
8686 FormatStyle::BAS_DontAlign);
8687 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
8688 FormatStyle::BAS_Align);
8689
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008690 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008691 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
8692 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
8693 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008694 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
8695 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +00008696 // For backward compatibility:
8697 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
8698 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008699
Daniel Jasperd74cf402014-04-08 12:46:38 +00008700 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +00008701 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
8702 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
8703 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
8704 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +00008705 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
8706 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +00008707 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
8708 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00008709 // For backward compatibility:
8710 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
8711 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
8712 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
8713 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +00008714
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008715 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
8716 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
8717 FormatStyle::SBPO_Never);
8718 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
8719 FormatStyle::SBPO_Always);
8720 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
8721 FormatStyle::SBPO_ControlStatements);
8722 // For backward compatibility:
8723 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
8724 FormatStyle::SBPO_Never);
8725 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
8726 FormatStyle::SBPO_ControlStatements);
8727
Alexander Kornienkod6538332013-05-07 15:32:14 +00008728 Style.ColumnLimit = 123;
8729 FormatStyle BaseStyle = getLLVMStyle();
8730 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
8731 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
8732
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008733 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
8734 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
8735 FormatStyle::BS_Attach);
8736 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
8737 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00008738 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
8739 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008740 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
8741 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00008742 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
8743 FormatStyle::BS_Allman);
8744 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00008745 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
8746 FormatStyle::BS_WebKit);
8747 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
8748 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008749
Zachary Turner448592e2015-12-18 22:20:15 +00008750 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
8751 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
8752 FormatStyle::RTBS_None);
8753 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
8754 FormatStyle::RTBS_All);
8755 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +00008756 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +00008757 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
8758 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
8759 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
8760 AlwaysBreakAfterReturnType,
8761 FormatStyle::RTBS_TopLevelDefinitions);
8762
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00008763 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
8764 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
8765 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
8766 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
8767 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
8768 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
8769 AlwaysBreakAfterDefinitionReturnType,
8770 FormatStyle::DRTBS_TopLevel);
8771
Daniel Jasper65ee3472013-07-31 23:16:02 +00008772 Style.NamespaceIndentation = FormatStyle::NI_All;
8773 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
8774 FormatStyle::NI_None);
8775 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
8776 FormatStyle::NI_Inner);
8777 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
8778 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +00008779
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00008780 // FIXME: This is required because parsing a configuration simply overwrites
8781 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +00008782 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +00008783 std::vector<std::string> BoostForeach;
8784 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00008785 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +00008786 std::vector<std::string> BoostAndQForeach;
8787 BoostAndQForeach.push_back("BOOST_FOREACH");
8788 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00008789 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
8790 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00008791
8792 Style.IncludeCategories.clear();
8793 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
8794 {".*", 1}};
8795 CHECK_PARSE("IncludeCategories:\n"
8796 " - Regex: abc/.*\n"
8797 " Priority: 2\n"
8798 " - Regex: .*\n"
8799 " Priority: 1",
8800 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00008801 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008802}
8803
8804TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
8805 FormatStyle Style = {};
8806 Style.Language = FormatStyle::LK_Cpp;
8807 CHECK_PARSE("Language: Cpp\n"
8808 "IndentWidth: 12",
8809 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +00008810 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
8811 "IndentWidth: 34",
8812 &Style),
8813 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008814 EXPECT_EQ(12u, Style.IndentWidth);
8815 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
8816 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
8817
8818 Style.Language = FormatStyle::LK_JavaScript;
8819 CHECK_PARSE("Language: JavaScript\n"
8820 "IndentWidth: 12",
8821 IndentWidth, 12u);
8822 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +00008823 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
8824 "IndentWidth: 34",
8825 &Style),
8826 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008827 EXPECT_EQ(23u, Style.IndentWidth);
8828 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
8829 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
8830
8831 CHECK_PARSE("BasedOnStyle: LLVM\n"
8832 "IndentWidth: 67",
8833 IndentWidth, 67u);
8834
8835 CHECK_PARSE("---\n"
8836 "Language: JavaScript\n"
8837 "IndentWidth: 12\n"
8838 "---\n"
8839 "Language: Cpp\n"
8840 "IndentWidth: 34\n"
8841 "...\n",
8842 IndentWidth, 12u);
8843
8844 Style.Language = FormatStyle::LK_Cpp;
8845 CHECK_PARSE("---\n"
8846 "Language: JavaScript\n"
8847 "IndentWidth: 12\n"
8848 "---\n"
8849 "Language: Cpp\n"
8850 "IndentWidth: 34\n"
8851 "...\n",
8852 IndentWidth, 34u);
8853 CHECK_PARSE("---\n"
8854 "IndentWidth: 78\n"
8855 "---\n"
8856 "Language: JavaScript\n"
8857 "IndentWidth: 56\n"
8858 "...\n",
8859 IndentWidth, 78u);
8860
8861 Style.ColumnLimit = 123;
8862 Style.IndentWidth = 234;
8863 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
8864 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +00008865 EXPECT_FALSE(parseConfiguration("---\n"
8866 "IndentWidth: 456\n"
8867 "BreakBeforeBraces: Allman\n"
8868 "---\n"
8869 "Language: JavaScript\n"
8870 "IndentWidth: 111\n"
8871 "TabWidth: 111\n"
8872 "---\n"
8873 "Language: Cpp\n"
8874 "BreakBeforeBraces: Stroustrup\n"
8875 "TabWidth: 789\n"
8876 "...\n",
8877 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008878 EXPECT_EQ(123u, Style.ColumnLimit);
8879 EXPECT_EQ(456u, Style.IndentWidth);
8880 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
8881 EXPECT_EQ(789u, Style.TabWidth);
8882
Rafael Espindola1f243172014-06-12 11:35:17 +00008883 EXPECT_EQ(parseConfiguration("---\n"
8884 "Language: JavaScript\n"
8885 "IndentWidth: 56\n"
8886 "---\n"
8887 "IndentWidth: 78\n"
8888 "...\n",
8889 &Style),
8890 ParseError::Error);
8891 EXPECT_EQ(parseConfiguration("---\n"
8892 "Language: JavaScript\n"
8893 "IndentWidth: 56\n"
8894 "---\n"
8895 "Language: JavaScript\n"
8896 "IndentWidth: 78\n"
8897 "...\n",
8898 &Style),
8899 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008900
8901 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
8902}
Daniel Jasper65ee3472013-07-31 23:16:02 +00008903
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008904#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008905
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008906TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
8907 FormatStyle Style = {};
8908 Style.Language = FormatStyle::LK_JavaScript;
8909 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008910 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00008911 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008912
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008913 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008914 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008915 "BasedOnStyle: Google\n"
8916 "---\n"
8917 "Language: JavaScript\n"
8918 "IndentWidth: 76\n"
8919 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008920 &Style)
8921 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00008922 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008923 EXPECT_EQ(76u, Style.IndentWidth);
8924 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
8925}
8926
Alexander Kornienkod6538332013-05-07 15:32:14 +00008927TEST_F(FormatTest, ConfigurationRoundTripTest) {
8928 FormatStyle Style = getLLVMStyle();
8929 std::string YAML = configurationAsText(Style);
8930 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008931 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00008932 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
8933 EXPECT_EQ(Style, ParsedStyle);
8934}
8935
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008936TEST_F(FormatTest, WorksFor8bitEncodings) {
8937 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
8938 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
8939 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
8940 "\"\xef\xee\xf0\xf3...\"",
8941 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
8942 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
8943 "\xef\xee\xf0\xf3...\"",
8944 getLLVMStyleWithColumns(12)));
8945}
8946
Alexander Kornienko393e3082013-11-13 14:04:17 +00008947TEST_F(FormatTest, HandlesUTF8BOM) {
8948 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
8949 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
8950 format("\xef\xbb\xbf#include <iostream>"));
8951 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
8952 format("\xef\xbb\xbf\n#include <iostream>"));
8953}
8954
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +00008955// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
8956#if !defined(_MSC_VER)
8957
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008958TEST_F(FormatTest, CountsUTF8CharactersProperly) {
8959 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
8960 getLLVMStyleWithColumns(35));
8961 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008962 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008963 verifyFormat("// Однажды в студёную зимнюю пору...",
8964 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +00008965 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008966 verifyFormat("/* Однажды в студёную зимнюю пору... */",
8967 getLLVMStyleWithColumns(39));
8968 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008969 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008970}
8971
8972TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +00008973 // Non-printable characters' width is currently considered to be the length in
8974 // bytes in UTF8. The characters can be displayed in very different manner
8975 // (zero-width, single width with a substitution glyph, expanded to their code
8976 // (e.g. "<8d>"), so there's no single correct way to handle them.
8977 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00008978 "\"\xc2\x8d\";",
8979 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +00008980 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00008981 "\"\xc2\x8d\";",
8982 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008983 EXPECT_EQ("\"Однажды, в \"\n"
8984 "\"студёную \"\n"
8985 "\"зимнюю \"\n"
8986 "\"пору,\"",
8987 format("\"Однажды, в студёную зимнюю пору,\"",
8988 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008989 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +00008990 "\"一 二 三 \"\n"
8991 "\"四 五六 \"\n"
8992 "\"七 八 九 \"\n"
8993 "\"十\"",
8994 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008995 EXPECT_EQ("\"一\t二 \"\n"
8996 "\"\t三 \"\n"
8997 "\"四 五\t六 \"\n"
8998 "\"\t七 \"\n"
8999 "\"八九十\tqq\"",
9000 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
9001 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +00009002
9003 // UTF8 character in an escape sequence.
9004 EXPECT_EQ("\"aaaaaa\"\n"
9005 "\"\\\xC2\x8D\"",
9006 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009007}
9008
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009009TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
9010 EXPECT_EQ("const char *sssss =\n"
9011 " \"一二三四五六七八\\\n"
9012 " 九 十\";",
9013 format("const char *sssss = \"一二三四五六七八\\\n"
9014 " 九 十\";",
9015 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009016}
9017
9018TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00009019 EXPECT_EQ("// aaaaÄ\xc2\x8d",
9020 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009021 EXPECT_EQ("// Я из лесу\n"
9022 "// вышел; был\n"
9023 "// сильный\n"
9024 "// мороз.",
9025 format("// Я из лесу вышел; был сильный мороз.",
9026 getLLVMStyleWithColumns(13)));
9027 EXPECT_EQ("// 一二三\n"
9028 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009029 "// 八 九\n"
9030 "// 十",
9031 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009032}
9033
9034TEST_F(FormatTest, SplitsUTF8BlockComments) {
9035 EXPECT_EQ("/* Гляжу,\n"
9036 " * поднимается\n"
9037 " * медленно в\n"
9038 " * гору\n"
9039 " * Лошадка,\n"
9040 " * везущая\n"
9041 " * хворосту\n"
9042 " * воз. */",
9043 format("/* Гляжу, поднимается медленно в гору\n"
9044 " * Лошадка, везущая хворосту воз. */",
9045 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009046 EXPECT_EQ(
9047 "/* 一二三\n"
9048 " * 四五六七\n"
9049 " * 八 九\n"
9050 " * 十 */",
9051 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +00009052 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
9053 " * 𝕓𝕪𝕥𝕖\n"
9054 " * 𝖀𝕿𝕱-𝟠 */",
9055 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009056}
9057
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009058#endif // _MSC_VER
9059
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009060TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
9061 FormatStyle Style = getLLVMStyle();
9062
9063 Style.ConstructorInitializerIndentWidth = 4;
9064 verifyFormat(
9065 "SomeClass::Constructor()\n"
9066 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
9067 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
9068 Style);
9069
9070 Style.ConstructorInitializerIndentWidth = 2;
9071 verifyFormat(
9072 "SomeClass::Constructor()\n"
9073 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
9074 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
9075 Style);
9076
9077 Style.ConstructorInitializerIndentWidth = 0;
9078 verifyFormat(
9079 "SomeClass::Constructor()\n"
9080 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
9081 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
9082 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +00009083 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9084 verifyFormat(
9085 "SomeLongTemplateVariableName<\n"
9086 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
9087 Style);
9088 verifyFormat(
9089 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
9090 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
9091 Style);
Daniel Jasper00853002014-09-16 16:22:30 +00009092}
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009093
Daniel Jasper00853002014-09-16 16:22:30 +00009094TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
9095 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009096 Style.BreakConstructorInitializersBeforeComma = true;
9097 Style.ConstructorInitializerIndentWidth = 4;
9098 verifyFormat("SomeClass::Constructor()\n"
9099 " : a(a)\n"
9100 " , b(b)\n"
9101 " , c(c) {}",
9102 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009103 verifyFormat("SomeClass::Constructor()\n"
9104 " : a(a) {}",
9105 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009106
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009107 Style.ColumnLimit = 0;
9108 verifyFormat("SomeClass::Constructor()\n"
9109 " : a(a) {}",
9110 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +00009111 verifyFormat("SomeClass::Constructor() noexcept\n"
9112 " : a(a) {}",
9113 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009114 verifyFormat("SomeClass::Constructor()\n"
9115 " : a(a)\n"
9116 " , b(b)\n"
9117 " , c(c) {}",
9118 Style);
9119 verifyFormat("SomeClass::Constructor()\n"
9120 " : a(a) {\n"
9121 " foo();\n"
9122 " bar();\n"
9123 "}",
9124 Style);
9125
Daniel Jasperd74cf402014-04-08 12:46:38 +00009126 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009127 verifyFormat("SomeClass::Constructor()\n"
9128 " : a(a)\n"
9129 " , b(b)\n"
9130 " , c(c) {\n}",
9131 Style);
9132 verifyFormat("SomeClass::Constructor()\n"
9133 " : a(a) {\n}",
9134 Style);
9135
9136 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +00009137 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009138 Style.ConstructorInitializerIndentWidth = 2;
9139 verifyFormat("SomeClass::Constructor()\n"
9140 " : a(a)\n"
9141 " , b(b)\n"
9142 " , c(c) {}",
9143 Style);
9144
9145 Style.ConstructorInitializerIndentWidth = 0;
9146 verifyFormat("SomeClass::Constructor()\n"
9147 ": a(a)\n"
9148 ", b(b)\n"
9149 ", c(c) {}",
9150 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +00009151
9152 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
9153 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009154 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
9155 verifyFormat(
9156 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
9157 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +00009158 verifyFormat(
9159 "SomeClass::Constructor()\n"
9160 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
9161 Style);
9162 Style.ConstructorInitializerIndentWidth = 4;
9163 Style.ColumnLimit = 60;
9164 verifyFormat("SomeClass::Constructor()\n"
9165 " : aaaaaaaa(aaaaaaaa)\n"
9166 " , aaaaaaaa(aaaaaaaa)\n"
9167 " , aaaaaaaa(aaaaaaaa) {}",
9168 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009169}
9170
Daniel Jasper38efc132014-10-21 07:51:54 +00009171TEST_F(FormatTest, Destructors) {
9172 verifyFormat("void F(int &i) { i.~int(); }");
9173 verifyFormat("void F(int &i) { i->~int(); }");
9174}
9175
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009176TEST_F(FormatTest, FormatsWithWebKitStyle) {
9177 FormatStyle Style = getWebKitStyle();
9178
9179 // Don't indent in outer namespaces.
9180 verifyFormat("namespace outer {\n"
9181 "int i;\n"
9182 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00009183 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009184 "} // namespace inner\n"
9185 "} // namespace outer\n"
9186 "namespace other_outer {\n"
9187 "int i;\n"
9188 "}",
9189 Style);
9190
9191 // Don't indent case labels.
9192 verifyFormat("switch (variable) {\n"
9193 "case 1:\n"
9194 "case 2:\n"
9195 " doSomething();\n"
9196 " break;\n"
9197 "default:\n"
9198 " ++variable;\n"
9199 "}",
9200 Style);
9201
9202 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +00009203 EXPECT_EQ("void f()\n"
9204 "{\n"
9205 " if (aaaaaaaaaaaaaaaa\n"
9206 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
9207 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
9208 " return;\n"
9209 "}",
9210 format("void f() {\n"
9211 "if (aaaaaaaaaaaaaaaa\n"
9212 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
9213 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
9214 "return;\n"
9215 "}",
9216 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009217
Daniel Jasper35995672014-04-29 14:05:20 +00009218 // Allow functions on a single line.
9219 verifyFormat("void f() { return; }", Style);
9220
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009221 // Constructor initializers are formatted one per line with the "," on the
9222 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009223 verifyFormat("Constructor()\n"
9224 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
9225 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00009226 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +00009227 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
9228 "{\n"
9229 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009230 Style);
9231 verifyFormat("SomeClass::Constructor()\n"
9232 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +00009233 "{\n"
9234 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009235 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +00009236 EXPECT_EQ("SomeClass::Constructor()\n"
9237 " : a(a)\n"
9238 "{\n"
9239 "}",
9240 format("SomeClass::Constructor():a(a){}", Style));
9241 verifyFormat("SomeClass::Constructor()\n"
9242 " : a(a)\n"
9243 " , b(b)\n"
9244 " , c(c)\n"
9245 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009246 "}",
9247 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009248 verifyFormat("SomeClass::Constructor()\n"
9249 " : a(a)\n"
9250 "{\n"
9251 " foo();\n"
9252 " bar();\n"
9253 "}",
9254 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009255
Daniel Jasper65ee3472013-07-31 23:16:02 +00009256 // Access specifiers should be aligned left.
9257 verifyFormat("class C {\n"
9258 "public:\n"
9259 " int i;\n"
9260 "};",
9261 Style);
9262
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009263 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +00009264 verifyFormat("int a; // Do not\n"
9265 "double b; // align comments.",
9266 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009267
Daniel Jasper3219e432014-12-02 13:24:51 +00009268 // Do not align operands.
9269 EXPECT_EQ("ASSERT(aaaa\n"
9270 " || bbbb);",
9271 format("ASSERT ( aaaa\n||bbbb);", Style));
9272
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009273 // Accept input's line breaks.
9274 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
9275 " || bbbbbbbbbbbbbbb) {\n"
9276 " i++;\n"
9277 "}",
9278 format("if (aaaaaaaaaaaaaaa\n"
9279 "|| bbbbbbbbbbbbbbb) { i++; }",
9280 Style));
9281 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
9282 " i++;\n"
9283 "}",
9284 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +00009285
9286 // Don't automatically break all macro definitions (llvm.org/PR17842).
9287 verifyFormat("#define aNumber 10", Style);
9288 // However, generally keep the line breaks that the user authored.
9289 EXPECT_EQ("#define aNumber \\\n"
9290 " 10",
9291 format("#define aNumber \\\n"
9292 " 10",
9293 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +00009294
9295 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +00009296 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
9297 " copyItems:YES];",
9298 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
9299 "copyItems:YES];",
9300 Style));
9301 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
9302 " copyItems:YES];",
9303 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
9304 " copyItems:YES];",
9305 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +00009306 // FIXME: This does not seem right, there should be more indentation before
9307 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +00009308 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +00009309 " @\"a\",\n"
9310 " @\"a\"\n"
9311 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +00009312 " copyItems:YES];",
9313 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
9314 " @\"a\",\n"
9315 " @\"a\"\n"
9316 " ]\n"
9317 " copyItems:YES];",
9318 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +00009319 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +00009320 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
9321 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +00009322 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
9323 " copyItems:YES];",
9324 Style));
9325
9326 verifyFormat("[self.a b:c c:d];", Style);
9327 EXPECT_EQ("[self.a b:c\n"
9328 " c:d];",
9329 format("[self.a b:c\n"
9330 "c:d];",
9331 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009332}
9333
Manuel Klimekffdeb592013-09-03 15:10:01 +00009334TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +00009335 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
9336 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
9337 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
9338 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
9339 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +00009340 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +00009341 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00009342 verifyFormat("void f() {\n"
9343 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
9344 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00009345 verifyFormat("void f() {\n"
9346 " other(x.begin(), //\n"
9347 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +00009348 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00009349 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +00009350 verifyFormat("SomeFunction([]() { // A cool function...\n"
9351 " return 43;\n"
9352 "});");
Daniel Jasper56346192014-10-27 16:31:46 +00009353 EXPECT_EQ("SomeFunction([]() {\n"
9354 "#define A a\n"
9355 " return 43;\n"
9356 "});",
9357 format("SomeFunction([](){\n"
9358 "#define A a\n"
9359 "return 43;\n"
9360 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +00009361 verifyFormat("void f() {\n"
9362 " SomeFunction([](decltype(x), A *a) {});\n"
9363 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +00009364 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
9365 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +00009366 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
9367 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
9368 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +00009369 verifyFormat("Constructor()\n"
9370 " : Field([] { // comment\n"
9371 " int i;\n"
9372 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +00009373 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
9374 " return some_parameter.size();\n"
9375 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +00009376 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
9377 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +00009378 verifyFormat("int i = aaaaaa ? 1 //\n"
9379 " : [] {\n"
9380 " return 2; //\n"
9381 " }();");
9382 verifyFormat("llvm::errs() << \"number of twos is \"\n"
9383 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
9384 " return x == 2; // force break\n"
9385 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +00009386 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
9387 " [=](int iiiiiiiiiiii) {\n"
9388 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
9389 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
9390 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +00009391 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +00009392 verifyFormat("SomeFunction({[&] {\n"
9393 " // comment\n"
9394 " },\n"
9395 " [&] {\n"
9396 " // comment\n"
9397 " }});");
9398 verifyFormat("SomeFunction({[&] {\n"
9399 " // comment\n"
9400 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00009401 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
9402 " [&]() { return true; },\n"
9403 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +00009404
Daniel Jaspercb51cf42014-01-16 09:11:55 +00009405 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +00009406 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +00009407 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +00009408 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
9409 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +00009410 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +00009411 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +00009412 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
9413 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +00009414 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +00009415 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
9416 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +00009417 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +00009418 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +00009419 verifyFormat(
9420 "aaaaaaaaaaaaaaaaaaaaaa(\n"
9421 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
9422 " return aaaaaaaaaaaaaaaaa;\n"
9423 " });",
9424 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +00009425 verifyFormat("[]() //\n"
9426 " -> int {\n"
9427 " return 1; //\n"
9428 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +00009429
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +00009430 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +00009431 verifyFormat("SomeFunction(\n"
9432 " []() {\n"
9433 " int i = 42;\n"
9434 " return i;\n"
9435 " },\n"
9436 " []() {\n"
9437 " int j = 43;\n"
9438 " return j;\n"
9439 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +00009440
Daniel Jasperda18fd82014-06-10 06:39:03 +00009441 // More complex introducers.
9442 verifyFormat("return [i, args...] {};");
9443
Daniel Jasperbf02b2c12013-09-05 11:49:39 +00009444 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +00009445 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +00009446 verifyFormat("double &operator[](int i) { return 0; }\n"
9447 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +00009448 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +00009449 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +00009450 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +00009451
9452 // Other corner cases.
9453 verifyFormat("void f() {\n"
9454 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
9455 " );\n"
9456 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +00009457
9458 // Lambdas created through weird macros.
9459 verifyFormat("void f() {\n"
9460 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +00009461 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +00009462 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +00009463
9464 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
9465 " doo_dah();\n"
9466 " doo_dah();\n"
9467 " })) {\n"
9468 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +00009469 verifyFormat("auto lambda = []() {\n"
9470 " int a = 2\n"
9471 "#if A\n"
9472 " + 2\n"
9473 "#endif\n"
9474 " ;\n"
9475 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +00009476
9477 // Lambdas with complex multiline introducers.
9478 verifyFormat(
9479 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
9480 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
9481 " -> ::std::unordered_set<\n"
9482 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
9483 " //\n"
9484 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +00009485}
9486
Manuel Klimek516e0542013-09-04 13:25:30 +00009487TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +00009488 FormatStyle ShortBlocks = getLLVMStyle();
9489 ShortBlocks.AllowShortBlocksOnASingleLine = true;
9490 verifyFormat("int (^Block)(int, int);", ShortBlocks);
9491 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
9492 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
9493 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
9494 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
9495 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +00009496
Daniel Jasper76284682014-10-22 09:12:44 +00009497 verifyFormat("foo(^{ bar(); });", ShortBlocks);
9498 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
9499 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +00009500
Daniel Jasper76284682014-10-22 09:12:44 +00009501 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009502 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009503 "}];");
9504 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009505 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009506 "}]};");
9507 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009508 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009509 "}];");
9510 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009511 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009512 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +00009513 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009514 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009515 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009516 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +00009517 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009518
9519 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009520 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009521 "}];",
9522 getLLVMStyleWithColumns(60));
9523 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009524 " NSString *path = [self sessionFilePath];\n"
9525 " if (path) {\n"
9526 " // ...\n"
9527 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009528 "});");
9529 verifyFormat("[[SessionService sharedService]\n"
9530 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009531 " if (window) {\n"
9532 " [self windowDidLoad:window];\n"
9533 " } else {\n"
9534 " [self errorLoadingWindow];\n"
9535 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009536 " }];");
9537 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009538 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009539 "};\n",
9540 getLLVMStyleWithColumns(40));
9541 verifyFormat("[[SessionService sharedService]\n"
9542 " loadWindowWithCompletionBlock: //\n"
9543 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009544 " if (window) {\n"
9545 " [self windowDidLoad:window];\n"
9546 " } else {\n"
9547 " [self errorLoadingWindow];\n"
9548 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009549 " }];",
9550 getLLVMStyleWithColumns(60));
9551 verifyFormat("[myObject doSomethingWith:arg1\n"
9552 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009553 " // ...\n"
9554 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009555 " }\n"
9556 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009557 " // ...\n"
9558 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +00009559 " }\n"
9560 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009561 " // ...\n"
9562 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009563 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +00009564 verifyFormat("[myObject doSomethingWith:arg1\n"
9565 " firstBlock:-1\n"
9566 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009567 " // ...\n"
9568 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +00009569 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +00009570
9571 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009572 " @autoreleasepool {\n"
9573 " if (a) {\n"
9574 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +00009575 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009576 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +00009577 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +00009578 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +00009579 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
9580 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +00009581
9582 FormatStyle FourIndent = getLLVMStyle();
9583 FourIndent.ObjCBlockIndentWidth = 4;
9584 verifyFormat("[operation setCompletionBlock:^{\n"
9585 " [self onOperationDone];\n"
9586 "}];",
9587 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +00009588}
9589
Daniel Jasper289afc02015-04-23 09:23:17 +00009590TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
9591 FormatStyle ZeroColumn = getLLVMStyle();
9592 ZeroColumn.ColumnLimit = 0;
9593
9594 verifyFormat("[[SessionService sharedService] "
9595 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9596 " if (window) {\n"
9597 " [self windowDidLoad:window];\n"
9598 " } else {\n"
9599 " [self errorLoadingWindow];\n"
9600 " }\n"
9601 "}];",
9602 ZeroColumn);
9603 EXPECT_EQ("[[SessionService sharedService]\n"
9604 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9605 " if (window) {\n"
9606 " [self windowDidLoad:window];\n"
9607 " } else {\n"
9608 " [self errorLoadingWindow];\n"
9609 " }\n"
9610 " }];",
9611 format("[[SessionService sharedService]\n"
9612 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9613 " if (window) {\n"
9614 " [self windowDidLoad:window];\n"
9615 " } else {\n"
9616 " [self errorLoadingWindow];\n"
9617 " }\n"
9618 "}];",
9619 ZeroColumn));
9620 verifyFormat("[myObject doSomethingWith:arg1\n"
9621 " firstBlock:^(Foo *a) {\n"
9622 " // ...\n"
9623 " int i;\n"
9624 " }\n"
9625 " secondBlock:^(Bar *b) {\n"
9626 " // ...\n"
9627 " int i;\n"
9628 " }\n"
9629 " thirdBlock:^Foo(Bar *b) {\n"
9630 " // ...\n"
9631 " int i;\n"
9632 " }];",
9633 ZeroColumn);
9634 verifyFormat("f(^{\n"
9635 " @autoreleasepool {\n"
9636 " if (a) {\n"
9637 " g();\n"
9638 " }\n"
9639 " }\n"
9640 "});",
9641 ZeroColumn);
9642 verifyFormat("void (^largeBlock)(void) = ^{\n"
9643 " // ...\n"
9644 "};",
9645 ZeroColumn);
9646
9647 ZeroColumn.AllowShortBlocksOnASingleLine = true;
9648 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009649 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +00009650 ZeroColumn.AllowShortBlocksOnASingleLine = false;
9651 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
9652 " int i;\n"
9653 "};",
9654 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
9655}
9656
Alexander Kornienko9e649af2013-09-11 12:25:57 +00009657TEST_F(FormatTest, SupportsCRLF) {
9658 EXPECT_EQ("int a;\r\n"
9659 "int b;\r\n"
9660 "int c;\r\n",
9661 format("int a;\r\n"
9662 " int b;\r\n"
9663 " int c;\r\n",
9664 getLLVMStyle()));
9665 EXPECT_EQ("int a;\r\n"
9666 "int b;\r\n"
9667 "int c;\r\n",
9668 format("int a;\r\n"
9669 " int b;\n"
9670 " int c;\r\n",
9671 getLLVMStyle()));
9672 EXPECT_EQ("int a;\n"
9673 "int b;\n"
9674 "int c;\n",
9675 format("int a;\r\n"
9676 " int b;\n"
9677 " int c;\n",
9678 getLLVMStyle()));
9679 EXPECT_EQ("\"aaaaaaa \"\r\n"
9680 "\"bbbbbbb\";\r\n",
9681 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
9682 EXPECT_EQ("#define A \\\r\n"
9683 " b; \\\r\n"
9684 " c; \\\r\n"
9685 " d;\r\n",
9686 format("#define A \\\r\n"
9687 " b; \\\r\n"
9688 " c; d; \r\n",
9689 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +00009690
9691 EXPECT_EQ("/*\r\n"
9692 "multi line block comments\r\n"
9693 "should not introduce\r\n"
9694 "an extra carriage return\r\n"
9695 "*/\r\n",
9696 format("/*\r\n"
9697 "multi line block comments\r\n"
9698 "should not introduce\r\n"
9699 "an extra carriage return\r\n"
9700 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +00009701}
9702
Manuel Klimekb212f3b2013-10-12 22:46:56 +00009703TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
9704 verifyFormat("MY_CLASS(C) {\n"
9705 " int i;\n"
9706 " int j;\n"
9707 "};");
9708}
9709
Daniel Jasper6633ab82013-10-18 10:38:14 +00009710TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
9711 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
9712 TwoIndent.ContinuationIndentWidth = 2;
9713
9714 EXPECT_EQ("int i =\n"
9715 " longFunction(\n"
9716 " arg);",
9717 format("int i = longFunction(arg);", TwoIndent));
9718
9719 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
9720 SixIndent.ContinuationIndentWidth = 6;
9721
9722 EXPECT_EQ("int i =\n"
9723 " longFunction(\n"
9724 " arg);",
9725 format("int i = longFunction(arg);", SixIndent));
9726}
9727
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009728TEST_F(FormatTest, SpacesInAngles) {
9729 FormatStyle Spaces = getLLVMStyle();
9730 Spaces.SpacesInAngles = true;
9731
9732 verifyFormat("static_cast< int >(arg);", Spaces);
9733 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
9734 verifyFormat("f< int, float >();", Spaces);
9735 verifyFormat("template <> g() {}", Spaces);
9736 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00009737 verifyFormat("std::function< void(int, int) > fct;", Spaces);
9738 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
9739 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009740
9741 Spaces.Standard = FormatStyle::LS_Cpp03;
9742 Spaces.SpacesInAngles = true;
9743 verifyFormat("A< A< int > >();", Spaces);
9744
9745 Spaces.SpacesInAngles = false;
9746 verifyFormat("A<A<int> >();", Spaces);
9747
9748 Spaces.Standard = FormatStyle::LS_Cpp11;
9749 Spaces.SpacesInAngles = true;
9750 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00009751
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009752 Spaces.SpacesInAngles = false;
9753 verifyFormat("A<A<int>>();", Spaces);
9754}
9755
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00009756TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
9757 FormatStyle Style = getLLVMStyle();
9758 Style.SpaceAfterTemplateKeyword = false;
9759 verifyFormat("template<int> void foo();", Style);
9760}
9761
Jacques Pienaarfc275112015-02-18 23:48:37 +00009762TEST_F(FormatTest, TripleAngleBrackets) {
9763 verifyFormat("f<<<1, 1>>>();");
9764 verifyFormat("f<<<1, 1, 1, s>>>();");
9765 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +00009766 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +00009767 verifyFormat("f<param><<<1, 1>>>();");
9768 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +00009769 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +00009770 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9771 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +00009772 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
9773 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +00009774}
9775
9776TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +00009777 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +00009778 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +00009779 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9780 "aaallvm::outs() <<");
9781 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9782 "aaaallvm::outs()\n <<");
9783}
9784
Manuel Klimek819788d2014-03-18 11:22:45 +00009785TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
9786 std::string code = "#if A\n"
9787 "#if B\n"
9788 "a.\n"
9789 "#endif\n"
9790 " a = 1;\n"
9791 "#else\n"
9792 "#endif\n"
9793 "#if C\n"
9794 "#else\n"
9795 "#endif\n";
9796 EXPECT_EQ(code, format(code));
9797}
9798
Manuel Klimek68b03042014-04-14 09:14:11 +00009799TEST_F(FormatTest, HandleConflictMarkers) {
9800 // Git/SVN conflict markers.
9801 EXPECT_EQ("int a;\n"
9802 "void f() {\n"
9803 " callme(some(parameter1,\n"
9804 "<<<<<<< text by the vcs\n"
9805 " parameter2),\n"
9806 "||||||| text by the vcs\n"
9807 " parameter2),\n"
9808 " parameter3,\n"
9809 "======= text by the vcs\n"
9810 " parameter2, parameter3),\n"
9811 ">>>>>>> text by the vcs\n"
9812 " otherparameter);\n",
9813 format("int a;\n"
9814 "void f() {\n"
9815 " callme(some(parameter1,\n"
9816 "<<<<<<< text by the vcs\n"
9817 " parameter2),\n"
9818 "||||||| text by the vcs\n"
9819 " parameter2),\n"
9820 " parameter3,\n"
9821 "======= text by the vcs\n"
9822 " parameter2,\n"
9823 " parameter3),\n"
9824 ">>>>>>> text by the vcs\n"
9825 " otherparameter);\n"));
9826
9827 // Perforce markers.
9828 EXPECT_EQ("void f() {\n"
9829 " function(\n"
9830 ">>>> text by the vcs\n"
9831 " parameter,\n"
9832 "==== text by the vcs\n"
9833 " parameter,\n"
9834 "==== text by the vcs\n"
9835 " parameter,\n"
9836 "<<<< text by the vcs\n"
9837 " parameter);\n",
9838 format("void f() {\n"
9839 " function(\n"
9840 ">>>> text by the vcs\n"
9841 " parameter,\n"
9842 "==== text by the vcs\n"
9843 " parameter,\n"
9844 "==== text by the vcs\n"
9845 " parameter,\n"
9846 "<<<< text by the vcs\n"
9847 " parameter);\n"));
9848
9849 EXPECT_EQ("<<<<<<<\n"
9850 "|||||||\n"
9851 "=======\n"
9852 ">>>>>>>",
9853 format("<<<<<<<\n"
9854 "|||||||\n"
9855 "=======\n"
9856 ">>>>>>>"));
9857
9858 EXPECT_EQ("<<<<<<<\n"
9859 "|||||||\n"
9860 "int i;\n"
9861 "=======\n"
9862 ">>>>>>>",
9863 format("<<<<<<<\n"
9864 "|||||||\n"
9865 "int i;\n"
9866 "=======\n"
9867 ">>>>>>>"));
9868
9869 // FIXME: Handle parsing of macros around conflict markers correctly:
9870 EXPECT_EQ("#define Macro \\\n"
9871 "<<<<<<<\n"
9872 "Something \\\n"
9873 "|||||||\n"
9874 "Else \\\n"
9875 "=======\n"
9876 "Other \\\n"
9877 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00009878 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +00009879 format("#define Macro \\\n"
9880 "<<<<<<<\n"
9881 " Something \\\n"
9882 "|||||||\n"
9883 " Else \\\n"
9884 "=======\n"
9885 " Other \\\n"
9886 ">>>>>>>\n"
9887 " End\n"
9888 "int i;\n"));
9889}
9890
Daniel Jasper471894432014-08-06 13:40:26 +00009891TEST_F(FormatTest, DisableRegions) {
9892 EXPECT_EQ("int i;\n"
9893 "// clang-format off\n"
9894 " int j;\n"
9895 "// clang-format on\n"
9896 "int k;",
9897 format(" int i;\n"
9898 " // clang-format off\n"
9899 " int j;\n"
9900 " // clang-format on\n"
9901 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +00009902 EXPECT_EQ("int i;\n"
9903 "/* clang-format off */\n"
9904 " int j;\n"
9905 "/* clang-format on */\n"
9906 "int k;",
9907 format(" int i;\n"
9908 " /* clang-format off */\n"
9909 " int j;\n"
9910 " /* clang-format on */\n"
9911 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +00009912
9913 // Don't reflow comments within disabled regions.
9914 EXPECT_EQ(
9915 "// clang-format off\n"
9916 "// long long long long long long line\n"
9917 "/* clang-format on */\n"
9918 "/* long long long\n"
9919 " * long long long\n"
9920 " * line */\n"
9921 "int i;\n"
9922 "/* clang-format off */\n"
9923 "/* long long long long long long line */\n",
9924 format("// clang-format off\n"
9925 "// long long long long long long line\n"
9926 "/* clang-format on */\n"
9927 "/* long long long long long long line */\n"
9928 "int i;\n"
9929 "/* clang-format off */\n"
9930 "/* long long long long long long line */\n",
9931 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +00009932}
9933
Manuel Klimekf0c95b32015-06-11 10:14:13 +00009934TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
9935 format("? ) =");
9936 verifyNoCrash("#define a\\\n /**/}");
9937}
Manuel Klimek5f594f82014-08-13 14:00:41 +00009938
Daniel Jasper498f5582015-12-25 08:53:31 +00009939TEST_F(FormatTest, FormatsTableGenCode) {
9940 FormatStyle Style = getLLVMStyle();
9941 Style.Language = FormatStyle::LK_TableGen;
9942 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
9943}
9944
Nico Weberb2673a12016-11-10 21:49:25 +00009945TEST_F(FormatTest, ArrayOfTemplates) {
9946 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
9947 format("auto a = new unique_ptr<int > [ 10];"));
9948
9949 FormatStyle Spaces = getLLVMStyle();
9950 Spaces.SpacesInSquareBrackets = true;
9951 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
9952 format("auto a = new unique_ptr<int > [10];", Spaces));
9953}
9954
9955TEST_F(FormatTest, ArrayAsTemplateType) {
9956 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
9957 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
9958
9959 FormatStyle Spaces = getLLVMStyle();
9960 Spaces.SpacesInSquareBrackets = true;
9961 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
9962 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
9963}
9964
Eric Liu547d8792016-03-24 13:22:42 +00009965TEST(FormatStyle, GetStyleOfFile) {
9966 vfs::InMemoryFileSystem FS;
9967 // Test 1: format file in the same directory.
9968 ASSERT_TRUE(
9969 FS.addFile("/a/.clang-format", 0,
9970 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
9971 ASSERT_TRUE(
9972 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +00009973 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +00009974 ASSERT_TRUE((bool)Style1);
9975 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +00009976
Antonio Maiorano7eb75072017-01-20 01:22:42 +00009977 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +00009978 ASSERT_TRUE(
9979 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +00009980 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +00009981 ASSERT_TRUE((bool)Style2);
9982 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +00009983
Antonio Maiorano7eb75072017-01-20 01:22:42 +00009984 // Test 2.2: no format on 'none' fallback style.
9985 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
9986 ASSERT_TRUE((bool)Style2);
9987 ASSERT_EQ(*Style2, getNoStyle());
9988
9989 // Test 2.3: format if config is found with no based style while fallback is
9990 // 'none'.
9991 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
9992 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
9993 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
9994 ASSERT_TRUE((bool)Style2);
9995 ASSERT_EQ(*Style2, getLLVMStyle());
9996
9997 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
9998 Style2 = getStyle("{}", "a.h", "none", "", &FS);
9999 ASSERT_TRUE((bool)Style2);
10000 ASSERT_EQ(*Style2, getLLVMStyle());
10001
Eric Liu547d8792016-03-24 13:22:42 +000010002 // Test 3: format file in parent directory.
10003 ASSERT_TRUE(
10004 FS.addFile("/c/.clang-format", 0,
10005 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
10006 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
10007 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010008 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000010009 ASSERT_TRUE((bool)Style3);
10010 ASSERT_EQ(*Style3, getGoogleStyle());
10011
10012 // Test 4: error on invalid fallback style
10013 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
10014 ASSERT_FALSE((bool)Style4);
10015 llvm::consumeError(Style4.takeError());
10016
10017 // Test 5: error on invalid yaml on command line
10018 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
10019 ASSERT_FALSE((bool)Style5);
10020 llvm::consumeError(Style5.takeError());
10021
10022 // Test 6: error on invalid style
10023 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
10024 ASSERT_FALSE((bool)Style6);
10025 llvm::consumeError(Style6.takeError());
10026
10027 // Test 7: found config file, error on parsing it
10028 ASSERT_TRUE(
10029 FS.addFile("/d/.clang-format", 0,
10030 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
10031 "InvalidKey: InvalidValue")));
10032 ASSERT_TRUE(
10033 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
10034 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
10035 ASSERT_FALSE((bool)Style7);
10036 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000010037}
10038
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010039TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
10040 // Column limit is 20.
10041 std::string Code = "Type *a =\n"
10042 " new Type();\n"
10043 "g(iiiii, 0, jjjjj,\n"
10044 " 0, kkkkk, 0, mm);\n"
10045 "int bad = format ;";
10046 std::string Expected = "auto a = new Type();\n"
10047 "g(iiiii, nullptr,\n"
10048 " jjjjj, nullptr,\n"
10049 " kkkkk, nullptr,\n"
10050 " mm);\n"
10051 "int bad = format ;";
10052 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000010053 tooling::Replacements Replaces = toReplacements(
10054 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
10055 "auto "),
10056 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
10057 "nullptr"),
10058 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
10059 "nullptr"),
10060 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
10061 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010062
10063 format::FormatStyle Style = format::getLLVMStyle();
10064 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000010065 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
10066 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
10067 << llvm::toString(FormattedReplaces.takeError()) << "\n";
10068 auto Result = applyAllReplacements(Code, *FormattedReplaces);
10069 EXPECT_TRUE(static_cast<bool>(Result));
10070 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010071}
10072
Eric Liubaf58c22016-05-18 13:43:48 +000010073TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
10074 std::string Code = "#include \"a.h\"\n"
10075 "#include \"c.h\"\n"
10076 "\n"
10077 "int main() {\n"
10078 " return 0;\n"
10079 "}";
10080 std::string Expected = "#include \"a.h\"\n"
10081 "#include \"b.h\"\n"
10082 "#include \"c.h\"\n"
10083 "\n"
10084 "int main() {\n"
10085 " return 0;\n"
10086 "}";
10087 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000010088 tooling::Replacements Replaces = toReplacements(
10089 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
10090 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000010091
10092 format::FormatStyle Style = format::getLLVMStyle();
10093 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000010094 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
10095 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
10096 << llvm::toString(FormattedReplaces.takeError()) << "\n";
10097 auto Result = applyAllReplacements(Code, *FormattedReplaces);
10098 EXPECT_TRUE(static_cast<bool>(Result));
10099 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000010100}
10101
Daniel Jasperd246a5a2015-06-15 15:25:11 +000010102} // end namespace
10103} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000010104} // end namespace clang