blob: 30cc749624632f2970e37f832755042e89830e89 [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 Georgiev32eaa862017-03-01 15:35:39 +0000188 "} // namespace N",
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"
284 "\n"
285 "} // namespace",
286 format("namespace {\n"
287 "int i;\n"
288 "\n"
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000289 "}"));
290 EXPECT_EQ("namespace {\n"
291 "int i;\n"
292 "\n"
293 "} // namespace",
294 format("namespace {\n"
295 "int i;\n"
296 "\n"
297 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000298
299 FormatStyle Style = getLLVMStyle();
300 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
301 Style.MaxEmptyLinesToKeep = 2;
302 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
303 Style.BraceWrapping.AfterClass = true;
304 Style.BraceWrapping.AfterFunction = true;
305 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
306
307 EXPECT_EQ("class Foo\n"
308 "{\n"
309 " Foo() {}\n"
310 "\n"
311 " void funk() {}\n"
312 "};",
313 format("class Foo\n"
314 "{\n"
315 " Foo()\n"
316 " {\n"
317 " }\n"
318 "\n"
319 " void funk() {}\n"
320 "};",
321 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000322}
323
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000324TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000325 verifyFormat("x = (a) and (b);");
326 verifyFormat("x = (a) or (b);");
327 verifyFormat("x = (a) bitand (b);");
328 verifyFormat("x = (a) bitor (b);");
329 verifyFormat("x = (a) not_eq (b);");
330 verifyFormat("x = (a) and_eq (b);");
331 verifyFormat("x = (a) or_eq (b);");
332 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000333}
334
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000335//===----------------------------------------------------------------------===//
336// Tests for control statements.
337//===----------------------------------------------------------------------===//
338
Daniel Jaspercdd06622013-05-14 10:31:09 +0000339TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000340 verifyFormat("if (true)\n f();\ng();");
341 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000342 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000343
Daniel Jasper3a685df2013-05-16 12:12:21 +0000344 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000345 AllowsMergedIf.AlignEscapedNewlinesLeft = true;
Daniel Jasperced17f82013-01-16 15:44:34 +0000346 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
347 verifyFormat("if (a)\n"
348 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000349 " f();",
350 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000351 verifyFormat("{\n"
352 " if (a)\n"
353 " label:\n"
354 " f();\n"
355 "}",
356 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000357 verifyFormat("#define A \\\n"
358 " if (a) \\\n"
359 " label: \\\n"
360 " f()",
361 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000362 verifyFormat("if (a)\n"
363 " ;",
364 AllowsMergedIf);
365 verifyFormat("if (a)\n"
366 " if (b) return;",
367 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000368
Daniel Jasper3a685df2013-05-16 12:12:21 +0000369 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000370 " f();\n",
371 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000372 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000373 " f();",
374 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000375 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000376 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000377 "}",
378 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000379 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000380 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000381 "}",
382 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000383
384 AllowsMergedIf.ColumnLimit = 14;
385 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000386 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000387 " return;",
388 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000389
390 AllowsMergedIf.ColumnLimit = 13;
391 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000392}
393
Daniel Jasper3a685df2013-05-16 12:12:21 +0000394TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
395 FormatStyle AllowsMergedLoops = getLLVMStyle();
396 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
397 verifyFormat("while (true) continue;", AllowsMergedLoops);
398 verifyFormat("for (;;) continue;", AllowsMergedLoops);
399 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
400 verifyFormat("while (true)\n"
401 " ;",
402 AllowsMergedLoops);
403 verifyFormat("for (;;)\n"
404 " ;",
405 AllowsMergedLoops);
406 verifyFormat("for (;;)\n"
407 " for (;;) continue;",
408 AllowsMergedLoops);
409 verifyFormat("for (;;) // Can't merge this\n"
410 " continue;",
411 AllowsMergedLoops);
412 verifyFormat("for (;;) /* still don't merge */\n"
413 " continue;",
414 AllowsMergedLoops);
415}
416
Daniel Jasper17605d32014-05-14 09:33:35 +0000417TEST_F(FormatTest, FormatShortBracedStatements) {
418 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
419 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
420
421 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
422 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
423
424 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
425 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
426 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
427 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
428 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
429 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
430 verifyFormat("if (true) { //\n"
431 " f();\n"
432 "}",
433 AllowSimpleBracedStatements);
434 verifyFormat("if (true) {\n"
435 " f();\n"
436 " f();\n"
437 "}",
438 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000439 verifyFormat("if (true) {\n"
440 " f();\n"
441 "} else {\n"
442 " f();\n"
443 "}",
444 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000445
Daniel Jasperbd630732014-05-22 13:25:26 +0000446 verifyFormat("template <int> struct A2 {\n"
447 " struct B {};\n"
448 "};",
449 AllowSimpleBracedStatements);
450
Daniel Jasper17605d32014-05-14 09:33:35 +0000451 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
452 verifyFormat("if (true) {\n"
453 " f();\n"
454 "}",
455 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000456 verifyFormat("if (true) {\n"
457 " f();\n"
458 "} else {\n"
459 " f();\n"
460 "}",
461 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000462
463 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
464 verifyFormat("while (true) {\n"
465 " f();\n"
466 "}",
467 AllowSimpleBracedStatements);
468 verifyFormat("for (;;) {\n"
469 " f();\n"
470 "}",
471 AllowSimpleBracedStatements);
472}
473
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000474TEST_F(FormatTest, ParseIfElse) {
475 verifyFormat("if (true)\n"
476 " if (true)\n"
477 " if (true)\n"
478 " f();\n"
479 " else\n"
480 " g();\n"
481 " else\n"
482 " h();\n"
483 "else\n"
484 " i();");
485 verifyFormat("if (true)\n"
486 " if (true)\n"
487 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000488 " if (true)\n"
489 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000490 " } else {\n"
491 " g();\n"
492 " }\n"
493 " else\n"
494 " h();\n"
495 "else {\n"
496 " i();\n"
497 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000498 verifyFormat("void f() {\n"
499 " if (a) {\n"
500 " } else {\n"
501 " }\n"
502 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000503}
504
505TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000506 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000507 verifyFormat("if (a)\n"
508 " f();\n"
509 "else if (b)\n"
510 " g();\n"
511 "else\n"
512 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000513 verifyFormat("if (a) {\n"
514 " f();\n"
515 "}\n"
516 "// or else ..\n"
517 "else {\n"
518 " g()\n"
519 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000520
521 verifyFormat("if (a) {\n"
522 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
523 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
524 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000525 verifyFormat("if (a) {\n"
526 "} else if (\n"
527 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
528 "}",
529 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000530}
531
Daniel Jasperf7935112012-12-03 18:12:45 +0000532TEST_F(FormatTest, FormatsForLoop) {
533 verifyFormat(
534 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000535 " ++VeryVeryLongLoopVariable)\n"
536 " ;");
537 verifyFormat("for (;;)\n"
538 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000539 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000540 verifyFormat("for (;;) {\n"
541 " f();\n"
542 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000543 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000544
545 verifyFormat(
546 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
547 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000548 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000549
550 verifyFormat(
551 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000552 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000553 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
554 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000555 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000556 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
557 " I = FD->getDeclsInPrototypeScope().begin(),\n"
558 " E = FD->getDeclsInPrototypeScope().end();\n"
559 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000560 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
561 " I = Container.begin(),\n"
562 " E = Container.end();\n"
563 " I != E; ++I) {\n}",
564 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000565
Daniel Jasper48c62f92013-01-28 17:30:17 +0000566 verifyFormat(
567 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
568 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000569 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
570 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000571 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000572 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
573 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
574 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000575 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
576 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
577 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000578 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
579 " aaaaaaaaaa);\n"
580 " iter; ++iter) {\n"
581 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000582 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
583 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
584 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
585 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000586
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000587 FormatStyle NoBinPacking = getLLVMStyle();
588 NoBinPacking.BinPackParameters = false;
589 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
590 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
591 " aaaaaaaaaaaaaaaa,\n"
592 " aaaaaaaaaaaaaaaa,\n"
593 " aaaaaaaaaaaaaaaa);\n"
594 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
595 "}",
596 NoBinPacking);
597 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000598 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
599 " E = UnwrappedLines.end();\n"
600 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000601 " ++I) {\n}",
602 NoBinPacking);
Daniel Jasperf7935112012-12-03 18:12:45 +0000603}
604
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000605TEST_F(FormatTest, RangeBasedForLoops) {
606 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
607 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
608 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
609 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000610 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
611 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000612 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
613 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000614}
615
Daniel Jaspere1e43192014-04-01 12:55:11 +0000616TEST_F(FormatTest, ForEachLoops) {
617 verifyFormat("void f() {\n"
618 " foreach (Item *item, itemlist) {}\n"
619 " Q_FOREACH (Item *item, itemlist) {}\n"
620 " BOOST_FOREACH (Item *item, itemlist) {}\n"
621 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
622 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000623
624 // As function-like macros.
625 verifyFormat("#define foreach(x, y)\n"
626 "#define Q_FOREACH(x, y)\n"
627 "#define BOOST_FOREACH(x, y)\n"
628 "#define UNKNOWN_FOREACH(x, y)\n");
629
630 // Not as function-like macros.
631 verifyFormat("#define foreach (x, y)\n"
632 "#define Q_FOREACH (x, y)\n"
633 "#define BOOST_FOREACH (x, y)\n"
634 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000635}
636
Daniel Jasperf7935112012-12-03 18:12:45 +0000637TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000638 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000639 verifyFormat("while (true)\n"
640 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000641 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000642 verifyFormat("while () {\n"
643 " f();\n"
644 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000645}
646
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000647TEST_F(FormatTest, FormatsDoWhile) {
648 verifyFormat("do {\n"
649 " do_something();\n"
650 "} while (something());");
651 verifyFormat("do\n"
652 " do_something();\n"
653 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000654}
655
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000656TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000657 verifyFormat("switch (x) {\n"
658 "case 1:\n"
659 " f();\n"
660 " break;\n"
661 "case kFoo:\n"
662 "case ns::kBar:\n"
663 "case kBaz:\n"
664 " break;\n"
665 "default:\n"
666 " g();\n"
667 " break;\n"
668 "}");
669 verifyFormat("switch (x) {\n"
670 "case 1: {\n"
671 " f();\n"
672 " break;\n"
673 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000674 "case 2: {\n"
675 " break;\n"
676 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000677 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000678 verifyFormat("switch (x) {\n"
679 "case 1: {\n"
680 " f();\n"
681 " {\n"
682 " g();\n"
683 " h();\n"
684 " }\n"
685 " break;\n"
686 "}\n"
687 "}");
688 verifyFormat("switch (x) {\n"
689 "case 1: {\n"
690 " f();\n"
691 " if (foo) {\n"
692 " g();\n"
693 " h();\n"
694 " }\n"
695 " break;\n"
696 "}\n"
697 "}");
698 verifyFormat("switch (x) {\n"
699 "case 1: {\n"
700 " f();\n"
701 " g();\n"
702 "} break;\n"
703 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000704 verifyFormat("switch (test)\n"
705 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000706 verifyFormat("switch (x) {\n"
707 "default: {\n"
708 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000709 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000710 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000711 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000712 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000713 "// if 1, do f()\n"
714 "case 1:\n"
715 " f();\n"
716 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000717 verifyFormat("switch (x) {\n"
718 "case 1:\n"
719 " // Do amazing stuff\n"
720 " {\n"
721 " f();\n"
722 " g();\n"
723 " }\n"
724 " break;\n"
725 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000726 verifyFormat("#define A \\\n"
727 " switch (x) { \\\n"
728 " case a: \\\n"
729 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000730 " }",
731 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000732 verifyFormat("#define OPERATION_CASE(name) \\\n"
733 " case OP_name: \\\n"
734 " return operations::Operation##name\n",
735 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000736 verifyFormat("switch (x) {\n"
737 "case 1:;\n"
738 "default:;\n"
739 " int i;\n"
740 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000741
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000742 verifyGoogleFormat("switch (x) {\n"
743 " case 1:\n"
744 " f();\n"
745 " break;\n"
746 " case kFoo:\n"
747 " case ns::kBar:\n"
748 " case kBaz:\n"
749 " break;\n"
750 " default:\n"
751 " g();\n"
752 " break;\n"
753 "}");
754 verifyGoogleFormat("switch (x) {\n"
755 " case 1: {\n"
756 " f();\n"
757 " break;\n"
758 " }\n"
759 "}");
760 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000761 " ;");
762
763 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
764 " case OP_name: \\\n"
765 " return operations::Operation##name\n");
766 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
767 " // Get the correction operation class.\n"
768 " switch (OpCode) {\n"
769 " CASE(Add);\n"
770 " CASE(Subtract);\n"
771 " default:\n"
772 " return operations::Unknown;\n"
773 " }\n"
774 "#undef OPERATION_CASE\n"
775 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000776 verifyFormat("DEBUG({\n"
777 " switch (x) {\n"
778 " case A:\n"
779 " f();\n"
780 " break;\n"
781 " // On B:\n"
782 " case B:\n"
783 " g();\n"
784 " break;\n"
785 " }\n"
786 "});");
Daniel Jasper031e2402014-04-28 07:48:36 +0000787 verifyFormat("switch (a) {\n"
788 "case (b):\n"
789 " return;\n"
790 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000791
792 verifyFormat("switch (a) {\n"
793 "case some_namespace::\n"
794 " some_constant:\n"
795 " return;\n"
796 "}",
797 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000798}
799
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000800TEST_F(FormatTest, CaseRanges) {
801 verifyFormat("switch (x) {\n"
802 "case 'A' ... 'Z':\n"
803 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000804 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000805 " break;\n"
806 "}");
807}
808
Daniel Jasperb87899b2014-09-10 13:11:45 +0000809TEST_F(FormatTest, ShortCaseLabels) {
810 FormatStyle Style = getLLVMStyle();
811 Style.AllowShortCaseLabelsOnASingleLine = true;
812 verifyFormat("switch (a) {\n"
813 "case 1: x = 1; break;\n"
814 "case 2: return;\n"
815 "case 3:\n"
816 "case 4:\n"
817 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +0000818 "case 6: // comment\n"
819 " return;\n"
820 "case 7:\n"
821 " // comment\n"
822 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +0000823 "case 8:\n"
824 " x = 8; // comment\n"
825 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000826 "default: y = 1; break;\n"
827 "}",
828 Style);
829 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +0000830 "#if FOO\n"
831 "case 0: return 0;\n"
832 "#endif\n"
833 "}",
834 Style);
835 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000836 "case 1: {\n"
837 "}\n"
838 "case 2: {\n"
839 " return;\n"
840 "}\n"
841 "case 3: {\n"
842 " x = 1;\n"
843 " return;\n"
844 "}\n"
845 "case 4:\n"
846 " if (x)\n"
847 " return;\n"
848 "}",
849 Style);
850 Style.ColumnLimit = 21;
851 verifyFormat("switch (a) {\n"
852 "case 1: x = 1; break;\n"
853 "case 2: return;\n"
854 "case 3:\n"
855 "case 4:\n"
856 "case 5: return;\n"
857 "default:\n"
858 " y = 1;\n"
859 " break;\n"
860 "}",
861 Style);
862}
863
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000864TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000865 verifyFormat("void f() {\n"
866 " some_code();\n"
867 "test_label:\n"
868 " some_other_code();\n"
869 " {\n"
870 " some_more_code();\n"
871 " another_label:\n"
872 " some_more_code();\n"
873 " }\n"
874 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +0000875 verifyFormat("{\n"
876 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000877 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +0000878 " some_other_code();\n"
879 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000880 verifyFormat("{\n"
881 " some_code();\n"
882 "test_label:;\n"
883 " int i = 0;\n"
884 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000885}
886
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000887//===----------------------------------------------------------------------===//
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000888// Tests for classes, namespaces, etc.
889//===----------------------------------------------------------------------===//
890
891TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +0000892 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000893}
894
895TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
896 verifyFormat("class A {\n"
897 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +0000898 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000899 "protected:\n"
900 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000901 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000902 "};");
903 verifyGoogleFormat("class A {\n"
904 " public:\n"
905 " protected:\n"
906 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000907 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000908 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +0000909 verifyFormat("class A {\n"
910 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +0000911 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +0000912 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +0000913 " void f2() {}\n"
914 "protected slots:\n"
915 " void f3() {}\n"
916 "protected Q_SLOTS:\n"
917 " void f4() {}\n"
918 "private slots:\n"
919 " void f5() {}\n"
920 "private Q_SLOTS:\n"
921 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +0000922 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +0000923 " void g1();\n"
924 "Q_SIGNALS:\n"
925 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +0000926 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +0000927
928 // Don't interpret 'signals' the wrong way.
929 verifyFormat("signals.set();");
930 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +0000931 verifyFormat("{\n"
932 " signals.set(); // This needs indentation.\n"
933 "}");
Daniel Jasper31343832016-07-27 10:13:24 +0000934 verifyFormat("void f() {\n"
935 "label:\n"
936 " signals.baz();\n"
937 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000938}
939
Alexander Kornienkofd433362013-03-27 17:08:02 +0000940TEST_F(FormatTest, SeparatesLogicalBlocks) {
941 EXPECT_EQ("class A {\n"
942 "public:\n"
943 " void f();\n"
944 "\n"
945 "private:\n"
946 " void g() {}\n"
947 " // test\n"
948 "protected:\n"
949 " int h;\n"
950 "};",
951 format("class A {\n"
952 "public:\n"
953 "void f();\n"
954 "private:\n"
955 "void g() {}\n"
956 "// test\n"
957 "protected:\n"
958 "int h;\n"
959 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +0000960 EXPECT_EQ("class A {\n"
961 "protected:\n"
962 "public:\n"
963 " void f();\n"
964 "};",
965 format("class A {\n"
966 "protected:\n"
967 "\n"
968 "public:\n"
969 "\n"
970 " void f();\n"
971 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +0000972
973 // Even ensure proper spacing inside macros.
974 EXPECT_EQ("#define B \\\n"
975 " class A { \\\n"
976 " protected: \\\n"
977 " public: \\\n"
978 " void f(); \\\n"
979 " };",
980 format("#define B \\\n"
981 " class A { \\\n"
982 " protected: \\\n"
983 " \\\n"
984 " public: \\\n"
985 " \\\n"
986 " void f(); \\\n"
987 " };",
988 getGoogleStyle()));
989 // But don't remove empty lines after macros ending in access specifiers.
990 EXPECT_EQ("#define A private:\n"
991 "\n"
992 "int i;",
993 format("#define A private:\n"
994 "\n"
995 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +0000996}
997
Daniel Jasper83193602013-04-05 17:22:09 +0000998TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +0000999 verifyFormat("class A : public B {};");
1000 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001001
1002 verifyFormat(
1003 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001004 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00001005 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1006 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001007 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001008 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001009 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00001010 verifyFormat("class AAAAAAAAAAAA : public B,\n"
1011 " public C,\n"
1012 " public D,\n"
1013 " public E,\n"
1014 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001015 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00001016
1017 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00001018 " ReallyReallyLongClassName {\n"
1019 " int i;\n"
1020 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00001021 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00001022 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1023 " aaaaaaaaaaaaaaaa> {};");
1024 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1025 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1026 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00001027 verifyFormat("template <class R, class C>\n"
1028 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1029 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00001030 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00001031}
1032
Manuel Klimek28cacc72013-01-07 18:10:23 +00001033TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00001034 verifyFormat("class A {\n} a, b;");
1035 verifyFormat("struct A {\n} a, b;");
1036 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00001037}
1038
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001039TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001040 verifyFormat("enum {\n"
1041 " Zero,\n"
1042 " One = 1,\n"
1043 " Two = One + 1,\n"
1044 " Three = (One + Two),\n"
1045 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1046 " Five = (One, Two, Three, Four, 5)\n"
1047 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001048 verifyGoogleFormat("enum {\n"
1049 " Zero,\n"
1050 " One = 1,\n"
1051 " Two = One + 1,\n"
1052 " Three = (One + Two),\n"
1053 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1054 " Five = (One, Two, Three, Four, 5)\n"
1055 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001056 verifyFormat("enum Enum {};");
1057 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001058 verifyFormat("enum X E {} d;");
1059 verifyFormat("enum __attribute__((...)) E {} d;");
1060 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00001061 verifyFormat("enum {\n"
1062 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001063 "};",
1064 getLLVMStyleWithColumns(30));
1065
1066 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00001067 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001068
1069 EXPECT_EQ("enum KeepEmptyLines {\n"
1070 " ONE,\n"
1071 "\n"
1072 " TWO,\n"
1073 "\n"
1074 " THREE\n"
1075 "}",
1076 format("enum KeepEmptyLines {\n"
1077 " ONE,\n"
1078 "\n"
1079 " TWO,\n"
1080 "\n"
1081 "\n"
1082 " THREE\n"
1083 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00001084 verifyFormat("enum E { // comment\n"
1085 " ONE,\n"
1086 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00001087 "};\n"
1088 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001089 // Not enums.
1090 verifyFormat("enum X f() {\n"
1091 " a();\n"
1092 " return 42;\n"
1093 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00001094 verifyFormat("enum X Type::f() {\n"
1095 " a();\n"
1096 " return 42;\n"
1097 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00001098 verifyFormat("enum ::X f() {\n"
1099 " a();\n"
1100 " return 42;\n"
1101 "}");
1102 verifyFormat("enum ns::X f() {\n"
1103 " a();\n"
1104 " return 42;\n"
1105 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00001106}
1107
Daniel Jasperb7150872013-08-30 10:10:19 +00001108TEST_F(FormatTest, FormatsEnumsWithErrors) {
1109 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001110 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001111 " Two = 1;\n"
1112 "};");
1113 verifyFormat("namespace n {\n"
1114 "enum Type {\n"
1115 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001116 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00001117 " int i;\n"
1118 "}\n"
1119 "void g() {}");
1120}
1121
Daniel Jasper2b41a822013-08-20 12:42:50 +00001122TEST_F(FormatTest, FormatsEnumStruct) {
1123 verifyFormat("enum struct {\n"
1124 " Zero,\n"
1125 " One = 1,\n"
1126 " Two = One + 1,\n"
1127 " Three = (One + Two),\n"
1128 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1129 " Five = (One, Two, Three, Four, 5)\n"
1130 "};");
1131 verifyFormat("enum struct Enum {};");
1132 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001133 verifyFormat("enum struct X E {} d;");
1134 verifyFormat("enum struct __attribute__((...)) E {} d;");
1135 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001136 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
1137}
1138
1139TEST_F(FormatTest, FormatsEnumClass) {
1140 verifyFormat("enum class {\n"
1141 " Zero,\n"
1142 " One = 1,\n"
1143 " Two = One + 1,\n"
1144 " Three = (One + Two),\n"
1145 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
1146 " Five = (One, Two, Three, Four, 5)\n"
1147 "};");
1148 verifyFormat("enum class Enum {};");
1149 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00001150 verifyFormat("enum class X E {} d;");
1151 verifyFormat("enum class __attribute__((...)) E {} d;");
1152 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00001153 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
1154}
1155
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001156TEST_F(FormatTest, FormatsEnumTypes) {
1157 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00001158 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001159 " B\n"
1160 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00001161 verifyFormat("enum X : int { A, B };");
1162 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00001163}
1164
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001165TEST_F(FormatTest, FormatsNSEnums) {
1166 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1167 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1168 " // Information about someDecentlyLongValue.\n"
1169 " someDecentlyLongValue,\n"
1170 " // Information about anotherDecentlyLongValue.\n"
1171 " anotherDecentlyLongValue,\n"
1172 " // Information about aThirdDecentlyLongValue.\n"
1173 " aThirdDecentlyLongValue\n"
1174 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00001175 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1176 " a = 1,\n"
1177 " b = 2,\n"
1178 " c = 3,\n"
1179 "};");
1180 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1181 " a = 1,\n"
1182 " b = 2,\n"
1183 " c = 3,\n"
1184 "};");
1185 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1186 " a = 1,\n"
1187 " b = 2,\n"
1188 " c = 3,\n"
1189 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00001190}
1191
Nico Weber7769a902013-01-14 05:49:49 +00001192TEST_F(FormatTest, FormatsBitfields) {
1193 verifyFormat("struct Bitfields {\n"
1194 " unsigned sClass : 8;\n"
1195 " unsigned ValueKind : 2;\n"
1196 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00001197 verifyFormat("struct A {\n"
1198 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1199 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1200 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00001201 verifyFormat("struct MyStruct {\n"
1202 " uchar data;\n"
1203 " uchar : 8;\n"
1204 " uchar : 8;\n"
1205 " uchar other;\n"
1206 "};");
Nico Weber7769a902013-01-14 05:49:49 +00001207}
1208
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001209TEST_F(FormatTest, FormatsNamespaces) {
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001210 FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1211 LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1212
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001213 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001214 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001215 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001216 "}",
1217 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001218 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001219 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001220 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001221 "}",
1222 LLVMWithNoNamespaceFix);
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00001223 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001224 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001225 "void f() { f(); }\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001226 "}",
1227 LLVMWithNoNamespaceFix);
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001228 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001229 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001230 "void f() { f(); }",
1231 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001232
1233 // This code is more common than we thought; if we
1234 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001235 // its own line, which is undesirable.
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001236 verifyFormat("namespace {};",
1237 LLVMWithNoNamespaceFix);
Manuel Klimek046b9302013-02-06 16:08:09 +00001238 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001239 "class A {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001240 "};",
1241 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001242
1243 verifyFormat("namespace {\n"
1244 "int SomeVariable = 0; // comment\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001245 "} // namespace",
1246 LLVMWithNoNamespaceFix);
Daniel Jasper251b3c92013-07-01 11:22:57 +00001247 EXPECT_EQ("#ifndef HEADER_GUARD\n"
1248 "#define HEADER_GUARD\n"
1249 "namespace my_namespace {\n"
1250 "int i;\n"
1251 "} // my_namespace\n"
1252 "#endif // HEADER_GUARD",
1253 format("#ifndef HEADER_GUARD\n"
1254 " #define HEADER_GUARD\n"
1255 " namespace my_namespace {\n"
1256 "int i;\n"
1257 "} // my_namespace\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001258 "#endif // HEADER_GUARD",
1259 LLVMWithNoNamespaceFix));
Daniel Jasper65ee3472013-07-31 23:16:02 +00001260
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001261 EXPECT_EQ("namespace A::B {\n"
1262 "class C {};\n"
1263 "}",
1264 format("namespace A::B {\n"
1265 "class C {};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001266 "}",
1267 LLVMWithNoNamespaceFix));
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00001268
Daniel Jasper65ee3472013-07-31 23:16:02 +00001269 FormatStyle Style = getLLVMStyle();
1270 Style.NamespaceIndentation = FormatStyle::NI_All;
1271 EXPECT_EQ("namespace out {\n"
1272 " int i;\n"
1273 " namespace in {\n"
1274 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001275 " } // namespace in\n"
1276 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001277 format("namespace out {\n"
1278 "int i;\n"
1279 "namespace in {\n"
1280 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001281 "} // namespace in\n"
1282 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001283 Style));
1284
1285 Style.NamespaceIndentation = FormatStyle::NI_Inner;
1286 EXPECT_EQ("namespace out {\n"
1287 "int i;\n"
1288 "namespace in {\n"
1289 " int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001290 "} // namespace in\n"
1291 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001292 format("namespace out {\n"
1293 "int i;\n"
1294 "namespace in {\n"
1295 "int i;\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001296 "} // namespace in\n"
1297 "} // namespace out",
Daniel Jasper65ee3472013-07-31 23:16:02 +00001298 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001299}
1300
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001301TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00001302
Daniel Jasper40aacf42013-03-14 13:45:21 +00001303TEST_F(FormatTest, FormatsInlineASM) {
1304 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00001305 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00001306 verifyFormat(
1307 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1308 " \"cpuid\\n\\t\"\n"
1309 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00001310 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00001311 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00001312 EXPECT_EQ(
1313 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001314 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001315 " mov edx,[that] // vtable in edx\n"
1316 " mov eax,methodIndex\n"
1317 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00001318 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00001319 "}",
1320 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1321 " __asm {\n"
1322 " mov edx,[that] // vtable in edx\n"
1323 " mov eax,methodIndex\n"
1324 " call [edx][eax*4] // stdcall\n"
1325 " }\n"
1326 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00001327 EXPECT_EQ("_asm {\n"
1328 " xor eax, eax;\n"
1329 " cpuid;\n"
1330 "}",
1331 format("_asm {\n"
1332 " xor eax, eax;\n"
1333 " cpuid;\n"
1334 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00001335 verifyFormat("void function() {\n"
1336 " // comment\n"
1337 " asm(\"\");\n"
1338 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00001339 EXPECT_EQ("__asm {\n"
1340 "}\n"
1341 "int i;",
1342 format("__asm {\n"
1343 "}\n"
1344 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00001345}
1346
Nico Weberd5650bd2013-01-07 16:36:17 +00001347TEST_F(FormatTest, FormatTryCatch) {
1348 verifyFormat("try {\n"
1349 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001350 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001351 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001352 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001353 " exit(42);\n"
1354 "}");
1355
1356 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00001357 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001358 " return 5;\n"
1359 "}");
1360 verifyFormat("class A {\n"
1361 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001362 " A() try : a(0) {\n"
1363 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00001364 " throw;\n"
1365 " }\n"
1366 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00001367
1368 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001369 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00001370}
1371
Nico Weberfac23712015-02-04 15:26:27 +00001372TEST_F(FormatTest, FormatSEHTryCatch) {
1373 verifyFormat("__try {\n"
1374 " int a = b * c;\n"
1375 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
1376 " // Do nothing.\n"
1377 "}");
1378
1379 verifyFormat("__try {\n"
1380 " int a = b * c;\n"
1381 "} __finally {\n"
1382 " // Do nothing.\n"
1383 "}");
1384
1385 verifyFormat("DEBUG({\n"
1386 " __try {\n"
1387 " } __finally {\n"
1388 " }\n"
1389 "});\n");
1390}
1391
Daniel Jasper04a71a42014-05-08 11:58:24 +00001392TEST_F(FormatTest, IncompleteTryCatchBlocks) {
1393 verifyFormat("try {\n"
1394 " f();\n"
1395 "} catch {\n"
1396 " g();\n"
1397 "}");
1398 verifyFormat("try {\n"
1399 " f();\n"
1400 "} catch (A a) MACRO(x) {\n"
1401 " g();\n"
1402 "} catch (B b) MACRO(x) {\n"
1403 " g();\n"
1404 "}");
1405}
1406
1407TEST_F(FormatTest, FormatTryCatchBraceStyles) {
1408 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00001409 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
1410 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00001411 Style.BreakBeforeBraces = BraceStyle;
1412 verifyFormat("try {\n"
1413 " // something\n"
1414 "} catch (...) {\n"
1415 " // something\n"
1416 "}",
1417 Style);
1418 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00001419 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
1420 verifyFormat("try {\n"
1421 " // something\n"
1422 "}\n"
1423 "catch (...) {\n"
1424 " // something\n"
1425 "}",
1426 Style);
Nico Weberfac23712015-02-04 15:26:27 +00001427 verifyFormat("__try {\n"
1428 " // something\n"
1429 "}\n"
1430 "__finally {\n"
1431 " // something\n"
1432 "}",
1433 Style);
Nico Weber33381f52015-02-07 01:57:32 +00001434 verifyFormat("@try {\n"
1435 " // something\n"
1436 "}\n"
1437 "@finally {\n"
1438 " // something\n"
1439 "}",
1440 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001441 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
1442 verifyFormat("try\n"
1443 "{\n"
1444 " // something\n"
1445 "}\n"
1446 "catch (...)\n"
1447 "{\n"
1448 " // something\n"
1449 "}",
1450 Style);
1451 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
1452 verifyFormat("try\n"
1453 " {\n"
1454 " // something\n"
1455 " }\n"
1456 "catch (...)\n"
1457 " {\n"
1458 " // something\n"
1459 " }",
1460 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00001461 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1462 Style.BraceWrapping.BeforeCatch = true;
1463 verifyFormat("try {\n"
1464 " // something\n"
1465 "}\n"
1466 "catch (...) {\n"
1467 " // something\n"
1468 "}",
1469 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00001470}
1471
Daniel Jaspere25509f2012-12-17 11:29:41 +00001472TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001473 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00001474
Daniel Jaspera44991332015-04-29 13:06:49 +00001475 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
1476 " 100000000, "
1477 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00001478
Daniel Jasper473c62c2013-05-17 09:35:01 +00001479 // Here, everything other than the "}" would fit on a line.
1480 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001481 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00001482 EXPECT_EQ("S s = {a,\n"
1483 "\n"
1484 " b};",
1485 format("S s = {\n"
1486 " a,\n"
1487 "\n"
1488 " b\n"
1489 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00001490
1491 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
1492 // line. However, the formatting looks a bit off and this probably doesn't
1493 // happen often in practice.
1494 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001495 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00001496 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001497}
1498
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001499TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001500 verifyFormat("const struct A a = {.a = 1, .b = 2};");
1501 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
1502 " .bbbbbbbbbb = 2,\n"
1503 " .cccccccccc = 3,\n"
1504 " .dddddddddd = 4,\n"
1505 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001506 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001507 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
1508 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
1509 " .ccccccccccccccccccccccccccc = 3,\n"
1510 " .ddddddddddddddddddddddddddd = 4,\n"
1511 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00001512
1513 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
1514}
1515
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001516TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00001517 verifyFormat("static A x = {{{}}};\n");
1518 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
1519 " {init1, init2, init3, init4}}};",
1520 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00001521
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001522 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001523 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1524 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1525 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
1526 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00001527 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001528 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1529 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1530 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00001531 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
1532 " {rect.fRight - rect.fLeft, rect.fBottom - "
1533 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001534
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001535 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001536 "SomeArrayOfSomeType a = {\n"
1537 " {{1, 2, 3},\n"
1538 " {1, 2, 3},\n"
1539 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
1540 " 333333333333333333333333333333},\n"
1541 " {1, 2, 3},\n"
1542 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00001543 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00001544 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001545 " {{1, 2, 3}},\n"
1546 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00001547 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
1548 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00001549 " {{1, 2, 3}},\n"
1550 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00001551
Daniel Jaspera44991332015-04-29 13:06:49 +00001552 verifyFormat("struct {\n"
1553 " unsigned bit;\n"
1554 " const char *const name;\n"
1555 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
1556 " {kOsWin, \"Windows\"},\n"
1557 " {kOsLinux, \"Linux\"},\n"
1558 " {kOsCrOS, \"Chrome OS\"}};");
1559 verifyFormat("struct {\n"
1560 " unsigned bit;\n"
1561 " const char *const name;\n"
1562 "} kBitsToOs[] = {\n"
1563 " {kOsMac, \"Mac\"},\n"
1564 " {kOsWin, \"Windows\"},\n"
1565 " {kOsLinux, \"Linux\"},\n"
1566 " {kOsCrOS, \"Chrome OS\"},\n"
1567 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00001568}
1569
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001570TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
1571 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
1572 " \\\n"
1573 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
1574}
1575
Daniel Jasperda16db32013-01-07 10:48:50 +00001576TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00001577 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
1578 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00001579
1580 // Do break defaulted and deleted functions.
1581 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1582 " default;",
1583 getLLVMStyleWithColumns(40));
1584 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1585 " delete;",
1586 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00001587}
1588
1589TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
1590 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
1591 getLLVMStyleWithColumns(40));
1592 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1593 getLLVMStyleWithColumns(40));
1594 EXPECT_EQ("#define Q \\\n"
1595 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
1596 " \"aaaaaaaa.cpp\"",
1597 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1598 getLLVMStyleWithColumns(40)));
1599}
1600
1601TEST_F(FormatTest, UnderstandsLinePPDirective) {
1602 EXPECT_EQ("# 123 \"A string literal\"",
1603 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00001604}
1605
Manuel Klimek591b5802013-01-31 15:58:48 +00001606TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00001607 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00001608 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001609}
1610
1611TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
1612 EXPECT_EQ("#line 42 \"test\"\n",
1613 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001614 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
1615 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001616}
1617
1618TEST_F(FormatTest, EndOfFileEndsPPDirective) {
1619 EXPECT_EQ("#line 42 \"test\"",
1620 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001621 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00001622}
1623
Daniel Jasper877615c2013-10-11 19:45:02 +00001624TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
1625 verifyFormat("#define A \\x20");
1626 verifyFormat("#define A \\ x20");
1627 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
1628 verifyFormat("#define A ''");
1629 verifyFormat("#define A ''qqq");
1630 verifyFormat("#define A `qqq");
1631 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00001632 EXPECT_EQ("const char *c = STRINGIFY(\n"
1633 "\\na : b);",
1634 format("const char * c = STRINGIFY(\n"
1635 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00001636
1637 verifyFormat("a\r\\");
1638 verifyFormat("a\v\\");
1639 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00001640}
1641
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001642TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001643 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
1644 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001645 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001646 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00001647 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00001648
1649 verifyFormat("#define A A\n#define A A");
1650 verifyFormat("#define A(X) A\n#define A A");
1651
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001652 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
1653 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001654}
1655
1656TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001657 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001658 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00001659 "#define A( \\\n"
1660 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001661 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001662 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001663 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00001664 " #include \"a.h\"\n"
1665 "#define A(A,\\\n"
1666 " B)\n"
1667 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001668 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001669 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00001670}
1671
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001672TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00001673
1674TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
1675 EXPECT_EQ("#define A \\\n"
1676 " c; \\\n"
1677 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001678 "f;",
1679 format("#define A c; e;\n"
1680 "f;",
1681 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00001682}
1683
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001684TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00001685
Manuel Klimek1abf7892013-01-04 23:34:14 +00001686TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00001687 EXPECT_EQ("int x,\n"
1688 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001689 " y;",
1690 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00001691}
1692
Manuel Klimek09e07972013-01-05 21:34:55 +00001693TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00001694 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00001695 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00001696 verifyFormat("#define A \\\n"
1697 " { \\\n"
1698 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001699 " }",
1700 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00001701
1702 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001703 " void function##X()",
1704 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00001705
1706 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001707 " void a##b##c()",
1708 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00001709
Daniel Jasper39825ea2013-01-14 15:40:57 +00001710 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00001711}
1712
Manuel Klimekd053c5b2013-01-23 14:37:36 +00001713TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00001714 EXPECT_EQ("#define A (x)", format("#define A (x)"));
1715 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00001716}
1717
Manuel Klimek0c137952013-02-11 12:33:24 +00001718TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
1719 EXPECT_EQ("#define A b;", format("#define A \\\n"
1720 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001721 " b;",
1722 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001723 EXPECT_EQ("#define A \\\n"
1724 " \\\n"
1725 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001726 " b;",
1727 format("#define A \\\n"
1728 " \\\n"
1729 " a; \\\n"
1730 " b;",
1731 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001732 EXPECT_EQ("#define A \\\n"
1733 " a; \\\n"
1734 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001735 " b;",
1736 format("#define A \\\n"
1737 " a; \\\n"
1738 " \\\n"
1739 " b;",
1740 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00001741}
1742
Daniel Jasper00475962013-02-19 17:14:38 +00001743TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001744 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00001745 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00001746 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00001747 " case 2\n",
1748 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00001749 verifyFormat("#define MACRO(a) \\\n"
1750 " if (a) \\\n"
1751 " f(); \\\n"
1752 " else \\\n"
1753 " g()",
1754 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00001755 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001756 verifyIncompleteFormat("#define STR(x) #x\n"
1757 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00001758 verifyFormat("#pragma omp threadprivate( \\\n"
1759 " y)), // expected-warning",
1760 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00001761 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00001762 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001763 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00001764 "#define b \\\n"
1765 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00001766 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00001767 "a",
1768 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00001769 verifyFormat("#define A \\\n"
1770 " { \\\n"
1771 " {\n"
1772 "#define B \\\n"
1773 " } \\\n"
1774 " }",
1775 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00001776 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00001777 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00001778 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00001779 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00001780}
1781
Daniel Jasper40e19212013-05-29 13:16:10 +00001782TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
1783 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
1784 EXPECT_EQ("class A : public QObject {\n"
1785 " Q_OBJECT\n"
1786 "\n"
1787 " A() {}\n"
1788 "};",
1789 format("class A : public QObject {\n"
1790 " Q_OBJECT\n"
1791 "\n"
1792 " A() {\n}\n"
1793 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00001794 EXPECT_EQ("MACRO\n"
1795 "/*static*/ int i;",
1796 format("MACRO\n"
1797 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00001798 EXPECT_EQ("SOME_MACRO\n"
1799 "namespace {\n"
1800 "void f();\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001801 "} // namespace",
Daniel Jasper41a0f782013-05-29 14:09:17 +00001802 format("SOME_MACRO\n"
1803 " namespace {\n"
1804 "void f( );\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00001805 "} // namespace"));
Daniel Jasper40e19212013-05-29 13:16:10 +00001806 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00001807 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
1808 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00001809 // Only if everything is upper case.
1810 EXPECT_EQ("class A : public QObject {\n"
1811 " Q_Object A() {}\n"
1812 "};",
1813 format("class A : public QObject {\n"
1814 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00001815 " A() {\n}\n"
1816 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00001817
1818 // Only if the next line can actually start an unwrapped line.
1819 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
1820 format("SOME_WEIRD_LOG_MACRO\n"
1821 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00001822
1823 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00001824 "(n, buffers))\n",
1825 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00001826}
1827
Alexander Kornienkode644272013-04-08 22:16:06 +00001828TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
1829 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
1830 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
1831 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001832 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00001833 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
1834 "int *createScopDetectionPass() { return 0; }",
1835 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
1836 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
1837 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
1838 " class X {};\n"
1839 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
1840 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001841 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
1842 // braces, so that inner block is indented one level more.
1843 EXPECT_EQ("int q() {\n"
1844 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
1845 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
1846 " IPC_END_MESSAGE_MAP()\n"
1847 "}",
1848 format("int q() {\n"
1849 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
1850 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
1851 " IPC_END_MESSAGE_MAP()\n"
1852 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00001853
Daniel Jasper352dae12014-01-03 11:50:46 +00001854 // Same inside macros.
1855 EXPECT_EQ("#define LIST(L) \\\n"
1856 " L(A) \\\n"
1857 " L(B) \\\n"
1858 " L(C)",
1859 format("#define LIST(L) \\\n"
1860 " L(A) \\\n"
1861 " L(B) \\\n"
1862 " L(C)",
1863 getGoogleStyle()));
1864
Daniel Jasper545c6522013-09-17 09:26:07 +00001865 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001866 EXPECT_EQ("int q() {\n"
1867 " f(x);\n"
1868 " f(x) {}\n"
1869 " f(x)->g();\n"
1870 " f(x)->*g();\n"
1871 " f(x).g();\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) <<= x;\n"
1883 " f(x)[y].z();\n"
1884 " LOG(INFO) << x;\n"
1885 " ifstream(x) >> x;\n"
1886 "}\n",
1887 format("int q() {\n"
1888 " f(x)\n;\n"
1889 " f(x)\n {}\n"
1890 " f(x)\n->g();\n"
1891 " f(x)\n->*g();\n"
1892 " f(x)\n.g();\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 <<= x;\n"
1904 " f(x)\n[y].z();\n"
1905 " LOG(INFO)\n << x;\n"
1906 " ifstream(x)\n >> x;\n"
1907 "}\n"));
1908 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001909 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001910 " if (1) {\n"
1911 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001912 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001913 " while (1) {\n"
1914 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001915 " F(x)\n"
1916 " G(x);\n"
1917 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001918 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001919 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001920 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001921 " }\n"
1922 "}\n",
1923 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001924 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001925 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001926 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001927 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00001928 "F(x)\n"
1929 "G(x);\n"
1930 "F(x)\n"
1931 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001932 "}\n"));
1933 EXPECT_EQ("class A {\n"
1934 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00001935 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001936 " A(X x)\n" // FIXME: function-level try blocks are broken.
1937 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00001938 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001939 " }\n"
1940 "};",
1941 format("class A {\n"
1942 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00001943 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00001944 " A(X x)\n"
1945 " try : t(0) {} catch (...) {}\n"
1946 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00001947 EXPECT_EQ("class SomeClass {\n"
1948 "public:\n"
1949 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1950 "};",
1951 format("class SomeClass {\n"
1952 "public:\n"
1953 " SomeClass()\n"
1954 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1955 "};"));
1956 EXPECT_EQ("class SomeClass {\n"
1957 "public:\n"
1958 " SomeClass()\n"
1959 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1960 "};",
1961 format("class SomeClass {\n"
1962 "public:\n"
1963 " SomeClass()\n"
1964 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1965 "};",
1966 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00001967
1968 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00001969}
1970
Manuel Klimek4fe43002013-05-22 12:51:29 +00001971TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
1972 verifyFormat("#define A \\\n"
1973 " f({ \\\n"
1974 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001975 " });",
1976 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00001977}
1978
Manuel Klimekef2cfb12013-01-05 22:14:16 +00001979TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
1980 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
1981}
1982
Manuel Klimek52d0fd82013-01-05 22:56:06 +00001983TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00001984 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00001985}
1986
Manuel Klimek1058d982013-01-06 20:07:31 +00001987TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
1988 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
1989 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
1990 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
1991 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
1992}
Manuel Klimek1abf7892013-01-04 23:34:14 +00001993
Daniel Jaspere2408e32015-05-06 11:16:43 +00001994TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00001995 EXPECT_EQ(
1996 "#define A \\\n int i; \\\n int j;",
1997 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00001998 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00001999 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Krasimir Georgievbb99a362017-02-16 12:39:31 +00002000 EXPECT_EQ("/* \\ \\ \\\n */", format("\\\n/* \\ \\ \\\n */"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00002001 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00002002}
2003
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002004TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2005 verifyFormat("#define A \\\n"
2006 " int v( \\\n"
2007 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002008 " int i;",
2009 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00002010}
2011
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002012TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00002013 EXPECT_EQ(
2014 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2015 " \\\n"
2016 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2017 "\n"
2018 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2019 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2020 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
2021 "\\\n"
2022 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2023 " \n"
2024 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2025 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002026}
2027
Manuel Klimek52b15152013-01-09 15:25:02 +00002028TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2029 EXPECT_EQ("int\n"
2030 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002031 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002032 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002033 verifyFormat("functionCallTo(\n"
2034 " someOtherFunction(\n"
2035 " withSomeParameters, whichInSequence,\n"
2036 " areLongerThanALine(andAnotherCall,\n"
2037 "#define A B\n"
2038 " withMoreParamters,\n"
2039 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00002040 " andMoreParameters),\n"
2041 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002042 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00002043 verifyFormat("Foo::Foo()\n"
2044 "#ifdef BAR\n"
2045 " : baz(0)\n"
2046 "#endif\n"
2047 "{\n"
2048 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00002049 verifyFormat("void f() {\n"
2050 " if (true)\n"
2051 "#ifdef A\n"
2052 " f(42);\n"
2053 " x();\n"
2054 "#else\n"
2055 " g();\n"
2056 " x();\n"
2057 "#endif\n"
2058 "}");
2059 verifyFormat("void f(param1, param2,\n"
2060 " param3,\n"
2061 "#ifdef A\n"
2062 " param4(param5,\n"
2063 "#ifdef A1\n"
2064 " param6,\n"
2065 "#ifdef A2\n"
2066 " param7),\n"
2067 "#else\n"
2068 " param8),\n"
2069 " param9,\n"
2070 "#endif\n"
2071 " param10,\n"
2072 "#endif\n"
2073 " param11)\n"
2074 "#else\n"
2075 " param12)\n"
2076 "#endif\n"
2077 "{\n"
2078 " x();\n"
2079 "}",
2080 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00002081 verifyFormat("#if 1\n"
2082 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00002083 verifyFormat("#if 1\n"
2084 "#endif\n"
2085 "#if 1\n"
2086 "#else\n"
2087 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00002088 verifyFormat("DEBUG({\n"
2089 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2090 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2091 "});\n"
2092 "#if a\n"
2093 "#else\n"
2094 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00002095
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002096 verifyIncompleteFormat("void f(\n"
2097 "#if A\n"
2098 " );\n"
2099 "#else\n"
2100 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00002101}
2102
Manuel Klimek14bd9172014-01-29 08:49:02 +00002103TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2104 verifyFormat("#endif\n"
2105 "#if B");
2106}
2107
Manuel Klimek88033d72013-10-21 08:11:15 +00002108TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2109 FormatStyle SingleLine = getLLVMStyle();
2110 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00002111 verifyFormat("#if 0\n"
2112 "#elif 1\n"
2113 "#endif\n"
2114 "void foo() {\n"
2115 " if (test) foo2();\n"
2116 "}",
2117 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00002118}
2119
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002120TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00002121 verifyFormat("functionCall({ int i; });");
2122 verifyFormat("functionCall({\n"
2123 " int i;\n"
2124 " int j;\n"
2125 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00002126 verifyFormat("functionCall(\n"
2127 " {\n"
2128 " int i;\n"
2129 " int j;\n"
2130 " },\n"
2131 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00002132 verifyFormat("functionA(functionB({\n"
2133 " int i;\n"
2134 " int j;\n"
2135 " }),\n"
2136 " aaaa, bbbb, cccc);");
2137 verifyFormat("functionCall(\n"
2138 " {\n"
2139 " int i;\n"
2140 " int j;\n"
2141 " },\n"
2142 " aaaa, bbbb, // comment\n"
2143 " cccc);");
2144 verifyFormat("functionA(functionB({\n"
2145 " int i;\n"
2146 " int j;\n"
2147 " }),\n"
2148 " aaaa, bbbb, // comment\n"
2149 " cccc);");
2150 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2151 verifyFormat("functionCall(aaaa, bbbb, {\n"
2152 " int i;\n"
2153 " int j;\n"
2154 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00002155 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00002156 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00002157 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002158 " int i; // break\n"
2159 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00002160 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2161 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002162 verifyFormat("DEBUG({\n"
2163 " if (a)\n"
2164 " f();\n"
2165 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002166}
2167
2168TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002169 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002170 "int i;",
2171 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002172}
2173
2174TEST_F(FormatTest, LayoutNestedBlocks) {
2175 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2176 " struct s {\n"
2177 " int i;\n"
2178 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002179 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00002180 " for (int i = 0; i < 10; ++i)\n"
2181 " return;\n"
2182 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002183 verifyFormat("call(parameter, {\n"
2184 " something();\n"
2185 " // Comment using all columns.\n"
2186 " somethingelse();\n"
2187 "});",
2188 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00002189 verifyFormat("DEBUG( //\n"
2190 " { f(); }, a);");
2191 verifyFormat("DEBUG( //\n"
2192 " {\n"
2193 " f(); //\n"
2194 " },\n"
2195 " a);");
2196
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00002197 EXPECT_EQ("call(parameter, {\n"
2198 " something();\n"
2199 " // Comment too\n"
2200 " // looooooooooong.\n"
2201 " somethingElse();\n"
2202 "});",
2203 format("call(parameter, {\n"
2204 " something();\n"
2205 " // Comment too looooooooooong.\n"
2206 " somethingElse();\n"
2207 "});",
2208 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002209 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00002210 EXPECT_EQ("DEBUG({ // comment\n"
2211 " int i;\n"
2212 "});",
2213 format("DEBUG({ // comment\n"
2214 "int i;\n"
2215 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00002216 EXPECT_EQ("DEBUG({\n"
2217 " int i;\n"
2218 "\n"
2219 " // comment\n"
2220 " int j;\n"
2221 "});",
2222 format("DEBUG({\n"
2223 " int i;\n"
2224 "\n"
2225 " // comment\n"
2226 " int j;\n"
2227 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00002228
2229 verifyFormat("DEBUG({\n"
2230 " if (a)\n"
2231 " return;\n"
2232 "});");
2233 verifyGoogleFormat("DEBUG({\n"
2234 " if (a) return;\n"
2235 "});");
2236 FormatStyle Style = getGoogleStyle();
2237 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00002238 verifyFormat("Debug(aaaaa,\n"
2239 " {\n"
2240 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
2241 " },\n"
2242 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00002243 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002244
Daniel Jaspera87af7a2015-06-30 11:32:22 +00002245 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
2246
Daniel Jasper47b35ae2015-01-29 10:47:14 +00002247 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00002248}
2249
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002250TEST_F(FormatTest, FormatNestedBlocksInMacros) {
2251 EXPECT_EQ("#define MACRO() \\\n"
2252 " Debug(aaa, /* force line break */ \\\n"
2253 " { \\\n"
2254 " int i; \\\n"
2255 " int j; \\\n"
2256 " })",
2257 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
2258 " { int i; int j; })",
2259 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00002260
2261 EXPECT_EQ("#define A \\\n"
2262 " [] { \\\n"
2263 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2264 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
2265 " }",
2266 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2267 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
2268 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00002269}
2270
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002271TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
2272 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002273 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002274 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002275}
2276
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00002277TEST_F(FormatTest, FormatBeginBlockEndMacros) {
2278 FormatStyle Style = getLLVMStyle();
2279 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
2280 Style.MacroBlockEnd = "^[A-Z_]+_END$";
2281 verifyFormat("FOO_BEGIN\n"
2282 " FOO_ENTRY\n"
2283 "FOO_END", Style);
2284 verifyFormat("FOO_BEGIN\n"
2285 " NESTED_FOO_BEGIN\n"
2286 " NESTED_FOO_ENTRY\n"
2287 " NESTED_FOO_END\n"
2288 "FOO_END", Style);
2289 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
2290 " int x;\n"
2291 " x = 1;\n"
2292 "FOO_END(Baz)", Style);
2293}
2294
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002295//===----------------------------------------------------------------------===//
2296// Line break tests.
2297//===----------------------------------------------------------------------===//
2298
Daniel Jasperf79b0b12013-08-30 08:29:25 +00002299TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002300 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00002301 "void f() {\n"
2302 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
2303 " parameter, parameter, parameter)),\n"
2304 " SecondLongCall(parameter));\n"
2305 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002306 verifyFormat(
2307 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2308 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2309 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2310 " aaaaaaaaaaaaaaaaaaaaaaaa);");
2311 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00002312 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2313 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
2314 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
2315 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002316 verifyFormat(
2317 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
2318 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
2319 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
2320 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00002321 verifyFormat("int a = bbbb && ccc &&\n"
2322 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00002323 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00002324 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00002325}
2326
Daniel Jasperd69fc772013-05-08 14:12:04 +00002327TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
2328 verifyFormat(
2329 "bool aaaaaaa =\n"
2330 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
2331 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002332 verifyFormat(
2333 "bool aaaaaaa =\n"
2334 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
2335 " bbbbbbbb();");
2336
Daniel Jasperd69fc772013-05-08 14:12:04 +00002337 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2338 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
2339 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00002340 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2341 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
2342 " ccccccccc == ddddddddddd;");
2343 verifyFormat(
2344 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
2345 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
2346 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00002347
2348 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2349 " aaaaaa) &&\n"
2350 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00002351 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2352 " aaaaaa) >>\n"
2353 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00002354 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00002355 " SourceMgr.getSpellingColumnNumber(\n"
2356 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
2357 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00002358
Daniel Jasper68d888c2013-06-03 08:42:05 +00002359 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2360 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
2361 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00002362 verifyFormat("b = a &&\n"
2363 " // Comment\n"
2364 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00002365
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002366 // If the LHS of a comparison is not a binary expression itself, the
2367 // additional linebreak confuses many people.
2368 verifyFormat(
2369 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2370 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
2371 "}");
2372 verifyFormat(
2373 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2374 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2375 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00002376 verifyFormat(
2377 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
2378 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2379 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002380 // Even explicit parentheses stress the precedence enough to make the
2381 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00002382 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2383 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2384 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002385 // This cases is borderline, but with the indentation it is still readable.
2386 verifyFormat(
2387 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2388 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2389 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
2390 "}",
2391 getLLVMStyleWithColumns(75));
2392
2393 // If the LHS is a binary expression, we should still use the additional break
2394 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00002395 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2396 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2397 " 5) {\n"
2398 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00002399
Daniel Jasper571f1af2013-05-14 20:39:56 +00002400 FormatStyle OnePerLine = getLLVMStyle();
2401 OnePerLine.BinPackParameters = false;
2402 verifyFormat(
2403 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2404 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2405 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
2406 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00002407
2408 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
2409 " .aaa(aaaaaaaaaaaaa) *\n"
2410 " aaaaaaa +\n"
2411 " aaaaaaa;",
2412 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00002413}
2414
Daniel Jasper6bee6822013-04-08 20:33:42 +00002415TEST_F(FormatTest, ExpressionIndentation) {
2416 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2417 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2418 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2419 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2420 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
2421 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
2422 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2423 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
2424 " ccccccccccccccccccccccccccccccccccccccccc;");
2425 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2426 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2427 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2428 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2429 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2430 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2431 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2432 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2433 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2434 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2435 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2436 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002437 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002438 "} else if (aaaaa && bbbbb > // break\n"
2439 " ccccc) {\n"
2440 "}");
2441 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00002442 "} else if (aaaaa &&\n"
2443 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002444 " ccccc &&\n"
2445 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00002446 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00002447
2448 // Presence of a trailing comment used to change indentation of b.
2449 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
2450 " b;\n"
2451 "return aaaaaaaaaaaaaaaaaaa +\n"
2452 " b; //",
2453 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00002454}
2455
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002456TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
2457 // Not sure what the best system is here. Like this, the LHS can be found
2458 // immediately above an operator (everything with the same or a higher
2459 // indent). The RHS is aligned right of the operator and so compasses
2460 // everything until something with the same indent as the operator is found.
2461 // FIXME: Is this a good system?
2462 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00002463 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002464 verifyFormat(
2465 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002466 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2467 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2468 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2469 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2470 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002471 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002472 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2473 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002474 Style);
2475 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002476 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2477 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002478 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2479 Style);
2480 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002481 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2482 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002483 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2484 Style);
2485 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2486 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002487 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2488 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002489 Style);
2490 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00002491 "} else if (aaaaa\n"
2492 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00002493 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002494 "}",
2495 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00002496 verifyFormat("return (a)\n"
2497 " // comment\n"
2498 " + b;",
2499 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00002500 verifyFormat(
2501 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2502 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2503 " + cc;",
2504 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00002505
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00002506 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2507 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
2508 Style);
2509
Daniel Jasper9e5ede02013-11-08 19:56:28 +00002510 // Forced by comments.
2511 verifyFormat(
2512 "unsigned ContentSize =\n"
2513 " sizeof(int16_t) // DWARF ARange version number\n"
2514 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
2515 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
2516 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00002517
2518 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
2519 " == boost::fusion::at_c<1>(iiii).second;",
2520 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00002521
2522 Style.ColumnLimit = 60;
2523 verifyFormat("zzzzzzzzzz\n"
2524 " = bbbbbbbbbbbbbbbbb\n"
2525 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
2526 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00002527}
2528
Daniel Jasperb1270392017-02-01 23:27:37 +00002529TEST_F(FormatTest, EnforcedOperatorWraps) {
2530 // Here we'd like to wrap after the || operators, but a comment is forcing an
2531 // earlier wrap.
2532 verifyFormat("bool x = aaaaa //\n"
2533 " || bbbbb\n"
2534 " //\n"
2535 " || cccc;");
2536}
2537
Daniel Jasper3219e432014-12-02 13:24:51 +00002538TEST_F(FormatTest, NoOperandAlignment) {
2539 FormatStyle Style = getLLVMStyle();
2540 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00002541 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
2542 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2543 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
2544 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002545 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00002546 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2547 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2548 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2549 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2550 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2551 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2552 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2553 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2554 " > ccccccccccccccccccccccccccccccccccccccccc;",
2555 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002556
2557 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2558 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2559 " + cc;",
2560 Style);
2561 verifyFormat("int a = aa\n"
2562 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00002563 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00002564 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00002565
Daniel Jasper6501f7e2015-10-27 12:38:37 +00002566 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00002567 verifyFormat("return (a > b\n"
2568 " // comment1\n"
2569 " // comment2\n"
2570 " || c);",
2571 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00002572}
2573
Daniel Jasperac043c92014-09-15 11:11:00 +00002574TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
2575 FormatStyle Style = getLLVMStyle();
2576 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
2577 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
2578 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00002579 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
2580 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00002581}
2582
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002583TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002584 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002585 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
2586 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002587 verifyFormat("Constructor()\n"
2588 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002589 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002590 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002591 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002592 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002593
Daniel Jasper7b259cd2015-08-27 11:59:31 +00002594 verifyFormat("template <typename T>\n"
2595 "Constructor() : Initializer(FitsOnTheLine) {}",
2596 getLLVMStyleWithColumns(45));
2597
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002598 verifyFormat(
2599 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002600 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002601
2602 verifyFormat(
2603 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002604 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002605 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00002606 verifyFormat(
2607 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002608 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002609 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00002610 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2611 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2612 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002613
2614 verifyFormat("Constructor()\n"
2615 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2616 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2617 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002618 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002619
Daniel Jasper65585ed2013-01-28 13:31:35 +00002620 verifyFormat("Constructor()\n"
2621 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002622 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00002623
Daniel Jasper62e68172013-02-25 15:59:54 +00002624 verifyFormat("Constructor(int Parameter = 0)\n"
2625 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
2626 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00002627 verifyFormat("Constructor()\n"
2628 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
2629 "}",
2630 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00002631 verifyFormat("Constructor()\n"
2632 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2633 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00002634
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002635 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002636 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00002637 verifyFormat("Constructor()\n"
2638 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
2639 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
2640 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002641
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002642 FormatStyle OnePerLine = getLLVMStyle();
2643 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00002644 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002645 verifyFormat("SomeClass::Constructor()\n"
2646 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
2647 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002648 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002649 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002650 verifyFormat("SomeClass::Constructor()\n"
2651 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
2652 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002653 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002654 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00002655 verifyFormat("MyClass::MyClass(int var)\n"
2656 " : some_var_(var), // 4 space indent\n"
2657 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002658 "}",
2659 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00002660 verifyFormat("Constructor()\n"
2661 " : aaaaa(aaaaaa),\n"
2662 " aaaaa(aaaaaa),\n"
2663 " aaaaa(aaaaaa),\n"
2664 " aaaaa(aaaaaa),\n"
2665 " aaaaa(aaaaaa) {}",
2666 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00002667 verifyFormat("Constructor()\n"
2668 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
2669 " aaaaaaaaaaaaaaaaaaaaaa) {}",
2670 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00002671 OnePerLine.BinPackParameters = false;
2672 verifyFormat(
2673 "Constructor()\n"
2674 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2675 " aaaaaaaaaaa().aaa(),\n"
2676 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
2677 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00002678 OnePerLine.ColumnLimit = 60;
2679 verifyFormat("Constructor()\n"
2680 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
2681 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
2682 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00002683
2684 EXPECT_EQ("Constructor()\n"
2685 " : // Comment forcing unwanted break.\n"
2686 " aaaa(aaaa) {}",
2687 format("Constructor() :\n"
2688 " // Comment forcing unwanted break.\n"
2689 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00002690}
2691
2692TEST_F(FormatTest, MemoizationTests) {
2693 // This breaks if the memoization lookup does not take \c Indent and
2694 // \c LastSpace into account.
2695 verifyFormat(
2696 "extern CFRunLoopTimerRef\n"
2697 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
2698 " CFTimeInterval interval, CFOptionFlags flags,\n"
2699 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00002700 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00002701
2702 // Deep nesting somewhat works around our memoization.
2703 verifyFormat(
2704 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2705 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2706 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2707 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2708 " aaaaa())))))))))))))))))))))))))))))))))))))));",
2709 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00002710 verifyFormat(
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,\n"
2735 " aaaaa))))))))))));",
2736 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00002737 verifyFormat(
2738 "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"
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),\n"
2755 " a)",
2756 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00002757
2758 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00002759 FormatStyle OnePerLine = getLLVMStyle();
2760 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00002761 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00002762 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00002763 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00002764 for (unsigned i = 0, e = 80; i != e; ++i) {
2765 input += " a,\n";
2766 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00002767 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00002768 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00002769}
2770
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002771TEST_F(FormatTest, BreaksAsHighAsPossible) {
2772 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00002773 "void f() {\n"
2774 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
2775 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
2776 " f();\n"
2777 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00002778 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00002779 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002780}
2781
Daniel Jasper6728fc12013-04-11 14:29:13 +00002782TEST_F(FormatTest, BreaksFunctionDeclarations) {
2783 // Principially, we break function declarations in a certain order:
2784 // 1) break amongst arguments.
2785 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
2786 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00002787 verifyFormat("template <class TemplateIt>\n"
2788 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
2789 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00002790
2791 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00002792 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00002793 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002794 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00002795 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002796
2797 // 3) break after (.
2798 verifyFormat(
2799 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00002800 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
2801 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002802
2803 // 4) break before after nested name specifiers.
2804 verifyFormat(
2805 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002806 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
2807 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00002808 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002809
2810 // However, there are exceptions, if a sufficient amount of lines can be
2811 // saved.
2812 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
2813 // more adjusting.
2814 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
2815 " Cccccccccccccc cccccccccc,\n"
2816 " Cccccccccccccc cccccccccc,\n"
2817 " Cccccccccccccc cccccccccc,\n"
2818 " Cccccccccccccc cccccccccc);");
2819 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00002820 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00002821 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2822 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2823 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00002824 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00002825 verifyFormat(
2826 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
2827 " Cccccccccccccc cccccccccc,\n"
2828 " Cccccccccccccc cccccccccc,\n"
2829 " Cccccccccccccc cccccccccc,\n"
2830 " Cccccccccccccc cccccccccc,\n"
2831 " Cccccccccccccc cccccccccc,\n"
2832 " Cccccccccccccc cccccccccc);");
2833 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
2834 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2835 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2836 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2837 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00002838
2839 // Break after multi-line parameters.
2840 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2841 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2842 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2843 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00002844 verifyFormat("void SomeLoooooooooooongFunction(\n"
2845 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
2846 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2847 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00002848
2849 // Treat overloaded operators like other functions.
2850 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2851 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00002852 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2853 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00002854 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2855 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
2856 verifyGoogleFormat(
2857 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
2858 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00002859 verifyGoogleFormat(
2860 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
2861 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00002862 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2863 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
2864 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
2865 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00002866 verifyGoogleFormat(
2867 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
2868 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2869 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00002870 verifyGoogleFormat(
2871 "template <typename T>\n"
2872 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2873 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
2874 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00002875
2876 FormatStyle Style = getLLVMStyle();
2877 Style.PointerAlignment = FormatStyle::PAS_Left;
2878 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2879 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
2880 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00002881 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
2882 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
2883 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00002884}
2885
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00002886TEST_F(FormatTest, TrailingReturnType) {
2887 verifyFormat("auto foo() -> int;\n");
2888 verifyFormat("struct S {\n"
2889 " auto bar() const -> int;\n"
2890 "};");
2891 verifyFormat("template <size_t Order, typename T>\n"
2892 "auto load_img(const std::string &filename)\n"
2893 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00002894 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
2895 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00002896 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00002897 verifyFormat("template <typename T>\n"
2898 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
2899 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00002900
2901 // Not trailing return types.
2902 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00002903}
2904
Daniel Jasper5be31f72013-05-21 09:16:31 +00002905TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002906 // Avoid breaking before trailing 'const' or other trailing annotations, if
2907 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00002908 FormatStyle Style = getGoogleStyle();
2909 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00002910 verifyFormat("void someLongFunction(\n"
2911 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00002912 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00002913 verifyFormat("LoooooongReturnType\n"
2914 "someLoooooooongFunction() const {}",
2915 getLLVMStyleWithColumns(47));
2916 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
2917 " const {}",
2918 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002919 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2920 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
2921 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2922 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
2923 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2924 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00002925 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
2926 " aaaaaaaaaaa aaaaa) const override;");
2927 verifyGoogleFormat(
2928 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
2929 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00002930
Daniel Jasper5550de62014-02-17 07:57:46 +00002931 // Even if the first parameter has to be wrapped.
2932 verifyFormat("void someLongFunction(\n"
2933 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002934 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00002935 verifyFormat("void someLongFunction(\n"
2936 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002937 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00002938 verifyFormat("void someLongFunction(\n"
2939 " int someLongParameter) override {}",
2940 Style);
2941 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00002942 " int someLongParameter) OVERRIDE {}",
2943 Style);
2944 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00002945 " int someLongParameter) final {}",
2946 Style);
2947 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00002948 " int someLongParameter) FINAL {}",
2949 Style);
2950 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00002951 " int parameter) const override {}",
2952 Style);
2953
Daniel Jaspere3f907f2014-06-02 09:52:08 +00002954 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2955 verifyFormat("void someLongFunction(\n"
2956 " int someLongParameter) const\n"
2957 "{\n"
2958 "}",
2959 Style);
2960
Daniel Jasper5550de62014-02-17 07:57:46 +00002961 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00002962 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
2963 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2964 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00002965
2966 // Breaking before function-like trailing annotations is fine to keep them
2967 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00002968 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2969 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
2970 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
2971 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
2972 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
2973 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00002974 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
2975 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00002976 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00002977
2978 verifyFormat(
2979 "void aaaaaaaaaaaaaaaaaa()\n"
2980 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
2981 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
2982 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2983 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00002984 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00002985 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00002986 " GUARDED_BY(aaaaaaaaaaaa);");
2987 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00002988 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00002989 " GUARDED_BY(aaaaaaaaaaaa);");
2990 verifyGoogleFormat(
2991 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
2992 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00002993 verifyGoogleFormat(
2994 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
2995 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00002996}
2997
Daniel Jasperf090f032015-05-18 09:47:22 +00002998TEST_F(FormatTest, FunctionAnnotations) {
2999 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00003000 "int OldFunction(const string &parameter) {}");
3001 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00003002 "string OldFunction(const string &parameter) {}");
3003 verifyFormat("template <typename T>\n"
3004 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
3005 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00003006
3007 // Not function annotations.
3008 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3009 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00003010 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
3011 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00003012 verifyFormat("MACRO(abc).function() // wrap\n"
3013 " << abc;");
3014 verifyFormat("MACRO(abc)->function() // wrap\n"
3015 " << abc;");
3016 verifyFormat("MACRO(abc)::function() // wrap\n"
3017 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00003018}
3019
Daniel Jasperf7935112012-12-03 18:12:45 +00003020TEST_F(FormatTest, BreaksDesireably) {
3021 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
3022 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003023 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00003024 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3025 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
3026 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003027
3028 verifyFormat(
3029 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003030 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00003031
3032 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3033 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3034 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00003035
3036 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003037 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3038 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3039 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00003040 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3041 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003042
3043 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3044 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3045
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003046 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003047 "void f() {\n"
3048 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
3049 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3050 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00003051 verifyFormat(
3052 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3053 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3054 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003055 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3056 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3057 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003058 "aaaaaa(aaa,\n"
3059 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003060 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3061 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003062 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3063 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3064 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00003065
Daniel Jasper739b85f2015-06-29 10:42:59 +00003066 // Indent consistently independent of call expression and unary operator.
3067 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3068 " dddddddddddddddddddddddddddddd));");
3069 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3070 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003071 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003072 " dddddddddddddddddddddddddddddd));");
3073
Daniel Jasperaa1c9202012-12-05 14:57:28 +00003074 // This test case breaks on an incorrect memoization, i.e. an optimization not
3075 // taking into account the StopAt value.
3076 verifyFormat(
3077 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003078 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3079 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3080 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00003081
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003082 verifyFormat("{\n {\n {\n"
3083 " Annotation.SpaceRequiredBefore =\n"
3084 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
3085 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
3086 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00003087
3088 // Break on an outer level if there was a break on an inner level.
3089 EXPECT_EQ("f(g(h(a, // comment\n"
3090 " b, c),\n"
3091 " d, e),\n"
3092 " x, y);",
3093 format("f(g(h(a, // comment\n"
3094 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00003095
3096 // Prefer breaking similar line breaks.
3097 verifyFormat(
3098 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
3099 " NSTrackingMouseEnteredAndExited |\n"
3100 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00003101}
3102
Daniel Jasper18210d72014-10-09 09:52:05 +00003103TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
3104 FormatStyle NoBinPacking = getGoogleStyle();
3105 NoBinPacking.BinPackParameters = false;
3106 NoBinPacking.BinPackArguments = true;
3107 verifyFormat("void f() {\n"
3108 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
3109 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3110 "}",
3111 NoBinPacking);
3112 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
3113 " int aaaaaaaaaaaaaaaaaaaa,\n"
3114 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3115 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003116
Daniel Jasper00693b082016-01-09 15:56:47 +00003117 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
3118 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3119 " vector<int> bbbbbbbbbbbbbbb);",
3120 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00003121 // FIXME: This behavior difference is probably not wanted. However, currently
3122 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
3123 // template arguments from BreakBeforeParameter being set because of the
3124 // one-per-line formatting.
3125 verifyFormat(
3126 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3127 " aaaaaaaaaa> aaaaaaaaaa);",
3128 NoBinPacking);
3129 verifyFormat(
3130 "void fffffffffff(\n"
3131 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
3132 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00003133}
3134
Daniel Jasper9278eb92013-01-16 14:59:02 +00003135TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00003136 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003137 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00003138 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003139 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
3140 " aaaaaaaaaaaaaaaaaaaa,\n"
3141 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
3142 NoBinPacking);
3143 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
3144 " aaaaaaaaaaaaa,\n"
3145 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
3146 NoBinPacking);
3147 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003148 "aaaaaaaa(aaaaaaaaaaaaa,\n"
3149 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3150 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
3151 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003152 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
3153 NoBinPacking);
3154 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3155 " .aaaaaaaaaaaaaaaaaa();",
3156 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003157 verifyFormat("void f() {\n"
3158 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3159 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
3160 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003161 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003162
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003163 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00003164 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3165 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003166 " aaaaaaaaaaaa);",
3167 NoBinPacking);
3168 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00003169 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
3170 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003171 " test);",
3172 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003173
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003174 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3175 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00003176 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
3177 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003178 NoBinPacking);
3179 verifyFormat("a(\"a\"\n"
3180 " \"a\",\n"
3181 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00003182
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003183 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00003184 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00003185 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00003186 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003187 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00003188 verifyFormat(
3189 "void f() {\n"
3190 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3191 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003192 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003193 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00003194 verifyFormat(
3195 "template <class SomeType, class SomeOtherType>\n"
3196 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
3197 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00003198}
3199
Daniel Jasperb10cbc42013-07-10 14:02:49 +00003200TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
3201 FormatStyle Style = getLLVMStyleWithColumns(15);
3202 Style.ExperimentalAutoDetectBinPacking = true;
3203 EXPECT_EQ("aaa(aaaa,\n"
3204 " aaaa,\n"
3205 " aaaa);\n"
3206 "aaa(aaaa,\n"
3207 " aaaa,\n"
3208 " aaaa);",
3209 format("aaa(aaaa,\n" // one-per-line
3210 " aaaa,\n"
3211 " aaaa );\n"
3212 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3213 Style));
3214 EXPECT_EQ("aaa(aaaa, aaaa,\n"
3215 " aaaa);\n"
3216 "aaa(aaaa, aaaa,\n"
3217 " aaaa);",
3218 format("aaa(aaaa, aaaa,\n" // bin-packed
3219 " aaaa );\n"
3220 "aaa(aaaa, aaaa, aaaa);", // inconclusive
3221 Style));
3222}
3223
Daniel Jasper04468962013-01-18 10:56:38 +00003224TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00003225 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
3226 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
3227 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
3228 " .StartsWith(\".init\", ORDER_INIT)\n"
3229 " .StartsWith(\".fini\", ORDER_FINI)\n"
3230 " .StartsWith(\".hash\", ORDER_HASH)\n"
3231 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00003232
Daniel Jaspereb50c672013-02-15 20:33:06 +00003233 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003234 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00003235 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00003236 "aaaaaaa->aaaaaaa\n"
3237 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3238 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00003239 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00003240 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00003241 "aaaaaaa->aaaaaaa\n"
3242 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3243 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
3244 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00003245 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00003246 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00003247 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003248 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
3249 " aaaaaa->aaaaaaaaaaaa()\n"
3250 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00003251 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003252 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00003253 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003254 "void f() {\n"
3255 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003256 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003257 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003258 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003259 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003260 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003261 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003262 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003263 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003264 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003265 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003266 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00003267
3268 verifyFormat(
3269 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
3270 verifyFormat("aaaaaaaaaaaaaaa()\n"
3271 " .aaaaaaaaaaaaaaa()\n"
3272 " .aaaaaaaaaaaaaaa()\n"
3273 " .aaaaaaaaaaaaaaa()\n"
3274 " .aaaaaaaaaaaaaaa();");
3275 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3276 " .aaaaaaaaaaaaaaa()\n"
3277 " .aaaaaaaaaaaaaaa()\n"
3278 " .aaaaaaaaaaaaaaa();");
3279 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3280 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3281 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00003282 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
3283 " ->aaaaaaaaaaaaaae(0)\n"
3284 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00003285
Daniel Jasper775954b2015-04-24 10:08:09 +00003286 // Don't linewrap after very short segments.
3287 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3288 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3289 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3290 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3291 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3292 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3293 verifyFormat("aaa()\n"
3294 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3295 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3296 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3297
Daniel Jaspercc3114d2013-10-18 15:23:06 +00003298 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3299 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3300 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
3301 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3302 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00003303 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00003304
Daniel Jaspera41aa532014-09-19 08:01:25 +00003305 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00003306 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
3307 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00003308
3309 // Prefer not to create "hanging" indents.
3310 verifyFormat(
3311 "return !soooooooooooooome_map\n"
3312 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3313 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00003314 verifyFormat(
3315 "return aaaaaaaaaaaaaaaa\n"
3316 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
3317 " .aaaa(aaaaaaaaaaaaaa);");
3318 // No hanging indent here.
3319 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
3320 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3321 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
3322 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00003323 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3324 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3325 getLLVMStyleWithColumns(60));
3326 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
3327 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3328 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3329 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00003330 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3331 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3332 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00003333}
3334
Daniel Jasperde5c2072012-12-24 00:13:23 +00003335TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
3336 verifyFormat(
3337 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003338 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003339 verifyFormat(
3340 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
3341 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
3342
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003343 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003344 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003345 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
3346 " ccccccccccccccccccccccccc) {\n}");
3347
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003348 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003349 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003350 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
3351 " ccccccccccccccccccccccccc) {\n}");
3352
Daniel Jasperde5c2072012-12-24 00:13:23 +00003353 verifyFormat(
3354 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003355 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003356 verifyFormat(
3357 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
3358 " ccccccccccccccccccccccccc) {\n}");
3359
Daniel Jasper400adc62013-02-08 15:28:42 +00003360 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
3361 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
3362 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
3363 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003364 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
3365 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
3366 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
3367 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
3368
Daniel Jasper400adc62013-02-08 15:28:42 +00003369 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
3370 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
3371 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003372 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
3373 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
3374 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00003375}
3376
Daniel Jasper43b65482013-01-23 12:27:43 +00003377TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00003378 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00003379 "unsigned Cost =\n"
3380 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
3381 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00003382 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00003383 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
3384 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00003385
3386 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00003387 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
3388 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00003389 verifyFormat("unsigned OriginalStartColumn =\n"
3390 " SourceMgr.getSpellingColumnNumber(\n"
3391 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
3392 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00003393}
3394
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003395TEST_F(FormatTest, AlignsAfterAssignments) {
3396 verifyFormat(
3397 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003398 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003399 verifyFormat(
3400 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003401 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003402 verifyFormat(
3403 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003404 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003405 verifyFormat(
3406 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00003407 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00003408 verifyFormat(
3409 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3410 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3411 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003412}
3413
3414TEST_F(FormatTest, AlignsAfterReturn) {
3415 verifyFormat(
3416 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3417 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
3418 verifyFormat(
3419 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3420 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00003421 verifyFormat(
3422 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003423 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00003424 verifyFormat(
3425 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003426 " aaaaaaaaaaaaaaaaaaaaaa());");
3427 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3428 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3429 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3430 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
3431 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00003432 verifyFormat("return\n"
3433 " // true if code is one of a or b.\n"
3434 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00003435}
3436
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003437TEST_F(FormatTest, AlignsAfterOpenBracket) {
3438 verifyFormat(
3439 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
3440 " aaaaaaaaa aaaaaaa) {}");
3441 verifyFormat(
3442 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
3443 " aaaaaaaaaaa aaaaaaaaa);");
3444 verifyFormat(
3445 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
3446 " aaaaaaaaaaaaaaaaaaaaa));");
3447 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003448 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00003449 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3450 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
3451 Style);
3452 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
3453 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
3454 Style);
3455 verifyFormat("SomeLongVariableName->someFunction(\n"
3456 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
3457 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003458 verifyFormat(
3459 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
3460 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3461 Style);
3462 verifyFormat(
3463 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
3464 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3465 Style);
3466 verifyFormat(
3467 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
3468 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
3469 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003470
Daniel Jasper2a9f7202016-02-08 09:52:54 +00003471 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
3472 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
3473 " b));",
3474 Style);
3475
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003476 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
3477 Style.BinPackArguments = false;
3478 Style.BinPackParameters = false;
3479 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3480 " aaaaaaaaaaa aaaaaaaa,\n"
3481 " aaaaaaaaa aaaaaaa,\n"
3482 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3483 Style);
3484 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
3485 " aaaaaaaaaaa aaaaaaaaa,\n"
3486 " aaaaaaaaaaa aaaaaaaaa,\n"
3487 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3488 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00003489 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
3490 " aaaaaaaaaaaaaaa,\n"
3491 " aaaaaaaaaaaaaaaaaaaaa,\n"
3492 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00003493 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00003494 verifyFormat(
3495 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
3496 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
3497 Style);
3498 verifyFormat(
3499 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
3500 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
3501 Style);
3502 verifyFormat(
3503 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3504 " aaaaaaaaaaaaaaaaaaaaa(\n"
3505 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
3506 " aaaaaaaaaaaaaaaa);",
3507 Style);
3508 verifyFormat(
3509 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3510 " aaaaaaaaaaaaaaaaaaaaa(\n"
3511 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
3512 " aaaaaaaaaaaaaaaa);",
3513 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00003514}
3515
Daniel Jasper3219e432014-12-02 13:24:51 +00003516TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
3517 FormatStyle Style = getLLVMStyleWithColumns(40);
3518 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3519 " bbbbbbbbbbbbbbbbbbbbbb);",
3520 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003521 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00003522 Style.AlignOperands = false;
3523 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3524 " bbbbbbbbbbbbbbbbbbbbbb);",
3525 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003526 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00003527 Style.AlignOperands = true;
3528 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3529 " bbbbbbbbbbbbbbbbbbbbbb);",
3530 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003531 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00003532 Style.AlignOperands = false;
3533 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3534 " bbbbbbbbbbbbbbbbbbbbbb);",
3535 Style);
3536}
3537
Daniel Jasper399d24b2013-01-09 07:06:56 +00003538TEST_F(FormatTest, BreaksConditionalExpressions) {
3539 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003540 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3541 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3542 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3543 verifyFormat(
3544 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003545 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3546 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00003547 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003548 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3549 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3550 verifyFormat(
3551 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003552 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3553 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00003554 verifyFormat(
3555 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
3556 " : aaaaaaaaaaaaa);");
3557 verifyFormat(
3558 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00003559 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00003560 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3561 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003562 verifyFormat(
3563 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3564 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3565 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00003566 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3567 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3568 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3569 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3570 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3571 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3572 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3573 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3574 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3575 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3576 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3577 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003578 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3579 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3580 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3581 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3582 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00003583 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3584 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3585 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00003586 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
3587 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3588 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3589 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00003590 verifyFormat(
3591 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3592 " ? aaaaaaaaaaaaaaa\n"
3593 " : aaaaaaaaaaaaaaa;");
3594 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003595 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00003596 " ? b\n"
3597 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00003598 verifyFormat("return aaaa == bbbb\n"
3599 " // comment\n"
3600 " ? aaaa\n"
3601 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003602 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003603 " format(TheLine.First,\n"
3604 " IndentForLevel[TheLine.Level] >= 0\n"
3605 " ? IndentForLevel[TheLine.Level]\n"
3606 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003607 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00003608 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00003609 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
3610 " ? aaaaaaaaaaaaaaa\n"
3611 " : bbbbbbbbbbbbbbb //\n"
3612 " ? ccccccccccccccc\n"
3613 " : ddddddddddddddd;");
3614 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
3615 " ? aaaaaaaaaaaaaaa\n"
3616 " : (bbbbbbbbbbbbbbb //\n"
3617 " ? ccccccccccccccc\n"
3618 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003619 verifyFormat(
3620 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3621 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3622 " aaaaaaaaaaaaaaaaaaaaa +\n"
3623 " aaaaaaaaaaaaaaaaaaaaa\n"
3624 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00003625 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00003626 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3627 " : aaaaaaaaaaaaaaaaaaaaaa\n"
3628 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00003629
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003630 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00003631 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003632 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00003633 "void f() {\n"
3634 " g(aaa,\n"
3635 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
3636 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3637 " ? aaaaaaaaaaaaaaa\n"
3638 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003639 "}",
3640 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00003641 verifyFormat(
3642 "void f() {\n"
3643 " g(aaa,\n"
3644 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
3645 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3646 " ?: aaaaaaaaaaaaaaa);\n"
3647 "}",
3648 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00003649
3650 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
3651 " // comment.\n"
3652 " ccccccccccccccccccccccccccccccccccccccc\n"
3653 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3654 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00003655
3656 // Assignments in conditional expressions. Apparently not uncommon :-(.
3657 verifyFormat("return a != b\n"
3658 " // comment\n"
3659 " ? a = b\n"
3660 " : a = b;");
3661 verifyFormat("return a != b\n"
3662 " // comment\n"
3663 " ? a = a != b\n"
3664 " // comment\n"
3665 " ? a = b\n"
3666 " : a\n"
3667 " : a;\n");
3668 verifyFormat("return a != b\n"
3669 " // comment\n"
3670 " ? a\n"
3671 " : a = a != b\n"
3672 " // comment\n"
3673 " ? a = b\n"
3674 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00003675}
3676
Daniel Jasper165b29e2013-11-08 00:57:11 +00003677TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
3678 FormatStyle Style = getLLVMStyle();
3679 Style.BreakBeforeTernaryOperators = false;
3680 Style.ColumnLimit = 70;
3681 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003682 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3683 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3684 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3685 Style);
3686 verifyFormat(
3687 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003688 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3689 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00003690 Style);
3691 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003692 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3693 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3694 Style);
3695 verifyFormat(
3696 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00003697 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3698 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00003699 Style);
3700 verifyFormat(
3701 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
3702 " aaaaaaaaaaaaa);",
3703 Style);
3704 verifyFormat(
3705 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3706 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3707 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3708 " aaaaaaaaaaaaa);",
3709 Style);
3710 verifyFormat(
3711 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3712 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3713 " aaaaaaaaaaaaa);",
3714 Style);
3715 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3716 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3717 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3718 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3719 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3720 Style);
3721 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3722 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3723 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3724 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3725 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3726 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3727 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3728 Style);
3729 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3730 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
3731 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3732 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3733 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3734 Style);
3735 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3736 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3737 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3738 Style);
3739 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00003740 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00003741 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3742 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3743 Style);
3744 verifyFormat(
3745 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3746 " aaaaaaaaaaaaaaa :\n"
3747 " aaaaaaaaaaaaaaa;",
3748 Style);
3749 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
3750 " aaaaaaaaa ?\n"
3751 " b :\n"
3752 " c);",
3753 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00003754 verifyFormat("unsigned Indent =\n"
3755 " format(TheLine.First,\n"
3756 " IndentForLevel[TheLine.Level] >= 0 ?\n"
3757 " IndentForLevel[TheLine.Level] :\n"
3758 " TheLine * 2,\n"
3759 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
3760 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00003761 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
3762 " aaaaaaaaaaaaaaa :\n"
3763 " bbbbbbbbbbbbbbb ? //\n"
3764 " ccccccccccccccc :\n"
3765 " ddddddddddddddd;",
3766 Style);
3767 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
3768 " aaaaaaaaaaaaaaa :\n"
3769 " (bbbbbbbbbbbbbbb ? //\n"
3770 " ccccccccccccccc :\n"
3771 " ddddddddddddddd);",
3772 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00003773 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3774 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
3775 " ccccccccccccccccccccccccccc;",
3776 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00003777 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3778 " aaaaa :\n"
3779 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
3780 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00003781}
3782
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003783TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
3784 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
3785 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
3786 verifyFormat("bool a = true, b = false;");
3787
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003788 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00003789 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003790 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00003791 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003792 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00003793 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00003794 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003795 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00003796 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
3797 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
3798 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
3799 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
3800 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
3801 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003802
Daniel Jasperbea1ab42015-03-01 18:55:26 +00003803 FormatStyle Style = getGoogleStyle();
3804 Style.PointerAlignment = FormatStyle::PAS_Left;
3805 Style.DerivePointerAlignment = false;
3806 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3807 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
3808 " *b = bbbbbbbbbbbbbbbbbbb;",
3809 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003810 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
3811 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
3812 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00003813 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00003814 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00003815}
3816
Nico Weber4a5030c2013-01-12 01:28:06 +00003817TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
3818 verifyFormat("arr[foo ? bar : baz];");
3819 verifyFormat("f()[foo ? bar : baz];");
3820 verifyFormat("(a + b)[foo ? bar : baz];");
3821 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
3822}
3823
Daniel Jasperf7935112012-12-03 18:12:45 +00003824TEST_F(FormatTest, AlignsStringLiterals) {
3825 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
3826 " \"short literal\");");
3827 verifyFormat(
3828 "looooooooooooooooooooooooongFunction(\n"
3829 " \"short literal\"\n"
3830 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003831 verifyFormat("someFunction(\"Always break between multi-line\"\n"
3832 " \" string literals\",\n"
3833 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003834 EXPECT_EQ("fun + \"1243\" /* comment */\n"
3835 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00003836 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003837 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00003838 getLLVMStyleWithColumns(28)));
3839 EXPECT_EQ(
3840 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
3841 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
3842 " \"aaaaaaaaaaaaaaaa\";",
3843 format("aaaaaa ="
3844 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
3845 "aaaaaaaaaaaaaaaaaaaaa\" "
3846 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00003847 verifyFormat("a = a + \"a\"\n"
3848 " \"a\"\n"
3849 " \"a\";");
3850 verifyFormat("f(\"a\", \"b\"\n"
3851 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00003852
3853 verifyFormat(
3854 "#define LL_FORMAT \"ll\"\n"
3855 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
3856 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00003857
3858 verifyFormat("#define A(X) \\\n"
3859 " \"aaaaa\" #X \"bbbbbb\" \\\n"
3860 " \"ccccc\"",
3861 getLLVMStyleWithColumns(23));
3862 verifyFormat("#define A \"def\"\n"
3863 "f(\"abc\" A \"ghi\"\n"
3864 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00003865
3866 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00003867 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00003868 verifyFormat("#define A(X) \\\n"
3869 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
3870 " L\"ccccc\"",
3871 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00003872
3873 verifyFormat("f(@\"a\"\n"
3874 " @\"b\");");
3875 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00003876 " @\"b\"\n"
3877 " @\"c\";");
3878 verifyFormat("NSString s = @\"a\"\n"
3879 " \"b\"\n"
3880 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00003881}
3882
Zachary Turner448592e2015-12-18 22:20:15 +00003883TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003884 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00003885 // No declarations or definitions should be moved to own line.
3886 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
3887 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003888 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003889 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003890 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003891 "int f() { return 1; }\n"
3892 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003893 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00003894
3895 // All declarations and definitions should have the return type moved to its
3896 // own
3897 // line.
3898 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
3899 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003900 " int\n"
3901 " f() {\n"
3902 " return 1;\n"
3903 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003904 " int\n"
3905 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003906 "};\n"
3907 "int\n"
3908 "f() {\n"
3909 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00003910 "}\n"
3911 "int\n"
3912 "g();\n",
3913 Style);
3914
3915 // Top-level definitions, and no kinds of declarations should have the
3916 // return type moved to its own line.
3917 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
3918 verifyFormat("class B {\n"
3919 " int f() { return 1; }\n"
3920 " int g();\n"
3921 "};\n"
3922 "int\n"
3923 "f() {\n"
3924 " return 1;\n"
3925 "}\n"
3926 "int g();\n",
3927 Style);
3928
3929 // Top-level definitions and declarations should have the return type moved
3930 // to its own line.
3931 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
3932 verifyFormat("class C {\n"
3933 " int f() { return 1; }\n"
3934 " int g();\n"
3935 "};\n"
3936 "int\n"
3937 "f() {\n"
3938 " return 1;\n"
3939 "}\n"
3940 "int\n"
3941 "g();\n",
3942 Style);
3943
3944 // All definitions should have the return type moved to its own line, but no
3945 // kinds of declarations.
3946 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
3947 verifyFormat("class D {\n"
3948 " int\n"
3949 " f() {\n"
3950 " return 1;\n"
3951 " }\n"
3952 " int g();\n"
3953 "};\n"
3954 "int\n"
3955 "f() {\n"
3956 " return 1;\n"
3957 "}\n"
3958 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003959 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00003960 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003961 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00003962 " return \"\";\n"
3963 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003964 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003965 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00003966 verifyFormat("template <class T>\n"
3967 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003968 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00003969 " return NULL;\n"
3970 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003971 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003972 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00003973 verifyFormat("class C {\n"
3974 " int\n"
3975 " operator+() {\n"
3976 " return 1;\n"
3977 " }\n"
3978 " int\n"
3979 " operator()() {\n"
3980 " return 1;\n"
3981 " }\n"
3982 "};\n",
3983 Style);
3984 verifyFormat("void\n"
3985 "A::operator()() {}\n"
3986 "void\n"
3987 "A::operator>>() {}\n"
3988 "void\n"
3989 "A::operator+() {}\n",
3990 Style);
3991 verifyFormat("void *operator new(std::size_t s);", // No break here.
3992 Style);
3993 verifyFormat("void *\n"
3994 "operator new(std::size_t s) {}",
3995 Style);
3996 verifyFormat("void *\n"
3997 "operator delete[](void *ptr) {}",
3998 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00003999 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00004000 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004001 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004002 "{\n"
4003 " return \"\";\n"
4004 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004005 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004006 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004007 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004008 "T *\n" // Problem here: no line break
4009 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004010 "{\n"
4011 " return NULL;\n"
4012 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004013 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004014 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004015}
4016
Alexander Kornienko58611712013-07-04 12:02:44 +00004017TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
4018 FormatStyle NoBreak = getLLVMStyle();
4019 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
4020 FormatStyle Break = getLLVMStyle();
4021 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00004022 verifyFormat("aaaa = \"bbbb\"\n"
4023 " \"cccc\";",
4024 NoBreak);
4025 verifyFormat("aaaa =\n"
4026 " \"bbbb\"\n"
4027 " \"cccc\";",
4028 Break);
4029 verifyFormat("aaaa(\"bbbb\"\n"
4030 " \"cccc\");",
4031 NoBreak);
4032 verifyFormat("aaaa(\n"
4033 " \"bbbb\"\n"
4034 " \"cccc\");",
4035 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004036 verifyFormat("aaaa(qqq, \"bbbb\"\n"
4037 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004038 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004039 verifyFormat("aaaa(qqq,\n"
4040 " \"bbbb\"\n"
4041 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00004042 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00004043 verifyFormat("aaaa(qqq,\n"
4044 " L\"bbbb\"\n"
4045 " L\"cccc\");",
4046 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004047 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
4048 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00004049 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00004050 verifyFormat("string s = someFunction(\n"
4051 " \"abc\"\n"
4052 " \"abc\");",
4053 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00004054
Daniel Jasper3251fff2014-06-10 06:27:23 +00004055 // As we break before unary operators, breaking right after them is bad.
4056 verifyFormat("string foo = abc ? \"x\"\n"
4057 " \"blah blah blah blah blah blah\"\n"
4058 " : \"y\";",
4059 Break);
4060
Daniel Jasperc834c702013-07-17 15:38:19 +00004061 // Don't break if there is no column gain.
4062 verifyFormat("f(\"aaaa\"\n"
4063 " \"bbbb\");",
4064 Break);
4065
4066 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004067 EXPECT_EQ("x = \"a\\\n"
4068 "b\\\n"
4069 "c\";",
4070 format("x = \"a\\\n"
4071 "b\\\n"
4072 "c\";",
4073 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004074 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004075 " \"a\\\n"
4076 "b\\\n"
4077 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00004078 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00004079 "b\\\n"
4080 "c\";",
4081 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00004082
4083 // Exempt ObjC strings for now.
4084 EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004085 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004086 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004087 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00004088 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00004089
4090 Break.ColumnLimit = 0;
4091 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00004092}
4093
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004094TEST_F(FormatTest, AlignsPipes) {
4095 verifyFormat(
4096 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4097 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4098 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4099 verifyFormat(
4100 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
4101 " << aaaaaaaaaaaaaaaaaaaa;");
4102 verifyFormat(
4103 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4104 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4105 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00004106 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4107 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4108 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004109 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
4110 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
4111 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
4112 verifyFormat(
4113 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4114 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4115 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004116 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4117 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4118 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4119 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00004120 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
4121 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00004122 verifyFormat(
4123 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4124 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00004125
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004126 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
4127 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00004128 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4129 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4130 " aaaaaaaaaaaaaaaaaaaaa)\n"
4131 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00004132 verifyFormat("LOG_IF(aaa == //\n"
4133 " bbb)\n"
4134 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004135
Daniel Jasper467ddb12013-08-12 12:58:05 +00004136 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00004137 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4138 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004139 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
4140 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4141 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00004142 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
4143 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00004144 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4145 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4146 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4147 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4148 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4149 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4150 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00004151
Daniel Jasperc238c872013-04-02 14:33:13 +00004152 verifyFormat(
4153 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4154 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00004155
4156 // Incomplete string literal.
4157 EXPECT_EQ("llvm::errs() << \"\n"
4158 " << a;",
4159 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00004160
4161 verifyFormat("void f() {\n"
4162 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
4163 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
4164 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00004165
4166 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00004167 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
4168 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
4169 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00004170
4171 // Handle '\n'.
4172 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
4173 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
4174 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
4175 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
4176 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
4177 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
4178 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004179}
4180
Daniel Jasper7209bb92016-12-13 11:16:42 +00004181TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
4182 verifyFormat("return out << \"somepacket = {\\n\"\n"
4183 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
4184 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
4185 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
4186 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
4187 " << \"}\";");
4188
4189 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4190 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4191 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
4192 verifyFormat(
4193 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
4194 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
4195 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
4196 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
4197 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
4198 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
4199 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
4200 verifyFormat(
4201 "void f() {\n"
4202 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
4203 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4204 "}");
4205
4206 // Breaking before the first "<<" is generally not desirable.
4207 verifyFormat(
4208 "llvm::errs()\n"
4209 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4210 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4211 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4212 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4213 getLLVMStyleWithColumns(70));
4214 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4215 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4216 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4217 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4218 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4219 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4220 getLLVMStyleWithColumns(70));
4221
4222 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4223 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4224 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
4225 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4226 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4227 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00004228 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
4229 " (aaaa + aaaa);",
4230 getLLVMStyleWithColumns(40));
4231 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
4232 " (aaaaaaa + aaaaa));",
4233 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00004234 verifyFormat(
4235 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
4236 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
4237 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00004238}
4239
Daniel Jasperf7935112012-12-03 18:12:45 +00004240TEST_F(FormatTest, UnderstandsEquals) {
4241 verifyFormat(
4242 "aaaaaaaaaaaaaaaaa =\n"
4243 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4244 verifyFormat(
4245 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004246 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004247 verifyFormat(
4248 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004249 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00004250 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004251 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
4252 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004253
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004254 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4255 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004256}
4257
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004258TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004259 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4260 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004261
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004262 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4263 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004264
4265 verifyFormat(
4266 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
4267 " Parameter2);");
4268
4269 verifyFormat(
4270 "ShortObject->shortFunction(\n"
4271 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
4272 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
4273
4274 verifyFormat("loooooooooooooongFunction(\n"
4275 " LoooooooooooooongObject->looooooooooooooooongFunction());");
4276
4277 verifyFormat(
4278 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
4279 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
4280
Daniel Jasper687af3b2013-02-14 14:26:07 +00004281 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4282 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00004283 verifyFormat("void f() {\n"
4284 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4285 " .Times(2)\n"
4286 " .WillRepeatedly(Return(SomeValue));\n"
4287 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00004288 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
4289 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00004290 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00004291 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4292 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00004293 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004294 verifyFormat("void f() {\n"
4295 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4296 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
4297 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00004298 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4299 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4300 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4301 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4302 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00004303 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4304 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4305 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4306 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
4307 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00004308
Daniel Jasperc7345cc2013-01-07 07:13:20 +00004309 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004310 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004311 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00004312 verifyFormat(
4313 "aaaaaaaaaaa->aaaaaaaaa(\n"
4314 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4315 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00004316
4317 verifyFormat(
4318 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4319 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00004320 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
4321 " aaaaaaaaa()->aaaaaa()->aaaaa());");
4322 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
4323 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004324
Daniel Jasper9b334242013-03-15 14:57:30 +00004325 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00004326 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4327 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00004328
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004329 FormatStyle NoBinPacking = getLLVMStyle();
4330 NoBinPacking.BinPackParameters = false;
4331 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4332 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4333 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
4334 " aaaaaaaaaaaaaaaaaaa,\n"
4335 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4336 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00004337
4338 // If there is a subsequent call, change to hanging indentation.
4339 verifyFormat(
4340 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4341 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
4342 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4343 verifyFormat(
4344 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4345 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00004346 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4347 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4348 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4349 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4350 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4351 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00004352}
4353
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004354TEST_F(FormatTest, WrapsTemplateDeclarations) {
4355 verifyFormat("template <typename T>\n"
4356 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00004357 verifyFormat("template <typename T>\n"
4358 "// T should be one of {A, B}.\n"
4359 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004360 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00004361 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00004362 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004363 verifyFormat("template <typename T>\n"
4364 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
4365 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004366 verifyFormat(
4367 "template <typename T>\n"
4368 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
4369 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00004370 verifyFormat(
4371 "template <typename T>\n"
4372 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
4373 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
4374 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00004375 verifyFormat("template <typename T>\n"
4376 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004377 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00004378 verifyFormat(
4379 "template <typename T1, typename T2 = char, typename T3 = char,\n"
4380 " typename T4 = char>\n"
4381 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00004382 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
4383 " template <typename> class cccccccccccccccccccccc,\n"
4384 " typename ddddddddddddd>\n"
4385 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004386 verifyFormat(
4387 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
4388 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00004389
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004390 verifyFormat("void f() {\n"
4391 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
4392 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
4393 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00004394
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00004395 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00004396 verifyFormat("template <typename T> void f();");
4397 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00004398 verifyFormat(
4399 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4400 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4401 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
4402 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4403 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4404 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
4405 " bbbbbbbbbbbbbbbbbbbbbbbb);",
4406 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00004407 EXPECT_EQ("static_cast<A< //\n"
4408 " B> *>(\n"
4409 "\n"
4410 " );",
4411 format("static_cast<A<//\n"
4412 " B>*>(\n"
4413 "\n"
4414 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00004415 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4416 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00004417
4418 FormatStyle AlwaysBreak = getLLVMStyle();
4419 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
4420 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
4421 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
4422 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
4423 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4424 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
4425 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
4426 verifyFormat("template <template <typename> class Fooooooo,\n"
4427 " template <typename> class Baaaaaaar>\n"
4428 "struct C {};",
4429 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00004430 verifyFormat("template <typename T> // T can be A, B or C.\n"
4431 "struct C {};",
4432 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00004433 verifyFormat("template <enum E> class A {\n"
4434 "public:\n"
4435 " E *f();\n"
4436 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00004437}
4438
Daniel Jasper2db1b4a2017-02-06 10:55:49 +00004439TEST_F(FormatTest, WrapsTemplateParameters) {
4440 FormatStyle Style = getLLVMStyle();
4441 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4442 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4443 verifyFormat(
4444 "template <typename... a> struct q {};\n"
4445 "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
4446 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
4447 " y;",
4448 Style);
4449 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4450 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4451 verifyFormat(
4452 "template <typename... a> struct r {};\n"
4453 "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
4454 " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
4455 " y;",
4456 Style);
4457 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4458 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4459 verifyFormat(
4460 "template <typename... a> struct s {};\n"
4461 "extern s<\n"
4462 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4463 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
4464 " y;",
4465 Style);
4466 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4467 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4468 verifyFormat(
4469 "template <typename... a> struct t {};\n"
4470 "extern t<\n"
4471 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4472 " aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
4473 " y;",
4474 Style);
4475}
4476
Daniel Jasper45797022013-01-25 10:57:27 +00004477TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
4478 verifyFormat(
4479 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4480 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4481 verifyFormat(
4482 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4483 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4484 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
4485
Daniel Jasper0f0234e2013-05-08 10:00:18 +00004486 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00004487 verifyFormat(
4488 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4489 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00004490 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00004491
Daniel Jasper45797022013-01-25 10:57:27 +00004492 verifyFormat(
4493 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00004494 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00004495
4496 // Breaking at nested name specifiers is generally not desirable.
4497 verifyFormat(
4498 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4499 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004500
4501 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004502 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
4503 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4504 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004505 " aaaaaaaaaaaaaaaaaaaaa);",
4506 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00004507
4508 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4509 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4510 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00004511}
4512
Daniel Jasperf7935112012-12-03 18:12:45 +00004513TEST_F(FormatTest, UnderstandsTemplateParameters) {
4514 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00004515 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004516 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
4517 verifyFormat("bool x = a < 1 || 2 > a;");
4518 verifyFormat("bool x = 5 < f<int>();");
4519 verifyFormat("bool x = f<int>() > 5;");
4520 verifyFormat("bool x = 5 < a<int>::x;");
4521 verifyFormat("bool x = a < 4 ? a > 2 : false;");
4522 verifyFormat("bool x = f() ? a < 2 : a > 2;");
4523
4524 verifyGoogleFormat("A<A<int>> a;");
4525 verifyGoogleFormat("A<A<A<int>>> a;");
4526 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00004527 verifyGoogleFormat("A<A<int> > a;");
4528 verifyGoogleFormat("A<A<A<int> > > a;");
4529 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00004530 verifyGoogleFormat("A<::A<int>> a;");
4531 verifyGoogleFormat("A<::A> a;");
4532 verifyGoogleFormat("A< ::A> a;");
4533 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00004534 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
4535 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00004536 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
4537 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00004538 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
4539 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00004540
Nico Weber7533b4d2014-09-24 17:17:32 +00004541 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
4542
Daniel Jasperf7935112012-12-03 18:12:45 +00004543 verifyFormat("test >> a >> b;");
4544 verifyFormat("test << a >> b;");
4545
4546 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004547 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00004548 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00004549 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
4550 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00004551 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00004552 verifyFormat("f(a.operator()<A>());");
4553 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4554 " .template operator()<A>());",
4555 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00004556
4557 // Not template parameters.
4558 verifyFormat("return a < b && c > d;");
4559 verifyFormat("void f() {\n"
4560 " while (a < b && c > d) {\n"
4561 " }\n"
4562 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00004563 verifyFormat("template <typename... Types>\n"
4564 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00004565
4566 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4567 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
4568 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00004569 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00004570 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00004571 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00004572}
4573
Malcolm Parsons6af3f142016-11-03 16:57:30 +00004574TEST_F(FormatTest, BitshiftOperatorWidth) {
4575 EXPECT_EQ("int a = 1 << 2; /* foo\n"
4576 " bar */",
4577 format("int a=1<<2; /* foo\n"
4578 " bar */"));
4579
4580 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
4581 " bar */",
4582 format("int b =256>>1 ; /* foo\n"
4583 " bar */"));
4584}
4585
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00004586TEST_F(FormatTest, UnderstandsBinaryOperators) {
4587 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00004588 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00004589}
4590
4591TEST_F(FormatTest, UnderstandsPointersToMembers) {
4592 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00004593 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00004594 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00004595 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00004596 verifyFormat("void f() {\n"
4597 " (a->*f)();\n"
4598 " a->*x;\n"
4599 " (a.*f)();\n"
4600 " ((*a).*f)();\n"
4601 " a.*x;\n"
4602 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00004603 verifyFormat("void f() {\n"
4604 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
4605 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
4606 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00004607 verifyFormat(
4608 "(aaaaaaaaaa->*bbbbbbb)(\n"
4609 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00004610 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00004611 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00004612 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00004613}
4614
Daniel Jasper8dd40472012-12-21 09:41:31 +00004615TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00004616 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00004617 verifyFormat("f(-1, -2, -3);");
4618 verifyFormat("a[-1] = 5;");
4619 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004620 verifyFormat("if (i == -1) {\n}");
4621 verifyFormat("if (i != -1) {\n}");
4622 verifyFormat("if (i > -1) {\n}");
4623 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00004624 verifyFormat("++(a->f());");
4625 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00004626 verifyFormat("(a->f())++;");
4627 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004628 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00004629
4630 verifyFormat("a-- > b;");
4631 verifyFormat("b ? -a : c;");
4632 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00004633 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00004634 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00004635 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00004636
4637 verifyFormat("return -1;");
4638 verifyFormat("switch (a) {\n"
4639 "case -1:\n"
4640 " break;\n"
4641 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00004642 verifyFormat("#define X -1");
4643 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00004644
Chandler Carruthf8b72662014-03-02 12:37:31 +00004645 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
4646 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00004647
4648 verifyFormat("int a = /* confusing comment */ -1;");
4649 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
4650 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004651}
4652
Daniel Jasper0c214fa2014-02-05 13:43:04 +00004653TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00004654 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00004655 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00004656 "}");
4657 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00004658 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00004659 verifyFormat("*aaa = aaaaaaa( // break\n"
4660 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00004661}
4662
Daniel Jasper8863ada2013-08-26 08:10:17 +00004663TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00004664 verifyFormat("bool operator<();");
4665 verifyFormat("bool operator>();");
4666 verifyFormat("bool operator=();");
4667 verifyFormat("bool operator==();");
4668 verifyFormat("bool operator!=();");
4669 verifyFormat("int operator+();");
4670 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00004671 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00004672 verifyFormat("bool operator();");
4673 verifyFormat("bool operator()();");
4674 verifyFormat("bool operator[]();");
4675 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004676 verifyFormat("operator int();");
4677 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00004678 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004679 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00004680 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00004681 verifyFormat("void *operator new(std::size_t size);");
4682 verifyFormat("void *operator new[](std::size_t size);");
4683 verifyFormat("void operator delete(void *ptr);");
4684 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00004685 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
4686 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00004687 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00004688 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004689
Daniel Jasper0af92eb2013-02-15 19:24:08 +00004690 verifyFormat(
4691 "ostream &operator<<(ostream &OutputStream,\n"
4692 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00004693 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
4694 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
4695 " return left.group < right.group;\n"
4696 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00004697 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00004698 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00004699
Daniel Jasper35d2dc72013-02-11 08:01:18 +00004700 verifyGoogleFormat("operator void*();");
4701 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00004702 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00004703
4704 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00004705 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
4706 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004707}
4708
Daniel Jasper1c220482015-02-25 10:30:06 +00004709TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00004710 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
4711 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
4712 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
4713 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
4714 verifyFormat("Deleted &operator=(const Deleted &) &;");
4715 verifyFormat("Deleted &operator=(const Deleted &) &&;");
4716 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
4717 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
4718 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
4719 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
4720 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00004721 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00004722 verifyFormat("template <typename T>\n"
4723 "void F(T) && = delete;",
4724 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00004725
Daniel Jasperaf642c62015-08-25 13:40:51 +00004726 FormatStyle AlignLeft = getLLVMStyle();
4727 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00004728 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00004729 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
4730 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
4731 AlignLeft);
4732 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
4733 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00004734 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
4735 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
4736 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
4737 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00004738 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00004739
4740 FormatStyle Spaces = getLLVMStyle();
4741 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00004742 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
4743 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
4744 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
4745 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00004746
4747 Spaces.SpacesInCStyleCastParentheses = false;
4748 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00004749 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
4750 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
4751 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
4752 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00004753}
4754
Daniel Jasperd6a947f2013-01-11 16:09:04 +00004755TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00004756 verifyFormat("void f() {\n"
4757 " A *a = new A;\n"
4758 " A *a = new (placement) A;\n"
4759 " delete a;\n"
4760 " delete (A *)a;\n"
4761 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00004762 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
4763 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00004764 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4765 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
4766 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00004767 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00004768}
4769
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00004770TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004771 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004772 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00004773 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004774 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00004775 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004776 verifyIndependentOfContext("int a = b * 10;");
4777 verifyIndependentOfContext("int a = 10 * b;");
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 * c;");
4783 verifyIndependentOfContext("int a = *b;");
4784 verifyIndependentOfContext("int a = *b * c;");
4785 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00004786 verifyIndependentOfContext("int a = b * (10);");
4787 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004788 verifyIndependentOfContext("return 10 * b;");
4789 verifyIndependentOfContext("return *b * *c;");
4790 verifyIndependentOfContext("return a & ~b;");
4791 verifyIndependentOfContext("f(b ? *c : *d);");
4792 verifyIndependentOfContext("int a = b ? *c : *d;");
4793 verifyIndependentOfContext("*b = a;");
4794 verifyIndependentOfContext("a * ~b;");
4795 verifyIndependentOfContext("a * !b;");
4796 verifyIndependentOfContext("a * +b;");
4797 verifyIndependentOfContext("a * -b;");
4798 verifyIndependentOfContext("a * ++b;");
4799 verifyIndependentOfContext("a * --b;");
4800 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00004801 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004802 verifyIndependentOfContext("f() * b;");
4803 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00004804 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004805 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00004806 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004807 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00004808 verifyIndependentOfContext("return sizeof(int **);");
4809 verifyIndependentOfContext("return sizeof(int ******);");
4810 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00004811 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00004812 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00004813 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00004814 verifyGoogleFormat("return sizeof(int**);");
4815 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
4816 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00004817 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00004818 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00004819 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00004820 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00004821 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00004822 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00004823 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00004824 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00004825 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00004826 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00004827 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00004828 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00004829 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00004830 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00004831 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00004832 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00004833 verifyFormat("void f(const MyOverride &override);");
4834 verifyFormat("void f(const MyFinal &final);");
4835 verifyIndependentOfContext("bool a = f() && override.f();");
4836 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00004837
Daniel Jasper5b49f472013-01-23 12:10:53 +00004838 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00004839
Daniel Jasper5b49f472013-01-23 12:10:53 +00004840 verifyIndependentOfContext("A<int *> a;");
4841 verifyIndependentOfContext("A<int **> a;");
4842 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00004843 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00004844 verifyIndependentOfContext(
4845 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004846 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00004847 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00004848 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00004849 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00004850 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00004851
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00004852 verifyFormat(
4853 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4854 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4855
Daniel Jasper1f5d6372016-06-13 14:45:12 +00004856 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00004857 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00004858 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004859 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00004860 verifyGoogleFormat("A<int*> a;");
4861 verifyGoogleFormat("A<int**> a;");
4862 verifyGoogleFormat("A<int*, int*> a;");
4863 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00004864 verifyGoogleFormat("f(b ? *c : *d);");
4865 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00004866 verifyGoogleFormat("Type* t = **x;");
4867 verifyGoogleFormat("Type* t = *++*x;");
4868 verifyGoogleFormat("*++*x;");
4869 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
4870 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00004871 verifyGoogleFormat(
4872 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00004873 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00004874 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
4875 verifyGoogleFormat("template <typename T>\n"
4876 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00004877
Daniel Jasper1904e9b2014-08-14 10:53:19 +00004878 FormatStyle Left = getLLVMStyle();
4879 Left.PointerAlignment = FormatStyle::PAS_Left;
4880 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00004881 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00004882 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00004883
Daniel Jasper5b49f472013-01-23 12:10:53 +00004884 verifyIndependentOfContext("a = *(x + y);");
4885 verifyIndependentOfContext("a = &(x + y);");
4886 verifyIndependentOfContext("*(x + y).call();");
4887 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00004888 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00004889
Daniel Jasper5b49f472013-01-23 12:10:53 +00004890 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00004891 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00004892 "int *MyValues = {\n"
4893 " *A, // Operator detection might be confused by the '{'\n"
4894 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00004895 "};");
Nico Weber80a82762013-01-17 17:17:19 +00004896
Daniel Jasper5b49f472013-01-23 12:10:53 +00004897 verifyIndependentOfContext("if (int *a = &b)");
4898 verifyIndependentOfContext("if (int &a = *b)");
4899 verifyIndependentOfContext("if (a & b[i])");
4900 verifyIndependentOfContext("if (a::b::c::d & b[i])");
4901 verifyIndependentOfContext("if (*b[i])");
4902 verifyIndependentOfContext("if (int *a = (&b))");
4903 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00004904 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00004905 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00004906 verifyFormat("void f() {\n"
4907 " for (const int &v : Values) {\n"
4908 " }\n"
4909 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00004910 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
4911 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00004912 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00004913
Daniel Jaspera98da3d2013-11-07 19:56:07 +00004914 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00004915 verifyFormat("#define MACRO \\\n"
4916 " int *i = a * b; \\\n"
4917 " void f(a *b);",
4918 getLLVMStyleWithColumns(19));
4919
Daniel Jasper97b89482013-03-13 07:49:51 +00004920 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00004921 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00004922 verifyIndependentOfContext("T **t = new T *;");
4923 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00004924 verifyGoogleFormat("A = new SomeType*[Length]();");
4925 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00004926 verifyGoogleFormat("T** t = new T*;");
4927 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00004928
Daniel Jasper990ff972013-05-07 14:17:18 +00004929 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00004930 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00004931 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00004932 verifyFormat("STATIC_ASSERT((a & b) == 0);");
4933 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00004934 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00004935 "typename t::if<x && y>::type f() {}");
4936 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00004937 verifyFormat("vector<int *> v;");
4938 verifyFormat("vector<int *const> v;");
4939 verifyFormat("vector<int *const **const *> v;");
4940 verifyFormat("vector<int *volatile> v;");
4941 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00004942 verifyFormat("foo<b && false>();");
4943 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00004944 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00004945 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004946 "template <class T, class = typename std::enable_if<\n"
4947 " std::is_integral<T>::value &&\n"
4948 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
4949 "void F();",
4950 getLLVMStyleWithColumns(70));
4951 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004952 "template <class T,\n"
4953 " class = typename std::enable_if<\n"
4954 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004955 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
4956 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00004957 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004958 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00004959 verifyFormat(
4960 "template <class T,\n"
4961 " class = typename ::std::enable_if<\n"
4962 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
4963 "void F();",
4964 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00004965
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00004966 verifyIndependentOfContext("MACRO(int *i);");
4967 verifyIndependentOfContext("MACRO(auto *a);");
4968 verifyIndependentOfContext("MACRO(const A *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);");
Daniel Jasperd1926a32013-01-02 08:44:14 +00005329}
5330
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005331TEST_F(FormatTest, FormatsArrays) {
5332 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5333 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00005334 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
5335 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00005336 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
5337 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005338 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5339 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5340 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5341 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
5342 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5343 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5344 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5345 verifyFormat(
5346 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
5347 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5348 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00005349 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
5350 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00005351
5352 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
5353 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00005354 verifyFormat(
5355 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
5356 " .aaaaaaa[0]\n"
5357 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00005358 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00005359
5360 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00005361
5362 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
5363 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00005364}
5365
Daniel Jaspere9de2602012-12-06 09:56:08 +00005366TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
5367 verifyFormat("(a)->b();");
5368 verifyFormat("--a;");
5369}
5370
Daniel Jasper8b529712012-12-04 13:02:32 +00005371TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00005372 verifyFormat("#include <string>\n"
5373 "#include <a/b/c.h>\n"
5374 "#include \"a/b/string\"\n"
5375 "#include \"string.h\"\n"
5376 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00005377 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005378 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00005379 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00005380 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00005381 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005382 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
5383 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00005384 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
5385 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00005386
Daniel Jasper5ef433f2013-01-13 08:12:18 +00005387 verifyFormat("#import <string>");
5388 verifyFormat("#import <a/b/c.h>");
5389 verifyFormat("#import \"a/b/string\"");
5390 verifyFormat("#import \"string.h\"");
5391 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00005392 verifyFormat("#if __has_include(<strstream>)\n"
5393 "#include <strstream>\n"
5394 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00005395
Daniel Jasper343643b2014-08-13 08:29:18 +00005396 verifyFormat("#define MY_IMPORT <a/b>");
5397
Nico Weber21088802017-02-10 19:36:52 +00005398 verifyFormat("#if __has_include(<a/b>)");
5399 verifyFormat("#if __has_include_next(<a/b>)");
5400 verifyFormat("#define F __has_include(<a/b>)");
5401 verifyFormat("#define F __has_include_next(<a/b>)");
5402
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00005403 // Protocol buffer definition or missing "#".
5404 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
5405 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00005406
5407 FormatStyle Style = getLLVMStyle();
5408 Style.AlwaysBreakBeforeMultilineStrings = true;
5409 Style.ColumnLimit = 0;
5410 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00005411
5412 // But 'import' might also be a regular C++ namespace.
5413 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5414 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00005415}
5416
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005417//===----------------------------------------------------------------------===//
5418// Error recovery tests.
5419//===----------------------------------------------------------------------===//
5420
Daniel Jasper66e9dee2013-02-14 09:19:04 +00005421TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005422 FormatStyle NoBinPacking = getLLVMStyle();
5423 NoBinPacking.BinPackParameters = false;
5424 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
5425 " double *min_x,\n"
5426 " double *max_x,\n"
5427 " double *min_y,\n"
5428 " double *max_y,\n"
5429 " double *min_z,\n"
5430 " double *max_z, ) {}",
5431 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00005432}
5433
Daniel Jasper83a54d22013-01-10 09:26:47 +00005434TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00005435 verifyFormat("void f() { return; }\n42");
5436 verifyFormat("void f() {\n"
5437 " if (0)\n"
5438 " return;\n"
5439 "}\n"
5440 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00005441 verifyFormat("void f() { return }\n42");
5442 verifyFormat("void f() {\n"
5443 " if (0)\n"
5444 " return\n"
5445 "}\n"
5446 "42");
5447}
5448
5449TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
5450 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
5451 EXPECT_EQ("void f() {\n"
5452 " if (a)\n"
5453 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005454 "}",
5455 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00005456 EXPECT_EQ("namespace N {\n"
5457 "void f()\n"
5458 "}",
5459 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00005460 EXPECT_EQ("namespace N {\n"
5461 "void f() {}\n"
5462 "void g()\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005463 "}",
5464 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00005465}
5466
Daniel Jasper2df93312013-01-09 10:16:05 +00005467TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
5468 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00005469 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005470 " b;",
5471 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00005472 verifyFormat("function(\n"
5473 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005474 " LoooooooooooongArgument);\n",
5475 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00005476}
5477
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005478TEST_F(FormatTest, IncorrectAccessSpecifier) {
5479 verifyFormat("public:");
5480 verifyFormat("class A {\n"
5481 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005482 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005483 "};");
5484 verifyFormat("public\n"
5485 "int qwerty;");
5486 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005487 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005488 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005489 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005490 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005491 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00005492}
Daniel Jasperf7935112012-12-03 18:12:45 +00005493
Daniel Jasper291f9362013-03-20 15:58:10 +00005494TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
5495 verifyFormat("{");
5496 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00005497 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00005498}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005499
5500TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005501 verifyFormat("do {\n}");
5502 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005503 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005504 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005505 "wheeee(fun);");
5506 verifyFormat("do {\n"
5507 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00005508 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00005509}
5510
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005511TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00005512 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005513 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00005514 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00005515 verifyFormat("while {\n foo;\n foo();\n}");
5516 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00005517}
5518
Daniel Jasperc0880a92013-01-04 18:52:56 +00005519TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00005520 verifyIncompleteFormat("namespace {\n"
5521 "class Foo { Foo (\n"
5522 "};\n"
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00005523 "} // namespace");
Daniel Jasperc0880a92013-01-04 18:52:56 +00005524}
5525
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005526TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005527 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005528 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
5529 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005530 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005531
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005532 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00005533 " {\n"
5534 " breakme(\n"
5535 " qwe);\n"
5536 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005537 format("{\n"
5538 " {\n"
5539 " breakme(qwe);\n"
5540 "}\n",
5541 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00005542}
5543
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00005544TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005545 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005546 " avariable,\n"
5547 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005548 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00005549}
5550
Manuel Klimek762dd182013-01-21 10:07:49 +00005551TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005552 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00005553}
5554
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005555TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00005556 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00005557 verifyFormat("vector<int> x{\n"
5558 " 1, 2, 3, 4,\n"
5559 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005560 verifyFormat("vector<T> x{{}, {}, {}, {}};");
5561 verifyFormat("f({1, 2});");
5562 verifyFormat("auto v = Foo{-1};");
5563 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
5564 verifyFormat("Class::Class : member{1, 2, 3} {}");
5565 verifyFormat("new vector<int>{1, 2, 3};");
5566 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00005567 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005568 verifyFormat("return {arg1, arg2};");
5569 verifyFormat("return {arg1, SomeType{parameter}};");
5570 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
5571 verifyFormat("new T{arg1, arg2};");
5572 verifyFormat("f(MyMap[{composite, key}]);");
5573 verifyFormat("class Class {\n"
5574 " T member = {arg1, arg2};\n"
5575 "};");
5576 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00005577 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
5578 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00005579
Daniel Jasper438059e2014-05-22 12:11:13 +00005580 verifyFormat("int foo(int i) { return fo1{}(i); }");
5581 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005582 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00005583 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00005584 verifyFormat("Node n{1, Node{1000}, //\n"
5585 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00005586 verifyFormat("Aaaa aaaaaaa{\n"
5587 " {\n"
5588 " aaaa,\n"
5589 " },\n"
5590 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00005591 verifyFormat("class C : public D {\n"
5592 " SomeClass SC{2};\n"
5593 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00005594 verifyFormat("class C : public A {\n"
5595 " class D : public B {\n"
5596 " void f() { int i{2}; }\n"
5597 " };\n"
5598 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00005599 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00005600
Daniel Jaspere4ada022016-12-13 10:05:03 +00005601 // Cases where distinguising braced lists and blocks is hard.
5602 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
5603 verifyFormat("void f() {\n"
5604 " return; // comment\n"
5605 "}\n"
5606 "SomeType t;");
5607 verifyFormat("void f() {\n"
5608 " if (a) {\n"
5609 " f();\n"
5610 " }\n"
5611 "}\n"
5612 "SomeType t;");
5613
Daniel Jasper08434342015-05-26 07:26:26 +00005614 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005615 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00005616 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005617 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
5618 " bbbbb,\n"
5619 " ccccc,\n"
5620 " ddddd,\n"
5621 " eeeee,\n"
5622 " ffffff,\n"
5623 " ggggg,\n"
5624 " hhhhhh,\n"
5625 " iiiiii,\n"
5626 " jjjjjj,\n"
5627 " kkkkkk};",
5628 NoBinPacking);
5629 verifyFormat("const Aaaaaa aaaaa = {\n"
5630 " aaaaa,\n"
5631 " bbbbb,\n"
5632 " ccccc,\n"
5633 " ddddd,\n"
5634 " eeeee,\n"
5635 " ffffff,\n"
5636 " ggggg,\n"
5637 " hhhhhh,\n"
5638 " iiiiii,\n"
5639 " jjjjjj,\n"
5640 " kkkkkk,\n"
5641 "};",
5642 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00005643 verifyFormat(
5644 "const Aaaaaa aaaaa = {\n"
5645 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
5646 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
5647 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
5648 "};",
5649 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00005650
Chandler Carruthf8b72662014-03-02 12:37:31 +00005651 // FIXME: The alignment of these trailing comments might be bad. Then again,
5652 // this might be utterly useless in real code.
5653 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00005654 " : some_value{ //\n"
5655 " aaaaaaa, //\n"
5656 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00005657
Chandler Carruthf8b72662014-03-02 12:37:31 +00005658 // In braced lists, the first comment is always assumed to belong to the
5659 // first element. Thus, it can be moved to the next or previous line as
5660 // appropriate.
5661 EXPECT_EQ("function({// First element:\n"
5662 " 1,\n"
5663 " // Second element:\n"
5664 " 2});",
5665 format("function({\n"
5666 " // First element:\n"
5667 " 1,\n"
5668 " // Second element:\n"
5669 " 2});"));
5670 EXPECT_EQ("std::vector<int> MyNumbers{\n"
5671 " // First element:\n"
5672 " 1,\n"
5673 " // Second element:\n"
5674 " 2};",
5675 format("std::vector<int> MyNumbers{// First element:\n"
5676 " 1,\n"
5677 " // Second element:\n"
5678 " 2};",
5679 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00005680 // A trailing comma should still lead to an enforced line break.
5681 EXPECT_EQ("vector<int> SomeVector = {\n"
5682 " // aaa\n"
5683 " 1, 2,\n"
5684 "};",
5685 format("vector<int> SomeVector = { // aaa\n"
5686 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00005687
Chandler Carruthf8b72662014-03-02 12:37:31 +00005688 FormatStyle ExtraSpaces = getLLVMStyle();
5689 ExtraSpaces.Cpp11BracedListStyle = false;
5690 ExtraSpaces.ColumnLimit = 75;
5691 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
5692 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
5693 verifyFormat("f({ 1, 2 });", ExtraSpaces);
5694 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
5695 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
5696 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
5697 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
5698 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
5699 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
5700 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
5701 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
5702 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
5703 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
5704 verifyFormat("class Class {\n"
5705 " T member = { arg1, arg2 };\n"
5706 "};",
5707 ExtraSpaces);
5708 verifyFormat(
5709 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5710 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
5711 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
5712 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
5713 ExtraSpaces);
5714 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00005715 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00005716 ExtraSpaces);
5717 verifyFormat(
5718 "someFunction(OtherParam,\n"
5719 " BracedList{ // comment 1 (Forcing interesting break)\n"
5720 " param1, param2,\n"
5721 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00005722 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00005723 ExtraSpaces);
5724 verifyFormat(
5725 "std::this_thread::sleep_for(\n"
5726 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
5727 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00005728 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00005729 " aaaaaaa,\n"
5730 " aaaaaaaaaa,\n"
5731 " aaaaa,\n"
5732 " aaaaaaaaaaaaaaa,\n"
5733 " aaa,\n"
5734 " aaaaaaaaaa,\n"
5735 " a,\n"
5736 " aaaaaaaaaaaaaaaaaaaaa,\n"
5737 " aaaaaaaaaaaa,\n"
5738 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
5739 " aaaaaaa,\n"
5740 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005741 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00005742}
5743
Daniel Jasper33b909c2013-10-25 14:29:37 +00005744TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00005745 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5746 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5747 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5748 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5749 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5750 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00005751 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005752 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00005753 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005754 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5755 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005756 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00005757 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5758 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5759 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
5760 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
5761 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
5762 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
5763 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005764 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005765 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5766 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00005767 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
5768 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5769 " // Separating comment.\n"
5770 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
5771 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
5772 " // Leading comment\n"
5773 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5774 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005775 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5776 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005777 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00005778 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5779 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005780 getLLVMStyleWithColumns(38));
5781 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005782 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
5783 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00005784 verifyFormat(
5785 "static unsigned SomeValues[10][3] = {\n"
5786 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
5787 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
5788 verifyFormat("static auto fields = new vector<string>{\n"
5789 " \"aaaaaaaaaaaaa\",\n"
5790 " \"aaaaaaaaaaaaa\",\n"
5791 " \"aaaaaaaaaaaa\",\n"
5792 " \"aaaaaaaaaaaaaa\",\n"
5793 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
5794 " \"aaaaaaaaaaaa\",\n"
5795 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
5796 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00005797 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
5798 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
5799 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
5800 " 3, cccccccccccccccccccccc};",
5801 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00005802
5803 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00005804 verifyFormat("vector<int> x = {\n"
5805 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
5806 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00005807 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00005808 verifyFormat("vector<int> x = {\n"
5809 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00005810 "};",
5811 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00005812 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5813 " 1, 1, 1, 1,\n"
5814 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00005815 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00005816
Daniel Jasper60c27072015-05-13 08:16:00 +00005817 // Trailing comment in the first line.
5818 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
5819 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
5820 " 111111111, 222222222, 3333333333, 444444444, //\n"
5821 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00005822 // Trailing comment in the last line.
5823 verifyFormat("int aaaaa[] = {\n"
5824 " 1, 2, 3, // comment\n"
5825 " 4, 5, 6 // comment\n"
5826 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00005827
Daniel Jaspere4c16c72015-05-08 13:51:14 +00005828 // With nested lists, we should either format one item per line or all nested
5829 // lists one on line.
5830 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00005831 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
5832 " {aaaaaaaaaaaaaaaaaaa},\n"
5833 " {aaaaaaaaaaaaaaaaaaaaa},\n"
5834 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00005835 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00005836 verifyFormat(
5837 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00005838 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
5839 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
5840 " {aaa, aaa},\n"
5841 " {aaa, aaa},\n"
5842 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
5843 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
5844 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00005845
5846 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00005847 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
5848 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00005849
5850 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00005851
Daniel Jaspereb65e912015-12-21 18:31:15 +00005852 // No braced initializer here.
5853 verifyFormat("void f() {\n"
5854 " struct Dummy {};\n"
5855 " f(v);\n"
5856 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00005857
5858 // Long lists should be formatted in columns even if they are nested.
5859 verifyFormat(
5860 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5861 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5862 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5863 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5864 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5865 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00005866
5867 // Allow "single-column" layout even if that violates the column limit. There
5868 // isn't going to be a better way.
5869 verifyFormat("std::vector<int> a = {\n"
5870 " aaaaaaaa,\n"
5871 " aaaaaaaa,\n"
5872 " aaaaaaaa,\n"
5873 " aaaaaaaa,\n"
5874 " aaaaaaaaaa,\n"
5875 " aaaaaaaa,\n"
5876 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
5877 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00005878 verifyFormat("vector<int> aaaa = {\n"
5879 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5880 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5881 " aaaaaa.aaaaaaa,\n"
5882 " aaaaaa.aaaaaaa,\n"
5883 " aaaaaa.aaaaaaa,\n"
5884 " aaaaaa.aaaaaaa,\n"
5885 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00005886
5887 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005888 verifyFormat("someFunction(Param, {List1, List2,\n"
5889 " List3});",
5890 getLLVMStyleWithColumns(35));
5891 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00005892 " {List1, List2,\n"
5893 " List3});",
5894 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00005895 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
5896 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00005897}
5898
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005899TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005900 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00005901 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005902
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005903 verifyFormat("void f() { return 42; }");
5904 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005905 " return 42;\n"
5906 "}",
5907 DoNotMerge);
5908 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005909 " // Comment\n"
5910 "}");
5911 verifyFormat("{\n"
5912 "#error {\n"
5913 " int a;\n"
5914 "}");
5915 verifyFormat("{\n"
5916 " int a;\n"
5917 "#error {\n"
5918 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00005919 verifyFormat("void f() {} // comment");
5920 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00005921 verifyFormat("void f() {\n"
5922 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00005923 DoNotMerge);
5924 verifyFormat("void f() {\n"
5925 " int a;\n"
5926 "} // comment",
5927 DoNotMerge);
5928 verifyFormat("void f() {\n"
5929 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00005930 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005931
5932 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
5933 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
5934
5935 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
5936 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00005937 verifyFormat("class C {\n"
5938 " C()\n"
5939 " : iiiiiiii(nullptr),\n"
5940 " kkkkkkk(nullptr),\n"
5941 " mmmmmmm(nullptr),\n"
5942 " nnnnnnn(nullptr) {}\n"
5943 "};",
5944 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00005945
5946 FormatStyle NoColumnLimit = getLLVMStyle();
5947 NoColumnLimit.ColumnLimit = 0;
5948 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
5949 EXPECT_EQ("class C {\n"
5950 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005951 "};",
5952 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00005953 EXPECT_EQ("A()\n"
5954 " : b(0) {\n"
5955 "}",
5956 format("A()\n:b(0)\n{\n}", NoColumnLimit));
5957
5958 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00005959 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
5960 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00005961 EXPECT_EQ("A()\n"
5962 " : b(0) {\n"
5963 "}",
5964 format("A():b(0){}", DoNotMergeNoColumnLimit));
5965 EXPECT_EQ("A()\n"
5966 " : b(0) {\n"
5967 "}",
5968 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00005969
5970 verifyFormat("#define A \\\n"
5971 " void f() { \\\n"
5972 " int i; \\\n"
5973 " }",
5974 getLLVMStyleWithColumns(20));
5975 verifyFormat("#define A \\\n"
5976 " void f() { int i; }",
5977 getLLVMStyleWithColumns(21));
5978 verifyFormat("#define A \\\n"
5979 " void f() { \\\n"
5980 " int i; \\\n"
5981 " } \\\n"
5982 " int j;",
5983 getLLVMStyleWithColumns(22));
5984 verifyFormat("#define A \\\n"
5985 " void f() { int i; } \\\n"
5986 " int j;",
5987 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00005988}
5989
Daniel Jasperd74cf402014-04-08 12:46:38 +00005990TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
5991 FormatStyle MergeInlineOnly = getLLVMStyle();
5992 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
5993 verifyFormat("class C {\n"
5994 " int f() { return 42; }\n"
5995 "};",
5996 MergeInlineOnly);
5997 verifyFormat("int f() {\n"
5998 " return 42;\n"
5999 "}",
6000 MergeInlineOnly);
6001}
6002
Manuel Klimeke01bab52013-01-15 13:38:33 +00006003TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
6004 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006005 verifyFormat("struct foo a = {bar};\nint n;");
6006 verifyFormat("class foo a = {bar};\nint n;");
6007 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006008
6009 // Elaborate types inside function definitions.
6010 verifyFormat("struct foo f() {}\nint n;");
6011 verifyFormat("class foo f() {}\nint n;");
6012 verifyFormat("union foo f() {}\nint n;");
6013
6014 // Templates.
6015 verifyFormat("template <class X> void f() {}\nint n;");
6016 verifyFormat("template <struct X> void f() {}\nint n;");
6017 verifyFormat("template <union X> void f() {}\nint n;");
6018
6019 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006020 verifyFormat("struct {\n} n;");
6021 verifyFormat(
6022 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006023 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006024 verifyFormat("class MACRO Z {\n} n;");
6025 verifyFormat("class MACRO(X) Z {\n} n;");
6026 verifyFormat("class __attribute__(X) Z {\n} n;");
6027 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00006028 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00006029 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00006030 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6031 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006032
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006033 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006034 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006035
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006036 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00006037 verifyFormat(
6038 "template <typename F>\n"
6039 "Matcher(const Matcher<F> &Other,\n"
6040 " typename enable_if_c<is_base_of<F, T>::value &&\n"
6041 " !is_same<F, T>::value>::type * = 0)\n"
6042 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6043
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006044 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006045 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00006046 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006047
6048 // FIXME:
6049 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006050 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006051
Manuel Klimeke01bab52013-01-15 13:38:33 +00006052 // Elaborate types where incorrectly parsing the structural element would
6053 // break the indent.
6054 verifyFormat("if (true)\n"
6055 " class X x;\n"
6056 "else\n"
6057 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00006058
6059 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00006060 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00006061}
6062
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006063TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00006064 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
6065 format("#error Leave all white!!!!! space* alone!\n"));
6066 EXPECT_EQ(
6067 "#warning Leave all white!!!!! space* alone!\n",
6068 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006069 EXPECT_EQ("#error 1", format(" # error 1"));
6070 EXPECT_EQ("#warning 1", format(" # warning 1"));
6071}
6072
Daniel Jasper4431aa92013-04-23 13:54:04 +00006073TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00006074 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00006075 verifyFormat("#if (AAAA && BBBB)");
6076 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00006077 // FIXME: Come up with a better indentation for #elif.
6078 verifyFormat(
6079 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
6080 " defined(BBBBBBBB)\n"
6081 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
6082 " defined(BBBBBBBB)\n"
6083 "#endif",
6084 getLLVMStyleWithColumns(65));
6085}
6086
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006087TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
6088 FormatStyle AllowsMergedIf = getGoogleStyle();
6089 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
6090 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
6091 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00006092 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
6093 EXPECT_EQ("if (true) return 42;",
6094 format("if (true)\nreturn 42;", AllowsMergedIf));
6095 FormatStyle ShortMergedIf = AllowsMergedIf;
6096 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006097 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006098 " if (true) return 42;",
6099 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006100 verifyFormat("#define A \\\n"
6101 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00006102 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006103 "#define B",
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 "g();",
6109 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00006110 verifyFormat("{\n"
6111 "#ifdef A\n"
6112 " // Comment\n"
6113 " if (true) continue;\n"
6114 "#endif\n"
6115 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00006116 " if (true) continue;\n"
6117 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006118 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00006119 ShortMergedIf.ColumnLimit = 29;
6120 verifyFormat("#define A \\\n"
6121 " if (aaaaaaaaaa) return 1; \\\n"
6122 " return 2;",
6123 ShortMergedIf);
6124 ShortMergedIf.ColumnLimit = 28;
6125 verifyFormat("#define A \\\n"
6126 " if (aaaaaaaaaa) \\\n"
6127 " return 1; \\\n"
6128 " return 2;",
6129 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00006130}
6131
Manuel Klimekd33516e2013-01-23 10:09:28 +00006132TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00006133 verifyFormat("void f(int *a);");
6134 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00006135 verifyFormat("class A {\n void f(int *a);\n};");
6136 verifyFormat("class A {\n int *a;\n};");
6137 verifyFormat("namespace a {\n"
6138 "namespace b {\n"
6139 "class A {\n"
6140 " void f() {}\n"
6141 " int *a;\n"
6142 "};\n"
6143 "}\n"
6144 "}");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00006145}
6146
Manuel Klimekd33516e2013-01-23 10:09:28 +00006147TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
6148 verifyFormat("while");
6149 verifyFormat("operator");
6150}
6151
Daniel Jasperfda47cd2016-10-31 13:23:00 +00006152TEST_F(FormatTest, SkipsDeeplyNestedLines) {
6153 // This code would be painfully slow to format if we didn't skip it.
6154 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
6155 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6156 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6157 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6158 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6159 "A(1, 1)\n"
6160 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
6161 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6162 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6163 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6164 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6165 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
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 // Deeply nested part is untouched, rest is formatted.
6171 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
6172 format(std::string("int i;\n") + Code + "int j;\n",
6173 getLLVMStyle(), IC_ExpectIncomplete));
6174}
6175
Nico Weber7e6a7a12013-01-08 17:56:31 +00006176//===----------------------------------------------------------------------===//
6177// Objective-C tests.
6178//===----------------------------------------------------------------------===//
6179
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006180TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
6181 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
6182 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
6183 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00006184 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006185 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
6186 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
6187 format("-(NSInteger)Method3:(id)anObject;"));
6188 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
6189 format("-(NSInteger)Method4:(id)anObject;"));
6190 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
6191 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
6192 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
6193 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00006194 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
6195 "forAllCells:(BOOL)flag;",
6196 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
6197 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00006198
6199 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00006200 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
6201 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00006202 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
6203 " inRange:(NSRange)range\n"
6204 " outRange:(NSRange)out_range\n"
6205 " outRange1:(NSRange)out_range1\n"
6206 " outRange2:(NSRange)out_range2\n"
6207 " outRange3:(NSRange)out_range3\n"
6208 " outRange4:(NSRange)out_range4\n"
6209 " outRange5:(NSRange)out_range5\n"
6210 " outRange6:(NSRange)out_range6\n"
6211 " outRange7:(NSRange)out_range7\n"
6212 " outRange8:(NSRange)out_range8\n"
6213 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00006214
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00006215 // When the function name has to be wrapped.
6216 FormatStyle Style = getLLVMStyle();
6217 Style.IndentWrappedFunctionNames = false;
6218 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
6219 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
6220 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
6221 "}",
6222 Style);
6223 Style.IndentWrappedFunctionNames = true;
6224 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
6225 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
6226 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
6227 "}",
6228 Style);
6229
Nico Weberd6f962f2013-01-10 20:18:33 +00006230 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00006231 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00006232 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
6233 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00006234 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00006235
Daniel Jasper37194282013-05-28 08:33:00 +00006236 verifyFormat("- (int (*)())foo:(int (*)())f;");
6237 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00006238
6239 // If there's no return type (very rare in practice!), LLVM and Google style
6240 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00006241 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00006242 verifyFormat("- foo:(int)f;");
6243 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00006244}
6245
Nico Weber0588b502013-02-07 00:19:29 +00006246
Alexander Kornienko64a42b82014-04-15 14:52:43 +00006247TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00006248 EXPECT_EQ("\"some text \"\n"
6249 "\"other\";",
6250 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00006251 EXPECT_EQ("\"some text \"\n"
6252 "\"other\";",
6253 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006254 EXPECT_EQ(
6255 "#define A \\\n"
6256 " \"some \" \\\n"
6257 " \"text \" \\\n"
6258 " \"other\";",
6259 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
6260 EXPECT_EQ(
6261 "#define A \\\n"
6262 " \"so \" \\\n"
6263 " \"text \" \\\n"
6264 " \"other\";",
6265 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
6266
6267 EXPECT_EQ("\"some text\"",
6268 format("\"some text\"", getLLVMStyleWithColumns(1)));
6269 EXPECT_EQ("\"some text\"",
6270 format("\"some text\"", getLLVMStyleWithColumns(11)));
6271 EXPECT_EQ("\"some \"\n"
6272 "\"text\"",
6273 format("\"some text\"", getLLVMStyleWithColumns(10)));
6274 EXPECT_EQ("\"some \"\n"
6275 "\"text\"",
6276 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00006277 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00006278 "\" tex\"\n"
6279 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00006280 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00006281 EXPECT_EQ("\"some\"\n"
6282 "\" tex\"\n"
6283 "\" and\"",
6284 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
6285 EXPECT_EQ("\"some\"\n"
6286 "\"/tex\"\n"
6287 "\"/and\"",
6288 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006289
6290 EXPECT_EQ("variable =\n"
6291 " \"long string \"\n"
6292 " \"literal\";",
6293 format("variable = \"long string literal\";",
6294 getLLVMStyleWithColumns(20)));
6295
6296 EXPECT_EQ("variable = f(\n"
6297 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006298 " \"literal\",\n"
6299 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00006300 " loooooooooooooooooooong);",
6301 format("variable = f(\"long string literal\", short, "
6302 "loooooooooooooooooooong);",
6303 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00006304
Daniel Jaspera44991332015-04-29 13:06:49 +00006305 EXPECT_EQ(
6306 "f(g(\"long string \"\n"
6307 " \"literal\"),\n"
6308 " b);",
6309 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00006310 EXPECT_EQ("f(g(\"long string \"\n"
6311 " \"literal\",\n"
6312 " a),\n"
6313 " b);",
6314 format("f(g(\"long string literal\", a), b);",
6315 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006316 EXPECT_EQ(
6317 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00006318 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00006319 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
6320 EXPECT_EQ("f(\"one two three four five six \"\n"
6321 " \"seven\".split(\n"
6322 " really_looooong_variable));",
6323 format("f(\"one two three four five six seven\"."
6324 "split(really_looooong_variable));",
6325 getLLVMStyleWithColumns(33)));
6326
6327 EXPECT_EQ("f(\"some \"\n"
6328 " \"text\",\n"
6329 " other);",
6330 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00006331
6332 // Only break as a last resort.
6333 verifyFormat(
6334 "aaaaaaaaaaaaaaaaaaaa(\n"
6335 " aaaaaaaaaaaaaaaaaaaa,\n"
6336 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00006337
Daniel Jaspera44991332015-04-29 13:06:49 +00006338 EXPECT_EQ("\"splitmea\"\n"
6339 "\"trandomp\"\n"
6340 "\"oint\"",
6341 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00006342
Daniel Jaspera44991332015-04-29 13:06:49 +00006343 EXPECT_EQ("\"split/\"\n"
6344 "\"pathat/\"\n"
6345 "\"slashes\"",
6346 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +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)));
Alexander Kornienko72852072013-06-19 14:22:47 +00006352 EXPECT_EQ("\"split at \"\n"
6353 "\"spaces/at/\"\n"
6354 "\"slashes.at.any$\"\n"
6355 "\"non-alphanumeric%\"\n"
6356 "\"1111111111characte\"\n"
6357 "\"rs\"",
6358 format("\"split at "
6359 "spaces/at/"
6360 "slashes.at."
6361 "any$non-"
6362 "alphanumeric%"
6363 "1111111111characte"
6364 "rs\"",
6365 getLLVMStyleWithColumns(20)));
6366
Daniel Jasper5aad4e52013-07-12 11:37:05 +00006367 // Verify that splitting the strings understands
6368 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00006369 EXPECT_EQ(
6370 "aaaaaaaaaaaa(\n"
6371 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
6372 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
6373 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
6374 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
6375 "aaaaaaaaaaaaaaaaaaaaaa\");",
6376 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00006377 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6378 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
6379 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
6380 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
6381 "aaaaaaaaaaaaaaaaaaaaaa\";",
6382 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00006383 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6384 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
6385 format("llvm::outs() << "
6386 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
6387 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00006388 EXPECT_EQ("ffff(\n"
6389 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6390 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
6391 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
6392 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
6393 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00006394
Daniel Jaspere1a7b762016-02-01 11:21:02 +00006395 FormatStyle Style = getLLVMStyleWithColumns(12);
6396 Style.BreakStringLiterals = false;
6397 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
6398
Daniel Jasper6fe2f002013-04-25 08:56:26 +00006399 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
6400 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00006401 EXPECT_EQ("#define A \\\n"
6402 " \"some \" \\\n"
6403 " \"text \" \\\n"
6404 " \"other\";",
6405 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00006406}
6407
Manuel Klimek9e321992015-07-28 15:50:24 +00006408TEST_F(FormatTest, FullyRemoveEmptyLines) {
6409 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
6410 NoEmptyLines.MaxEmptyLinesToKeep = 0;
6411 EXPECT_EQ("int i = a(b());",
6412 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
6413}
6414
Alexander Kornienko64a42b82014-04-15 14:52:43 +00006415TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
6416 EXPECT_EQ(
6417 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
6418 "(\n"
6419 " \"x\t\");",
6420 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
6421 "aaaaaaa("
6422 "\"x\t\");"));
6423}
6424
Daniel Jasper174b0122014-01-09 14:18:12 +00006425TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00006426 EXPECT_EQ(
6427 "u8\"utf8 string \"\n"
6428 "u8\"literal\";",
6429 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
6430 EXPECT_EQ(
6431 "u\"utf16 string \"\n"
6432 "u\"literal\";",
6433 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
6434 EXPECT_EQ(
6435 "U\"utf32 string \"\n"
6436 "U\"literal\";",
6437 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
6438 EXPECT_EQ("L\"wide string \"\n"
6439 "L\"literal\";",
6440 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00006441 EXPECT_EQ("@\"NSString \"\n"
6442 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00006443 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00006444
6445 // This input makes clang-format try to split the incomplete unicode escape
6446 // sequence, which used to lead to a crasher.
6447 verifyNoCrash(
6448 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
6449 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00006450}
6451
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00006452TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
6453 FormatStyle Style = getGoogleStyleWithColumns(15);
6454 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
6455 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
6456 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
6457 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
6458 EXPECT_EQ("u8R\"x(raw literal)x\";",
6459 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00006460}
6461
6462TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
6463 FormatStyle Style = getLLVMStyleWithColumns(20);
6464 EXPECT_EQ(
6465 "_T(\"aaaaaaaaaaaaaa\")\n"
6466 "_T(\"aaaaaaaaaaaaaa\")\n"
6467 "_T(\"aaaaaaaaaaaa\")",
6468 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
6469 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
6470 " _T(\"aaaaaa\"),\n"
6471 " z);",
6472 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
6473
6474 // FIXME: Handle embedded spaces in one iteration.
6475 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
6476 // "_T(\"aaaaaaaaaaaaa\")\n"
6477 // "_T(\"aaaaaaaaaaaaa\")\n"
6478 // "_T(\"a\")",
6479 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
6480 // getLLVMStyleWithColumns(20)));
6481 EXPECT_EQ(
6482 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
6483 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00006484 EXPECT_EQ("f(\n"
6485 "#if !TEST\n"
6486 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
6487 "#endif\n"
6488 " );",
6489 format("f(\n"
6490 "#if !TEST\n"
6491 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
6492 "#endif\n"
6493 ");"));
6494 EXPECT_EQ("f(\n"
6495 "\n"
6496 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
6497 format("f(\n"
6498 "\n"
6499 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00006500}
6501
Alexander Kornienko657c67b2013-07-16 21:06:13 +00006502TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006503 EXPECT_EQ(
6504 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6505 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6506 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
6507 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6508 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6509 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
6510}
6511
6512TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
6513 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00006514 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006515 EXPECT_EQ("fffffffffff(g(R\"x(\n"
6516 "multiline raw string literal xxxxxxxxxxxxxx\n"
6517 ")x\",\n"
6518 " a),\n"
6519 " b);",
6520 format("fffffffffff(g(R\"x(\n"
6521 "multiline raw string literal xxxxxxxxxxxxxx\n"
6522 ")x\", a), b);",
6523 getGoogleStyleWithColumns(20)));
6524 EXPECT_EQ("fffffffffff(\n"
6525 " g(R\"x(qqq\n"
6526 "multiline raw string literal xxxxxxxxxxxxxx\n"
6527 ")x\",\n"
6528 " a),\n"
6529 " b);",
6530 format("fffffffffff(g(R\"x(qqq\n"
6531 "multiline raw string literal xxxxxxxxxxxxxx\n"
6532 ")x\", a), b);",
6533 getGoogleStyleWithColumns(20)));
6534
6535 EXPECT_EQ("fffffffffff(R\"x(\n"
6536 "multiline raw string literal xxxxxxxxxxxxxx\n"
6537 ")x\");",
6538 format("fffffffffff(R\"x(\n"
6539 "multiline raw string literal xxxxxxxxxxxxxx\n"
6540 ")x\");",
6541 getGoogleStyleWithColumns(20)));
6542 EXPECT_EQ("fffffffffff(R\"x(\n"
6543 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00006544 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006545 format("fffffffffff(R\"x(\n"
6546 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00006547 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00006548 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00006549 EXPECT_EQ("fffffffffff(\n"
6550 " R\"x(\n"
6551 "multiline raw string literal xxxxxxxxxxxxxx\n"
6552 ")x\" +\n"
6553 " bbbbbb);",
6554 format("fffffffffff(\n"
6555 " R\"x(\n"
6556 "multiline raw string literal xxxxxxxxxxxxxx\n"
6557 ")x\" + bbbbbb);",
6558 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00006559}
6560
Alexander Kornienkobe633902013-06-14 11:46:10 +00006561TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00006562 verifyFormat("string a = \"unterminated;");
6563 EXPECT_EQ("function(\"unterminated,\n"
6564 " OtherParameter);",
6565 format("function( \"unterminated,\n"
6566 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00006567}
6568
6569TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006570 FormatStyle Style = getLLVMStyle();
6571 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00006572 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006573 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00006574}
6575
Daniel Jaspera44991332015-04-29 13:06:49 +00006576TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00006577
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00006578TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
6579 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
6580 " \"ddeeefff\");",
6581 format("someFunction(\"aaabbbcccdddeeefff\");",
6582 getLLVMStyleWithColumns(25)));
6583 EXPECT_EQ("someFunction1234567890(\n"
6584 " \"aaabbbcccdddeeefff\");",
6585 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6586 getLLVMStyleWithColumns(26)));
6587 EXPECT_EQ("someFunction1234567890(\n"
6588 " \"aaabbbcccdddeeeff\"\n"
6589 " \"f\");",
6590 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6591 getLLVMStyleWithColumns(25)));
6592 EXPECT_EQ("someFunction1234567890(\n"
6593 " \"aaabbbcccdddeeeff\"\n"
6594 " \"f\");",
6595 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6596 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00006597 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
6598 " \"ddde \"\n"
6599 " \"efff\");",
6600 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00006601 getLLVMStyleWithColumns(25)));
6602 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
6603 " \"ddeeefff\");",
6604 format("someFunction(\"aaabbbccc ddeeefff\");",
6605 getLLVMStyleWithColumns(25)));
6606 EXPECT_EQ("someFunction1234567890(\n"
6607 " \"aaabb \"\n"
6608 " \"cccdddeeefff\");",
6609 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
6610 getLLVMStyleWithColumns(25)));
6611 EXPECT_EQ("#define A \\\n"
6612 " string s = \\\n"
6613 " \"123456789\" \\\n"
6614 " \"0\"; \\\n"
6615 " int i;",
6616 format("#define A string s = \"1234567890\"; int i;",
6617 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00006618 // FIXME: Put additional penalties on breaking at non-whitespace locations.
6619 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
6620 " \"dddeeeff\"\n"
6621 " \"f\");",
6622 format("someFunction(\"aaabbbcc dddeeefff\");",
6623 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00006624}
6625
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006626TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00006627 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
6628 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006629 EXPECT_EQ("\"test\"\n"
6630 "\"\\n\"",
6631 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
6632 EXPECT_EQ("\"tes\\\\\"\n"
6633 "\"n\"",
6634 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
6635 EXPECT_EQ("\"\\\\\\\\\"\n"
6636 "\"\\n\"",
6637 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00006638 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006639 EXPECT_EQ("\"\\uff01\"\n"
6640 "\"test\"",
6641 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
6642 EXPECT_EQ("\"\\Uff01ff02\"",
6643 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
6644 EXPECT_EQ("\"\\x000000000001\"\n"
6645 "\"next\"",
6646 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
6647 EXPECT_EQ("\"\\x000000000001next\"",
6648 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
6649 EXPECT_EQ("\"\\x000000000001\"",
6650 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
6651 EXPECT_EQ("\"test\"\n"
6652 "\"\\000000\"\n"
6653 "\"000001\"",
6654 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
6655 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00006656 "\"00000000\"\n"
6657 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006658 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00006659}
6660
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00006661TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
6662 verifyFormat("void f() {\n"
6663 " return g() {}\n"
6664 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006665 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00006666 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00006667 "}");
6668}
6669
Manuel Klimek421147e2014-01-24 09:25:23 +00006670TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
6671 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00006672 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00006673}
6674
Manuel Klimek13b97d82013-05-13 08:42:42 +00006675TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
6676 verifyFormat("class X {\n"
6677 " void f() {\n"
6678 " }\n"
6679 "};",
6680 getLLVMStyleWithColumns(12));
6681}
6682
6683TEST_F(FormatTest, ConfigurableIndentWidth) {
6684 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
6685 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00006686 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00006687 verifyFormat("void f() {\n"
6688 " someFunction();\n"
6689 " if (true) {\n"
6690 " f();\n"
6691 " }\n"
6692 "}",
6693 EightIndent);
6694 verifyFormat("class X {\n"
6695 " void f() {\n"
6696 " }\n"
6697 "};",
6698 EightIndent);
6699 verifyFormat("int x[] = {\n"
6700 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006701 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00006702 EightIndent);
6703}
6704
Alexander Kornienko34a87e82013-06-22 01:35:36 +00006705TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00006706 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00006707 "f();",
6708 getLLVMStyleWithColumns(8));
6709}
6710
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00006711TEST_F(FormatTest, ConfigurableUseOfTab) {
6712 FormatStyle Tab = getLLVMStyleWithColumns(42);
6713 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006714 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00006715 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00006716
6717 EXPECT_EQ("if (aaaaaaaa && // q\n"
6718 " bb)\t\t// w\n"
6719 "\t;",
6720 format("if (aaaaaaaa &&// q\n"
6721 "bb)// w\n"
6722 ";",
6723 Tab));
6724 EXPECT_EQ("if (aaa && bbb) // w\n"
6725 "\t;",
6726 format("if(aaa&&bbb)// w\n"
6727 ";",
6728 Tab));
6729
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00006730 verifyFormat("class X {\n"
6731 "\tvoid f() {\n"
6732 "\t\tsomeFunction(parameter1,\n"
6733 "\t\t\t parameter2);\n"
6734 "\t}\n"
6735 "};",
6736 Tab);
6737 verifyFormat("#define A \\\n"
6738 "\tvoid f() { \\\n"
6739 "\t\tsomeFunction( \\\n"
6740 "\t\t parameter1, \\\n"
6741 "\t\t parameter2); \\\n"
6742 "\t}",
6743 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00006744
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00006745 Tab.TabWidth = 4;
6746 Tab.IndentWidth = 8;
6747 verifyFormat("class TabWidth4Indent8 {\n"
6748 "\t\tvoid f() {\n"
6749 "\t\t\t\tsomeFunction(parameter1,\n"
6750 "\t\t\t\t\t\t\t parameter2);\n"
6751 "\t\t}\n"
6752 "};",
6753 Tab);
6754
6755 Tab.TabWidth = 4;
6756 Tab.IndentWidth = 4;
6757 verifyFormat("class TabWidth4Indent4 {\n"
6758 "\tvoid f() {\n"
6759 "\t\tsomeFunction(parameter1,\n"
6760 "\t\t\t\t\t parameter2);\n"
6761 "\t}\n"
6762 "};",
6763 Tab);
6764
6765 Tab.TabWidth = 8;
6766 Tab.IndentWidth = 4;
6767 verifyFormat("class TabWidth8Indent4 {\n"
6768 " void f() {\n"
6769 "\tsomeFunction(parameter1,\n"
6770 "\t\t parameter2);\n"
6771 " }\n"
6772 "};",
6773 Tab);
6774
Alexander Kornienko39856b72013-09-10 09:38:25 +00006775 Tab.TabWidth = 8;
6776 Tab.IndentWidth = 8;
6777 EXPECT_EQ("/*\n"
6778 "\t a\t\tcomment\n"
6779 "\t in multiple lines\n"
6780 " */",
6781 format(" /*\t \t \n"
6782 " \t \t a\t\tcomment\t \t\n"
6783 " \t \t in multiple lines\t\n"
6784 " \t */",
6785 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00006786
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006787 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00006788 verifyFormat("{\n"
6789 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6790 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6791 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6792 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6793 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6794 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00006795 "};",
6796 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00006797 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00006798 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00006799 "\ta2,\n"
6800 "\ta3\n"
6801 "};",
6802 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006803 EXPECT_EQ("if (aaaaaaaa && // q\n"
6804 " bb) // w\n"
6805 "\t;",
6806 format("if (aaaaaaaa &&// q\n"
6807 "bb)// w\n"
6808 ";",
6809 Tab));
6810 verifyFormat("class X {\n"
6811 "\tvoid f() {\n"
6812 "\t\tsomeFunction(parameter1,\n"
6813 "\t\t parameter2);\n"
6814 "\t}\n"
6815 "};",
6816 Tab);
6817 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00006818 "\tQ(\n"
6819 "\t {\n"
6820 "\t\t int a;\n"
6821 "\t\t someFunction(aaaaaaaa,\n"
6822 "\t\t bbbbbbb);\n"
6823 "\t },\n"
6824 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006825 "}",
6826 Tab);
6827 EXPECT_EQ("{\n"
6828 "\t/* aaaa\n"
6829 "\t bbbb */\n"
6830 "}",
6831 format("{\n"
6832 "/* aaaa\n"
6833 " bbbb */\n"
6834 "}",
6835 Tab));
6836 EXPECT_EQ("{\n"
6837 "\t/*\n"
6838 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6839 "\t bbbbbbbbbbbbb\n"
6840 "\t*/\n"
6841 "}",
6842 format("{\n"
6843 "/*\n"
6844 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
6845 "*/\n"
6846 "}",
6847 Tab));
6848 EXPECT_EQ("{\n"
6849 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6850 "\t// bbbbbbbbbbbbb\n"
6851 "}",
6852 format("{\n"
6853 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
6854 "}",
6855 Tab));
6856 EXPECT_EQ("{\n"
6857 "\t/*\n"
6858 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6859 "\t bbbbbbbbbbbbb\n"
6860 "\t*/\n"
6861 "}",
6862 format("{\n"
6863 "\t/*\n"
6864 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
6865 "\t*/\n"
6866 "}",
6867 Tab));
6868 EXPECT_EQ("{\n"
6869 "\t/*\n"
6870 "\n"
6871 "\t*/\n"
6872 "}",
6873 format("{\n"
6874 "\t/*\n"
6875 "\n"
6876 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00006877 "}",
6878 Tab));
6879 EXPECT_EQ("{\n"
6880 "\t/*\n"
6881 " asdf\n"
6882 "\t*/\n"
6883 "}",
6884 format("{\n"
6885 "\t/*\n"
6886 " asdf\n"
6887 "\t*/\n"
6888 "}",
6889 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00006890
6891 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00006892 EXPECT_EQ("/*\n"
6893 " a\t\tcomment\n"
6894 " in multiple lines\n"
6895 " */",
6896 format(" /*\t \t \n"
6897 " \t \t a\t\tcomment\t \t\n"
6898 " \t \t in multiple lines\t\n"
6899 " \t */",
6900 Tab));
6901 EXPECT_EQ("/* some\n"
6902 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00006903 format(" \t \t /* some\n"
6904 " \t \t comment */",
6905 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00006906 EXPECT_EQ("int a; /* some\n"
6907 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00006908 format(" \t \t int a; /* some\n"
6909 " \t \t comment */",
6910 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00006911
Alexander Kornienko39856b72013-09-10 09:38:25 +00006912 EXPECT_EQ("int a; /* some\n"
6913 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00006914 format(" \t \t int\ta; /* some\n"
6915 " \t \t comment */",
6916 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00006917 EXPECT_EQ("f(\"\t\t\"); /* some\n"
6918 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00006919 format(" \t \t f(\"\t\t\"); /* some\n"
6920 " \t \t comment */",
6921 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00006922 EXPECT_EQ("{\n"
6923 " /*\n"
6924 " * Comment\n"
6925 " */\n"
6926 " int i;\n"
6927 "}",
6928 format("{\n"
6929 "\t/*\n"
6930 "\t * Comment\n"
6931 "\t */\n"
6932 "\t int i;\n"
6933 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00006934
6935 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
6936 Tab.TabWidth = 8;
6937 Tab.IndentWidth = 8;
6938 EXPECT_EQ("if (aaaaaaaa && // q\n"
6939 " bb) // w\n"
6940 "\t;",
6941 format("if (aaaaaaaa &&// q\n"
6942 "bb)// w\n"
6943 ";",
6944 Tab));
6945 EXPECT_EQ("if (aaa && bbb) // w\n"
6946 "\t;",
6947 format("if(aaa&&bbb)// w\n"
6948 ";",
6949 Tab));
6950 verifyFormat("class X {\n"
6951 "\tvoid f() {\n"
6952 "\t\tsomeFunction(parameter1,\n"
6953 "\t\t\t parameter2);\n"
6954 "\t}\n"
6955 "};",
6956 Tab);
6957 verifyFormat("#define A \\\n"
6958 "\tvoid f() { \\\n"
6959 "\t\tsomeFunction( \\\n"
6960 "\t\t parameter1, \\\n"
6961 "\t\t parameter2); \\\n"
6962 "\t}",
6963 Tab);
6964 Tab.TabWidth = 4;
6965 Tab.IndentWidth = 8;
6966 verifyFormat("class TabWidth4Indent8 {\n"
6967 "\t\tvoid f() {\n"
6968 "\t\t\t\tsomeFunction(parameter1,\n"
6969 "\t\t\t\t\t\t\t parameter2);\n"
6970 "\t\t}\n"
6971 "};",
6972 Tab);
6973 Tab.TabWidth = 4;
6974 Tab.IndentWidth = 4;
6975 verifyFormat("class TabWidth4Indent4 {\n"
6976 "\tvoid f() {\n"
6977 "\t\tsomeFunction(parameter1,\n"
6978 "\t\t\t\t\t parameter2);\n"
6979 "\t}\n"
6980 "};",
6981 Tab);
6982 Tab.TabWidth = 8;
6983 Tab.IndentWidth = 4;
6984 verifyFormat("class TabWidth8Indent4 {\n"
6985 " void f() {\n"
6986 "\tsomeFunction(parameter1,\n"
6987 "\t\t parameter2);\n"
6988 " }\n"
6989 "};",
6990 Tab);
6991 Tab.TabWidth = 8;
6992 Tab.IndentWidth = 8;
6993 EXPECT_EQ("/*\n"
6994 "\t a\t\tcomment\n"
6995 "\t in multiple lines\n"
6996 " */",
6997 format(" /*\t \t \n"
6998 " \t \t a\t\tcomment\t \t\n"
6999 " \t \t in multiple lines\t\n"
7000 " \t */",
7001 Tab));
7002 verifyFormat("{\n"
7003 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7004 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7005 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7006 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7007 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7008 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7009 "};",
7010 Tab);
7011 verifyFormat("enum AA {\n"
7012 "\ta1, // Force multiple lines\n"
7013 "\ta2,\n"
7014 "\ta3\n"
7015 "};",
7016 Tab);
7017 EXPECT_EQ("if (aaaaaaaa && // q\n"
7018 " bb) // w\n"
7019 "\t;",
7020 format("if (aaaaaaaa &&// q\n"
7021 "bb)// w\n"
7022 ";",
7023 Tab));
7024 verifyFormat("class X {\n"
7025 "\tvoid f() {\n"
7026 "\t\tsomeFunction(parameter1,\n"
7027 "\t\t\t parameter2);\n"
7028 "\t}\n"
7029 "};",
7030 Tab);
7031 verifyFormat("{\n"
7032 "\tQ(\n"
7033 "\t {\n"
7034 "\t\t int a;\n"
7035 "\t\t someFunction(aaaaaaaa,\n"
7036 "\t\t\t\t bbbbbbb);\n"
7037 "\t },\n"
7038 "\t p);\n"
7039 "}",
7040 Tab);
7041 EXPECT_EQ("{\n"
7042 "\t/* aaaa\n"
7043 "\t bbbb */\n"
7044 "}",
7045 format("{\n"
7046 "/* aaaa\n"
7047 " bbbb */\n"
7048 "}",
7049 Tab));
7050 EXPECT_EQ("{\n"
7051 "\t/*\n"
7052 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7053 "\t bbbbbbbbbbbbb\n"
7054 "\t*/\n"
7055 "}",
7056 format("{\n"
7057 "/*\n"
7058 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7059 "*/\n"
7060 "}",
7061 Tab));
7062 EXPECT_EQ("{\n"
7063 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7064 "\t// bbbbbbbbbbbbb\n"
7065 "}",
7066 format("{\n"
7067 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7068 "}",
7069 Tab));
7070 EXPECT_EQ("{\n"
7071 "\t/*\n"
7072 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7073 "\t bbbbbbbbbbbbb\n"
7074 "\t*/\n"
7075 "}",
7076 format("{\n"
7077 "\t/*\n"
7078 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7079 "\t*/\n"
7080 "}",
7081 Tab));
7082 EXPECT_EQ("{\n"
7083 "\t/*\n"
7084 "\n"
7085 "\t*/\n"
7086 "}",
7087 format("{\n"
7088 "\t/*\n"
7089 "\n"
7090 "\t*/\n"
7091 "}",
7092 Tab));
7093 EXPECT_EQ("{\n"
7094 "\t/*\n"
7095 " asdf\n"
7096 "\t*/\n"
7097 "}",
7098 format("{\n"
7099 "\t/*\n"
7100 " asdf\n"
7101 "\t*/\n"
7102 "}",
7103 Tab));
7104 EXPECT_EQ("/*\n"
7105 "\t a\t\tcomment\n"
7106 "\t in multiple lines\n"
7107 " */",
7108 format(" /*\t \t \n"
7109 " \t \t a\t\tcomment\t \t\n"
7110 " \t \t in multiple lines\t\n"
7111 " \t */",
7112 Tab));
7113 EXPECT_EQ("/* some\n"
7114 " comment */",
7115 format(" \t \t /* some\n"
7116 " \t \t comment */",
7117 Tab));
7118 EXPECT_EQ("int a; /* some\n"
7119 " comment */",
7120 format(" \t \t int a; /* some\n"
7121 " \t \t comment */",
7122 Tab));
7123 EXPECT_EQ("int a; /* some\n"
7124 "comment */",
7125 format(" \t \t int\ta; /* some\n"
7126 " \t \t comment */",
7127 Tab));
7128 EXPECT_EQ("f(\"\t\t\"); /* some\n"
7129 " comment */",
7130 format(" \t \t f(\"\t\t\"); /* some\n"
7131 " \t \t comment */",
7132 Tab));
7133 EXPECT_EQ("{\n"
7134 " /*\n"
7135 " * Comment\n"
7136 " */\n"
7137 " int i;\n"
7138 "}",
7139 format("{\n"
7140 "\t/*\n"
7141 "\t * Comment\n"
7142 "\t */\n"
7143 "\t int i;\n"
7144 "}"));
7145 Tab.AlignConsecutiveAssignments = true;
7146 Tab.AlignConsecutiveDeclarations = true;
7147 Tab.TabWidth = 4;
7148 Tab.IndentWidth = 4;
7149 verifyFormat("class Assign {\n"
7150 "\tvoid f() {\n"
7151 "\t\tint x = 123;\n"
7152 "\t\tint random = 4;\n"
7153 "\t\tstd::string alphabet =\n"
7154 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
7155 "\t}\n"
7156 "};",
7157 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007158}
7159
Alexander Kornienko917f9e02013-09-10 12:29:48 +00007160TEST_F(FormatTest, CalculatesOriginalColumn) {
7161 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7162 "q\"; /* some\n"
7163 " comment */",
7164 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7165 "q\"; /* some\n"
7166 " comment */",
7167 getLLVMStyle()));
7168 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
7169 "/* some\n"
7170 " comment */",
7171 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
7172 " /* some\n"
7173 " comment */",
7174 getLLVMStyle()));
7175 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7176 "qqq\n"
7177 "/* some\n"
7178 " comment */",
7179 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7180 "qqq\n"
7181 " /* some\n"
7182 " comment */",
7183 getLLVMStyle()));
7184 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7185 "wwww; /* some\n"
7186 " comment */",
7187 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7188 "wwww; /* some\n"
7189 " comment */",
7190 getLLVMStyle()));
7191}
7192
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007193TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00007194 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007195 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00007196
7197 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007198 " continue;",
7199 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007200 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007201 " continue;",
7202 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007203 verifyFormat("if(true)\n"
7204 " f();\n"
7205 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007206 " f();",
7207 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007208 verifyFormat("do {\n"
7209 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007210 "} while(something());",
7211 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007212 verifyFormat("switch(x) {\n"
7213 "default:\n"
7214 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007215 "}",
7216 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00007217 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00007218 verifyFormat("size_t x = sizeof(x);", NoSpace);
7219 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
7220 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
7221 verifyFormat("alignas(128) char a[128];", NoSpace);
7222 verifyFormat("size_t x = alignof(MyType);", NoSpace);
7223 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
7224 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00007225 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00007226 verifyFormat("T A::operator()();", NoSpace);
7227 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00007228
7229 FormatStyle Space = getLLVMStyle();
7230 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
7231
7232 verifyFormat("int f ();", Space);
7233 verifyFormat("void f (int a, T b) {\n"
7234 " while (true)\n"
7235 " continue;\n"
7236 "}",
7237 Space);
7238 verifyFormat("if (true)\n"
7239 " f ();\n"
7240 "else if (true)\n"
7241 " f ();",
7242 Space);
7243 verifyFormat("do {\n"
7244 " do_something ();\n"
7245 "} while (something ());",
7246 Space);
7247 verifyFormat("switch (x) {\n"
7248 "default:\n"
7249 " break;\n"
7250 "}",
7251 Space);
7252 verifyFormat("A::A () : a (1) {}", Space);
7253 verifyFormat("void f () __attribute__ ((asdf));", Space);
7254 verifyFormat("*(&a + 1);\n"
7255 "&((&a)[1]);\n"
7256 "a[(b + c) * d];\n"
7257 "(((a + 1) * 2) + 3) * 4;",
7258 Space);
7259 verifyFormat("#define A(x) x", Space);
7260 verifyFormat("#define A (x) x", Space);
7261 verifyFormat("#if defined(x)\n"
7262 "#endif",
7263 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00007264 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00007265 verifyFormat("size_t x = sizeof (x);", Space);
7266 verifyFormat("auto f (int x) -> decltype (x);", Space);
7267 verifyFormat("int f (T x) noexcept (x.create ());", Space);
7268 verifyFormat("alignas (128) char a[128];", Space);
7269 verifyFormat("size_t x = alignof (MyType);", Space);
7270 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
7271 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00007272 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00007273 verifyFormat("T A::operator() ();", Space);
7274 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007275}
7276
7277TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
7278 FormatStyle Spaces = getLLVMStyle();
7279
7280 Spaces.SpacesInParentheses = true;
7281 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007282 verifyFormat("call();", Spaces);
7283 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00007284 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
7285 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007286 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007287 " continue;",
7288 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007289 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007290 " continue;",
7291 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007292 verifyFormat("if ( true )\n"
7293 " f();\n"
7294 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007295 " f();",
7296 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007297 verifyFormat("do {\n"
7298 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007299 "} while ( something() );",
7300 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007301 verifyFormat("switch ( x ) {\n"
7302 "default:\n"
7303 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007304 "}",
7305 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007306
7307 Spaces.SpacesInParentheses = false;
7308 Spaces.SpacesInCStyleCastParentheses = true;
7309 verifyFormat("Type *A = ( Type * )P;", Spaces);
7310 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
7311 verifyFormat("x = ( int32 )y;", Spaces);
7312 verifyFormat("int a = ( int )(2.0f);", Spaces);
7313 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
7314 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
7315 verifyFormat("#define x (( int )-1)", Spaces);
7316
Daniel Jasper92e09822015-03-18 12:59:19 +00007317 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00007318 Spaces.SpacesInParentheses = false;
7319 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00007320 Spaces.SpacesInCStyleCastParentheses = true;
7321 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007322 verifyFormat("call( );", Spaces);
7323 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007324 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007325 " continue;",
7326 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007327 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007328 " continue;",
7329 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007330 verifyFormat("if (true)\n"
7331 " f( );\n"
7332 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007333 " f( );",
7334 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007335 verifyFormat("do {\n"
7336 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007337 "} while (something( ));",
7338 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007339 verifyFormat("switch (x) {\n"
7340 "default:\n"
7341 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007342 "}",
7343 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007344
Daniel Jasper92e09822015-03-18 12:59:19 +00007345 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007346 Spaces.SpaceAfterCStyleCast = true;
7347 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007348 verifyFormat("call( );", Spaces);
7349 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007350 verifyFormat("while (( bool ) 1)\n"
7351 " continue;",
7352 Spaces);
7353 verifyFormat("for (;;)\n"
7354 " continue;",
7355 Spaces);
7356 verifyFormat("if (true)\n"
7357 " f( );\n"
7358 "else if (true)\n"
7359 " f( );",
7360 Spaces);
7361 verifyFormat("do {\n"
7362 " do_something(( int ) i);\n"
7363 "} while (something( ));",
7364 Spaces);
7365 verifyFormat("switch (x) {\n"
7366 "default:\n"
7367 " break;\n"
7368 "}",
7369 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00007370
7371 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00007372 Spaces.SpacesInCStyleCastParentheses = false;
7373 Spaces.SpaceAfterCStyleCast = true;
7374 verifyFormat("while ((bool) 1)\n"
7375 " continue;",
7376 Spaces);
7377 verifyFormat("do {\n"
7378 " do_something((int) i);\n"
7379 "} while (something( ));",
7380 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00007381}
7382
Daniel Jasperad981f82014-08-26 11:41:14 +00007383TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
7384 verifyFormat("int a[5];");
7385 verifyFormat("a[3] += 42;");
7386
7387 FormatStyle Spaces = getLLVMStyle();
7388 Spaces.SpacesInSquareBrackets = true;
7389 // Lambdas unchanged.
7390 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
7391 verifyFormat("return [i, args...] {};", Spaces);
7392
7393 // Not lambdas.
7394 verifyFormat("int a[ 5 ];", Spaces);
7395 verifyFormat("a[ 3 ] += 42;", Spaces);
7396 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
7397 verifyFormat("double &operator[](int i) { return 0; }\n"
7398 "int i;",
7399 Spaces);
7400 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
7401 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
7402 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
7403}
7404
Daniel Jasperd94bff32013-09-25 15:15:02 +00007405TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
7406 verifyFormat("int a = 5;");
7407 verifyFormat("a += 42;");
7408 verifyFormat("a or_eq 8;");
7409
7410 FormatStyle Spaces = getLLVMStyle();
7411 Spaces.SpaceBeforeAssignmentOperators = false;
7412 verifyFormat("int a= 5;", Spaces);
7413 verifyFormat("a+= 42;", Spaces);
7414 verifyFormat("a or_eq 8;", Spaces);
7415}
7416
Daniel Jaspera44991332015-04-29 13:06:49 +00007417TEST_F(FormatTest, AlignConsecutiveAssignments) {
7418 FormatStyle Alignment = getLLVMStyle();
7419 Alignment.AlignConsecutiveAssignments = false;
7420 verifyFormat("int a = 5;\n"
7421 "int oneTwoThree = 123;",
7422 Alignment);
7423 verifyFormat("int a = 5;\n"
7424 "int oneTwoThree = 123;",
7425 Alignment);
7426
7427 Alignment.AlignConsecutiveAssignments = true;
7428 verifyFormat("int a = 5;\n"
7429 "int oneTwoThree = 123;",
7430 Alignment);
7431 verifyFormat("int a = method();\n"
7432 "int oneTwoThree = 133;",
7433 Alignment);
7434 verifyFormat("a &= 5;\n"
7435 "bcd *= 5;\n"
7436 "ghtyf += 5;\n"
7437 "dvfvdb -= 5;\n"
7438 "a /= 5;\n"
7439 "vdsvsv %= 5;\n"
7440 "sfdbddfbdfbb ^= 5;\n"
7441 "dvsdsv |= 5;\n"
7442 "int dsvvdvsdvvv = 123;",
7443 Alignment);
7444 verifyFormat("int i = 1, j = 10;\n"
7445 "something = 2000;",
7446 Alignment);
7447 verifyFormat("something = 2000;\n"
7448 "int i = 1, j = 10;\n",
7449 Alignment);
7450 verifyFormat("something = 2000;\n"
7451 "another = 911;\n"
7452 "int i = 1, j = 10;\n"
7453 "oneMore = 1;\n"
7454 "i = 2;",
7455 Alignment);
7456 verifyFormat("int a = 5;\n"
7457 "int one = 1;\n"
7458 "method();\n"
7459 "int oneTwoThree = 123;\n"
7460 "int oneTwo = 12;",
7461 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00007462 verifyFormat("int oneTwoThree = 123;\n"
7463 "int oneTwo = 12;\n"
7464 "method();\n",
7465 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00007466 verifyFormat("int oneTwoThree = 123; // comment\n"
7467 "int oneTwo = 12; // comment",
7468 Alignment);
7469 EXPECT_EQ("int a = 5;\n"
7470 "\n"
7471 "int oneTwoThree = 123;",
7472 format("int a = 5;\n"
7473 "\n"
7474 "int oneTwoThree= 123;",
7475 Alignment));
7476 EXPECT_EQ("int a = 5;\n"
7477 "int one = 1;\n"
7478 "\n"
7479 "int oneTwoThree = 123;",
7480 format("int a = 5;\n"
7481 "int one = 1;\n"
7482 "\n"
7483 "int oneTwoThree = 123;",
7484 Alignment));
7485 EXPECT_EQ("int a = 5;\n"
7486 "int one = 1;\n"
7487 "\n"
7488 "int oneTwoThree = 123;\n"
7489 "int oneTwo = 12;",
7490 format("int a = 5;\n"
7491 "int one = 1;\n"
7492 "\n"
7493 "int oneTwoThree = 123;\n"
7494 "int oneTwo = 12;",
7495 Alignment));
7496 Alignment.AlignEscapedNewlinesLeft = true;
7497 verifyFormat("#define A \\\n"
7498 " int aaaa = 12; \\\n"
7499 " int b = 23; \\\n"
7500 " int ccc = 234; \\\n"
7501 " int dddddddddd = 2345;",
7502 Alignment);
7503 Alignment.AlignEscapedNewlinesLeft = false;
7504 verifyFormat("#define A "
7505 " \\\n"
7506 " int aaaa = 12; "
7507 " \\\n"
7508 " int b = 23; "
7509 " \\\n"
7510 " int ccc = 234; "
7511 " \\\n"
7512 " int dddddddddd = 2345;",
7513 Alignment);
7514 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
7515 "k = 4, int l = 5,\n"
7516 " int m = 6) {\n"
7517 " int j = 10;\n"
7518 " otherThing = 1;\n"
7519 "}",
7520 Alignment);
7521 verifyFormat("void SomeFunction(int parameter = 0) {\n"
7522 " int i = 1;\n"
7523 " int j = 2;\n"
7524 " int big = 10000;\n"
7525 "}",
7526 Alignment);
7527 verifyFormat("class C {\n"
7528 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00007529 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007530 " virtual void f() = 0;\n"
7531 "};",
7532 Alignment);
7533 verifyFormat("int i = 1;\n"
7534 "if (SomeType t = getSomething()) {\n"
7535 "}\n"
7536 "int j = 2;\n"
7537 "int big = 10000;",
7538 Alignment);
7539 verifyFormat("int j = 7;\n"
7540 "for (int k = 0; k < N; ++k) {\n"
7541 "}\n"
7542 "int j = 2;\n"
7543 "int big = 10000;\n"
7544 "}",
7545 Alignment);
7546 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7547 verifyFormat("int i = 1;\n"
7548 "LooooooooooongType loooooooooooooooooooooongVariable\n"
7549 " = someLooooooooooooooooongFunction();\n"
7550 "int j = 2;",
7551 Alignment);
7552 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7553 verifyFormat("int i = 1;\n"
7554 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
7555 " someLooooooooooooooooongFunction();\n"
7556 "int j = 2;",
7557 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00007558
7559 verifyFormat("auto lambda = []() {\n"
7560 " auto i = 0;\n"
7561 " return 0;\n"
7562 "};\n"
7563 "int i = 0;\n"
7564 "auto v = type{\n"
7565 " i = 1, //\n"
7566 " (i = 2), //\n"
7567 " i = 3 //\n"
7568 "};",
7569 Alignment);
7570
Daniel Jaspera44991332015-04-29 13:06:49 +00007571 // FIXME: Should align all three assignments
7572 verifyFormat(
7573 "int i = 1;\n"
7574 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
7575 " loooooooooooooooooooooongParameterB);\n"
7576 "int j = 2;",
7577 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00007578
7579 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
7580 " typename B = very_long_type_name_1,\n"
7581 " typename T_2 = very_long_type_name_2>\n"
7582 "auto foo() {}\n",
7583 Alignment);
7584 verifyFormat("int a, b = 1;\n"
7585 "int c = 2;\n"
7586 "int dd = 3;\n",
7587 Alignment);
7588 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
7589 "float b[1][] = {{3.f}};\n",
7590 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00007591}
7592
Daniel Jaspere12597c2015-10-01 10:06:54 +00007593TEST_F(FormatTest, AlignConsecutiveDeclarations) {
7594 FormatStyle Alignment = getLLVMStyle();
7595 Alignment.AlignConsecutiveDeclarations = false;
7596 verifyFormat("float const a = 5;\n"
7597 "int oneTwoThree = 123;",
7598 Alignment);
7599 verifyFormat("int a = 5;\n"
7600 "float const oneTwoThree = 123;",
7601 Alignment);
7602
7603 Alignment.AlignConsecutiveDeclarations = true;
7604 verifyFormat("float const a = 5;\n"
7605 "int oneTwoThree = 123;",
7606 Alignment);
7607 verifyFormat("int a = method();\n"
7608 "float const oneTwoThree = 133;",
7609 Alignment);
7610 verifyFormat("int i = 1, j = 10;\n"
7611 "something = 2000;",
7612 Alignment);
7613 verifyFormat("something = 2000;\n"
7614 "int i = 1, j = 10;\n",
7615 Alignment);
7616 verifyFormat("float something = 2000;\n"
7617 "double another = 911;\n"
7618 "int i = 1, j = 10;\n"
7619 "const int *oneMore = 1;\n"
7620 "unsigned i = 2;",
7621 Alignment);
7622 verifyFormat("float a = 5;\n"
7623 "int one = 1;\n"
7624 "method();\n"
7625 "const double oneTwoThree = 123;\n"
7626 "const unsigned int oneTwo = 12;",
7627 Alignment);
7628 verifyFormat("int oneTwoThree{0}; // comment\n"
7629 "unsigned oneTwo; // comment",
7630 Alignment);
7631 EXPECT_EQ("float const a = 5;\n"
7632 "\n"
7633 "int oneTwoThree = 123;",
7634 format("float const a = 5;\n"
7635 "\n"
7636 "int oneTwoThree= 123;",
7637 Alignment));
7638 EXPECT_EQ("float a = 5;\n"
7639 "int one = 1;\n"
7640 "\n"
7641 "unsigned oneTwoThree = 123;",
7642 format("float a = 5;\n"
7643 "int one = 1;\n"
7644 "\n"
7645 "unsigned oneTwoThree = 123;",
7646 Alignment));
7647 EXPECT_EQ("float a = 5;\n"
7648 "int one = 1;\n"
7649 "\n"
7650 "unsigned oneTwoThree = 123;\n"
7651 "int oneTwo = 12;",
7652 format("float a = 5;\n"
7653 "int one = 1;\n"
7654 "\n"
7655 "unsigned oneTwoThree = 123;\n"
7656 "int oneTwo = 12;",
7657 Alignment));
7658 Alignment.AlignConsecutiveAssignments = true;
7659 verifyFormat("float something = 2000;\n"
7660 "double another = 911;\n"
7661 "int i = 1, j = 10;\n"
7662 "const int *oneMore = 1;\n"
7663 "unsigned i = 2;",
7664 Alignment);
7665 verifyFormat("int oneTwoThree = {0}; // comment\n"
7666 "unsigned oneTwo = 0; // comment",
7667 Alignment);
7668 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
7669 " int const i = 1;\n"
7670 " int * j = 2;\n"
7671 " int big = 10000;\n"
7672 "\n"
7673 " unsigned oneTwoThree = 123;\n"
7674 " int oneTwo = 12;\n"
7675 " method();\n"
7676 " float k = 2;\n"
7677 " int ll = 10000;\n"
7678 "}",
7679 format("void SomeFunction(int parameter= 0) {\n"
7680 " int const i= 1;\n"
7681 " int *j=2;\n"
7682 " int big = 10000;\n"
7683 "\n"
7684 "unsigned oneTwoThree =123;\n"
7685 "int oneTwo = 12;\n"
7686 " method();\n"
7687 "float k= 2;\n"
7688 "int ll=10000;\n"
7689 "}",
7690 Alignment));
7691 Alignment.AlignConsecutiveAssignments = false;
7692 Alignment.AlignEscapedNewlinesLeft = true;
7693 verifyFormat("#define A \\\n"
7694 " int aaaa = 12; \\\n"
7695 " float b = 23; \\\n"
7696 " const int ccc = 234; \\\n"
7697 " unsigned dddddddddd = 2345;",
7698 Alignment);
7699 Alignment.AlignEscapedNewlinesLeft = false;
7700 Alignment.ColumnLimit = 30;
7701 verifyFormat("#define A \\\n"
7702 " int aaaa = 12; \\\n"
7703 " float b = 23; \\\n"
7704 " const int ccc = 234; \\\n"
7705 " int dddddddddd = 2345;",
7706 Alignment);
7707 Alignment.ColumnLimit = 80;
7708 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
7709 "k = 4, int l = 5,\n"
7710 " int m = 6) {\n"
7711 " const int j = 10;\n"
7712 " otherThing = 1;\n"
7713 "}",
7714 Alignment);
7715 verifyFormat("void SomeFunction(int parameter = 0) {\n"
7716 " int const i = 1;\n"
7717 " int * j = 2;\n"
7718 " int big = 10000;\n"
7719 "}",
7720 Alignment);
7721 verifyFormat("class C {\n"
7722 "public:\n"
7723 " int i = 1;\n"
7724 " virtual void f() = 0;\n"
7725 "};",
7726 Alignment);
7727 verifyFormat("float i = 1;\n"
7728 "if (SomeType t = getSomething()) {\n"
7729 "}\n"
7730 "const unsigned j = 2;\n"
7731 "int big = 10000;",
7732 Alignment);
7733 verifyFormat("float j = 7;\n"
7734 "for (int k = 0; k < N; ++k) {\n"
7735 "}\n"
7736 "unsigned j = 2;\n"
7737 "int big = 10000;\n"
7738 "}",
7739 Alignment);
7740 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7741 verifyFormat("float i = 1;\n"
7742 "LooooooooooongType loooooooooooooooooooooongVariable\n"
7743 " = someLooooooooooooooooongFunction();\n"
7744 "int j = 2;",
7745 Alignment);
7746 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7747 verifyFormat("int i = 1;\n"
7748 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
7749 " someLooooooooooooooooongFunction();\n"
7750 "int j = 2;",
7751 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00007752
7753 Alignment.AlignConsecutiveAssignments = true;
7754 verifyFormat("auto lambda = []() {\n"
7755 " auto ii = 0;\n"
7756 " float j = 0;\n"
7757 " return 0;\n"
7758 "};\n"
7759 "int i = 0;\n"
7760 "float i2 = 0;\n"
7761 "auto v = type{\n"
7762 " i = 1, //\n"
7763 " (i = 2), //\n"
7764 " i = 3 //\n"
7765 "};",
7766 Alignment);
7767 Alignment.AlignConsecutiveAssignments = false;
7768
Daniel Jaspere12597c2015-10-01 10:06:54 +00007769 // FIXME: Should align all three declarations
7770 verifyFormat(
7771 "int i = 1;\n"
7772 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
7773 " loooooooooooooooooooooongParameterB);\n"
7774 "int j = 2;",
7775 Alignment);
7776
7777 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
7778 // We expect declarations and assignments to align, as long as it doesn't
7779 // exceed the column limit, starting a new alignemnt sequence whenever it
7780 // happens.
7781 Alignment.AlignConsecutiveAssignments = true;
7782 Alignment.ColumnLimit = 30;
7783 verifyFormat("float ii = 1;\n"
7784 "unsigned j = 2;\n"
7785 "int someVerylongVariable = 1;\n"
7786 "AnotherLongType ll = 123456;\n"
7787 "VeryVeryLongType k = 2;\n"
7788 "int myvar = 1;",
7789 Alignment);
7790 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00007791 Alignment.AlignConsecutiveAssignments = false;
7792
7793 verifyFormat(
7794 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
7795 " typename LongType, typename B>\n"
7796 "auto foo() {}\n",
7797 Alignment);
7798 verifyFormat("float a, b = 1;\n"
7799 "int c = 2;\n"
7800 "int dd = 3;\n",
7801 Alignment);
7802 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
7803 "float b[1][] = {{3.f}};\n",
7804 Alignment);
7805 Alignment.AlignConsecutiveAssignments = true;
7806 verifyFormat("float a, b = 1;\n"
7807 "int c = 2;\n"
7808 "int dd = 3;\n",
7809 Alignment);
7810 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
7811 "float b[1][] = {{3.f}};\n",
7812 Alignment);
7813 Alignment.AlignConsecutiveAssignments = false;
7814
7815 Alignment.ColumnLimit = 30;
7816 Alignment.BinPackParameters = false;
7817 verifyFormat("void foo(float a,\n"
7818 " float b,\n"
7819 " int c,\n"
7820 " uint32_t *d) {\n"
7821 " int * e = 0;\n"
7822 " float f = 0;\n"
7823 " double g = 0;\n"
7824 "}\n"
7825 "void bar(ino_t a,\n"
7826 " int b,\n"
7827 " uint32_t *c,\n"
7828 " bool d) {}\n",
7829 Alignment);
7830 Alignment.BinPackParameters = true;
7831 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00007832}
7833
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007834TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007835 FormatStyle LinuxBraceStyle = getLLVMStyle();
7836 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007837 verifyFormat("namespace a\n"
7838 "{\n"
7839 "class A\n"
7840 "{\n"
7841 " void f()\n"
7842 " {\n"
7843 " if (true) {\n"
7844 " a();\n"
7845 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00007846 " } else {\n"
7847 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007848 " }\n"
7849 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007850 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007851 "};\n"
7852 "struct B {\n"
7853 " int x;\n"
7854 "};\n"
7855 "}\n",
7856 LinuxBraceStyle);
7857 verifyFormat("enum X {\n"
7858 " Y = 0,\n"
7859 "}\n",
7860 LinuxBraceStyle);
7861 verifyFormat("struct S {\n"
7862 " int Type;\n"
7863 " union {\n"
7864 " int x;\n"
7865 " double y;\n"
7866 " } Value;\n"
7867 " class C\n"
7868 " {\n"
7869 " MyFavoriteType Value;\n"
7870 " } Class;\n"
7871 "}\n",
7872 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007873}
7874
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00007875TEST_F(FormatTest, MozillaBraceBreaking) {
7876 FormatStyle MozillaBraceStyle = getLLVMStyle();
7877 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00007878 MozillaBraceStyle.FixNamespaceComments = false;
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00007879 verifyFormat("namespace a {\n"
7880 "class A\n"
7881 "{\n"
7882 " void f()\n"
7883 " {\n"
7884 " if (true) {\n"
7885 " a();\n"
7886 " b();\n"
7887 " }\n"
7888 " }\n"
7889 " void g() { return; }\n"
7890 "};\n"
7891 "enum E\n"
7892 "{\n"
7893 " A,\n"
7894 " // foo\n"
7895 " B,\n"
7896 " C\n"
7897 "};\n"
7898 "struct B\n"
7899 "{\n"
7900 " int x;\n"
7901 "};\n"
7902 "}\n",
7903 MozillaBraceStyle);
7904 verifyFormat("struct S\n"
7905 "{\n"
7906 " int Type;\n"
7907 " union\n"
7908 " {\n"
7909 " int x;\n"
7910 " double y;\n"
7911 " } Value;\n"
7912 " class C\n"
7913 " {\n"
7914 " MyFavoriteType Value;\n"
7915 " } Class;\n"
7916 "}\n",
7917 MozillaBraceStyle);
7918}
7919
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007920TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007921 FormatStyle StroustrupBraceStyle = getLLVMStyle();
7922 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007923 verifyFormat("namespace a {\n"
7924 "class A {\n"
7925 " void f()\n"
7926 " {\n"
7927 " if (true) {\n"
7928 " a();\n"
7929 " b();\n"
7930 " }\n"
7931 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007932 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007933 "};\n"
7934 "struct B {\n"
7935 " int x;\n"
7936 "};\n"
7937 "}\n",
7938 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00007939
Daniel Jasperd9670872014-08-05 12:06:20 +00007940 verifyFormat("void foo()\n"
7941 "{\n"
7942 " if (a) {\n"
7943 " a();\n"
7944 " }\n"
7945 " else {\n"
7946 " b();\n"
7947 " }\n"
7948 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007949 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00007950
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00007951 verifyFormat("#ifdef _DEBUG\n"
7952 "int foo(int i = 0)\n"
7953 "#else\n"
7954 "int foo(int i = 5)\n"
7955 "#endif\n"
7956 "{\n"
7957 " return i;\n"
7958 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007959 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00007960
7961 verifyFormat("void foo() {}\n"
7962 "void bar()\n"
7963 "#ifdef _DEBUG\n"
7964 "{\n"
7965 " foo();\n"
7966 "}\n"
7967 "#else\n"
7968 "{\n"
7969 "}\n"
7970 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007971 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00007972
7973 verifyFormat("void foobar() { int i = 5; }\n"
7974 "#ifdef _DEBUG\n"
7975 "void bar() {}\n"
7976 "#else\n"
7977 "void bar() { foobar(); }\n"
7978 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007979 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00007980}
7981
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00007982TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007983 FormatStyle AllmanBraceStyle = getLLVMStyle();
7984 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00007985 verifyFormat("namespace a\n"
7986 "{\n"
7987 "class A\n"
7988 "{\n"
7989 " void f()\n"
7990 " {\n"
7991 " if (true)\n"
7992 " {\n"
7993 " a();\n"
7994 " b();\n"
7995 " }\n"
7996 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007997 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00007998 "};\n"
7999 "struct B\n"
8000 "{\n"
8001 " int x;\n"
8002 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008003 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008004 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008005
8006 verifyFormat("void f()\n"
8007 "{\n"
8008 " if (true)\n"
8009 " {\n"
8010 " a();\n"
8011 " }\n"
8012 " else if (false)\n"
8013 " {\n"
8014 " b();\n"
8015 " }\n"
8016 " else\n"
8017 " {\n"
8018 " c();\n"
8019 " }\n"
8020 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008021 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008022
8023 verifyFormat("void f()\n"
8024 "{\n"
8025 " for (int i = 0; i < 10; ++i)\n"
8026 " {\n"
8027 " a();\n"
8028 " }\n"
8029 " while (false)\n"
8030 " {\n"
8031 " b();\n"
8032 " }\n"
8033 " do\n"
8034 " {\n"
8035 " c();\n"
8036 " } while (false)\n"
8037 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008038 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008039
8040 verifyFormat("void f(int a)\n"
8041 "{\n"
8042 " switch (a)\n"
8043 " {\n"
8044 " case 0:\n"
8045 " break;\n"
8046 " case 1:\n"
8047 " {\n"
8048 " break;\n"
8049 " }\n"
8050 " case 2:\n"
8051 " {\n"
8052 " }\n"
8053 " break;\n"
8054 " default:\n"
8055 " break;\n"
8056 " }\n"
8057 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008058 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00008059
8060 verifyFormat("enum X\n"
8061 "{\n"
8062 " Y = 0,\n"
8063 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008064 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00008065 verifyFormat("enum X\n"
8066 "{\n"
8067 " Y = 0\n"
8068 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008069 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00008070
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008071 verifyFormat("@interface BSApplicationController ()\n"
8072 "{\n"
8073 "@private\n"
8074 " id _extraIvar;\n"
8075 "}\n"
8076 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008077 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008078
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008079 verifyFormat("#ifdef _DEBUG\n"
8080 "int foo(int i = 0)\n"
8081 "#else\n"
8082 "int foo(int i = 5)\n"
8083 "#endif\n"
8084 "{\n"
8085 " return i;\n"
8086 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008087 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008088
8089 verifyFormat("void foo() {}\n"
8090 "void bar()\n"
8091 "#ifdef _DEBUG\n"
8092 "{\n"
8093 " foo();\n"
8094 "}\n"
8095 "#else\n"
8096 "{\n"
8097 "}\n"
8098 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008099 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008100
8101 verifyFormat("void foobar() { int i = 5; }\n"
8102 "#ifdef _DEBUG\n"
8103 "void bar() {}\n"
8104 "#else\n"
8105 "void bar() { foobar(); }\n"
8106 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008107 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008108
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008109 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008110 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00008111 " // ...\n"
8112 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008113 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008114 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008115 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00008116 " // ...\n"
8117 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008118 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008119 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00008120 // .. or dict literals.
8121 verifyFormat("void f()\n"
8122 "{\n"
8123 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
8124 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008125 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00008126 verifyFormat("int f()\n"
8127 "{ // comment\n"
8128 " return 42;\n"
8129 "}",
8130 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00008131
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008132 AllmanBraceStyle.ColumnLimit = 19;
8133 verifyFormat("void f() { int i; }", AllmanBraceStyle);
8134 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00008135 verifyFormat("void f()\n"
8136 "{\n"
8137 " int i;\n"
8138 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008139 AllmanBraceStyle);
8140 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00008141
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008142 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00008143 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
8144 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
8145 verifyFormat("void f(bool b)\n"
8146 "{\n"
8147 " if (b)\n"
8148 " {\n"
8149 " return;\n"
8150 " }\n"
8151 "}\n",
8152 BreakBeforeBraceShortIfs);
8153 verifyFormat("void f(bool b)\n"
8154 "{\n"
8155 " if (b) return;\n"
8156 "}\n",
8157 BreakBeforeBraceShortIfs);
8158 verifyFormat("void f(bool b)\n"
8159 "{\n"
8160 " while (b)\n"
8161 " {\n"
8162 " return;\n"
8163 " }\n"
8164 "}\n",
8165 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00008166}
8167
Alexander Kornienko3a33f022013-12-12 09:49:52 +00008168TEST_F(FormatTest, GNUBraceBreaking) {
8169 FormatStyle GNUBraceStyle = getLLVMStyle();
8170 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
8171 verifyFormat("namespace a\n"
8172 "{\n"
8173 "class A\n"
8174 "{\n"
8175 " void f()\n"
8176 " {\n"
8177 " int a;\n"
8178 " {\n"
8179 " int b;\n"
8180 " }\n"
8181 " if (true)\n"
8182 " {\n"
8183 " a();\n"
8184 " b();\n"
8185 " }\n"
8186 " }\n"
8187 " void g() { return; }\n"
8188 "}\n"
8189 "}",
8190 GNUBraceStyle);
8191
8192 verifyFormat("void f()\n"
8193 "{\n"
8194 " if (true)\n"
8195 " {\n"
8196 " a();\n"
8197 " }\n"
8198 " else if (false)\n"
8199 " {\n"
8200 " b();\n"
8201 " }\n"
8202 " else\n"
8203 " {\n"
8204 " c();\n"
8205 " }\n"
8206 "}\n",
8207 GNUBraceStyle);
8208
8209 verifyFormat("void f()\n"
8210 "{\n"
8211 " for (int i = 0; i < 10; ++i)\n"
8212 " {\n"
8213 " a();\n"
8214 " }\n"
8215 " while (false)\n"
8216 " {\n"
8217 " b();\n"
8218 " }\n"
8219 " do\n"
8220 " {\n"
8221 " c();\n"
8222 " }\n"
8223 " while (false);\n"
8224 "}\n",
8225 GNUBraceStyle);
8226
8227 verifyFormat("void f(int a)\n"
8228 "{\n"
8229 " switch (a)\n"
8230 " {\n"
8231 " case 0:\n"
8232 " break;\n"
8233 " case 1:\n"
8234 " {\n"
8235 " break;\n"
8236 " }\n"
8237 " case 2:\n"
8238 " {\n"
8239 " }\n"
8240 " break;\n"
8241 " default:\n"
8242 " break;\n"
8243 " }\n"
8244 "}\n",
8245 GNUBraceStyle);
8246
8247 verifyFormat("enum X\n"
8248 "{\n"
8249 " Y = 0,\n"
8250 "}\n",
8251 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00008252
8253 verifyFormat("@interface BSApplicationController ()\n"
8254 "{\n"
8255 "@private\n"
8256 " id _extraIvar;\n"
8257 "}\n"
8258 "@end\n",
8259 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00008260
8261 verifyFormat("#ifdef _DEBUG\n"
8262 "int foo(int i = 0)\n"
8263 "#else\n"
8264 "int foo(int i = 5)\n"
8265 "#endif\n"
8266 "{\n"
8267 " return i;\n"
8268 "}",
8269 GNUBraceStyle);
8270
8271 verifyFormat("void foo() {}\n"
8272 "void bar()\n"
8273 "#ifdef _DEBUG\n"
8274 "{\n"
8275 " foo();\n"
8276 "}\n"
8277 "#else\n"
8278 "{\n"
8279 "}\n"
8280 "#endif",
8281 GNUBraceStyle);
8282
8283 verifyFormat("void foobar() { int i = 5; }\n"
8284 "#ifdef _DEBUG\n"
8285 "void bar() {}\n"
8286 "#else\n"
8287 "void bar() { foobar(); }\n"
8288 "#endif",
8289 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00008290}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00008291
8292TEST_F(FormatTest, WebKitBraceBreaking) {
8293 FormatStyle WebKitBraceStyle = getLLVMStyle();
8294 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
Krasimir Georgiev32eaa862017-03-01 15:35:39 +00008295 WebKitBraceStyle.FixNamespaceComments = false;
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00008296 verifyFormat("namespace a {\n"
8297 "class A {\n"
8298 " void f()\n"
8299 " {\n"
8300 " if (true) {\n"
8301 " a();\n"
8302 " b();\n"
8303 " }\n"
8304 " }\n"
8305 " void g() { return; }\n"
8306 "};\n"
8307 "enum E {\n"
8308 " A,\n"
8309 " // foo\n"
8310 " B,\n"
8311 " C\n"
8312 "};\n"
8313 "struct B {\n"
8314 " int x;\n"
8315 "};\n"
8316 "}\n",
8317 WebKitBraceStyle);
8318 verifyFormat("struct S {\n"
8319 " int Type;\n"
8320 " union {\n"
8321 " int x;\n"
8322 " double y;\n"
8323 " } Value;\n"
8324 " class C {\n"
8325 " MyFavoriteType Value;\n"
8326 " } Class;\n"
8327 "};\n",
8328 WebKitBraceStyle);
8329}
8330
Manuel Klimekd5735502013-08-12 03:51:17 +00008331TEST_F(FormatTest, CatchExceptionReferenceBinding) {
8332 verifyFormat("void f() {\n"
8333 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00008334 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00008335 " }\n"
8336 "}\n",
8337 getLLVMStyle());
8338}
8339
Daniel Jasper9613c812013-08-07 16:29:23 +00008340TEST_F(FormatTest, UnderstandsPragmas) {
8341 verifyFormat("#pragma omp reduction(| : var)");
8342 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00008343
8344 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
8345 "(including parentheses).",
8346 format("#pragma mark Any non-hyphenated or hyphenated string "
8347 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +00008348}
8349
Daniel Jasperee4a8a12015-04-22 09:45:42 +00008350TEST_F(FormatTest, UnderstandPragmaOption) {
8351 verifyFormat("#pragma option -C -A");
8352
8353 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
8354}
8355
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008356#define EXPECT_ALL_STYLES_EQUAL(Styles) \
8357 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +00008358 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
8359 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +00008360
8361TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008362 SmallVector<FormatStyle, 3> Styles;
8363 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008364
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008365 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008366 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
8367 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
8368 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008369
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008370 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008371 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
8372 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
8373 EXPECT_ALL_STYLES_EQUAL(Styles);
8374
Nico Weber514ecc82014-02-02 20:50:45 +00008375 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008376 EXPECT_TRUE(
8377 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
8378 EXPECT_TRUE(
8379 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
8380 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008381
Nico Weber514ecc82014-02-02 20:50:45 +00008382 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008383 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
8384 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
8385 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008386
8387 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008388 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
8389 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
8390 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008391
Daniel Jasperffefb3d2013-07-24 13:10:59 +00008392 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008393 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
8394 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
8395 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00008396
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +00008397 Styles[0] = getGNUStyle();
8398 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
8399 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
8400 EXPECT_ALL_STYLES_EQUAL(Styles);
8401
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008402 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
8403}
8404
8405TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
8406 SmallVector<FormatStyle, 8> Styles;
8407 Styles.resize(2);
8408
8409 Styles[0] = getGoogleStyle();
8410 Styles[1] = getLLVMStyle();
8411 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
8412 EXPECT_ALL_STYLES_EQUAL(Styles);
8413
8414 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +00008415 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008416 Styles[1] = getLLVMStyle();
8417 Styles[1].Language = FormatStyle::LK_JavaScript;
8418 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
8419
8420 Styles[2] = getLLVMStyle();
8421 Styles[2].Language = FormatStyle::LK_JavaScript;
8422 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
8423 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008424 &Styles[2])
8425 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008426
8427 Styles[3] = getLLVMStyle();
8428 Styles[3].Language = FormatStyle::LK_JavaScript;
8429 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
8430 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008431 &Styles[3])
8432 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008433
8434 Styles[4] = getLLVMStyle();
8435 Styles[4].Language = FormatStyle::LK_JavaScript;
8436 EXPECT_EQ(0, parseConfiguration("---\n"
8437 "BasedOnStyle: LLVM\n"
8438 "IndentWidth: 123\n"
8439 "---\n"
8440 "BasedOnStyle: Google\n"
8441 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008442 &Styles[4])
8443 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008444 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008445}
8446
Daniel Jasper91881d92014-09-29 08:07:46 +00008447#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +00008448 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +00008449 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +00008450 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +00008451 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +00008452 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008453
Daniel Jasper91881d92014-09-29 08:07:46 +00008454#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
8455
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00008456#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
8457 Style.STRUCT.FIELD = false; \
8458 EXPECT_EQ(0, \
8459 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
8460 .value()); \
8461 EXPECT_TRUE(Style.STRUCT.FIELD); \
8462 EXPECT_EQ(0, \
8463 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
8464 .value()); \
8465 EXPECT_FALSE(Style.STRUCT.FIELD);
8466
8467#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
8468 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
8469
Daniel Jasper00853002014-09-16 16:22:30 +00008470#define CHECK_PARSE(TEXT, FIELD, VALUE) \
8471 EXPECT_NE(VALUE, Style.FIELD); \
8472 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
8473 EXPECT_EQ(VALUE, Style.FIELD)
8474
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008475TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008476 FormatStyle Style = {};
8477 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00008478 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +00008479 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +00008480 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +00008481 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +00008482 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008483 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +00008484 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +00008485 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008486 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +00008487 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00008488 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +00008489 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00008490 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008491 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +00008492 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00008493 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008494 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008495 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +00008496 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +00008497 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +00008498 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008499 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00008500 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +00008501 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +00008502 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008503 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +00008504 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +00008505 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +00008506 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008507 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +00008508 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00008509 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008510 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +00008511 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008512 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008513 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00008514 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +00008515 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00008516
8517 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
8518 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
8519 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
8520 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
8521 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
8522 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
8523 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
8524 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
8525 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
8526 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
8527 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008528}
Alexander Kornienkod6538332013-05-07 15:32:14 +00008529
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008530#undef CHECK_PARSE_BOOL
8531
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00008532TEST_F(FormatTest, ParsesConfiguration) {
8533 FormatStyle Style = {};
8534 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00008535 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00008536 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
8537 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +00008538 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008539 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
8540 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +00008541 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
8542 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008543 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
8544 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
8545 PenaltyReturnTypeOnItsOwnLine, 1234u);
8546 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
8547 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +00008548 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +00008549 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00008550 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +00008551
Daniel Jasper553d4872014-06-17 12:40:34 +00008552 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +00008553 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
8554 FormatStyle::PAS_Left);
8555 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
8556 FormatStyle::PAS_Right);
8557 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
8558 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +00008559 // For backward compatibility:
8560 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
8561 FormatStyle::PAS_Left);
8562 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
8563 FormatStyle::PAS_Right);
8564 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
8565 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +00008566
Alexander Kornienkod6538332013-05-07 15:32:14 +00008567 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +00008568 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
8569 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +00008570 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
8571 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
8572 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
8573
Daniel Jasperac043c92014-09-15 11:11:00 +00008574 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +00008575 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
8576 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +00008577 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
8578 FormatStyle::BOS_None);
8579 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
8580 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00008581 // For backward compatibility:
8582 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
8583 FormatStyle::BOS_None);
8584 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
8585 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +00008586
Daniel Jasper6501f7e2015-10-27 12:38:37 +00008587 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8588 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
8589 FormatStyle::BAS_Align);
8590 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
8591 FormatStyle::BAS_DontAlign);
8592 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
8593 FormatStyle::BAS_AlwaysBreak);
8594 // For backward compatibility:
8595 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
8596 FormatStyle::BAS_DontAlign);
8597 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
8598 FormatStyle::BAS_Align);
8599
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008600 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008601 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
8602 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
8603 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008604 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
8605 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +00008606 // For backward compatibility:
8607 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
8608 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008609
Daniel Jasperd74cf402014-04-08 12:46:38 +00008610 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +00008611 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
8612 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
8613 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
8614 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +00008615 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
8616 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +00008617 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
8618 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00008619 // For backward compatibility:
8620 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
8621 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
8622 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
8623 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +00008624
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008625 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
8626 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
8627 FormatStyle::SBPO_Never);
8628 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
8629 FormatStyle::SBPO_Always);
8630 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
8631 FormatStyle::SBPO_ControlStatements);
8632 // For backward compatibility:
8633 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
8634 FormatStyle::SBPO_Never);
8635 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
8636 FormatStyle::SBPO_ControlStatements);
8637
Alexander Kornienkod6538332013-05-07 15:32:14 +00008638 Style.ColumnLimit = 123;
8639 FormatStyle BaseStyle = getLLVMStyle();
8640 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
8641 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
8642
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008643 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
8644 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
8645 FormatStyle::BS_Attach);
8646 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
8647 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00008648 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
8649 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008650 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
8651 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00008652 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
8653 FormatStyle::BS_Allman);
8654 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00008655 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
8656 FormatStyle::BS_WebKit);
8657 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
8658 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008659
Zachary Turner448592e2015-12-18 22:20:15 +00008660 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
8661 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
8662 FormatStyle::RTBS_None);
8663 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
8664 FormatStyle::RTBS_All);
8665 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +00008666 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +00008667 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
8668 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
8669 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
8670 AlwaysBreakAfterReturnType,
8671 FormatStyle::RTBS_TopLevelDefinitions);
8672
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00008673 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
8674 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
8675 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
8676 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
8677 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
8678 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
8679 AlwaysBreakAfterDefinitionReturnType,
8680 FormatStyle::DRTBS_TopLevel);
8681
Daniel Jasper65ee3472013-07-31 23:16:02 +00008682 Style.NamespaceIndentation = FormatStyle::NI_All;
8683 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
8684 FormatStyle::NI_None);
8685 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
8686 FormatStyle::NI_Inner);
8687 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
8688 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +00008689
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00008690 // FIXME: This is required because parsing a configuration simply overwrites
8691 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +00008692 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +00008693 std::vector<std::string> BoostForeach;
8694 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00008695 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +00008696 std::vector<std::string> BoostAndQForeach;
8697 BoostAndQForeach.push_back("BOOST_FOREACH");
8698 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00008699 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
8700 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00008701
8702 Style.IncludeCategories.clear();
8703 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
8704 {".*", 1}};
8705 CHECK_PARSE("IncludeCategories:\n"
8706 " - Regex: abc/.*\n"
8707 " Priority: 2\n"
8708 " - Regex: .*\n"
8709 " Priority: 1",
8710 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00008711 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008712}
8713
8714TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
8715 FormatStyle Style = {};
8716 Style.Language = FormatStyle::LK_Cpp;
8717 CHECK_PARSE("Language: Cpp\n"
8718 "IndentWidth: 12",
8719 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +00008720 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
8721 "IndentWidth: 34",
8722 &Style),
8723 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008724 EXPECT_EQ(12u, Style.IndentWidth);
8725 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
8726 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
8727
8728 Style.Language = FormatStyle::LK_JavaScript;
8729 CHECK_PARSE("Language: JavaScript\n"
8730 "IndentWidth: 12",
8731 IndentWidth, 12u);
8732 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +00008733 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
8734 "IndentWidth: 34",
8735 &Style),
8736 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008737 EXPECT_EQ(23u, Style.IndentWidth);
8738 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
8739 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
8740
8741 CHECK_PARSE("BasedOnStyle: LLVM\n"
8742 "IndentWidth: 67",
8743 IndentWidth, 67u);
8744
8745 CHECK_PARSE("---\n"
8746 "Language: JavaScript\n"
8747 "IndentWidth: 12\n"
8748 "---\n"
8749 "Language: Cpp\n"
8750 "IndentWidth: 34\n"
8751 "...\n",
8752 IndentWidth, 12u);
8753
8754 Style.Language = FormatStyle::LK_Cpp;
8755 CHECK_PARSE("---\n"
8756 "Language: JavaScript\n"
8757 "IndentWidth: 12\n"
8758 "---\n"
8759 "Language: Cpp\n"
8760 "IndentWidth: 34\n"
8761 "...\n",
8762 IndentWidth, 34u);
8763 CHECK_PARSE("---\n"
8764 "IndentWidth: 78\n"
8765 "---\n"
8766 "Language: JavaScript\n"
8767 "IndentWidth: 56\n"
8768 "...\n",
8769 IndentWidth, 78u);
8770
8771 Style.ColumnLimit = 123;
8772 Style.IndentWidth = 234;
8773 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
8774 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +00008775 EXPECT_FALSE(parseConfiguration("---\n"
8776 "IndentWidth: 456\n"
8777 "BreakBeforeBraces: Allman\n"
8778 "---\n"
8779 "Language: JavaScript\n"
8780 "IndentWidth: 111\n"
8781 "TabWidth: 111\n"
8782 "---\n"
8783 "Language: Cpp\n"
8784 "BreakBeforeBraces: Stroustrup\n"
8785 "TabWidth: 789\n"
8786 "...\n",
8787 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008788 EXPECT_EQ(123u, Style.ColumnLimit);
8789 EXPECT_EQ(456u, Style.IndentWidth);
8790 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
8791 EXPECT_EQ(789u, Style.TabWidth);
8792
Rafael Espindola1f243172014-06-12 11:35:17 +00008793 EXPECT_EQ(parseConfiguration("---\n"
8794 "Language: JavaScript\n"
8795 "IndentWidth: 56\n"
8796 "---\n"
8797 "IndentWidth: 78\n"
8798 "...\n",
8799 &Style),
8800 ParseError::Error);
8801 EXPECT_EQ(parseConfiguration("---\n"
8802 "Language: JavaScript\n"
8803 "IndentWidth: 56\n"
8804 "---\n"
8805 "Language: JavaScript\n"
8806 "IndentWidth: 78\n"
8807 "...\n",
8808 &Style),
8809 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008810
8811 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
8812}
Daniel Jasper65ee3472013-07-31 23:16:02 +00008813
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008814#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008815
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008816TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
8817 FormatStyle Style = {};
8818 Style.Language = FormatStyle::LK_JavaScript;
8819 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008820 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00008821 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008822
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008823 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00008824 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008825 "BasedOnStyle: Google\n"
8826 "---\n"
8827 "Language: JavaScript\n"
8828 "IndentWidth: 76\n"
8829 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00008830 &Style)
8831 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00008832 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00008833 EXPECT_EQ(76u, Style.IndentWidth);
8834 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
8835}
8836
Alexander Kornienkod6538332013-05-07 15:32:14 +00008837TEST_F(FormatTest, ConfigurationRoundTripTest) {
8838 FormatStyle Style = getLLVMStyle();
8839 std::string YAML = configurationAsText(Style);
8840 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +00008841 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00008842 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
8843 EXPECT_EQ(Style, ParsedStyle);
8844}
8845
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008846TEST_F(FormatTest, WorksFor8bitEncodings) {
8847 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
8848 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
8849 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
8850 "\"\xef\xee\xf0\xf3...\"",
8851 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
8852 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
8853 "\xef\xee\xf0\xf3...\"",
8854 getLLVMStyleWithColumns(12)));
8855}
8856
Alexander Kornienko393e3082013-11-13 14:04:17 +00008857TEST_F(FormatTest, HandlesUTF8BOM) {
8858 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
8859 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
8860 format("\xef\xbb\xbf#include <iostream>"));
8861 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
8862 format("\xef\xbb\xbf\n#include <iostream>"));
8863}
8864
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +00008865// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
8866#if !defined(_MSC_VER)
8867
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008868TEST_F(FormatTest, CountsUTF8CharactersProperly) {
8869 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
8870 getLLVMStyleWithColumns(35));
8871 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008872 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008873 verifyFormat("// Однажды в студёную зимнюю пору...",
8874 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +00008875 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008876 verifyFormat("/* Однажды в студёную зимнюю пору... */",
8877 getLLVMStyleWithColumns(39));
8878 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008879 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008880}
8881
8882TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +00008883 // Non-printable characters' width is currently considered to be the length in
8884 // bytes in UTF8. The characters can be displayed in very different manner
8885 // (zero-width, single width with a substitution glyph, expanded to their code
8886 // (e.g. "<8d>"), so there's no single correct way to handle them.
8887 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00008888 "\"\xc2\x8d\";",
8889 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +00008890 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00008891 "\"\xc2\x8d\";",
8892 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008893 EXPECT_EQ("\"Однажды, в \"\n"
8894 "\"студёную \"\n"
8895 "\"зимнюю \"\n"
8896 "\"пору,\"",
8897 format("\"Однажды, в студёную зимнюю пору,\"",
8898 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008899 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +00008900 "\"一 二 三 \"\n"
8901 "\"四 五六 \"\n"
8902 "\"七 八 九 \"\n"
8903 "\"十\"",
8904 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008905 EXPECT_EQ("\"一\t二 \"\n"
8906 "\"\t三 \"\n"
8907 "\"四 五\t六 \"\n"
8908 "\"\t七 \"\n"
8909 "\"八九十\tqq\"",
8910 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
8911 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +00008912
8913 // UTF8 character in an escape sequence.
8914 EXPECT_EQ("\"aaaaaa\"\n"
8915 "\"\\\xC2\x8D\"",
8916 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008917}
8918
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008919TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
8920 EXPECT_EQ("const char *sssss =\n"
8921 " \"一二三四五六七八\\\n"
8922 " 九 十\";",
8923 format("const char *sssss = \"一二三四五六七八\\\n"
8924 " 九 十\";",
8925 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008926}
8927
8928TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00008929 EXPECT_EQ("// aaaaÄ\xc2\x8d",
8930 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008931 EXPECT_EQ("// Я из лесу\n"
8932 "// вышел; был\n"
8933 "// сильный\n"
8934 "// мороз.",
8935 format("// Я из лесу вышел; был сильный мороз.",
8936 getLLVMStyleWithColumns(13)));
8937 EXPECT_EQ("// 一二三\n"
8938 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008939 "// 八 九\n"
8940 "// 十",
8941 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008942}
8943
8944TEST_F(FormatTest, SplitsUTF8BlockComments) {
8945 EXPECT_EQ("/* Гляжу,\n"
8946 " * поднимается\n"
8947 " * медленно в\n"
8948 " * гору\n"
8949 " * Лошадка,\n"
8950 " * везущая\n"
8951 " * хворосту\n"
8952 " * воз. */",
8953 format("/* Гляжу, поднимается медленно в гору\n"
8954 " * Лошадка, везущая хворосту воз. */",
8955 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008956 EXPECT_EQ(
8957 "/* 一二三\n"
8958 " * 四五六七\n"
8959 " * 八 九\n"
8960 " * 十 */",
8961 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +00008962 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
8963 " * 𝕓𝕪𝕥𝕖\n"
8964 " * 𝖀𝕿𝕱-𝟠 */",
8965 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00008966}
8967
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008968#endif // _MSC_VER
8969
Daniel Jaspercdaffa42013-08-13 10:58:30 +00008970TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
8971 FormatStyle Style = getLLVMStyle();
8972
8973 Style.ConstructorInitializerIndentWidth = 4;
8974 verifyFormat(
8975 "SomeClass::Constructor()\n"
8976 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
8977 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
8978 Style);
8979
8980 Style.ConstructorInitializerIndentWidth = 2;
8981 verifyFormat(
8982 "SomeClass::Constructor()\n"
8983 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
8984 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
8985 Style);
8986
8987 Style.ConstructorInitializerIndentWidth = 0;
8988 verifyFormat(
8989 "SomeClass::Constructor()\n"
8990 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
8991 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
8992 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +00008993 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8994 verifyFormat(
8995 "SomeLongTemplateVariableName<\n"
8996 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
8997 Style);
8998 verifyFormat(
8999 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
9000 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
9001 Style);
Daniel Jasper00853002014-09-16 16:22:30 +00009002}
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009003
Daniel Jasper00853002014-09-16 16:22:30 +00009004TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
9005 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009006 Style.BreakConstructorInitializersBeforeComma = true;
9007 Style.ConstructorInitializerIndentWidth = 4;
9008 verifyFormat("SomeClass::Constructor()\n"
9009 " : a(a)\n"
9010 " , b(b)\n"
9011 " , c(c) {}",
9012 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009013 verifyFormat("SomeClass::Constructor()\n"
9014 " : a(a) {}",
9015 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009016
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009017 Style.ColumnLimit = 0;
9018 verifyFormat("SomeClass::Constructor()\n"
9019 " : a(a) {}",
9020 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +00009021 verifyFormat("SomeClass::Constructor() noexcept\n"
9022 " : a(a) {}",
9023 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009024 verifyFormat("SomeClass::Constructor()\n"
9025 " : a(a)\n"
9026 " , b(b)\n"
9027 " , c(c) {}",
9028 Style);
9029 verifyFormat("SomeClass::Constructor()\n"
9030 " : a(a) {\n"
9031 " foo();\n"
9032 " bar();\n"
9033 "}",
9034 Style);
9035
Daniel Jasperd74cf402014-04-08 12:46:38 +00009036 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009037 verifyFormat("SomeClass::Constructor()\n"
9038 " : a(a)\n"
9039 " , b(b)\n"
9040 " , c(c) {\n}",
9041 Style);
9042 verifyFormat("SomeClass::Constructor()\n"
9043 " : a(a) {\n}",
9044 Style);
9045
9046 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +00009047 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009048 Style.ConstructorInitializerIndentWidth = 2;
9049 verifyFormat("SomeClass::Constructor()\n"
9050 " : a(a)\n"
9051 " , b(b)\n"
9052 " , c(c) {}",
9053 Style);
9054
9055 Style.ConstructorInitializerIndentWidth = 0;
9056 verifyFormat("SomeClass::Constructor()\n"
9057 ": a(a)\n"
9058 ", b(b)\n"
9059 ", c(c) {}",
9060 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +00009061
9062 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
9063 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009064 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
9065 verifyFormat(
9066 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
9067 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +00009068 verifyFormat(
9069 "SomeClass::Constructor()\n"
9070 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
9071 Style);
9072 Style.ConstructorInitializerIndentWidth = 4;
9073 Style.ColumnLimit = 60;
9074 verifyFormat("SomeClass::Constructor()\n"
9075 " : aaaaaaaa(aaaaaaaa)\n"
9076 " , aaaaaaaa(aaaaaaaa)\n"
9077 " , aaaaaaaa(aaaaaaaa) {}",
9078 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009079}
9080
Daniel Jasper38efc132014-10-21 07:51:54 +00009081TEST_F(FormatTest, Destructors) {
9082 verifyFormat("void F(int &i) { i.~int(); }");
9083 verifyFormat("void F(int &i) { i->~int(); }");
9084}
9085
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009086TEST_F(FormatTest, FormatsWithWebKitStyle) {
9087 FormatStyle Style = getWebKitStyle();
9088
9089 // Don't indent in outer namespaces.
9090 verifyFormat("namespace outer {\n"
9091 "int i;\n"
9092 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00009093 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009094 "} // namespace inner\n"
9095 "} // namespace outer\n"
9096 "namespace other_outer {\n"
9097 "int i;\n"
9098 "}",
9099 Style);
9100
9101 // Don't indent case labels.
9102 verifyFormat("switch (variable) {\n"
9103 "case 1:\n"
9104 "case 2:\n"
9105 " doSomething();\n"
9106 " break;\n"
9107 "default:\n"
9108 " ++variable;\n"
9109 "}",
9110 Style);
9111
9112 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +00009113 EXPECT_EQ("void f()\n"
9114 "{\n"
9115 " if (aaaaaaaaaaaaaaaa\n"
9116 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
9117 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
9118 " return;\n"
9119 "}",
9120 format("void f() {\n"
9121 "if (aaaaaaaaaaaaaaaa\n"
9122 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
9123 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
9124 "return;\n"
9125 "}",
9126 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009127
Daniel Jasper35995672014-04-29 14:05:20 +00009128 // Allow functions on a single line.
9129 verifyFormat("void f() { return; }", Style);
9130
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009131 // Constructor initializers are formatted one per line with the "," on the
9132 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009133 verifyFormat("Constructor()\n"
9134 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
9135 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00009136 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +00009137 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
9138 "{\n"
9139 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009140 Style);
9141 verifyFormat("SomeClass::Constructor()\n"
9142 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +00009143 "{\n"
9144 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009145 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +00009146 EXPECT_EQ("SomeClass::Constructor()\n"
9147 " : a(a)\n"
9148 "{\n"
9149 "}",
9150 format("SomeClass::Constructor():a(a){}", Style));
9151 verifyFormat("SomeClass::Constructor()\n"
9152 " : a(a)\n"
9153 " , b(b)\n"
9154 " , c(c)\n"
9155 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009156 "}",
9157 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +00009158 verifyFormat("SomeClass::Constructor()\n"
9159 " : a(a)\n"
9160 "{\n"
9161 " foo();\n"
9162 " bar();\n"
9163 "}",
9164 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009165
Daniel Jasper65ee3472013-07-31 23:16:02 +00009166 // Access specifiers should be aligned left.
9167 verifyFormat("class C {\n"
9168 "public:\n"
9169 " int i;\n"
9170 "};",
9171 Style);
9172
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009173 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +00009174 verifyFormat("int a; // Do not\n"
9175 "double b; // align comments.",
9176 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009177
Daniel Jasper3219e432014-12-02 13:24:51 +00009178 // Do not align operands.
9179 EXPECT_EQ("ASSERT(aaaa\n"
9180 " || bbbb);",
9181 format("ASSERT ( aaaa\n||bbbb);", Style));
9182
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009183 // Accept input's line breaks.
9184 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
9185 " || bbbbbbbbbbbbbbb) {\n"
9186 " i++;\n"
9187 "}",
9188 format("if (aaaaaaaaaaaaaaa\n"
9189 "|| bbbbbbbbbbbbbbb) { i++; }",
9190 Style));
9191 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
9192 " i++;\n"
9193 "}",
9194 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +00009195
9196 // Don't automatically break all macro definitions (llvm.org/PR17842).
9197 verifyFormat("#define aNumber 10", Style);
9198 // However, generally keep the line breaks that the user authored.
9199 EXPECT_EQ("#define aNumber \\\n"
9200 " 10",
9201 format("#define aNumber \\\n"
9202 " 10",
9203 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +00009204
9205 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +00009206 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
9207 " copyItems:YES];",
9208 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
9209 "copyItems:YES];",
9210 Style));
9211 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
9212 " copyItems:YES];",
9213 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
9214 " copyItems:YES];",
9215 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +00009216 // FIXME: This does not seem right, there should be more indentation before
9217 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +00009218 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +00009219 " @\"a\",\n"
9220 " @\"a\"\n"
9221 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +00009222 " copyItems:YES];",
9223 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
9224 " @\"a\",\n"
9225 " @\"a\"\n"
9226 " ]\n"
9227 " copyItems:YES];",
9228 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +00009229 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +00009230 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
9231 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +00009232 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
9233 " copyItems:YES];",
9234 Style));
9235
9236 verifyFormat("[self.a b:c c:d];", Style);
9237 EXPECT_EQ("[self.a b:c\n"
9238 " c:d];",
9239 format("[self.a b:c\n"
9240 "c:d];",
9241 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009242}
9243
Manuel Klimekffdeb592013-09-03 15:10:01 +00009244TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +00009245 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
9246 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
9247 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
9248 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
9249 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +00009250 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +00009251 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00009252 verifyFormat("void f() {\n"
9253 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
9254 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00009255 verifyFormat("void f() {\n"
9256 " other(x.begin(), //\n"
9257 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +00009258 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00009259 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +00009260 verifyFormat("SomeFunction([]() { // A cool function...\n"
9261 " return 43;\n"
9262 "});");
Daniel Jasper56346192014-10-27 16:31:46 +00009263 EXPECT_EQ("SomeFunction([]() {\n"
9264 "#define A a\n"
9265 " return 43;\n"
9266 "});",
9267 format("SomeFunction([](){\n"
9268 "#define A a\n"
9269 "return 43;\n"
9270 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +00009271 verifyFormat("void f() {\n"
9272 " SomeFunction([](decltype(x), A *a) {});\n"
9273 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +00009274 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
9275 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +00009276 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
9277 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
9278 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +00009279 verifyFormat("Constructor()\n"
9280 " : Field([] { // comment\n"
9281 " int i;\n"
9282 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +00009283 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
9284 " return some_parameter.size();\n"
9285 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +00009286 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
9287 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +00009288 verifyFormat("int i = aaaaaa ? 1 //\n"
9289 " : [] {\n"
9290 " return 2; //\n"
9291 " }();");
9292 verifyFormat("llvm::errs() << \"number of twos is \"\n"
9293 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
9294 " return x == 2; // force break\n"
9295 " });");
Daniel Jasperd9b319e2017-02-20 12:43:48 +00009296 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
9297 " [=](int iiiiiiiiiiii) {\n"
9298 " return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
9299 " aaaaaaaaaaaaaaaaaaaaaaa;\n"
9300 " });",
Daniel Jasperb9edcfb2015-07-07 13:50:50 +00009301 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +00009302 verifyFormat("SomeFunction({[&] {\n"
9303 " // comment\n"
9304 " },\n"
9305 " [&] {\n"
9306 " // comment\n"
9307 " }});");
9308 verifyFormat("SomeFunction({[&] {\n"
9309 " // comment\n"
9310 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00009311 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
9312 " [&]() { return true; },\n"
9313 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +00009314
Daniel Jaspercb51cf42014-01-16 09:11:55 +00009315 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +00009316 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +00009317 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +00009318 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
9319 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +00009320 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +00009321 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +00009322 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
9323 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +00009324 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +00009325 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
9326 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +00009327 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +00009328 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +00009329 verifyFormat(
9330 "aaaaaaaaaaaaaaaaaaaaaa(\n"
9331 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
9332 " return aaaaaaaaaaaaaaaaa;\n"
9333 " });",
9334 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +00009335 verifyFormat("[]() //\n"
9336 " -> int {\n"
9337 " return 1; //\n"
9338 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +00009339
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +00009340 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +00009341 verifyFormat("SomeFunction(\n"
9342 " []() {\n"
9343 " int i = 42;\n"
9344 " return i;\n"
9345 " },\n"
9346 " []() {\n"
9347 " int j = 43;\n"
9348 " return j;\n"
9349 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +00009350
Daniel Jasperda18fd82014-06-10 06:39:03 +00009351 // More complex introducers.
9352 verifyFormat("return [i, args...] {};");
9353
Daniel Jasperbf02b2c12013-09-05 11:49:39 +00009354 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +00009355 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +00009356 verifyFormat("double &operator[](int i) { return 0; }\n"
9357 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +00009358 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +00009359 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +00009360 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +00009361
9362 // Other corner cases.
9363 verifyFormat("void f() {\n"
9364 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
9365 " );\n"
9366 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +00009367
9368 // Lambdas created through weird macros.
9369 verifyFormat("void f() {\n"
9370 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +00009371 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +00009372 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +00009373
9374 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
9375 " doo_dah();\n"
9376 " doo_dah();\n"
9377 " })) {\n"
9378 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +00009379 verifyFormat("auto lambda = []() {\n"
9380 " int a = 2\n"
9381 "#if A\n"
9382 " + 2\n"
9383 "#endif\n"
9384 " ;\n"
9385 "};");
Daniel Jasperd9b319e2017-02-20 12:43:48 +00009386
9387 // Lambdas with complex multiline introducers.
9388 verifyFormat(
9389 "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
9390 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
9391 " -> ::std::unordered_set<\n"
9392 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
9393 " //\n"
9394 " });");
Manuel Klimekffdeb592013-09-03 15:10:01 +00009395}
9396
Manuel Klimek516e0542013-09-04 13:25:30 +00009397TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +00009398 FormatStyle ShortBlocks = getLLVMStyle();
9399 ShortBlocks.AllowShortBlocksOnASingleLine = true;
9400 verifyFormat("int (^Block)(int, int);", ShortBlocks);
9401 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
9402 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
9403 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
9404 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
9405 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +00009406
Daniel Jasper76284682014-10-22 09:12:44 +00009407 verifyFormat("foo(^{ bar(); });", ShortBlocks);
9408 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
9409 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +00009410
Daniel Jasper76284682014-10-22 09:12:44 +00009411 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009412 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009413 "}];");
9414 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009415 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009416 "}]};");
9417 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009418 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009419 "}];");
9420 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009421 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009422 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +00009423 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009424 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009425 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +00009426 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +00009427 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009428
9429 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009430 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009431 "}];",
9432 getLLVMStyleWithColumns(60));
9433 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009434 " NSString *path = [self sessionFilePath];\n"
9435 " if (path) {\n"
9436 " // ...\n"
9437 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009438 "});");
9439 verifyFormat("[[SessionService sharedService]\n"
9440 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009441 " if (window) {\n"
9442 " [self windowDidLoad:window];\n"
9443 " } else {\n"
9444 " [self errorLoadingWindow];\n"
9445 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009446 " }];");
9447 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009448 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009449 "};\n",
9450 getLLVMStyleWithColumns(40));
9451 verifyFormat("[[SessionService sharedService]\n"
9452 " loadWindowWithCompletionBlock: //\n"
9453 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009454 " if (window) {\n"
9455 " [self windowDidLoad:window];\n"
9456 " } else {\n"
9457 " [self errorLoadingWindow];\n"
9458 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009459 " }];",
9460 getLLVMStyleWithColumns(60));
9461 verifyFormat("[myObject doSomethingWith:arg1\n"
9462 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009463 " // ...\n"
9464 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009465 " }\n"
9466 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009467 " // ...\n"
9468 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +00009469 " }\n"
9470 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009471 " // ...\n"
9472 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +00009473 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +00009474 verifyFormat("[myObject doSomethingWith:arg1\n"
9475 " firstBlock:-1\n"
9476 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009477 " // ...\n"
9478 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +00009479 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +00009480
9481 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009482 " @autoreleasepool {\n"
9483 " if (a) {\n"
9484 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +00009485 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009486 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +00009487 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +00009488 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +00009489 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
9490 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +00009491
9492 FormatStyle FourIndent = getLLVMStyle();
9493 FourIndent.ObjCBlockIndentWidth = 4;
9494 verifyFormat("[operation setCompletionBlock:^{\n"
9495 " [self onOperationDone];\n"
9496 "}];",
9497 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +00009498}
9499
Daniel Jasper289afc02015-04-23 09:23:17 +00009500TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
9501 FormatStyle ZeroColumn = getLLVMStyle();
9502 ZeroColumn.ColumnLimit = 0;
9503
9504 verifyFormat("[[SessionService sharedService] "
9505 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9506 " if (window) {\n"
9507 " [self windowDidLoad:window];\n"
9508 " } else {\n"
9509 " [self errorLoadingWindow];\n"
9510 " }\n"
9511 "}];",
9512 ZeroColumn);
9513 EXPECT_EQ("[[SessionService sharedService]\n"
9514 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9515 " if (window) {\n"
9516 " [self windowDidLoad:window];\n"
9517 " } else {\n"
9518 " [self errorLoadingWindow];\n"
9519 " }\n"
9520 " }];",
9521 format("[[SessionService sharedService]\n"
9522 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9523 " if (window) {\n"
9524 " [self windowDidLoad:window];\n"
9525 " } else {\n"
9526 " [self errorLoadingWindow];\n"
9527 " }\n"
9528 "}];",
9529 ZeroColumn));
9530 verifyFormat("[myObject doSomethingWith:arg1\n"
9531 " firstBlock:^(Foo *a) {\n"
9532 " // ...\n"
9533 " int i;\n"
9534 " }\n"
9535 " secondBlock:^(Bar *b) {\n"
9536 " // ...\n"
9537 " int i;\n"
9538 " }\n"
9539 " thirdBlock:^Foo(Bar *b) {\n"
9540 " // ...\n"
9541 " int i;\n"
9542 " }];",
9543 ZeroColumn);
9544 verifyFormat("f(^{\n"
9545 " @autoreleasepool {\n"
9546 " if (a) {\n"
9547 " g();\n"
9548 " }\n"
9549 " }\n"
9550 "});",
9551 ZeroColumn);
9552 verifyFormat("void (^largeBlock)(void) = ^{\n"
9553 " // ...\n"
9554 "};",
9555 ZeroColumn);
9556
9557 ZeroColumn.AllowShortBlocksOnASingleLine = true;
9558 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009559 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +00009560 ZeroColumn.AllowShortBlocksOnASingleLine = false;
9561 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
9562 " int i;\n"
9563 "};",
9564 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
9565}
9566
Alexander Kornienko9e649af2013-09-11 12:25:57 +00009567TEST_F(FormatTest, SupportsCRLF) {
9568 EXPECT_EQ("int a;\r\n"
9569 "int b;\r\n"
9570 "int c;\r\n",
9571 format("int a;\r\n"
9572 " int b;\r\n"
9573 " int c;\r\n",
9574 getLLVMStyle()));
9575 EXPECT_EQ("int a;\r\n"
9576 "int b;\r\n"
9577 "int c;\r\n",
9578 format("int a;\r\n"
9579 " int b;\n"
9580 " int c;\r\n",
9581 getLLVMStyle()));
9582 EXPECT_EQ("int a;\n"
9583 "int b;\n"
9584 "int c;\n",
9585 format("int a;\r\n"
9586 " int b;\n"
9587 " int c;\n",
9588 getLLVMStyle()));
9589 EXPECT_EQ("\"aaaaaaa \"\r\n"
9590 "\"bbbbbbb\";\r\n",
9591 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
9592 EXPECT_EQ("#define A \\\r\n"
9593 " b; \\\r\n"
9594 " c; \\\r\n"
9595 " d;\r\n",
9596 format("#define A \\\r\n"
9597 " b; \\\r\n"
9598 " c; d; \r\n",
9599 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +00009600
9601 EXPECT_EQ("/*\r\n"
9602 "multi line block comments\r\n"
9603 "should not introduce\r\n"
9604 "an extra carriage return\r\n"
9605 "*/\r\n",
9606 format("/*\r\n"
9607 "multi line block comments\r\n"
9608 "should not introduce\r\n"
9609 "an extra carriage return\r\n"
9610 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +00009611}
9612
Manuel Klimekb212f3b2013-10-12 22:46:56 +00009613TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
9614 verifyFormat("MY_CLASS(C) {\n"
9615 " int i;\n"
9616 " int j;\n"
9617 "};");
9618}
9619
Daniel Jasper6633ab82013-10-18 10:38:14 +00009620TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
9621 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
9622 TwoIndent.ContinuationIndentWidth = 2;
9623
9624 EXPECT_EQ("int i =\n"
9625 " longFunction(\n"
9626 " arg);",
9627 format("int i = longFunction(arg);", TwoIndent));
9628
9629 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
9630 SixIndent.ContinuationIndentWidth = 6;
9631
9632 EXPECT_EQ("int i =\n"
9633 " longFunction(\n"
9634 " arg);",
9635 format("int i = longFunction(arg);", SixIndent));
9636}
9637
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009638TEST_F(FormatTest, SpacesInAngles) {
9639 FormatStyle Spaces = getLLVMStyle();
9640 Spaces.SpacesInAngles = true;
9641
9642 verifyFormat("static_cast< int >(arg);", Spaces);
9643 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
9644 verifyFormat("f< int, float >();", Spaces);
9645 verifyFormat("template <> g() {}", Spaces);
9646 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00009647 verifyFormat("std::function< void(int, int) > fct;", Spaces);
9648 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
9649 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009650
9651 Spaces.Standard = FormatStyle::LS_Cpp03;
9652 Spaces.SpacesInAngles = true;
9653 verifyFormat("A< A< int > >();", Spaces);
9654
9655 Spaces.SpacesInAngles = false;
9656 verifyFormat("A<A<int> >();", Spaces);
9657
9658 Spaces.Standard = FormatStyle::LS_Cpp11;
9659 Spaces.SpacesInAngles = true;
9660 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00009661
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009662 Spaces.SpacesInAngles = false;
9663 verifyFormat("A<A<int>>();", Spaces);
9664}
9665
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00009666TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
9667 FormatStyle Style = getLLVMStyle();
9668 Style.SpaceAfterTemplateKeyword = false;
9669 verifyFormat("template<int> void foo();", Style);
9670}
9671
Jacques Pienaarfc275112015-02-18 23:48:37 +00009672TEST_F(FormatTest, TripleAngleBrackets) {
9673 verifyFormat("f<<<1, 1>>>();");
9674 verifyFormat("f<<<1, 1, 1, s>>>();");
9675 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +00009676 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +00009677 verifyFormat("f<param><<<1, 1>>>();");
9678 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +00009679 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +00009680 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9681 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +00009682 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
9683 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +00009684}
9685
9686TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +00009687 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +00009688 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +00009689 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9690 "aaallvm::outs() <<");
9691 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9692 "aaaallvm::outs()\n <<");
9693}
9694
Manuel Klimek819788d2014-03-18 11:22:45 +00009695TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
9696 std::string code = "#if A\n"
9697 "#if B\n"
9698 "a.\n"
9699 "#endif\n"
9700 " a = 1;\n"
9701 "#else\n"
9702 "#endif\n"
9703 "#if C\n"
9704 "#else\n"
9705 "#endif\n";
9706 EXPECT_EQ(code, format(code));
9707}
9708
Manuel Klimek68b03042014-04-14 09:14:11 +00009709TEST_F(FormatTest, HandleConflictMarkers) {
9710 // Git/SVN conflict markers.
9711 EXPECT_EQ("int a;\n"
9712 "void f() {\n"
9713 " callme(some(parameter1,\n"
9714 "<<<<<<< text by the vcs\n"
9715 " parameter2),\n"
9716 "||||||| text by the vcs\n"
9717 " parameter2),\n"
9718 " parameter3,\n"
9719 "======= text by the vcs\n"
9720 " parameter2, parameter3),\n"
9721 ">>>>>>> text by the vcs\n"
9722 " otherparameter);\n",
9723 format("int a;\n"
9724 "void f() {\n"
9725 " callme(some(parameter1,\n"
9726 "<<<<<<< text by the vcs\n"
9727 " parameter2),\n"
9728 "||||||| text by the vcs\n"
9729 " parameter2),\n"
9730 " parameter3,\n"
9731 "======= text by the vcs\n"
9732 " parameter2,\n"
9733 " parameter3),\n"
9734 ">>>>>>> text by the vcs\n"
9735 " otherparameter);\n"));
9736
9737 // Perforce markers.
9738 EXPECT_EQ("void f() {\n"
9739 " function(\n"
9740 ">>>> text by the vcs\n"
9741 " parameter,\n"
9742 "==== text by the vcs\n"
9743 " parameter,\n"
9744 "==== text by the vcs\n"
9745 " parameter,\n"
9746 "<<<< text by the vcs\n"
9747 " parameter);\n",
9748 format("void f() {\n"
9749 " function(\n"
9750 ">>>> text by the vcs\n"
9751 " parameter,\n"
9752 "==== text by the vcs\n"
9753 " parameter,\n"
9754 "==== text by the vcs\n"
9755 " parameter,\n"
9756 "<<<< text by the vcs\n"
9757 " parameter);\n"));
9758
9759 EXPECT_EQ("<<<<<<<\n"
9760 "|||||||\n"
9761 "=======\n"
9762 ">>>>>>>",
9763 format("<<<<<<<\n"
9764 "|||||||\n"
9765 "=======\n"
9766 ">>>>>>>"));
9767
9768 EXPECT_EQ("<<<<<<<\n"
9769 "|||||||\n"
9770 "int i;\n"
9771 "=======\n"
9772 ">>>>>>>",
9773 format("<<<<<<<\n"
9774 "|||||||\n"
9775 "int i;\n"
9776 "=======\n"
9777 ">>>>>>>"));
9778
9779 // FIXME: Handle parsing of macros around conflict markers correctly:
9780 EXPECT_EQ("#define Macro \\\n"
9781 "<<<<<<<\n"
9782 "Something \\\n"
9783 "|||||||\n"
9784 "Else \\\n"
9785 "=======\n"
9786 "Other \\\n"
9787 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00009788 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +00009789 format("#define Macro \\\n"
9790 "<<<<<<<\n"
9791 " Something \\\n"
9792 "|||||||\n"
9793 " Else \\\n"
9794 "=======\n"
9795 " Other \\\n"
9796 ">>>>>>>\n"
9797 " End\n"
9798 "int i;\n"));
9799}
9800
Daniel Jasper471894432014-08-06 13:40:26 +00009801TEST_F(FormatTest, DisableRegions) {
9802 EXPECT_EQ("int i;\n"
9803 "// clang-format off\n"
9804 " int j;\n"
9805 "// clang-format on\n"
9806 "int k;",
9807 format(" int i;\n"
9808 " // clang-format off\n"
9809 " int j;\n"
9810 " // clang-format on\n"
9811 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +00009812 EXPECT_EQ("int i;\n"
9813 "/* clang-format off */\n"
9814 " int j;\n"
9815 "/* clang-format on */\n"
9816 "int k;",
9817 format(" int i;\n"
9818 " /* clang-format off */\n"
9819 " int j;\n"
9820 " /* clang-format on */\n"
9821 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +00009822
9823 // Don't reflow comments within disabled regions.
9824 EXPECT_EQ(
9825 "// clang-format off\n"
9826 "// long long long long long long line\n"
9827 "/* clang-format on */\n"
9828 "/* long long long\n"
9829 " * long long long\n"
9830 " * line */\n"
9831 "int i;\n"
9832 "/* clang-format off */\n"
9833 "/* long long long long long long line */\n",
9834 format("// clang-format off\n"
9835 "// long long long long long long line\n"
9836 "/* clang-format on */\n"
9837 "/* long long long long long long line */\n"
9838 "int i;\n"
9839 "/* clang-format off */\n"
9840 "/* long long long long long long line */\n",
9841 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +00009842}
9843
Manuel Klimekf0c95b32015-06-11 10:14:13 +00009844TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
9845 format("? ) =");
9846 verifyNoCrash("#define a\\\n /**/}");
9847}
Manuel Klimek5f594f82014-08-13 14:00:41 +00009848
Daniel Jasper498f5582015-12-25 08:53:31 +00009849TEST_F(FormatTest, FormatsTableGenCode) {
9850 FormatStyle Style = getLLVMStyle();
9851 Style.Language = FormatStyle::LK_TableGen;
9852 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
9853}
9854
Nico Weberb2673a12016-11-10 21:49:25 +00009855TEST_F(FormatTest, ArrayOfTemplates) {
9856 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
9857 format("auto a = new unique_ptr<int > [ 10];"));
9858
9859 FormatStyle Spaces = getLLVMStyle();
9860 Spaces.SpacesInSquareBrackets = true;
9861 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
9862 format("auto a = new unique_ptr<int > [10];", Spaces));
9863}
9864
9865TEST_F(FormatTest, ArrayAsTemplateType) {
9866 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
9867 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
9868
9869 FormatStyle Spaces = getLLVMStyle();
9870 Spaces.SpacesInSquareBrackets = true;
9871 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
9872 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
9873}
9874
Eric Liu547d8792016-03-24 13:22:42 +00009875TEST(FormatStyle, GetStyleOfFile) {
9876 vfs::InMemoryFileSystem FS;
9877 // Test 1: format file in the same directory.
9878 ASSERT_TRUE(
9879 FS.addFile("/a/.clang-format", 0,
9880 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
9881 ASSERT_TRUE(
9882 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +00009883 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +00009884 ASSERT_TRUE((bool)Style1);
9885 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +00009886
Antonio Maiorano7eb75072017-01-20 01:22:42 +00009887 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +00009888 ASSERT_TRUE(
9889 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +00009890 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +00009891 ASSERT_TRUE((bool)Style2);
9892 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +00009893
Antonio Maiorano7eb75072017-01-20 01:22:42 +00009894 // Test 2.2: no format on 'none' fallback style.
9895 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
9896 ASSERT_TRUE((bool)Style2);
9897 ASSERT_EQ(*Style2, getNoStyle());
9898
9899 // Test 2.3: format if config is found with no based style while fallback is
9900 // 'none'.
9901 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
9902 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
9903 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
9904 ASSERT_TRUE((bool)Style2);
9905 ASSERT_EQ(*Style2, getLLVMStyle());
9906
9907 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
9908 Style2 = getStyle("{}", "a.h", "none", "", &FS);
9909 ASSERT_TRUE((bool)Style2);
9910 ASSERT_EQ(*Style2, getLLVMStyle());
9911
Eric Liu547d8792016-03-24 13:22:42 +00009912 // Test 3: format file in parent directory.
9913 ASSERT_TRUE(
9914 FS.addFile("/c/.clang-format", 0,
9915 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
9916 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
9917 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +00009918 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +00009919 ASSERT_TRUE((bool)Style3);
9920 ASSERT_EQ(*Style3, getGoogleStyle());
9921
9922 // Test 4: error on invalid fallback style
9923 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
9924 ASSERT_FALSE((bool)Style4);
9925 llvm::consumeError(Style4.takeError());
9926
9927 // Test 5: error on invalid yaml on command line
9928 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
9929 ASSERT_FALSE((bool)Style5);
9930 llvm::consumeError(Style5.takeError());
9931
9932 // Test 6: error on invalid style
9933 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
9934 ASSERT_FALSE((bool)Style6);
9935 llvm::consumeError(Style6.takeError());
9936
9937 // Test 7: found config file, error on parsing it
9938 ASSERT_TRUE(
9939 FS.addFile("/d/.clang-format", 0,
9940 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
9941 "InvalidKey: InvalidValue")));
9942 ASSERT_TRUE(
9943 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
9944 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
9945 ASSERT_FALSE((bool)Style7);
9946 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +00009947}
9948
Manuel Klimekb12e5a52016-03-01 12:37:30 +00009949TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
9950 // Column limit is 20.
9951 std::string Code = "Type *a =\n"
9952 " new Type();\n"
9953 "g(iiiii, 0, jjjjj,\n"
9954 " 0, kkkkk, 0, mm);\n"
9955 "int bad = format ;";
9956 std::string Expected = "auto a = new Type();\n"
9957 "g(iiiii, nullptr,\n"
9958 " jjjjj, nullptr,\n"
9959 " kkkkk, nullptr,\n"
9960 " mm);\n"
9961 "int bad = format ;";
9962 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +00009963 tooling::Replacements Replaces = toReplacements(
9964 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
9965 "auto "),
9966 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
9967 "nullptr"),
9968 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
9969 "nullptr"),
9970 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
9971 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +00009972
9973 format::FormatStyle Style = format::getLLVMStyle();
9974 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +00009975 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
9976 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
9977 << llvm::toString(FormattedReplaces.takeError()) << "\n";
9978 auto Result = applyAllReplacements(Code, *FormattedReplaces);
9979 EXPECT_TRUE(static_cast<bool>(Result));
9980 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +00009981}
9982
Eric Liubaf58c22016-05-18 13:43:48 +00009983TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
9984 std::string Code = "#include \"a.h\"\n"
9985 "#include \"c.h\"\n"
9986 "\n"
9987 "int main() {\n"
9988 " return 0;\n"
9989 "}";
9990 std::string Expected = "#include \"a.h\"\n"
9991 "#include \"b.h\"\n"
9992 "#include \"c.h\"\n"
9993 "\n"
9994 "int main() {\n"
9995 " return 0;\n"
9996 "}";
9997 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +00009998 tooling::Replacements Replaces = toReplacements(
9999 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
10000 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000010001
10002 format::FormatStyle Style = format::getLLVMStyle();
10003 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000010004 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
10005 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
10006 << llvm::toString(FormattedReplaces.takeError()) << "\n";
10007 auto Result = applyAllReplacements(Code, *FormattedReplaces);
10008 EXPECT_TRUE(static_cast<bool>(Result));
10009 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000010010}
10011
Daniel Jasperd246a5a2015-06-15 15:25:11 +000010012} // end namespace
10013} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000010014} // end namespace clang