blob: 497015bb09581f6c873f60ead868ac45f029d6ba [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));
Daniel Jasperf7935112012-12-03 18:12:45 +000074 }
75
Manuel Klimekec5c3db2015-05-07 12:26:30 +000076 void verifyIncompleteFormat(llvm::StringRef Code,
77 const FormatStyle &Style = getLLVMStyle()) {
78 EXPECT_EQ(Code.str(),
79 format(test::messUp(Code), Style, IC_ExpectIncomplete));
80 }
81
Daniel Jasperf7935112012-12-03 18:12:45 +000082 void verifyGoogleFormat(llvm::StringRef Code) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000083 verifyFormat(Code, getGoogleStyle());
Daniel Jasperf7935112012-12-03 18:12:45 +000084 }
Daniel Jasper5b49f472013-01-23 12:10:53 +000085
86 void verifyIndependentOfContext(llvm::StringRef text) {
87 verifyFormat(text);
88 verifyFormat(llvm::Twine("void f() { " + text + " }").str());
89 }
Daniel Jasper7b038a22013-01-30 09:46:12 +000090
Daniel Jasper675b4f82015-01-19 10:51:23 +000091 /// \brief Verify that clang-format does not crash on the given input.
92 void verifyNoCrash(llvm::StringRef Code,
93 const FormatStyle &Style = getLLVMStyle()) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +000094 format(Code, Style, IC_DoNotCheck);
Daniel Jasper675b4f82015-01-19 10:51:23 +000095 }
96
Daniel Jasper7b038a22013-01-30 09:46:12 +000097 int ReplacementCount;
Daniel Jasperf7935112012-12-03 18:12:45 +000098};
99
Manuel Klimek52b15152013-01-09 15:25:02 +0000100TEST_F(FormatTest, MessUp) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +0000101 EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
102 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
103 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
104 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
105 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
Manuel Klimek52b15152013-01-09 15:25:02 +0000106}
107
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000108//===----------------------------------------------------------------------===//
109// Basic function tests.
110//===----------------------------------------------------------------------===//
111
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +0000112TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000113 EXPECT_EQ(";", format(";"));
114}
115
116TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
117 EXPECT_EQ("int i;", format(" int i;"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +0000118 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000119 EXPECT_EQ("int i;\nint j;", format(" int i; int j;"));
120 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;"));
121}
122
123TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
124 EXPECT_EQ("int i;", format("int\ni;"));
125}
126
127TEST_F(FormatTest, FormatsNestedBlockStatements) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000128 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000129}
130
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000131TEST_F(FormatTest, FormatsNestedCall) {
132 verifyFormat("Method(f1, f2(f3));");
133 verifyFormat("Method(f1(f2, f3()));");
Daniel Jasper48cb3b92013-01-13 08:19:51 +0000134 verifyFormat("Method(f1(f2, (f3())));");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000135}
136
Daniel Jasper14556742013-02-07 21:08:36 +0000137TEST_F(FormatTest, NestedNameSpecifiers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +0000138 verifyFormat("vector<::Type> v;");
Daniel Jasper14556742013-02-07 21:08:36 +0000139 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
Daniel Jasper11be8ac2013-08-28 07:07:07 +0000140 verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
Daniel Jasperf322eb52014-10-23 20:22:22 +0000141 verifyFormat("bool a = 2 < ::SomeFunction();");
Daniel Jasper736c14f2013-01-16 07:19:28 +0000142}
143
Daniel Jasper7b038a22013-01-30 09:46:12 +0000144TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
145 EXPECT_EQ("if (a) {\n"
146 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000147 "}",
148 format("if(a){f();}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000149 EXPECT_EQ(4, ReplacementCount);
150 EXPECT_EQ("if (a) {\n"
151 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000152 "}",
153 format("if (a) {\n"
154 " f();\n"
155 "}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000156 EXPECT_EQ(0, ReplacementCount);
Daniel Jasperd6e61882015-06-17 12:23:15 +0000157 EXPECT_EQ("/*\r\n"
158 "\r\n"
159 "*/\r\n",
160 format("/*\r\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +0000161 "\r\n"
162 "*/\r\n"));
Daniel Jasperd6e61882015-06-17 12:23:15 +0000163 EXPECT_EQ(0, ReplacementCount);
Daniel Jasper7b038a22013-01-30 09:46:12 +0000164}
165
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000166TEST_F(FormatTest, RemovesEmptyLines) {
167 EXPECT_EQ("class C {\n"
168 " int i;\n"
169 "};",
170 format("class C {\n"
171 " int i;\n"
172 "\n"
173 "};"));
174
Nico Weber34272652014-11-13 16:25:37 +0000175 // Don't remove empty lines at the start of namespaces or extern "C" blocks.
Daniel Jasper01b35482014-03-21 13:03:33 +0000176 EXPECT_EQ("namespace N {\n"
177 "\n"
178 "int i;\n"
179 "}",
180 format("namespace N {\n"
181 "\n"
182 "int i;\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000183 "}",
184 getGoogleStyle()));
Nico Weber34272652014-11-13 16:25:37 +0000185 EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
186 "\n"
187 "int i;\n"
188 "}",
189 format("extern /**/ \"C\" /**/ {\n"
190 "\n"
191 "int i;\n"
192 "}",
193 getGoogleStyle()));
194
195 // ...but do keep inlining and removing empty lines for non-block extern "C"
196 // functions.
197 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
198 EXPECT_EQ("extern \"C\" int f() {\n"
199 " int i = 42;\n"
200 " return i;\n"
201 "}",
202 format("extern \"C\" int f() {\n"
203 "\n"
204 " int i = 42;\n"
205 " return i;\n"
206 "}",
207 getGoogleStyle()));
Daniel Jasper01b35482014-03-21 13:03:33 +0000208
Daniel Jasper11164bd2014-03-21 12:58:53 +0000209 // Remove empty lines at the beginning and end of blocks.
210 EXPECT_EQ("void f() {\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000211 "\n"
212 " if (a) {\n"
213 "\n"
214 " f();\n"
215 " }\n"
216 "}",
217 format("void f() {\n"
218 "\n"
219 " if (a) {\n"
220 "\n"
221 " f();\n"
222 "\n"
223 " }\n"
224 "\n"
225 "}",
226 getLLVMStyle()));
227 EXPECT_EQ("void f() {\n"
Daniel Jasper11164bd2014-03-21 12:58:53 +0000228 " if (a) {\n"
229 " f();\n"
230 " }\n"
231 "}",
232 format("void f() {\n"
233 "\n"
234 " if (a) {\n"
235 "\n"
236 " f();\n"
237 "\n"
238 " }\n"
239 "\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000240 "}",
241 getGoogleStyle()));
Daniel Jasper11164bd2014-03-21 12:58:53 +0000242
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000243 // Don't remove empty lines in more complex control statements.
244 EXPECT_EQ("void f() {\n"
245 " if (a) {\n"
246 " f();\n"
247 "\n"
248 " } else if (b) {\n"
249 " f();\n"
250 " }\n"
251 "}",
252 format("void f() {\n"
253 " if (a) {\n"
254 " f();\n"
255 "\n"
256 " } else if (b) {\n"
257 " f();\n"
258 "\n"
259 " }\n"
260 "\n"
261 "}"));
262
263 // FIXME: This is slightly inconsistent.
264 EXPECT_EQ("namespace {\n"
265 "int i;\n"
266 "}",
267 format("namespace {\n"
268 "int i;\n"
269 "\n"
270 "}"));
271 EXPECT_EQ("namespace {\n"
272 "int i;\n"
273 "\n"
274 "} // namespace",
275 format("namespace {\n"
276 "int i;\n"
277 "\n"
278 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000279
280 FormatStyle Style = getLLVMStyle();
281 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
282 Style.MaxEmptyLinesToKeep = 2;
283 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
284 Style.BraceWrapping.AfterClass = true;
285 Style.BraceWrapping.AfterFunction = true;
286 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
287
288 EXPECT_EQ("class Foo\n"
289 "{\n"
290 " Foo() {}\n"
291 "\n"
292 " void funk() {}\n"
293 "};",
294 format("class Foo\n"
295 "{\n"
296 " Foo()\n"
297 " {\n"
298 " }\n"
299 "\n"
300 " void funk() {}\n"
301 "};",
302 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000303}
304
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000305TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000306 verifyFormat("x = (a) and (b);");
307 verifyFormat("x = (a) or (b);");
308 verifyFormat("x = (a) bitand (b);");
309 verifyFormat("x = (a) bitor (b);");
310 verifyFormat("x = (a) not_eq (b);");
311 verifyFormat("x = (a) and_eq (b);");
312 verifyFormat("x = (a) or_eq (b);");
313 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000314}
315
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000316//===----------------------------------------------------------------------===//
317// Tests for control statements.
318//===----------------------------------------------------------------------===//
319
Daniel Jaspercdd06622013-05-14 10:31:09 +0000320TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000321 verifyFormat("if (true)\n f();\ng();");
322 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000323 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000324
Daniel Jasper3a685df2013-05-16 12:12:21 +0000325 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000326 AllowsMergedIf.AlignEscapedNewlinesLeft = true;
Daniel Jasperced17f82013-01-16 15:44:34 +0000327 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
328 verifyFormat("if (a)\n"
329 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000330 " f();",
331 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000332 verifyFormat("{\n"
333 " if (a)\n"
334 " label:\n"
335 " f();\n"
336 "}",
337 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000338 verifyFormat("#define A \\\n"
339 " if (a) \\\n"
340 " label: \\\n"
341 " f()",
342 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000343 verifyFormat("if (a)\n"
344 " ;",
345 AllowsMergedIf);
346 verifyFormat("if (a)\n"
347 " if (b) return;",
348 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000349
Daniel Jasper3a685df2013-05-16 12:12:21 +0000350 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000351 " f();\n",
352 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000353 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000354 " f();",
355 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000356 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000357 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000358 "}",
359 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000360 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000361 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000362 "}",
363 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000364
365 AllowsMergedIf.ColumnLimit = 14;
366 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000367 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000368 " return;",
369 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000370
371 AllowsMergedIf.ColumnLimit = 13;
372 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000373}
374
Daniel Jasper3a685df2013-05-16 12:12:21 +0000375TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
376 FormatStyle AllowsMergedLoops = getLLVMStyle();
377 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
378 verifyFormat("while (true) continue;", AllowsMergedLoops);
379 verifyFormat("for (;;) continue;", AllowsMergedLoops);
380 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
381 verifyFormat("while (true)\n"
382 " ;",
383 AllowsMergedLoops);
384 verifyFormat("for (;;)\n"
385 " ;",
386 AllowsMergedLoops);
387 verifyFormat("for (;;)\n"
388 " for (;;) continue;",
389 AllowsMergedLoops);
390 verifyFormat("for (;;) // Can't merge this\n"
391 " continue;",
392 AllowsMergedLoops);
393 verifyFormat("for (;;) /* still don't merge */\n"
394 " continue;",
395 AllowsMergedLoops);
396}
397
Daniel Jasper17605d32014-05-14 09:33:35 +0000398TEST_F(FormatTest, FormatShortBracedStatements) {
399 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
400 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
401
402 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
403 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
404
405 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
406 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
407 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
408 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
409 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
410 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
411 verifyFormat("if (true) { //\n"
412 " f();\n"
413 "}",
414 AllowSimpleBracedStatements);
415 verifyFormat("if (true) {\n"
416 " f();\n"
417 " f();\n"
418 "}",
419 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000420 verifyFormat("if (true) {\n"
421 " f();\n"
422 "} else {\n"
423 " f();\n"
424 "}",
425 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000426
Daniel Jasperbd630732014-05-22 13:25:26 +0000427 verifyFormat("template <int> struct A2 {\n"
428 " struct B {};\n"
429 "};",
430 AllowSimpleBracedStatements);
431
Daniel Jasper17605d32014-05-14 09:33:35 +0000432 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
433 verifyFormat("if (true) {\n"
434 " f();\n"
435 "}",
436 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000437 verifyFormat("if (true) {\n"
438 " f();\n"
439 "} else {\n"
440 " f();\n"
441 "}",
442 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000443
444 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
445 verifyFormat("while (true) {\n"
446 " f();\n"
447 "}",
448 AllowSimpleBracedStatements);
449 verifyFormat("for (;;) {\n"
450 " f();\n"
451 "}",
452 AllowSimpleBracedStatements);
453}
454
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000455TEST_F(FormatTest, ParseIfElse) {
456 verifyFormat("if (true)\n"
457 " if (true)\n"
458 " if (true)\n"
459 " f();\n"
460 " else\n"
461 " g();\n"
462 " else\n"
463 " h();\n"
464 "else\n"
465 " i();");
466 verifyFormat("if (true)\n"
467 " if (true)\n"
468 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000469 " if (true)\n"
470 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000471 " } else {\n"
472 " g();\n"
473 " }\n"
474 " else\n"
475 " h();\n"
476 "else {\n"
477 " i();\n"
478 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000479 verifyFormat("void f() {\n"
480 " if (a) {\n"
481 " } else {\n"
482 " }\n"
483 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000484}
485
486TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000487 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000488 verifyFormat("if (a)\n"
489 " f();\n"
490 "else if (b)\n"
491 " g();\n"
492 "else\n"
493 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000494 verifyFormat("if (a) {\n"
495 " f();\n"
496 "}\n"
497 "// or else ..\n"
498 "else {\n"
499 " g()\n"
500 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000501
502 verifyFormat("if (a) {\n"
503 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
504 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
505 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000506 verifyFormat("if (a) {\n"
507 "} else if (\n"
508 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
509 "}",
510 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000511}
512
Daniel Jasperf7935112012-12-03 18:12:45 +0000513TEST_F(FormatTest, FormatsForLoop) {
514 verifyFormat(
515 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000516 " ++VeryVeryLongLoopVariable)\n"
517 " ;");
518 verifyFormat("for (;;)\n"
519 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000520 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000521 verifyFormat("for (;;) {\n"
522 " f();\n"
523 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000524 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000525
526 verifyFormat(
527 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
528 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000529 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000530
531 verifyFormat(
532 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000533 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000534 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
535 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000536 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000537 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
538 " I = FD->getDeclsInPrototypeScope().begin(),\n"
539 " E = FD->getDeclsInPrototypeScope().end();\n"
540 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000541 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
542 " I = Container.begin(),\n"
543 " E = Container.end();\n"
544 " I != E; ++I) {\n}",
545 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000546
Daniel Jasper48c62f92013-01-28 17:30:17 +0000547 verifyFormat(
548 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
549 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000550 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
551 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000552 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000553 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
554 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
555 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000556 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
557 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
558 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000559 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
560 " aaaaaaaaaa);\n"
561 " iter; ++iter) {\n"
562 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000563 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
564 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
565 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
566 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000567
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000568 FormatStyle NoBinPacking = getLLVMStyle();
569 NoBinPacking.BinPackParameters = false;
570 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
571 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
572 " aaaaaaaaaaaaaaaa,\n"
573 " aaaaaaaaaaaaaaaa,\n"
574 " aaaaaaaaaaaaaaaa);\n"
575 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
576 "}",
577 NoBinPacking);
578 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000579 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
580 " E = UnwrappedLines.end();\n"
581 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000582 " ++I) {\n}",
583 NoBinPacking);
Daniel Jasperf7935112012-12-03 18:12:45 +0000584}
585
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000586TEST_F(FormatTest, RangeBasedForLoops) {
587 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
588 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
589 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
590 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000591 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
592 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000593 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
594 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000595}
596
Daniel Jaspere1e43192014-04-01 12:55:11 +0000597TEST_F(FormatTest, ForEachLoops) {
598 verifyFormat("void f() {\n"
599 " foreach (Item *item, itemlist) {}\n"
600 " Q_FOREACH (Item *item, itemlist) {}\n"
601 " BOOST_FOREACH (Item *item, itemlist) {}\n"
602 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
603 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000604
605 // As function-like macros.
606 verifyFormat("#define foreach(x, y)\n"
607 "#define Q_FOREACH(x, y)\n"
608 "#define BOOST_FOREACH(x, y)\n"
609 "#define UNKNOWN_FOREACH(x, y)\n");
610
611 // Not as function-like macros.
612 verifyFormat("#define foreach (x, y)\n"
613 "#define Q_FOREACH (x, y)\n"
614 "#define BOOST_FOREACH (x, y)\n"
615 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000616}
617
Daniel Jasperf7935112012-12-03 18:12:45 +0000618TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000619 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000620 verifyFormat("while (true)\n"
621 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000622 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000623 verifyFormat("while () {\n"
624 " f();\n"
625 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000626}
627
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000628TEST_F(FormatTest, FormatsDoWhile) {
629 verifyFormat("do {\n"
630 " do_something();\n"
631 "} while (something());");
632 verifyFormat("do\n"
633 " do_something();\n"
634 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000635}
636
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000637TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000638 verifyFormat("switch (x) {\n"
639 "case 1:\n"
640 " f();\n"
641 " break;\n"
642 "case kFoo:\n"
643 "case ns::kBar:\n"
644 "case kBaz:\n"
645 " break;\n"
646 "default:\n"
647 " g();\n"
648 " break;\n"
649 "}");
650 verifyFormat("switch (x) {\n"
651 "case 1: {\n"
652 " f();\n"
653 " break;\n"
654 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000655 "case 2: {\n"
656 " break;\n"
657 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000658 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000659 verifyFormat("switch (x) {\n"
660 "case 1: {\n"
661 " f();\n"
662 " {\n"
663 " g();\n"
664 " h();\n"
665 " }\n"
666 " break;\n"
667 "}\n"
668 "}");
669 verifyFormat("switch (x) {\n"
670 "case 1: {\n"
671 " f();\n"
672 " if (foo) {\n"
673 " g();\n"
674 " h();\n"
675 " }\n"
676 " break;\n"
677 "}\n"
678 "}");
679 verifyFormat("switch (x) {\n"
680 "case 1: {\n"
681 " f();\n"
682 " g();\n"
683 "} break;\n"
684 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000685 verifyFormat("switch (test)\n"
686 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000687 verifyFormat("switch (x) {\n"
688 "default: {\n"
689 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000690 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000691 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000692 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000693 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000694 "// if 1, do f()\n"
695 "case 1:\n"
696 " f();\n"
697 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000698 verifyFormat("switch (x) {\n"
699 "case 1:\n"
700 " // Do amazing stuff\n"
701 " {\n"
702 " f();\n"
703 " g();\n"
704 " }\n"
705 " break;\n"
706 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000707 verifyFormat("#define A \\\n"
708 " switch (x) { \\\n"
709 " case a: \\\n"
710 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000711 " }",
712 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000713 verifyFormat("#define OPERATION_CASE(name) \\\n"
714 " case OP_name: \\\n"
715 " return operations::Operation##name\n",
716 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000717 verifyFormat("switch (x) {\n"
718 "case 1:;\n"
719 "default:;\n"
720 " int i;\n"
721 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000722
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000723 verifyGoogleFormat("switch (x) {\n"
724 " case 1:\n"
725 " f();\n"
726 " break;\n"
727 " case kFoo:\n"
728 " case ns::kBar:\n"
729 " case kBaz:\n"
730 " break;\n"
731 " default:\n"
732 " g();\n"
733 " break;\n"
734 "}");
735 verifyGoogleFormat("switch (x) {\n"
736 " case 1: {\n"
737 " f();\n"
738 " break;\n"
739 " }\n"
740 "}");
741 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000742 " ;");
743
744 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
745 " case OP_name: \\\n"
746 " return operations::Operation##name\n");
747 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
748 " // Get the correction operation class.\n"
749 " switch (OpCode) {\n"
750 " CASE(Add);\n"
751 " CASE(Subtract);\n"
752 " default:\n"
753 " return operations::Unknown;\n"
754 " }\n"
755 "#undef OPERATION_CASE\n"
756 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000757 verifyFormat("DEBUG({\n"
758 " switch (x) {\n"
759 " case A:\n"
760 " f();\n"
761 " break;\n"
762 " // On B:\n"
763 " case B:\n"
764 " g();\n"
765 " break;\n"
766 " }\n"
767 "});");
Daniel Jasper031e2402014-04-28 07:48:36 +0000768 verifyFormat("switch (a) {\n"
769 "case (b):\n"
770 " return;\n"
771 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000772
773 verifyFormat("switch (a) {\n"
774 "case some_namespace::\n"
775 " some_constant:\n"
776 " return;\n"
777 "}",
778 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000779}
780
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000781TEST_F(FormatTest, CaseRanges) {
782 verifyFormat("switch (x) {\n"
783 "case 'A' ... 'Z':\n"
784 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000785 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000786 " break;\n"
787 "}");
788}
789
Daniel Jasperb87899b2014-09-10 13:11:45 +0000790TEST_F(FormatTest, ShortCaseLabels) {
791 FormatStyle Style = getLLVMStyle();
792 Style.AllowShortCaseLabelsOnASingleLine = true;
793 verifyFormat("switch (a) {\n"
794 "case 1: x = 1; break;\n"
795 "case 2: return;\n"
796 "case 3:\n"
797 "case 4:\n"
798 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +0000799 "case 6: // comment\n"
800 " return;\n"
801 "case 7:\n"
802 " // comment\n"
803 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +0000804 "case 8:\n"
805 " x = 8; // comment\n"
806 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000807 "default: y = 1; break;\n"
808 "}",
809 Style);
810 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +0000811 "#if FOO\n"
812 "case 0: return 0;\n"
813 "#endif\n"
814 "}",
815 Style);
816 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000817 "case 1: {\n"
818 "}\n"
819 "case 2: {\n"
820 " return;\n"
821 "}\n"
822 "case 3: {\n"
823 " x = 1;\n"
824 " return;\n"
825 "}\n"
826 "case 4:\n"
827 " if (x)\n"
828 " return;\n"
829 "}",
830 Style);
831 Style.ColumnLimit = 21;
832 verifyFormat("switch (a) {\n"
833 "case 1: x = 1; break;\n"
834 "case 2: return;\n"
835 "case 3:\n"
836 "case 4:\n"
837 "case 5: return;\n"
838 "default:\n"
839 " y = 1;\n"
840 " break;\n"
841 "}",
842 Style);
843}
844
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000845TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000846 verifyFormat("void f() {\n"
847 " some_code();\n"
848 "test_label:\n"
849 " some_other_code();\n"
850 " {\n"
851 " some_more_code();\n"
852 " another_label:\n"
853 " some_more_code();\n"
854 " }\n"
855 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +0000856 verifyFormat("{\n"
857 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000858 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +0000859 " some_other_code();\n"
860 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000861 verifyFormat("{\n"
862 " some_code();\n"
863 "test_label:;\n"
864 " int i = 0;\n"
865 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000866}
867
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000868//===----------------------------------------------------------------------===//
869// Tests for comments.
870//===----------------------------------------------------------------------===//
871
872TEST_F(FormatTest, UnderstandsSingleLineComments) {
Daniel Jasper55213652013-03-22 10:01:29 +0000873 verifyFormat("//* */");
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000874 verifyFormat("// line 1\n"
875 "// line 2\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000876 "void f() {}\n");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000877
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000878 verifyFormat("void f() {\n"
879 " // Doesn't do anything\n"
880 "}");
Daniel Jasper185de242013-07-11 13:48:16 +0000881 verifyFormat("SomeObject\n"
882 " // Calling someFunction on SomeObject\n"
883 " .someFunction();");
Daniel Jaspera0407742014-02-11 10:08:11 +0000884 verifyFormat("auto result = SomeObject\n"
885 " // Calling someFunction on SomeObject\n"
886 " .someFunction();");
Daniel Jasperaa701fa2013-01-18 08:44:07 +0000887 verifyFormat("void f(int i, // some comment (probably for i)\n"
888 " int j, // some comment (probably for j)\n"
Daniel Jasper942ee722013-01-13 16:10:20 +0000889 " int k); // some comment (probably for k)");
890 verifyFormat("void f(int i,\n"
891 " // some comment (probably for j)\n"
892 " int j,\n"
893 " // some comment (probably for k)\n"
894 " int k);");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000895
Daniel Jasperaa701fa2013-01-18 08:44:07 +0000896 verifyFormat("int i // This is a fancy variable\n"
897 " = 5; // with nicely aligned comment.");
898
899 verifyFormat("// Leading comment.\n"
900 "int a; // Trailing comment.");
901 verifyFormat("int a; // Trailing comment\n"
902 " // on 2\n"
903 " // or 3 lines.\n"
904 "int b;");
905 verifyFormat("int a; // Trailing comment\n"
906 "\n"
907 "// Leading comment.\n"
908 "int b;");
909 verifyFormat("int a; // Comment.\n"
910 " // More details.\n"
911 "int bbbb; // Another comment.");
912 verifyFormat(
913 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
914 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // comment\n"
915 "int cccccccccccccccccccccccccccccc; // comment\n"
916 "int ddd; // looooooooooooooooooooooooong comment\n"
917 "int aaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
918 "int bbbbbbbbbbbbbbbbbbbbb; // comment\n"
919 "int ccccccccccccccccccc; // comment");
920
Daniel Jasper997b08c2013-01-18 09:19:33 +0000921 verifyFormat("#include \"a\" // comment\n"
922 "#include \"a/b/c\" // comment");
923 verifyFormat("#include <a> // comment\n"
924 "#include <a/b/c> // comment");
Daniel Jasper98857842013-10-30 13:54:53 +0000925 EXPECT_EQ("#include \"a\" // comment\n"
Manuel Klimek5c24cca2013-05-23 10:56:37 +0000926 "#include \"a/b/c\" // comment",
927 format("#include \\\n"
928 " \"a\" // comment\n"
929 "#include \"a/b/c\" // comment"));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000930
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000931 verifyFormat("enum E {\n"
932 " // comment\n"
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000933 " VAL_A, // comment\n"
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000934 " VAL_B\n"
935 "};");
Daniel Jaspere25509f2012-12-17 11:29:41 +0000936
Krasimir Georgiev753625b2017-01-31 13:32:38 +0000937 EXPECT_EQ("enum A {\n"
938 " // line a\n"
939 " a,\n"
940 " b, // line b\n"
941 "\n"
942 " // line c\n"
943 " c\n"
944 "};",
945 format("enum A {\n"
946 " // line a\n"
947 " a,\n"
948 " b, // line b\n"
949 "\n"
950 " // line c\n"
951 " c\n"
952 "};",
953 getLLVMStyleWithColumns(20)));
954
Daniel Jaspere25509f2012-12-17 11:29:41 +0000955 verifyFormat(
956 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000957 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // Trailing comment");
Daniel Jasperd8bb2db2013-01-09 09:33:39 +0000958 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
959 " // Comment inside a statement.\n"
960 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper4281c5a2014-10-07 14:45:34 +0000961 verifyFormat("SomeFunction(a,\n"
962 " // comment\n"
963 " b + x);");
964 verifyFormat("SomeFunction(a, a,\n"
965 " // comment\n"
966 " b + x);");
Daniel Jasper38396592013-02-06 15:23:09 +0000967 verifyFormat(
968 "bool aaaaaaaaaaaaa = // comment\n"
969 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
970 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Manuel Klimekc74d2922013-01-07 08:54:53 +0000971
Daniel Jasper525264c2013-02-13 19:25:54 +0000972 verifyFormat("int aaaa; // aaaaa\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000973 "int aa; // aaaaaaa",
974 getLLVMStyleWithColumns(20));
Daniel Jasper525264c2013-02-13 19:25:54 +0000975
Daniel Jasper304a9862013-01-21 22:49:20 +0000976 EXPECT_EQ("void f() { // This does something ..\n"
977 "}\n"
978 "int a; // This is unrelated",
979 format("void f() { // This does something ..\n"
980 " }\n"
981 "int a; // This is unrelated"));
Daniel Jasper251b3c92013-07-01 11:22:57 +0000982 EXPECT_EQ("class C {\n"
983 " void f() { // This does something ..\n"
984 " } // awesome..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +0000985 "\n"
Daniel Jasper251b3c92013-07-01 11:22:57 +0000986 " int a; // This is unrelated\n"
987 "};",
988 format("class C{void f() { // This does something ..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +0000989 " } // awesome..\n"
990 " \n"
Daniel Jasper251b3c92013-07-01 11:22:57 +0000991 "int a; // This is unrelated\n"
992 "};"));
Daniel Jasper304a9862013-01-21 22:49:20 +0000993
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000994 EXPECT_EQ("int i; // single line trailing comment",
Manuel Klimekc74d2922013-01-07 08:54:53 +0000995 format("int i;\\\n// single line trailing comment"));
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000996
997 verifyGoogleFormat("int a; // Trailing comment.");
Daniel Jasperddaa9be2013-01-29 19:41:55 +0000998
999 verifyFormat("someFunction(anotherFunction( // Force break.\n"
1000 " parameter));");
Daniel Jaspera885dbe2013-02-05 09:34:14 +00001001
1002 verifyGoogleFormat("#endif // HEADER_GUARD");
Daniel Jasperf79f9352013-02-06 22:04:05 +00001003
1004 verifyFormat("const char *test[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001005 " // A\n"
1006 " \"aaaa\",\n"
1007 " // B\n"
1008 " \"aaaaa\"};");
Daniel Jaspereef30492013-02-11 12:36:37 +00001009 verifyGoogleFormat(
1010 "aaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001011 " aaaaaaaaaaaaaaaaaaaaaa); // 81_cols_with_this_comment");
Alexander Kornienkob1be9d62013-04-03 12:38:53 +00001012 EXPECT_EQ("D(a, {\n"
1013 " // test\n"
1014 " int a;\n"
1015 "});",
1016 format("D(a, {\n"
1017 "// test\n"
1018 "int a;\n"
1019 "});"));
Manuel Klimekc5730802013-05-23 11:42:52 +00001020
1021 EXPECT_EQ("lineWith(); // comment\n"
1022 "// at start\n"
1023 "otherLine();",
1024 format("lineWith(); // comment\n"
1025 "// at start\n"
1026 "otherLine();"));
1027 EXPECT_EQ("lineWith(); // comment\n"
Daniel Jasperbb37a2f2016-02-01 11:20:55 +00001028 "/*\n"
1029 " * at start */\n"
1030 "otherLine();",
1031 format("lineWith(); // comment\n"
1032 "/*\n"
1033 " * at start */\n"
1034 "otherLine();"));
1035 EXPECT_EQ("lineWith(); // comment\n"
Manuel Klimekc5730802013-05-23 11:42:52 +00001036 " // at start\n"
1037 "otherLine();",
1038 format("lineWith(); // comment\n"
1039 " // at start\n"
1040 "otherLine();"));
Manuel Klimekb27375f2013-05-23 19:54:43 +00001041
1042 EXPECT_EQ("lineWith(); // comment\n"
1043 "// at start\n"
1044 "otherLine(); // comment",
1045 format("lineWith(); // comment\n"
1046 "// at start\n"
1047 "otherLine(); // comment"));
Manuel Klimek75ef31f2013-05-23 20:46:07 +00001048 EXPECT_EQ("lineWith();\n"
1049 "// at start\n"
1050 "otherLine(); // comment",
1051 format("lineWith();\n"
1052 " // at start\n"
1053 "otherLine(); // comment"));
1054 EXPECT_EQ("// first\n"
1055 "// at start\n"
1056 "otherLine(); // comment",
1057 format("// first\n"
1058 " // at start\n"
1059 "otherLine(); // comment"));
1060 EXPECT_EQ("f();\n"
1061 "// first\n"
1062 "// at start\n"
1063 "otherLine(); // comment",
1064 format("f();\n"
1065 "// first\n"
1066 " // at start\n"
1067 "otherLine(); // comment"));
Daniel Jasper0e93cdb2013-11-08 23:31:14 +00001068 verifyFormat("f(); // comment\n"
1069 "// first\n"
1070 "// at start\n"
1071 "otherLine();");
1072 EXPECT_EQ("f(); // comment\n"
1073 "// first\n"
1074 "// at start\n"
1075 "otherLine();",
1076 format("f(); // comment\n"
1077 "// first\n"
1078 " // at start\n"
1079 "otherLine();"));
1080 EXPECT_EQ("f(); // comment\n"
1081 " // first\n"
1082 "// at start\n"
1083 "otherLine();",
1084 format("f(); // comment\n"
1085 " // first\n"
1086 "// at start\n"
1087 "otherLine();"));
Daniel Jasper49532102015-01-07 14:00:11 +00001088 EXPECT_EQ("void f() {\n"
1089 " lineWith(); // comment\n"
1090 " // at start\n"
1091 "}",
1092 format("void f() {\n"
1093 " lineWith(); // comment\n"
1094 " // at start\n"
1095 "}"));
Benjamin Kramerdab50462016-01-11 16:27:16 +00001096 EXPECT_EQ("int xy; // a\n"
1097 "int z; // b",
1098 format("int xy; // a\n"
1099 "int z; //b"));
1100 EXPECT_EQ("int xy; // a\n"
1101 "int z; // bb",
1102 format("int xy; // a\n"
1103 "int z; //bb",
1104 getLLVMStyleWithColumns(12)));
Daniel Jasper66935022014-04-27 10:03:19 +00001105
Daniel Jaspera44991332015-04-29 13:06:49 +00001106 verifyFormat("#define A \\\n"
1107 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1108 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1109 getLLVMStyleWithColumns(60));
Daniel Jasper66935022014-04-27 10:03:19 +00001110 verifyFormat(
1111 "#define A \\\n"
1112 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1113 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1114 getLLVMStyleWithColumns(61));
Daniel Jasper8acf8222014-05-07 09:23:05 +00001115
1116 verifyFormat("if ( // This is some comment\n"
1117 " x + 3) {\n"
1118 "}");
1119 EXPECT_EQ("if ( // This is some comment\n"
1120 " // spanning two lines\n"
1121 " x + 3) {\n"
1122 "}",
1123 format("if( // This is some comment\n"
1124 " // spanning two lines\n"
1125 " x + 3) {\n"
1126 "}"));
Daniel Jasper9b79efb2015-01-19 11:49:32 +00001127
1128 verifyNoCrash("/\\\n/");
1129 verifyNoCrash("/\\\n* */");
Daniel Jasper62c78f52015-05-06 08:58:57 +00001130 // The 0-character somehow makes the lexer return a proper comment.
1131 verifyNoCrash(StringRef("/*\\\0\n/", 6));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001132}
1133
Daniel Jasper14e58e52014-03-21 11:58:45 +00001134TEST_F(FormatTest, KeepsParameterWithTrailingCommentsOnTheirOwnLine) {
1135 EXPECT_EQ("SomeFunction(a,\n"
1136 " b, // comment\n"
1137 " c);",
1138 format("SomeFunction(a,\n"
1139 " b, // comment\n"
1140 " c);"));
Daniel Jasper28df0a32014-03-21 12:15:40 +00001141 EXPECT_EQ("SomeFunction(a, b,\n"
1142 " // comment\n"
1143 " c);",
1144 format("SomeFunction(a,\n"
1145 " b,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001146 " // comment\n"
Daniel Jasper28df0a32014-03-21 12:15:40 +00001147 " c);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001148 EXPECT_EQ("SomeFunction(a, b, // comment (unclear relation)\n"
1149 " c);",
1150 format("SomeFunction(a, b, // comment (unclear relation)\n"
1151 " c);"));
1152 EXPECT_EQ("SomeFunction(a, // comment\n"
1153 " b,\n"
1154 " c); // comment",
1155 format("SomeFunction(a, // comment\n"
1156 " b,\n"
1157 " c); // comment"));
Daniel Jasper35e41222016-11-29 09:40:01 +00001158 EXPECT_EQ("aaaaaaaaaa(aaaa(aaaa,\n"
1159 " aaaa), //\n"
1160 " aaaa, bbbbb);",
1161 format("aaaaaaaaaa(aaaa(aaaa,\n"
1162 "aaaa), //\n"
1163 "aaaa, bbbbb);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001164}
1165
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001166TEST_F(FormatTest, RemovesTrailingWhitespaceOfComments) {
1167 EXPECT_EQ("// comment", format("// comment "));
1168 EXPECT_EQ("int aaaaaaa, bbbbbbb; // comment",
1169 format("int aaaaaaa, bbbbbbb; // comment ",
1170 getLLVMStyleWithColumns(33)));
Alexander Kornienko9ab4a772013-09-06 17:24:54 +00001171 EXPECT_EQ("// comment\\\n", format("// comment\\\n \t \v \f "));
1172 EXPECT_EQ("// comment \\\n", format("// comment \\\n \t \v \f "));
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001173}
1174
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001175TEST_F(FormatTest, UnderstandsBlockComments) {
Nico Weber8084cff2013-06-26 00:15:19 +00001176 verifyFormat("f(/*noSpaceAfterParameterNamingComment=*/true);");
Daniel Jasper2b2c9672016-05-08 18:14:01 +00001177 verifyFormat("void f() { g(/*aaa=*/x, /*bbb=*/!y, /*c=*/::c); }");
Daniel Jasper38c82402013-11-29 09:27:43 +00001178 EXPECT_EQ("f(aaaaaaaaaaaaaaaaaaaaaaaaa, /* Trailing comment for aa... */\n"
1179 " bbbbbbbbbbbbbbbbbbbbbbbbb);",
1180 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \\\n"
1181 "/* Trailing comment for aa... */\n"
1182 " bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001183 EXPECT_EQ(
1184 "f(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1185 " /* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);",
1186 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \n"
1187 "/* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper61a40782013-06-06 16:08:57 +00001188 EXPECT_EQ(
1189 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1190 " aaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001191 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001192 "}",
1193 format("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1194 " aaaaaaaaaaaaaaaaaa ,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001195 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001196 "}"));
Daniel Jasper99302ed2016-05-27 08:59:34 +00001197 verifyFormat("f(/* aaaaaaaaaaaaaaaaaa = */\n"
1198 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperddaa9be2013-01-29 19:41:55 +00001199
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00001200 FormatStyle NoBinPacking = getLLVMStyle();
1201 NoBinPacking.BinPackParameters = false;
1202 verifyFormat("aaaaaaaa(/* parameter 1 */ aaaaaa,\n"
1203 " /* parameter 2 */ aaaaaa,\n"
1204 " /* parameter 3 */ aaaaaa,\n"
1205 " /* parameter 4 */ aaaaaa);",
1206 NoBinPacking);
Daniel Jasper03b1bc72014-03-28 15:06:01 +00001207
1208 // Aligning block comments in macros.
1209 verifyGoogleFormat("#define A \\\n"
1210 " int i; /*a*/ \\\n"
1211 " int jjj; /*b*/");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001212}
1213
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001214TEST_F(FormatTest, AlignsBlockComments) {
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001215 EXPECT_EQ("/*\n"
1216 " * Really multi-line\n"
1217 " * comment.\n"
1218 " */\n"
1219 "void f() {}",
1220 format(" /*\n"
1221 " * Really multi-line\n"
1222 " * comment.\n"
1223 " */\n"
1224 " void f() {}"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001225 EXPECT_EQ("class C {\n"
1226 " /*\n"
1227 " * Another multi-line\n"
1228 " * comment.\n"
1229 " */\n"
1230 " void f() {}\n"
1231 "};",
1232 format("class C {\n"
1233 "/*\n"
1234 " * Another multi-line\n"
1235 " * comment.\n"
1236 " */\n"
1237 "void f() {}\n"
1238 "};"));
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001239 EXPECT_EQ("/*\n"
1240 " 1. This is a comment with non-trivial formatting.\n"
1241 " 1.1. We have to indent/outdent all lines equally\n"
1242 " 1.1.1. to keep the formatting.\n"
1243 " */",
1244 format(" /*\n"
1245 " 1. This is a comment with non-trivial formatting.\n"
1246 " 1.1. We have to indent/outdent all lines equally\n"
1247 " 1.1.1. to keep the formatting.\n"
1248 " */"));
1249 EXPECT_EQ("/*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001250 "Don't try to outdent if there's not enough indentation.\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001251 "*/",
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001252 format(" /*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001253 " Don't try to outdent if there's not enough indentation.\n"
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001254 " */"));
Manuel Klimek281dcbe2013-05-28 08:55:01 +00001255
1256 EXPECT_EQ("int i; /* Comment with empty...\n"
1257 " *\n"
1258 " * line. */",
1259 format("int i; /* Comment with empty...\n"
1260 " *\n"
1261 " * line. */"));
Alexander Kornienko67d9c8c2014-04-17 16:12:46 +00001262 EXPECT_EQ("int foobar = 0; /* comment */\n"
1263 "int bar = 0; /* multiline\n"
1264 " comment 1 */\n"
1265 "int baz = 0; /* multiline\n"
1266 " comment 2 */\n"
1267 "int bzz = 0; /* multiline\n"
1268 " comment 3 */",
1269 format("int foobar = 0; /* comment */\n"
1270 "int bar = 0; /* multiline\n"
1271 " comment 1 */\n"
1272 "int baz = 0; /* multiline\n"
1273 " comment 2 */\n"
1274 "int bzz = 0; /* multiline\n"
1275 " comment 3 */"));
1276 EXPECT_EQ("int foobar = 0; /* comment */\n"
1277 "int bar = 0; /* multiline\n"
1278 " comment */\n"
1279 "int baz = 0; /* multiline\n"
1280 "comment */",
1281 format("int foobar = 0; /* comment */\n"
1282 "int bar = 0; /* multiline\n"
1283 "comment */\n"
1284 "int baz = 0; /* multiline\n"
1285 "comment */"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001286}
1287
Daniel Jaspera0a50392015-12-01 13:28:53 +00001288TEST_F(FormatTest, CommentReflowingCanBeTurnedOff) {
1289 FormatStyle Style = getLLVMStyleWithColumns(20);
1290 Style.ReflowComments = false;
1291 verifyFormat("// aaaaaaaaa aaaaaaaaaa aaaaaaaaaa", Style);
1292 verifyFormat("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa */", Style);
1293}
1294
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001295TEST_F(FormatTest, CorrectlyHandlesLengthOfBlockComments) {
1296 EXPECT_EQ("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1297 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */",
1298 format("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1299 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */"));
Alexander Kornienkoaa620e12013-07-01 13:42:42 +00001300 EXPECT_EQ(
1301 "void ffffffffffff(\n"
1302 " int aaaaaaaa, int bbbbbbbb,\n"
1303 " int cccccccccccc) { /*\n"
1304 " aaaaaaaaaa\n"
1305 " aaaaaaaaaaaaa\n"
1306 " bbbbbbbbbbbbbb\n"
1307 " bbbbbbbbbb\n"
1308 " */\n"
1309 "}",
1310 format("void ffffffffffff(int aaaaaaaa, int bbbbbbbb, int cccccccccccc)\n"
1311 "{ /*\n"
1312 " aaaaaaaaaa aaaaaaaaaaaaa\n"
1313 " bbbbbbbbbbbbbb bbbbbbbbbb\n"
1314 " */\n"
1315 "}",
1316 getLLVMStyleWithColumns(40)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001317}
1318
Alexander Kornienko94042342013-07-16 23:47:22 +00001319TEST_F(FormatTest, DontBreakNonTrailingBlockComments) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00001320 EXPECT_EQ("void ffffffffff(\n"
1321 " int aaaaa /* test */);",
Alexander Kornienko94042342013-07-16 23:47:22 +00001322 format("void ffffffffff(int aaaaa /* test */);",
1323 getLLVMStyleWithColumns(35)));
1324}
1325
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001326TEST_F(FormatTest, SplitsLongCxxComments) {
1327 EXPECT_EQ("// A comment that\n"
1328 "// doesn't fit on\n"
1329 "// one line",
1330 format("// A comment that doesn't fit on one line",
1331 getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001332 EXPECT_EQ("/// A comment that\n"
1333 "/// doesn't fit on\n"
1334 "/// one line",
1335 format("/// A comment that doesn't fit on one line",
1336 getLLVMStyleWithColumns(20)));
1337 EXPECT_EQ("//! A comment that\n"
1338 "//! doesn't fit on\n"
1339 "//! one line",
1340 format("//! A comment that doesn't fit on one line",
1341 getLLVMStyleWithColumns(20)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00001342 EXPECT_EQ("// a b c d\n"
1343 "// e f g\n"
1344 "// h i j k",
Daniel Jaspera44991332015-04-29 13:06:49 +00001345 format("// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
1346 EXPECT_EQ(
1347 "// a b c d\n"
1348 "// e f g\n"
1349 "// h i j k",
1350 format("\\\n// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001351 EXPECT_EQ("if (true) // A comment that\n"
1352 " // doesn't fit on\n"
1353 " // one line",
1354 format("if (true) // A comment that doesn't fit on one line ",
1355 getLLVMStyleWithColumns(30)));
1356 EXPECT_EQ("// Don't_touch_leading_whitespace",
1357 format("// Don't_touch_leading_whitespace",
1358 getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001359 EXPECT_EQ("// Add leading\n"
1360 "// whitespace",
1361 format("//Add leading whitespace", getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001362 EXPECT_EQ("/// Add leading\n"
1363 "/// whitespace",
1364 format("///Add leading whitespace", getLLVMStyleWithColumns(20)));
1365 EXPECT_EQ("//! Add leading\n"
1366 "//! whitespace",
1367 format("//!Add leading whitespace", getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001368 EXPECT_EQ("// whitespace", format("//whitespace", getLLVMStyle()));
1369 EXPECT_EQ("// Even if it makes the line exceed the column\n"
1370 "// limit",
1371 format("//Even if it makes the line exceed the column limit",
1372 getLLVMStyleWithColumns(51)));
1373 EXPECT_EQ("//--But not here", format("//--But not here", getLLVMStyle()));
Krasimir Georgievb796ceb2017-01-31 15:40:15 +00001374 EXPECT_EQ("/// line 1\n"
1375 "// add leading whitespace",
1376 format("/// line 1\n"
1377 "//add leading whitespace",
1378 getLLVMStyleWithColumns(30)));
1379 EXPECT_EQ("/// line 1\n"
1380 "/// line 2\n"
1381 "//! line 3\n"
1382 "//! line 4\n"
1383 "//! line 5\n"
1384 "// line 6\n"
1385 "// line 7",
1386 format("///line 1\n"
1387 "///line 2\n"
1388 "//! line 3\n"
1389 "//!line 4\n"
1390 "//!line 5\n"
1391 "// line 6\n"
1392 "//line 7", getLLVMStyleWithColumns(20)));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001393
1394 EXPECT_EQ("// aa bb cc dd",
1395 format("// aa bb cc dd ",
1396 getLLVMStyleWithColumns(15)));
1397
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001398 EXPECT_EQ("// A comment before\n"
1399 "// a macro\n"
1400 "// definition\n"
1401 "#define a b",
1402 format("// A comment before a macro definition\n"
1403 "#define a b",
1404 getLLVMStyleWithColumns(20)));
Daniel Jaspere068ac72014-10-27 17:13:59 +00001405 EXPECT_EQ("void ffffff(\n"
1406 " int aaaaaaaaa, // wwww\n"
1407 " int bbbbbbbbbb, // xxxxxxx\n"
1408 " // yyyyyyyyyy\n"
1409 " int c, int d, int e) {}",
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001410 format("void ffffff(\n"
1411 " int aaaaaaaaa, // wwww\n"
Daniel Jasper19a541e2013-12-19 16:45:34 +00001412 " int bbbbbbbbbb, // xxxxxxx yyyyyyyyyy\n"
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001413 " int c, int d, int e) {}",
1414 getLLVMStyleWithColumns(40)));
Alexander Kornienkob93062e2013-06-20 13:58:37 +00001415 EXPECT_EQ("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1416 format("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1417 getLLVMStyleWithColumns(20)));
Alexander Kornienko3abbb8a2013-11-12 17:30:49 +00001418 EXPECT_EQ(
1419 "#define XXX // a b c d\n"
1420 " // e f g h",
1421 format("#define XXX // a b c d e f g h", getLLVMStyleWithColumns(22)));
1422 EXPECT_EQ(
1423 "#define XXX // q w e r\n"
1424 " // t y u i",
1425 format("#define XXX //q w e r t y u i", getLLVMStyleWithColumns(22)));
Krasimir Georgieve518e0b2017-01-30 21:00:01 +00001426 EXPECT_EQ("{\n"
1427 " //\n"
1428 " //\\\n"
1429 " // long 1 2 3 4\n"
1430 " // 5\n"
1431 "}",
1432 format("{\n"
1433 " //\n"
1434 " //\\\n"
1435 " // long 1 2 3 4 5\n"
1436 "}",
1437 getLLVMStyleWithColumns(20)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001438}
Manuel Klimek9043c742013-05-27 15:23:34 +00001439
Alexander Kornienko4504f932014-03-10 13:14:56 +00001440TEST_F(FormatTest, PreservesHangingIndentInCxxComments) {
1441 EXPECT_EQ("// A comment\n"
1442 "// that doesn't\n"
1443 "// fit on one\n"
1444 "// line",
1445 format("// A comment that doesn't fit on one line",
1446 getLLVMStyleWithColumns(20)));
1447 EXPECT_EQ("/// A comment\n"
1448 "/// that doesn't\n"
1449 "/// fit on one\n"
1450 "/// line",
1451 format("/// A comment that doesn't fit on one line",
1452 getLLVMStyleWithColumns(20)));
1453}
1454
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001455TEST_F(FormatTest, DontSplitLineCommentsWithEscapedNewlines) {
1456 EXPECT_EQ("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1457 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1458 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1459 format("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1460 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1461 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
1462 EXPECT_EQ("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1463 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1464 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1465 format("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1466 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1467 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1468 getLLVMStyleWithColumns(50)));
1469 // FIXME: One day we might want to implement adjustment of leading whitespace
1470 // of the consecutive lines in this kind of comment:
Daniel Jasper4355e7f2014-07-09 07:50:33 +00001471 EXPECT_EQ("double\n"
1472 " a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1473 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1474 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1475 format("double a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1476 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1477 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001478 getLLVMStyleWithColumns(49)));
1479}
1480
Alexander Kornienkoce9161a2014-01-02 15:13:14 +00001481TEST_F(FormatTest, DontSplitLineCommentsWithPragmas) {
1482 FormatStyle Pragmas = getLLVMStyleWithColumns(30);
1483 Pragmas.CommentPragmas = "^ IWYU pragma:";
1484 EXPECT_EQ(
1485 "// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb",
1486 format("// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb", Pragmas));
1487 EXPECT_EQ(
1488 "/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */",
1489 format("/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */", Pragmas));
1490}
1491
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001492TEST_F(FormatTest, PriorityOfCommentBreaking) {
Daniel Jasper2739af32013-08-28 10:03:58 +00001493 EXPECT_EQ("if (xxx ==\n"
1494 " yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001495 " zzz)\n"
1496 " q();",
1497 format("if (xxx == yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
1498 " zzz) q();",
1499 getLLVMStyleWithColumns(40)));
1500 EXPECT_EQ("if (xxxxxxxxxx ==\n"
1501 " yyy && // aaaaaa bbbbbbbb cccc\n"
1502 " zzz)\n"
1503 " q();",
1504 format("if (xxxxxxxxxx == yyy && // aaaaaa bbbbbbbb cccc\n"
1505 " zzz) q();",
1506 getLLVMStyleWithColumns(40)));
1507 EXPECT_EQ("if (xxxxxxxxxx &&\n"
1508 " yyy || // aaaaaa bbbbbbbb cccc\n"
1509 " zzz)\n"
1510 " q();",
1511 format("if (xxxxxxxxxx && yyy || // aaaaaa bbbbbbbb cccc\n"
1512 " zzz) q();",
1513 getLLVMStyleWithColumns(40)));
Daniel Jasper19a541e2013-12-19 16:45:34 +00001514 EXPECT_EQ("fffffffff(\n"
1515 " &xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1516 " zzz);",
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001517 format("fffffffff(&xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1518 " zzz);",
1519 getLLVMStyleWithColumns(40)));
Manuel Klimek9043c742013-05-27 15:23:34 +00001520}
1521
1522TEST_F(FormatTest, MultiLineCommentsInDefines) {
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001523 EXPECT_EQ("#define A(x) /* \\\n"
1524 " a comment \\\n"
1525 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001526 " f();",
1527 format("#define A(x) /* \\\n"
1528 " a comment \\\n"
1529 " inside */ \\\n"
1530 " f();",
1531 getLLVMStyleWithColumns(17)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001532 EXPECT_EQ("#define A( \\\n"
1533 " x) /* \\\n"
1534 " a comment \\\n"
1535 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001536 " f();",
1537 format("#define A( \\\n"
1538 " x) /* \\\n"
1539 " a comment \\\n"
1540 " inside */ \\\n"
1541 " f();",
1542 getLLVMStyleWithColumns(17)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001543}
1544
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001545TEST_F(FormatTest, ParsesCommentsAdjacentToPPDirectives) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001546 EXPECT_EQ("namespace {}\n// Test\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001547 format("namespace {}\n // Test\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001548 EXPECT_EQ("namespace {}\n/* Test */\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001549 format("namespace {}\n /* Test */\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001550 EXPECT_EQ("namespace {}\n/* Test */ #define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001551 format("namespace {}\n /* Test */ #define A"));
1552}
1553
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001554TEST_F(FormatTest, SplitsLongLinesInComments) {
1555 EXPECT_EQ("/* This is a long\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001556 " * comment that\n"
1557 " * doesn't\n"
1558 " * fit on one line.\n"
1559 " */",
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001560 format("/* "
1561 "This is a long "
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001562 "comment that "
1563 "doesn't "
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001564 "fit on one line. */",
1565 getLLVMStyleWithColumns(20)));
Daniel Jaspera44991332015-04-29 13:06:49 +00001566 EXPECT_EQ(
1567 "/* a b c d\n"
1568 " * e f g\n"
1569 " * h i j k\n"
1570 " */",
1571 format("/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
1572 EXPECT_EQ(
1573 "/* a b c d\n"
1574 " * e f g\n"
1575 " * h i j k\n"
1576 " */",
1577 format("\\\n/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001578 EXPECT_EQ("/*\n"
1579 "This is a long\n"
1580 "comment that doesn't\n"
1581 "fit on one line.\n"
1582 "*/",
1583 format("/*\n"
1584 "This is a long "
1585 "comment that doesn't "
1586 "fit on one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001587 "*/",
1588 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001589 EXPECT_EQ("/*\n"
1590 " * This is a long\n"
1591 " * comment that\n"
1592 " * doesn't fit on\n"
1593 " * one line.\n"
1594 " */",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001595 format("/* \n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001596 " * This is a long "
1597 " comment that "
1598 " doesn't fit on "
1599 " one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001600 " */",
1601 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001602 EXPECT_EQ("/*\n"
1603 " * This_is_a_comment_with_words_that_dont_fit_on_one_line\n"
1604 " * so_it_should_be_broken\n"
1605 " * wherever_a_space_occurs\n"
1606 " */",
1607 format("/*\n"
1608 " * This_is_a_comment_with_words_that_dont_fit_on_one_line "
1609 " so_it_should_be_broken "
1610 " wherever_a_space_occurs \n"
1611 " */",
1612 getLLVMStyleWithColumns(20)));
1613 EXPECT_EQ("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001614 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001615 " */",
1616 format("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001617 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001618 " */",
1619 getLLVMStyleWithColumns(20)));
1620 EXPECT_EQ("{\n"
1621 " /*\n"
1622 " This is another\n"
1623 " long comment that\n"
1624 " doesn't fit on one\n"
1625 " line 1234567890\n"
1626 " */\n"
1627 "}",
1628 format("{\n"
1629 "/*\n"
1630 "This is another "
1631 " long comment that "
1632 " doesn't fit on one"
1633 " line 1234567890\n"
1634 "*/\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001635 "}",
1636 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001637 EXPECT_EQ("{\n"
1638 " /*\n"
1639 " * This i s\n"
1640 " * another comment\n"
1641 " * t hat doesn' t\n"
1642 " * fit on one l i\n"
1643 " * n e\n"
1644 " */\n"
1645 "}",
1646 format("{\n"
1647 "/*\n"
1648 " * This i s"
1649 " another comment"
1650 " t hat doesn' t"
1651 " fit on one l i"
1652 " n e\n"
1653 " */\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001654 "}",
1655 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001656 EXPECT_EQ("/*\n"
1657 " * This is a long\n"
1658 " * comment that\n"
1659 " * doesn't fit on\n"
1660 " * one line\n"
1661 " */",
1662 format(" /*\n"
1663 " * This is a long comment that doesn't fit on one line\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001664 " */",
1665 getLLVMStyleWithColumns(20)));
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001666 EXPECT_EQ("{\n"
1667 " if (something) /* This is a\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001668 " long\n"
1669 " comment */\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001670 " ;\n"
1671 "}",
1672 format("{\n"
1673 " if (something) /* This is a long comment */\n"
1674 " ;\n"
1675 "}",
1676 getLLVMStyleWithColumns(30)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001677
1678 EXPECT_EQ("/* A comment before\n"
1679 " * a macro\n"
1680 " * definition */\n"
1681 "#define a b",
1682 format("/* A comment before a macro definition */\n"
1683 "#define a b",
1684 getLLVMStyleWithColumns(20)));
1685
1686 EXPECT_EQ("/* some comment\n"
1687 " * a comment\n"
1688 "* that we break\n"
1689 " * another comment\n"
1690 "* we have to break\n"
1691 "* a left comment\n"
1692 " */",
1693 format(" /* some comment\n"
1694 " * a comment that we break\n"
1695 " * another comment we have to break\n"
1696 "* a left comment\n"
1697 " */",
1698 getLLVMStyleWithColumns(20)));
1699
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00001700 EXPECT_EQ("/**\n"
1701 " * multiline block\n"
1702 " * comment\n"
1703 " *\n"
1704 " */",
1705 format("/**\n"
1706 " * multiline block comment\n"
1707 " *\n"
1708 " */",
1709 getLLVMStyleWithColumns(20)));
1710
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001711 EXPECT_EQ("/*\n"
1712 "\n"
1713 "\n"
1714 " */\n",
1715 format(" /* \n"
1716 " \n"
1717 " \n"
1718 " */\n"));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001719
1720 EXPECT_EQ("/* a a */",
1721 format("/* a a */", getLLVMStyleWithColumns(15)));
1722 EXPECT_EQ("/* a a bc */",
1723 format("/* a a bc */", getLLVMStyleWithColumns(15)));
1724 EXPECT_EQ("/* aaa aaa\n"
1725 " * aaaaa */",
1726 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
1727 EXPECT_EQ("/* aaa aaa\n"
1728 " * aaaaa */",
1729 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001730}
1731
1732TEST_F(FormatTest, SplitsLongLinesInCommentsInPreprocessor) {
1733 EXPECT_EQ("#define X \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001734 " /* \\\n"
1735 " Test \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001736 " Macro comment \\\n"
1737 " with a long \\\n"
1738 " line \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001739 " */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001740 " A + B",
1741 format("#define X \\\n"
1742 " /*\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001743 " Test\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001744 " Macro comment with a long line\n"
1745 " */ \\\n"
1746 " A + B",
1747 getLLVMStyleWithColumns(20)));
1748 EXPECT_EQ("#define X \\\n"
1749 " /* Macro comment \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001750 " with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001751 " line */ \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001752 " A + B",
1753 format("#define X \\\n"
1754 " /* Macro comment with a long\n"
1755 " line */ \\\n"
1756 " A + B",
1757 getLLVMStyleWithColumns(20)));
1758 EXPECT_EQ("#define X \\\n"
1759 " /* Macro comment \\\n"
1760 " * with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001761 " * line */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001762 " A + B",
1763 format("#define X \\\n"
1764 " /* Macro comment with a long line */ \\\n"
1765 " A + B",
1766 getLLVMStyleWithColumns(20)));
1767}
1768
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001769TEST_F(FormatTest, CommentsInStaticInitializers) {
1770 EXPECT_EQ(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001771 "static SomeType type = {aaaaaaaaaaaaaaaaaaaa, /* comment */\n"
1772 " aaaaaaaaaaaaaaaaaaaa /* comment */,\n"
1773 " /* comment */ aaaaaaaaaaaaaaaaaaaa,\n"
1774 " aaaaaaaaaaaaaaaaaaaa, // comment\n"
1775 " aaaaaaaaaaaaaaaaaaaa};",
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001776 format("static SomeType type = { aaaaaaaaaaaaaaaaaaaa , /* comment */\n"
1777 " aaaaaaaaaaaaaaaaaaaa /* comment */ ,\n"
1778 " /* comment */ aaaaaaaaaaaaaaaaaaaa ,\n"
1779 " aaaaaaaaaaaaaaaaaaaa , // comment\n"
1780 " aaaaaaaaaaaaaaaaaaaa };"));
Chandler Carruthf8b72662014-03-02 12:37:31 +00001781 verifyFormat("static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1782 " bbbbbbbbbbb, ccccccccccc};");
1783 verifyFormat("static SomeType type = {aaaaaaaaaaa,\n"
1784 " // comment for bb....\n"
1785 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001786 verifyGoogleFormat(
Daniel Jaspere5777d22013-05-23 10:15:45 +00001787 "static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1788 " bbbbbbbbbbb, ccccccccccc};");
1789 verifyGoogleFormat("static SomeType type = {aaaaaaaaaaa,\n"
1790 " // comment for bb....\n"
1791 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001792
Chandler Carruthf8b72662014-03-02 12:37:31 +00001793 verifyFormat("S s = {{a, b, c}, // Group #1\n"
1794 " {d, e, f}, // Group #2\n"
1795 " {g, h, i}}; // Group #3");
1796 verifyFormat("S s = {{// Group #1\n"
1797 " a, b, c},\n"
1798 " {// Group #2\n"
1799 " d, e, f},\n"
1800 " {// Group #3\n"
1801 " g, h, i}};");
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001802
1803 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001804 " // Some comment\n"
1805 " a,\n"
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001806 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001807 " // Comment after empty line\n"
1808 " b}",
Daniel Jasperfb5e2412013-02-26 13:10:34 +00001809 format("S s = {\n"
1810 " // Some comment\n"
1811 " a,\n"
1812 " \n"
1813 " // Comment after empty line\n"
1814 " b\n"
1815 "}"));
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001816 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001817 " /* Some comment */\n"
1818 " a,\n"
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001819 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001820 " /* Comment after empty line */\n"
1821 " b}",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001822 format("S s = {\n"
1823 " /* Some comment */\n"
1824 " a,\n"
1825 " \n"
1826 " /* Comment after empty line */\n"
1827 " b\n"
1828 "}"));
Daniel Jaspera400cab2013-02-28 15:04:12 +00001829 verifyFormat("const uint8_t aaaaaaaaaaaaaaaaaaaaaa[0] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001830 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1831 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1832 " 0x00, 0x00, 0x00, 0x00}; // comment\n");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001833}
1834
Krasimir Georgiev84321612017-01-30 19:18:55 +00001835TEST_F(FormatTest, LineCommentsAfterRightBrace) {
1836 EXPECT_EQ("if (true) { // comment about branch\n"
1837 " // comment about f\n"
1838 " f();\n"
1839 "}",
1840 format("if (true) { // comment about branch\n"
1841 " // comment about f\n"
1842 " f();\n"
1843 "}",
1844 getLLVMStyleWithColumns(80)));
1845 EXPECT_EQ("if (1) { // if line 1\n"
1846 " // if line 2\n"
1847 " // if line 3\n"
1848 " // f line 1\n"
1849 " // f line 2\n"
1850 " f();\n"
1851 "} else { // else line 1\n"
1852 " // else line 2\n"
1853 " // else line 3\n"
1854 " // g line 1\n"
1855 " g();\n"
1856 "}",
1857 format("if (1) { // if line 1\n"
1858 " // if line 2\n"
1859 " // if line 3\n"
1860 " // f line 1\n"
1861 " // f line 2\n"
1862 " f();\n"
1863 "} else { // else line 1\n"
1864 " // else line 2\n"
1865 " // else line 3\n"
1866 " // g line 1\n"
1867 " g();\n"
1868 "}"));
1869 EXPECT_EQ("do { // line 1\n"
1870 " // line 2\n"
1871 " // line 3\n"
1872 " f();\n"
1873 "} while (true);",
1874 format("do { // line 1\n"
1875 " // line 2\n"
1876 " // line 3\n"
1877 " f();\n"
1878 "} while (true);",
1879 getLLVMStyleWithColumns(80)));
1880 EXPECT_EQ("while (a < b) { // line 1\n"
1881 " // line 2\n"
1882 " // line 3\n"
1883 " f();\n"
1884 "}",
1885 format("while (a < b) {// line 1\n"
1886 " // line 2\n"
1887 " // line 3\n"
1888 " f();\n"
1889 "}",
1890 getLLVMStyleWithColumns(80)));
1891}
1892
Krasimir Georgiev91834222017-01-25 13:58:58 +00001893TEST_F(FormatTest, ReflowsComments) {
1894 // Break a long line and reflow with the full next line.
1895 EXPECT_EQ("// long long long\n"
1896 "// long long",
1897 format("// long long long long\n"
1898 "// long",
1899 getLLVMStyleWithColumns(20)));
1900
1901 // Keep the trailing newline while reflowing.
1902 EXPECT_EQ("// long long long\n"
1903 "// long long\n",
1904 format("// long long long long\n"
1905 "// long\n",
1906 getLLVMStyleWithColumns(20)));
1907
1908 // Break a long line and reflow with a part of the next line.
1909 EXPECT_EQ("// long long long\n"
1910 "// long long\n"
1911 "// long_long",
1912 format("// long long long long\n"
1913 "// long long_long",
1914 getLLVMStyleWithColumns(20)));
1915
1916 // Break but do not reflow if the first word from the next line is too long.
1917 EXPECT_EQ("// long long long\n"
1918 "// long\n"
1919 "// long_long_long\n",
1920 format("// long long long long\n"
1921 "// long_long_long\n",
1922 getLLVMStyleWithColumns(20)));
1923
1924 // Don't break or reflow short lines.
1925 verifyFormat("// long\n"
1926 "// long long long lo\n"
1927 "// long long long lo\n"
1928 "// long",
1929 getLLVMStyleWithColumns(20));
1930
1931 // Keep prefixes and decorations while reflowing.
1932 EXPECT_EQ("/// long long long\n"
1933 "/// long long\n",
1934 format("/// long long long long\n"
1935 "/// long\n",
1936 getLLVMStyleWithColumns(20)));
1937 EXPECT_EQ("//! long long long\n"
1938 "//! long long\n",
1939 format("//! long long long long\n"
1940 "//! long\n",
1941 getLLVMStyleWithColumns(20)));
1942 EXPECT_EQ("/* long long long\n"
1943 " * long long */",
1944 format("/* long long long long\n"
1945 " * long */",
1946 getLLVMStyleWithColumns(20)));
1947
1948 // Don't bring leading whitespace up while reflowing.
1949 EXPECT_EQ("/* long long long\n"
1950 " * long long long\n"
1951 " */",
1952 format("/* long long long long\n"
1953 " * long long\n"
1954 " */",
1955 getLLVMStyleWithColumns(20)));
1956
1957 // Reflow the last line of a block comment with its trailing '*/'.
1958 EXPECT_EQ("/* long long long\n"
1959 " long long */",
1960 format("/* long long long long\n"
1961 " long */",
1962 getLLVMStyleWithColumns(20)));
1963
1964 // Reflow two short lines; keep the postfix of the last one.
1965 EXPECT_EQ("/* long long long\n"
1966 " * long long long */",
1967 format("/* long long long long\n"
1968 " * long\n"
1969 " * long */",
1970 getLLVMStyleWithColumns(20)));
1971
1972 // Put the postfix of the last short reflow line on a newline if it doesn't
1973 // fit.
1974 EXPECT_EQ("/* long long long\n"
1975 " * long long longg\n"
1976 " */",
1977 format("/* long long long long\n"
1978 " * long\n"
1979 " * longg */",
1980 getLLVMStyleWithColumns(20)));
1981
Krasimir Georgievaf1b9622017-01-31 14:31:44 +00001982 // Reflow lines with leading whitespace.
1983 EXPECT_EQ("{\n"
1984 " /*\n"
1985 " * long long long\n"
1986 " * long long long\n"
1987 " * long long long\n"
1988 " */\n"
1989 "}",
1990 format("{\n"
1991 "/*\n"
1992 " * long long long long\n"
1993 " * long\n"
1994 " * long long long long\n"
1995 " */\n"
1996 "}",
1997 getLLVMStyleWithColumns(20)));
1998
Krasimir Georgiev91834222017-01-25 13:58:58 +00001999 // Break single line block comments that are first in the line with ' *'
2000 // decoration.
2001 EXPECT_EQ("/* long long long\n"
2002 " * long */",
2003 format("/* long long long long */", getLLVMStyleWithColumns(20)));
2004
2005 // Break single line block comment that are not first in the line with ' '
2006 // decoration.
2007 EXPECT_EQ("int i; /* long long\n"
2008 " long */",
2009 format("int i; /* long long long */", getLLVMStyleWithColumns(20)));
2010
2011 // Reflow a line that goes just over the column limit.
2012 EXPECT_EQ("// long long long\n"
2013 "// lon long",
2014 format("// long long long lon\n"
2015 "// long",
2016 getLLVMStyleWithColumns(20)));
2017
2018 // Stop reflowing if the next line has a different indentation than the
2019 // previous line.
2020 EXPECT_EQ("// long long long\n"
2021 "// long\n"
2022 "// long long\n"
2023 "// long",
2024 format("// long long long long\n"
2025 "// long long\n"
2026 "// long",
2027 getLLVMStyleWithColumns(20)));
2028
2029 // Reflow into the last part of a really long line that has been broken into
2030 // multiple lines.
2031 EXPECT_EQ("// long long long\n"
2032 "// long long long\n"
2033 "// long long long\n",
2034 format("// long long long long long long long long\n"
2035 "// long\n",
2036 getLLVMStyleWithColumns(20)));
2037
2038 // Break the first line, then reflow the beginning of the second and third
2039 // line up.
2040 EXPECT_EQ("// long long long\n"
2041 "// lon1 lon2 lon2\n"
2042 "// lon2 lon3 lon3",
2043 format("// long long long lon1\n"
2044 "// lon2 lon2 lon2\n"
2045 "// lon3 lon3",
2046 getLLVMStyleWithColumns(20)));
2047
2048 // Reflow the beginning of the second line, then break the rest.
2049 EXPECT_EQ("// long long long\n"
2050 "// lon1 lon2 lon2\n"
2051 "// lon2 lon2 lon2\n"
2052 "// lon3",
2053 format("// long long long lon1\n"
2054 "// lon2 lon2 lon2 lon2 lon2 lon3",
2055 getLLVMStyleWithColumns(20)));
2056
2057 // Shrink the first line, then reflow the second line up.
2058 EXPECT_EQ("// long long long", format("// long long\n"
2059 "// long",
2060 getLLVMStyleWithColumns(20)));
2061
2062 // Don't shrink leading whitespace.
2063 EXPECT_EQ("int i; /// a",
2064 format("int i; /// a", getLLVMStyleWithColumns(20)));
2065
2066 // Shrink trailing whitespace if there is no postfix and reflow.
2067 EXPECT_EQ("// long long long\n"
2068 "// long long",
2069 format("// long long long long \n"
2070 "// long",
2071 getLLVMStyleWithColumns(20)));
2072
2073 // Shrink trailing whitespace to a single one if there is postfix.
2074 EXPECT_EQ("/* long long long */",
2075 format("/* long long long */", getLLVMStyleWithColumns(20)));
2076
2077 // Break a block comment postfix if exceeding the line limit.
2078 EXPECT_EQ("/* long\n"
2079 " */",
2080 format("/* long */", getLLVMStyleWithColumns(20)));
2081
2082 // Reflow indented comments.
2083 EXPECT_EQ("{\n"
2084 " // long long long\n"
2085 " // long long\n"
2086 " int i; /* long lon\n"
2087 " g long\n"
2088 " */\n"
2089 "}",
2090 format("{\n"
2091 " // long long long long\n"
2092 " // long\n"
2093 " int i; /* long lon g\n"
2094 " long */\n"
2095 "}",
2096 getLLVMStyleWithColumns(20)));
2097
2098 // Don't realign trailing comments after reflow has happened.
2099 EXPECT_EQ("// long long long\n"
2100 "// long long\n"
2101 "long i; // long",
2102 format("// long long long long\n"
2103 "// long\n"
2104 "long i; // long",
2105 getLLVMStyleWithColumns(20)));
2106 EXPECT_EQ("// long long long\n"
2107 "// longng long long\n"
2108 "// long lo",
2109 format("// long long long longng\n"
2110 "// long long long\n"
2111 "// lo",
2112 getLLVMStyleWithColumns(20)));
2113
2114 // Reflow lines after a broken line.
2115 EXPECT_EQ("int a; // Trailing\n"
2116 " // comment on\n"
2117 " // 2 or 3\n"
2118 " // lines.\n",
2119 format("int a; // Trailing comment\n"
2120 " // on 2\n"
2121 " // or 3\n"
2122 " // lines.\n",
2123 getLLVMStyleWithColumns(20)));
2124 EXPECT_EQ("/// This long line\n"
2125 "/// gets reflown.\n",
2126 format("/// This long line gets\n"
2127 "/// reflown.\n",
2128 getLLVMStyleWithColumns(20)));
2129 EXPECT_EQ("//! This long line\n"
2130 "//! gets reflown.\n",
2131 format(" //! This long line gets\n"
2132 " //! reflown.\n",
2133 getLLVMStyleWithColumns(20)));
2134 EXPECT_EQ("/* This long line\n"
2135 " * gets reflown.\n"
2136 " */\n",
2137 format("/* This long line gets\n"
2138 " * reflown.\n"
2139 " */\n",
2140 getLLVMStyleWithColumns(20)));
2141
2142 // Reflow after indentation makes a line too long.
2143 EXPECT_EQ("{\n"
2144 " // long long long\n"
2145 " // lo long\n"
2146 "}\n",
2147 format("{\n"
2148 "// long long long lo\n"
2149 "// long\n"
2150 "}\n",
2151 getLLVMStyleWithColumns(20)));
2152
2153 // Break and reflow multiple lines.
2154 EXPECT_EQ("/*\n"
2155 " * Reflow the end of\n"
2156 " * line by 11 22 33\n"
2157 " * 4.\n"
2158 " */\n",
2159 format("/*\n"
2160 " * Reflow the end of line\n"
2161 " * by\n"
2162 " * 11\n"
2163 " * 22\n"
2164 " * 33\n"
2165 " * 4.\n"
2166 " */\n",
2167 getLLVMStyleWithColumns(20)));
2168 EXPECT_EQ("/// First line gets\n"
2169 "/// broken. Second\n"
2170 "/// line gets\n"
2171 "/// reflown and\n"
2172 "/// broken. Third\n"
2173 "/// gets reflown.\n",
2174 format("/// First line gets broken.\n"
2175 "/// Second line gets reflown and broken.\n"
2176 "/// Third gets reflown.\n",
2177 getLLVMStyleWithColumns(20)));
2178 EXPECT_EQ("int i; // first long\n"
2179 " // long snd\n"
2180 " // long.\n",
2181 format("int i; // first long long\n"
2182 " // snd long.\n",
2183 getLLVMStyleWithColumns(20)));
2184 EXPECT_EQ("{\n"
2185 " // first long line\n"
2186 " // line second\n"
2187 " // long line line\n"
2188 " // third long line\n"
2189 " // line\n"
2190 "}\n",
2191 format("{\n"
2192 " // first long line line\n"
2193 " // second long line line\n"
2194 " // third long line line\n"
2195 "}\n",
2196 getLLVMStyleWithColumns(20)));
2197 EXPECT_EQ("int i; /* first line\n"
2198 " * second\n"
2199 " * line third\n"
2200 " * line\n"
2201 " */",
2202 format("int i; /* first line\n"
2203 " * second line\n"
2204 " * third line\n"
2205 " */",
2206 getLLVMStyleWithColumns(20)));
2207
2208 // Reflow the last two lines of a section that starts with a line having
2209 // different indentation.
2210 EXPECT_EQ(
2211 "// long\n"
2212 "// long long long\n"
2213 "// long long",
2214 format("// long\n"
2215 "// long long long long\n"
2216 "// long",
2217 getLLVMStyleWithColumns(20)));
2218
2219 // Keep the block comment endling '*/' while reflowing.
2220 EXPECT_EQ("/* Long long long\n"
2221 " * line short */\n",
2222 format("/* Long long long line\n"
2223 " * short */\n",
2224 getLLVMStyleWithColumns(20)));
2225
2226 // Don't reflow between separate blocks of comments.
2227 EXPECT_EQ("/* First comment\n"
2228 " * block will */\n"
2229 "/* Snd\n"
2230 " */\n",
2231 format("/* First comment block\n"
2232 " * will */\n"
2233 "/* Snd\n"
2234 " */\n",
2235 getLLVMStyleWithColumns(20)));
2236
2237 // Don't reflow across blank comment lines.
2238 EXPECT_EQ("int i; // This long\n"
2239 " // line gets\n"
2240 " // broken.\n"
Krasimir Georgiev13dbaa02017-02-01 10:10:04 +00002241 " //\n"
Krasimir Georgiev91834222017-01-25 13:58:58 +00002242 " // keep.\n",
2243 format("int i; // This long line gets broken.\n"
2244 " // \n"
2245 " // keep.\n",
2246 getLLVMStyleWithColumns(20)));
2247 EXPECT_EQ("{\n"
2248 " /// long long long\n"
2249 " /// long long\n"
2250 " ///\n"
2251 " /// long\n"
2252 "}",
2253 format("{\n"
2254 " /// long long long long\n"
2255 " /// long\n"
2256 " ///\n"
2257 " /// long\n"
2258 "}",
2259 getLLVMStyleWithColumns(20)));
2260 EXPECT_EQ("//! long long long\n"
2261 "//! long\n"
2262 "\n"
2263 "//! long",
2264 format("//! long long long long\n"
2265 "\n"
2266 "//! long",
2267 getLLVMStyleWithColumns(20)));
2268 EXPECT_EQ("/* long long long\n"
2269 " long\n"
2270 "\n"
2271 " long */",
2272 format("/* long long long long\n"
2273 "\n"
2274 " long */",
2275 getLLVMStyleWithColumns(20)));
2276 EXPECT_EQ("/* long long long\n"
2277 " * long\n"
2278 " *\n"
2279 " * long */",
2280 format("/* long long long long\n"
2281 " *\n"
2282 " * long */",
2283 getLLVMStyleWithColumns(20)));
2284
2285 // Don't reflow lines having content that is a single character.
2286 EXPECT_EQ("// long long long\n"
2287 "// long\n"
2288 "// l",
2289 format("// long long long long\n"
2290 "// l",
2291 getLLVMStyleWithColumns(20)));
2292
2293 // Don't reflow lines starting with two punctuation characters.
2294 EXPECT_EQ("// long long long\n"
2295 "// long\n"
2296 "// ... --- ...",
2297 format(
2298 "// long long long long\n"
2299 "// ... --- ...",
2300 getLLVMStyleWithColumns(20)));
Krasimir Georgiev8f62cf72017-01-31 11:38:02 +00002301
2302 // Don't reflow lines starting with '@'.
2303 EXPECT_EQ("// long long long\n"
2304 "// long\n"
2305 "// @param arg",
2306 format("// long long long long\n"
2307 "// @param arg",
2308 getLLVMStyleWithColumns(20)));
Krasimir Georgiev28912c02017-02-02 10:52:08 +00002309
2310 // Don't reflow lines starting with 'TODO'.
2311 EXPECT_EQ("// long long long\n"
2312 "// long\n"
2313 "// TODO: long",
2314 format("// long long long long\n"
2315 "// TODO: long",
2316 getLLVMStyleWithColumns(20)));
2317
2318 // Don't reflow lines starting with 'FIXME'.
2319 EXPECT_EQ("// long long long\n"
2320 "// long\n"
2321 "// FIXME: long",
2322 format("// long long long long\n"
2323 "// FIXME: long",
2324 getLLVMStyleWithColumns(20)));
2325
2326 // Don't reflow lines starting with 'XXX'.
2327 EXPECT_EQ("// long long long\n"
2328 "// long\n"
2329 "// XXX: long",
2330 format("// long long long long\n"
2331 "// XXX: long",
2332 getLLVMStyleWithColumns(20)));
Krasimir Georgiev8f62cf72017-01-31 11:38:02 +00002333
Krasimir Georgiev91834222017-01-25 13:58:58 +00002334 // Reflow lines that have a non-punctuation character among their first 2
2335 // characters.
2336 EXPECT_EQ("// long long long\n"
2337 "// long 'long'",
2338 format(
2339 "// long long long long\n"
2340 "// 'long'",
2341 getLLVMStyleWithColumns(20)));
2342
2343 // Don't reflow between separate blocks of comments.
2344 EXPECT_EQ("/* First comment\n"
2345 " * block will */\n"
2346 "/* Snd\n"
2347 " */\n",
2348 format("/* First comment block\n"
2349 " * will */\n"
2350 "/* Snd\n"
2351 " */\n",
2352 getLLVMStyleWithColumns(20)));
2353
2354 // Don't reflow lines having different indentation.
2355 EXPECT_EQ("// long long long\n"
2356 "// long\n"
2357 "// long",
2358 format("// long long long long\n"
2359 "// long",
2360 getLLVMStyleWithColumns(20)));
2361
2362 // Don't break or reflow after implicit string literals.
2363 verifyFormat("#include <t> // l l l\n"
2364 " // l",
2365 getLLVMStyleWithColumns(20));
2366
2367 // Don't break or reflow comments on import lines.
2368 EXPECT_EQ("#include \"t\" /* l l l\n"
2369 " * l */",
2370 format("#include \"t\" /* l l l\n"
2371 " * l */",
2372 getLLVMStyleWithColumns(20)));
2373
2374 // Don't reflow between different trailing comment sections.
2375 EXPECT_EQ("int i; // long long\n"
2376 " // long\n"
2377 "int j; // long long\n"
2378 " // long\n",
2379 format("int i; // long long long\n"
2380 "int j; // long long long\n",
2381 getLLVMStyleWithColumns(20)));
2382
2383 // Don't reflow if the first word on the next line is longer than the
2384 // available space at current line.
2385 EXPECT_EQ("int i; // trigger\n"
2386 " // reflow\n"
2387 " // longsec\n",
2388 format("int i; // trigger reflow\n"
2389 " // longsec\n",
2390 getLLVMStyleWithColumns(20)));
2391
2392 // Keep empty comment lines.
2393 EXPECT_EQ("/**/", format(" /**/", getLLVMStyleWithColumns(20)));
2394 EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
2395 EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
2396 EXPECT_EQ("//", format(" // ", getLLVMStyleWithColumns(20)));
2397 EXPECT_EQ("///", format(" /// ", getLLVMStyleWithColumns(20)));
2398}
2399
Alexander Kornienkof2e02122013-05-24 18:24:24 +00002400TEST_F(FormatTest, IgnoresIf0Contents) {
2401 EXPECT_EQ("#if 0\n"
2402 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
2403 "#endif\n"
2404 "void f() {}",
2405 format("#if 0\n"
2406 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
2407 "#endif\n"
2408 "void f( ) { }"));
2409 EXPECT_EQ("#if false\n"
2410 "void f( ) { }\n"
2411 "#endif\n"
2412 "void g() {}\n",
2413 format("#if false\n"
2414 "void f( ) { }\n"
2415 "#endif\n"
2416 "void g( ) { }\n"));
2417 EXPECT_EQ("enum E {\n"
2418 " One,\n"
2419 " Two,\n"
2420 "#if 0\n"
2421 "Three,\n"
2422 " Four,\n"
2423 "#endif\n"
2424 " Five\n"
2425 "};",
2426 format("enum E {\n"
2427 " One,Two,\n"
2428 "#if 0\n"
2429 "Three,\n"
2430 " Four,\n"
2431 "#endif\n"
2432 " Five};"));
2433 EXPECT_EQ("enum F {\n"
2434 " One,\n"
2435 "#if 1\n"
2436 " Two,\n"
2437 "#if 0\n"
2438 "Three,\n"
2439 " Four,\n"
2440 "#endif\n"
2441 " Five\n"
2442 "#endif\n"
2443 "};",
2444 format("enum F {\n"
2445 "One,\n"
2446 "#if 1\n"
2447 "Two,\n"
2448 "#if 0\n"
2449 "Three,\n"
2450 " Four,\n"
2451 "#endif\n"
2452 "Five\n"
2453 "#endif\n"
2454 "};"));
2455 EXPECT_EQ("enum G {\n"
2456 " One,\n"
2457 "#if 0\n"
2458 "Two,\n"
2459 "#else\n"
2460 " Three,\n"
2461 "#endif\n"
2462 " Four\n"
2463 "};",
2464 format("enum G {\n"
2465 "One,\n"
2466 "#if 0\n"
2467 "Two,\n"
2468 "#else\n"
2469 "Three,\n"
2470 "#endif\n"
2471 "Four\n"
2472 "};"));
2473 EXPECT_EQ("enum H {\n"
2474 " One,\n"
2475 "#if 0\n"
2476 "#ifdef Q\n"
2477 "Two,\n"
2478 "#else\n"
2479 "Three,\n"
2480 "#endif\n"
2481 "#endif\n"
2482 " Four\n"
2483 "};",
2484 format("enum H {\n"
2485 "One,\n"
2486 "#if 0\n"
2487 "#ifdef Q\n"
2488 "Two,\n"
2489 "#else\n"
2490 "Three,\n"
2491 "#endif\n"
2492 "#endif\n"
2493 "Four\n"
2494 "};"));
2495 EXPECT_EQ("enum I {\n"
2496 " One,\n"
2497 "#if /* test */ 0 || 1\n"
2498 "Two,\n"
2499 "Three,\n"
2500 "#endif\n"
2501 " Four\n"
2502 "};",
2503 format("enum I {\n"
2504 "One,\n"
2505 "#if /* test */ 0 || 1\n"
2506 "Two,\n"
2507 "Three,\n"
2508 "#endif\n"
2509 "Four\n"
2510 "};"));
2511 EXPECT_EQ("enum J {\n"
2512 " One,\n"
2513 "#if 0\n"
2514 "#if 0\n"
2515 "Two,\n"
2516 "#else\n"
2517 "Three,\n"
2518 "#endif\n"
2519 "Four,\n"
2520 "#endif\n"
2521 " Five\n"
2522 "};",
2523 format("enum J {\n"
2524 "One,\n"
2525 "#if 0\n"
2526 "#if 0\n"
2527 "Two,\n"
2528 "#else\n"
2529 "Three,\n"
2530 "#endif\n"
2531 "Four,\n"
2532 "#endif\n"
2533 "Five\n"
2534 "};"));
Alexander Kornienkof2e02122013-05-24 18:24:24 +00002535}
2536
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002537//===----------------------------------------------------------------------===//
2538// Tests for classes, namespaces, etc.
2539//===----------------------------------------------------------------------===//
2540
2541TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002542 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002543}
2544
2545TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
2546 verifyFormat("class A {\n"
2547 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00002548 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002549 "protected:\n"
2550 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002551 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002552 "};");
2553 verifyGoogleFormat("class A {\n"
2554 " public:\n"
2555 " protected:\n"
2556 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002557 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002558 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00002559 verifyFormat("class A {\n"
2560 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002561 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00002562 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002563 " void f2() {}\n"
2564 "protected slots:\n"
2565 " void f3() {}\n"
2566 "protected Q_SLOTS:\n"
2567 " void f4() {}\n"
2568 "private slots:\n"
2569 " void f5() {}\n"
2570 "private Q_SLOTS:\n"
2571 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00002572 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002573 " void g1();\n"
2574 "Q_SIGNALS:\n"
2575 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00002576 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00002577
2578 // Don't interpret 'signals' the wrong way.
2579 verifyFormat("signals.set();");
2580 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00002581 verifyFormat("{\n"
2582 " signals.set(); // This needs indentation.\n"
2583 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00002584 verifyFormat("void f() {\n"
2585 "label:\n"
2586 " signals.baz();\n"
2587 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002588}
2589
Alexander Kornienkofd433362013-03-27 17:08:02 +00002590TEST_F(FormatTest, SeparatesLogicalBlocks) {
2591 EXPECT_EQ("class A {\n"
2592 "public:\n"
2593 " void f();\n"
2594 "\n"
2595 "private:\n"
2596 " void g() {}\n"
2597 " // test\n"
2598 "protected:\n"
2599 " int h;\n"
2600 "};",
2601 format("class A {\n"
2602 "public:\n"
2603 "void f();\n"
2604 "private:\n"
2605 "void g() {}\n"
2606 "// test\n"
2607 "protected:\n"
2608 "int h;\n"
2609 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00002610 EXPECT_EQ("class A {\n"
2611 "protected:\n"
2612 "public:\n"
2613 " void f();\n"
2614 "};",
2615 format("class A {\n"
2616 "protected:\n"
2617 "\n"
2618 "public:\n"
2619 "\n"
2620 " void f();\n"
2621 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00002622
2623 // Even ensure proper spacing inside macros.
2624 EXPECT_EQ("#define B \\\n"
2625 " class A { \\\n"
2626 " protected: \\\n"
2627 " public: \\\n"
2628 " void f(); \\\n"
2629 " };",
2630 format("#define B \\\n"
2631 " class A { \\\n"
2632 " protected: \\\n"
2633 " \\\n"
2634 " public: \\\n"
2635 " \\\n"
2636 " void f(); \\\n"
2637 " };",
2638 getGoogleStyle()));
2639 // But don't remove empty lines after macros ending in access specifiers.
2640 EXPECT_EQ("#define A private:\n"
2641 "\n"
2642 "int i;",
2643 format("#define A private:\n"
2644 "\n"
2645 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00002646}
2647
Daniel Jasper83193602013-04-05 17:22:09 +00002648TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002649 verifyFormat("class A : public B {};");
2650 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002651
2652 verifyFormat(
2653 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002654 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00002655 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
2656 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002657 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002658 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002659 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002660 verifyFormat("class AAAAAAAAAAAA : public B,\n"
2661 " public C,\n"
2662 " public D,\n"
2663 " public E,\n"
2664 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002665 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00002666
2667 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002668 " ReallyReallyLongClassName {\n"
2669 " int i;\n"
2670 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00002671 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00002672 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
2673 " aaaaaaaaaaaaaaaa> {};");
2674 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
2675 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
2676 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00002677 verifyFormat("template <class R, class C>\n"
2678 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
2679 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00002680 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00002681}
2682
Manuel Klimek28cacc72013-01-07 18:10:23 +00002683TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002684 verifyFormat("class A {\n} a, b;");
2685 verifyFormat("struct A {\n} a, b;");
2686 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00002687}
2688
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002689TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002690 verifyFormat("enum {\n"
2691 " Zero,\n"
2692 " One = 1,\n"
2693 " Two = One + 1,\n"
2694 " Three = (One + Two),\n"
2695 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2696 " Five = (One, Two, Three, Four, 5)\n"
2697 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002698 verifyGoogleFormat("enum {\n"
2699 " Zero,\n"
2700 " One = 1,\n"
2701 " Two = One + 1,\n"
2702 " Three = (One + Two),\n"
2703 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2704 " Five = (One, Two, Three, Four, 5)\n"
2705 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002706 verifyFormat("enum Enum {};");
2707 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002708 verifyFormat("enum X E {} d;");
2709 verifyFormat("enum __attribute__((...)) E {} d;");
2710 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00002711 verifyFormat("enum {\n"
2712 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002713 "};",
2714 getLLVMStyleWithColumns(30));
2715
2716 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00002717 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002718
2719 EXPECT_EQ("enum KeepEmptyLines {\n"
2720 " ONE,\n"
2721 "\n"
2722 " TWO,\n"
2723 "\n"
2724 " THREE\n"
2725 "}",
2726 format("enum KeepEmptyLines {\n"
2727 " ONE,\n"
2728 "\n"
2729 " TWO,\n"
2730 "\n"
2731 "\n"
2732 " THREE\n"
2733 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00002734 verifyFormat("enum E { // comment\n"
2735 " ONE,\n"
2736 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00002737 "};\n"
2738 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002739 // Not enums.
2740 verifyFormat("enum X f() {\n"
2741 " a();\n"
2742 " return 42;\n"
2743 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00002744 verifyFormat("enum X Type::f() {\n"
2745 " a();\n"
2746 " return 42;\n"
2747 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002748 verifyFormat("enum ::X f() {\n"
2749 " a();\n"
2750 " return 42;\n"
2751 "}");
2752 verifyFormat("enum ns::X f() {\n"
2753 " a();\n"
2754 " return 42;\n"
2755 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002756}
2757
Daniel Jasperb7150872013-08-30 10:10:19 +00002758TEST_F(FormatTest, FormatsEnumsWithErrors) {
2759 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002760 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002761 " Two = 1;\n"
2762 "};");
2763 verifyFormat("namespace n {\n"
2764 "enum Type {\n"
2765 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002766 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002767 " int i;\n"
2768 "}\n"
2769 "void g() {}");
2770}
2771
Daniel Jasper2b41a822013-08-20 12:42:50 +00002772TEST_F(FormatTest, FormatsEnumStruct) {
2773 verifyFormat("enum struct {\n"
2774 " Zero,\n"
2775 " One = 1,\n"
2776 " Two = One + 1,\n"
2777 " Three = (One + Two),\n"
2778 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2779 " Five = (One, Two, Three, Four, 5)\n"
2780 "};");
2781 verifyFormat("enum struct Enum {};");
2782 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002783 verifyFormat("enum struct X E {} d;");
2784 verifyFormat("enum struct __attribute__((...)) E {} d;");
2785 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002786 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
2787}
2788
2789TEST_F(FormatTest, FormatsEnumClass) {
2790 verifyFormat("enum class {\n"
2791 " Zero,\n"
2792 " One = 1,\n"
2793 " Two = One + 1,\n"
2794 " Three = (One + Two),\n"
2795 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2796 " Five = (One, Two, Three, Four, 5)\n"
2797 "};");
2798 verifyFormat("enum class Enum {};");
2799 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002800 verifyFormat("enum class X E {} d;");
2801 verifyFormat("enum class __attribute__((...)) E {} d;");
2802 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002803 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
2804}
2805
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002806TEST_F(FormatTest, FormatsEnumTypes) {
2807 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002808 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002809 " B\n"
2810 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00002811 verifyFormat("enum X : int { A, B };");
2812 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002813}
2814
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002815TEST_F(FormatTest, FormatsNSEnums) {
2816 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
2817 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
2818 " // Information about someDecentlyLongValue.\n"
2819 " someDecentlyLongValue,\n"
2820 " // Information about anotherDecentlyLongValue.\n"
2821 " anotherDecentlyLongValue,\n"
2822 " // Information about aThirdDecentlyLongValue.\n"
2823 " aThirdDecentlyLongValue\n"
2824 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00002825 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
2826 " a = 1,\n"
2827 " b = 2,\n"
2828 " c = 3,\n"
2829 "};");
2830 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
2831 " a = 1,\n"
2832 " b = 2,\n"
2833 " c = 3,\n"
2834 "};");
2835 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
2836 " a = 1,\n"
2837 " b = 2,\n"
2838 " c = 3,\n"
2839 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002840}
2841
Nico Weber7769a902013-01-14 05:49:49 +00002842TEST_F(FormatTest, FormatsBitfields) {
2843 verifyFormat("struct Bitfields {\n"
2844 " unsigned sClass : 8;\n"
2845 " unsigned ValueKind : 2;\n"
2846 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00002847 verifyFormat("struct A {\n"
2848 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
2849 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
2850 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00002851 verifyFormat("struct MyStruct {\n"
2852 " uchar data;\n"
2853 " uchar : 8;\n"
2854 " uchar : 8;\n"
2855 " uchar other;\n"
2856 "};");
Nico Weber7769a902013-01-14 05:49:49 +00002857}
2858
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002859TEST_F(FormatTest, FormatsNamespaces) {
2860 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002861 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002862 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002863 "}");
2864 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002865 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002866 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002867 "}");
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002868 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002869 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002870 "void f() { f(); }\n"
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002871 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002872 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002873 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002874 "void f() { f(); }");
Manuel Klimek046b9302013-02-06 16:08:09 +00002875
2876 // This code is more common than we thought; if we
2877 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002878 // its own line, which is undesirable.
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002879 verifyFormat("namespace {};");
Manuel Klimek046b9302013-02-06 16:08:09 +00002880 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002881 "class A {};\n"
Manuel Klimek046b9302013-02-06 16:08:09 +00002882 "};");
Daniel Jasper251b3c92013-07-01 11:22:57 +00002883
2884 verifyFormat("namespace {\n"
2885 "int SomeVariable = 0; // comment\n"
2886 "} // namespace");
2887 EXPECT_EQ("#ifndef HEADER_GUARD\n"
2888 "#define HEADER_GUARD\n"
2889 "namespace my_namespace {\n"
2890 "int i;\n"
2891 "} // my_namespace\n"
2892 "#endif // HEADER_GUARD",
2893 format("#ifndef HEADER_GUARD\n"
2894 " #define HEADER_GUARD\n"
2895 " namespace my_namespace {\n"
2896 "int i;\n"
2897 "} // my_namespace\n"
2898 "#endif // HEADER_GUARD"));
Daniel Jasper65ee3472013-07-31 23:16:02 +00002899
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00002900 EXPECT_EQ("namespace A::B {\n"
2901 "class C {};\n"
2902 "}",
2903 format("namespace A::B {\n"
2904 "class C {};\n"
2905 "}"));
2906
Daniel Jasper65ee3472013-07-31 23:16:02 +00002907 FormatStyle Style = getLLVMStyle();
2908 Style.NamespaceIndentation = FormatStyle::NI_All;
2909 EXPECT_EQ("namespace out {\n"
2910 " int i;\n"
2911 " namespace in {\n"
2912 " int i;\n"
2913 " } // namespace\n"
2914 "} // namespace",
2915 format("namespace out {\n"
2916 "int i;\n"
2917 "namespace in {\n"
2918 "int i;\n"
2919 "} // namespace\n"
2920 "} // namespace",
2921 Style));
2922
2923 Style.NamespaceIndentation = FormatStyle::NI_Inner;
2924 EXPECT_EQ("namespace out {\n"
2925 "int i;\n"
2926 "namespace in {\n"
2927 " int i;\n"
2928 "} // namespace\n"
2929 "} // namespace",
2930 format("namespace out {\n"
2931 "int i;\n"
2932 "namespace in {\n"
2933 "int i;\n"
2934 "} // namespace\n"
2935 "} // namespace",
2936 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002937}
2938
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002939TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00002940
Daniel Jasper40aacf42013-03-14 13:45:21 +00002941TEST_F(FormatTest, FormatsInlineASM) {
2942 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00002943 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00002944 verifyFormat(
2945 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2946 " \"cpuid\\n\\t\"\n"
2947 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00002948 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00002949 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00002950 EXPECT_EQ(
2951 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002952 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002953 " mov edx,[that] // vtable in edx\n"
2954 " mov eax,methodIndex\n"
2955 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002956 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002957 "}",
2958 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2959 " __asm {\n"
2960 " mov edx,[that] // vtable in edx\n"
2961 " mov eax,methodIndex\n"
2962 " call [edx][eax*4] // stdcall\n"
2963 " }\n"
2964 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00002965 EXPECT_EQ("_asm {\n"
2966 " xor eax, eax;\n"
2967 " cpuid;\n"
2968 "}",
2969 format("_asm {\n"
2970 " xor eax, eax;\n"
2971 " cpuid;\n"
2972 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00002973 verifyFormat("void function() {\n"
2974 " // comment\n"
2975 " asm(\"\");\n"
2976 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00002977 EXPECT_EQ("__asm {\n"
2978 "}\n"
2979 "int i;",
2980 format("__asm {\n"
2981 "}\n"
2982 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00002983}
2984
Nico Weberd5650bd2013-01-07 16:36:17 +00002985TEST_F(FormatTest, FormatTryCatch) {
2986 verifyFormat("try {\n"
2987 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002988 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002989 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002990 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002991 " exit(42);\n"
2992 "}");
2993
2994 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00002995 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002996 " return 5;\n"
2997 "}");
2998 verifyFormat("class A {\n"
2999 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003000 " A() try : a(0) {\n"
3001 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00003002 " throw;\n"
3003 " }\n"
3004 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00003005
3006 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003007 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00003008}
3009
Nico Weberfac23712015-02-04 15:26:27 +00003010TEST_F(FormatTest, FormatSEHTryCatch) {
3011 verifyFormat("__try {\n"
3012 " int a = b * c;\n"
3013 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
3014 " // Do nothing.\n"
3015 "}");
3016
3017 verifyFormat("__try {\n"
3018 " int a = b * c;\n"
3019 "} __finally {\n"
3020 " // Do nothing.\n"
3021 "}");
3022
3023 verifyFormat("DEBUG({\n"
3024 " __try {\n"
3025 " } __finally {\n"
3026 " }\n"
3027 "});\n");
3028}
3029
Daniel Jasper04a71a42014-05-08 11:58:24 +00003030TEST_F(FormatTest, IncompleteTryCatchBlocks) {
3031 verifyFormat("try {\n"
3032 " f();\n"
3033 "} catch {\n"
3034 " g();\n"
3035 "}");
3036 verifyFormat("try {\n"
3037 " f();\n"
3038 "} catch (A a) MACRO(x) {\n"
3039 " g();\n"
3040 "} catch (B b) MACRO(x) {\n"
3041 " g();\n"
3042 "}");
3043}
3044
3045TEST_F(FormatTest, FormatTryCatchBraceStyles) {
3046 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00003047 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
3048 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00003049 Style.BreakBeforeBraces = BraceStyle;
3050 verifyFormat("try {\n"
3051 " // something\n"
3052 "} catch (...) {\n"
3053 " // something\n"
3054 "}",
3055 Style);
3056 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00003057 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
3058 verifyFormat("try {\n"
3059 " // something\n"
3060 "}\n"
3061 "catch (...) {\n"
3062 " // something\n"
3063 "}",
3064 Style);
Nico Weberfac23712015-02-04 15:26:27 +00003065 verifyFormat("__try {\n"
3066 " // something\n"
3067 "}\n"
3068 "__finally {\n"
3069 " // something\n"
3070 "}",
3071 Style);
Nico Weber33381f52015-02-07 01:57:32 +00003072 verifyFormat("@try {\n"
3073 " // something\n"
3074 "}\n"
3075 "@finally {\n"
3076 " // something\n"
3077 "}",
3078 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00003079 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3080 verifyFormat("try\n"
3081 "{\n"
3082 " // something\n"
3083 "}\n"
3084 "catch (...)\n"
3085 "{\n"
3086 " // something\n"
3087 "}",
3088 Style);
3089 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
3090 verifyFormat("try\n"
3091 " {\n"
3092 " // something\n"
3093 " }\n"
3094 "catch (...)\n"
3095 " {\n"
3096 " // something\n"
3097 " }",
3098 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00003099 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
3100 Style.BraceWrapping.BeforeCatch = true;
3101 verifyFormat("try {\n"
3102 " // something\n"
3103 "}\n"
3104 "catch (...) {\n"
3105 " // something\n"
3106 "}",
3107 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00003108}
3109
Daniel Jaspere25509f2012-12-17 11:29:41 +00003110TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003111 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00003112
Daniel Jaspera44991332015-04-29 13:06:49 +00003113 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
3114 " 100000000, "
3115 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00003116
Daniel Jasper473c62c2013-05-17 09:35:01 +00003117 // Here, everything other than the "}" would fit on a line.
3118 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003119 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00003120 EXPECT_EQ("S s = {a,\n"
3121 "\n"
3122 " b};",
3123 format("S s = {\n"
3124 " a,\n"
3125 "\n"
3126 " b\n"
3127 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00003128
3129 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
3130 // line. However, the formatting looks a bit off and this probably doesn't
3131 // happen often in practice.
3132 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003133 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00003134 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00003135}
3136
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003137TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003138 verifyFormat("const struct A a = {.a = 1, .b = 2};");
3139 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
3140 " .bbbbbbbbbb = 2,\n"
3141 " .cccccccccc = 3,\n"
3142 " .dddddddddd = 4,\n"
3143 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003144 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003145 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
3146 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
3147 " .ccccccccccccccccccccccccccc = 3,\n"
3148 " .ddddddddddddddddddddddddddd = 4,\n"
3149 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003150
3151 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
3152}
3153
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003154TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003155 verifyFormat("static A x = {{{}}};\n");
3156 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
3157 " {init1, init2, init3, init4}}};",
3158 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00003159
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003160 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003161 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
3162 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
3163 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
3164 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00003165 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00003166 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
3167 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
3168 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00003169 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
3170 " {rect.fRight - rect.fLeft, rect.fBottom - "
3171 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003172
Daniel Jasper8a8ce242013-01-31 14:59:26 +00003173 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00003174 "SomeArrayOfSomeType a = {\n"
3175 " {{1, 2, 3},\n"
3176 " {1, 2, 3},\n"
3177 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
3178 " 333333333333333333333333333333},\n"
3179 " {1, 2, 3},\n"
3180 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00003181 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00003182 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00003183 " {{1, 2, 3}},\n"
3184 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00003185 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
3186 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00003187 " {{1, 2, 3}},\n"
3188 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00003189
Daniel Jaspera44991332015-04-29 13:06:49 +00003190 verifyFormat("struct {\n"
3191 " unsigned bit;\n"
3192 " const char *const name;\n"
3193 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
3194 " {kOsWin, \"Windows\"},\n"
3195 " {kOsLinux, \"Linux\"},\n"
3196 " {kOsCrOS, \"Chrome OS\"}};");
3197 verifyFormat("struct {\n"
3198 " unsigned bit;\n"
3199 " const char *const name;\n"
3200 "} kBitsToOs[] = {\n"
3201 " {kOsMac, \"Mac\"},\n"
3202 " {kOsWin, \"Windows\"},\n"
3203 " {kOsLinux, \"Linux\"},\n"
3204 " {kOsCrOS, \"Chrome OS\"},\n"
3205 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003206}
3207
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003208TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
3209 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3210 " \\\n"
3211 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
3212}
3213
Daniel Jasperda16db32013-01-07 10:48:50 +00003214TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00003215 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
3216 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00003217
3218 // Do break defaulted and deleted functions.
3219 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
3220 " default;",
3221 getLLVMStyleWithColumns(40));
3222 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
3223 " delete;",
3224 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00003225}
3226
3227TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
3228 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
3229 getLLVMStyleWithColumns(40));
3230 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
3231 getLLVMStyleWithColumns(40));
3232 EXPECT_EQ("#define Q \\\n"
3233 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
3234 " \"aaaaaaaa.cpp\"",
3235 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
3236 getLLVMStyleWithColumns(40)));
3237}
3238
3239TEST_F(FormatTest, UnderstandsLinePPDirective) {
3240 EXPECT_EQ("# 123 \"A string literal\"",
3241 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00003242}
3243
Manuel Klimek591b5802013-01-31 15:58:48 +00003244TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00003245 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00003246 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003247}
3248
3249TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
3250 EXPECT_EQ("#line 42 \"test\"\n",
3251 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003252 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
3253 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003254}
3255
3256TEST_F(FormatTest, EndOfFileEndsPPDirective) {
3257 EXPECT_EQ("#line 42 \"test\"",
3258 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003259 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003260}
3261
Daniel Jasper877615c2013-10-11 19:45:02 +00003262TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
3263 verifyFormat("#define A \\x20");
3264 verifyFormat("#define A \\ x20");
3265 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
3266 verifyFormat("#define A ''");
3267 verifyFormat("#define A ''qqq");
3268 verifyFormat("#define A `qqq");
3269 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00003270 EXPECT_EQ("const char *c = STRINGIFY(\n"
3271 "\\na : b);",
3272 format("const char * c = STRINGIFY(\n"
3273 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00003274
3275 verifyFormat("a\r\\");
3276 verifyFormat("a\v\\");
3277 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00003278}
3279
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003280TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003281 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
3282 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003283 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003284 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00003285 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00003286
3287 verifyFormat("#define A A\n#define A A");
3288 verifyFormat("#define A(X) A\n#define A A");
3289
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003290 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
3291 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003292}
3293
3294TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00003295 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003296 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003297 "#define A( \\\n"
3298 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003299 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00003300 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00003301 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003302 " #include \"a.h\"\n"
3303 "#define A(A,\\\n"
3304 " B)\n"
3305 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00003306 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003307 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003308}
3309
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003310TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00003311
3312TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
3313 EXPECT_EQ("#define A \\\n"
3314 " c; \\\n"
3315 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003316 "f;",
3317 format("#define A c; e;\n"
3318 "f;",
3319 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00003320}
3321
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003322TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00003323
Manuel Klimek1abf7892013-01-04 23:34:14 +00003324TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00003325 EXPECT_EQ("int x,\n"
3326 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003327 " y;",
3328 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00003329}
3330
Manuel Klimek09e07972013-01-05 21:34:55 +00003331TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00003332 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00003333 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00003334 verifyFormat("#define A \\\n"
3335 " { \\\n"
3336 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003337 " }",
3338 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00003339
3340 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003341 " void function##X()",
3342 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00003343
3344 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003345 " void a##b##c()",
3346 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00003347
Daniel Jasper39825ea2013-01-14 15:40:57 +00003348 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00003349}
3350
Manuel Klimekd053c5b2013-01-23 14:37:36 +00003351TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00003352 EXPECT_EQ("#define A (x)", format("#define A (x)"));
3353 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00003354}
3355
Manuel Klimek0c137952013-02-11 12:33:24 +00003356TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
3357 EXPECT_EQ("#define A b;", format("#define A \\\n"
3358 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003359 " b;",
3360 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003361 EXPECT_EQ("#define A \\\n"
3362 " \\\n"
3363 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003364 " b;",
3365 format("#define A \\\n"
3366 " \\\n"
3367 " a; \\\n"
3368 " b;",
3369 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003370 EXPECT_EQ("#define A \\\n"
3371 " a; \\\n"
3372 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003373 " b;",
3374 format("#define A \\\n"
3375 " a; \\\n"
3376 " \\\n"
3377 " b;",
3378 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003379}
3380
Daniel Jasper00475962013-02-19 17:14:38 +00003381TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003382 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00003383 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00003384 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00003385 " case 2\n",
3386 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00003387 verifyFormat("#define MACRO(a) \\\n"
3388 " if (a) \\\n"
3389 " f(); \\\n"
3390 " else \\\n"
3391 " g()",
3392 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00003393 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003394 verifyIncompleteFormat("#define STR(x) #x\n"
3395 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00003396 verifyFormat("#pragma omp threadprivate( \\\n"
3397 " y)), // expected-warning",
3398 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00003399 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00003400 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003401 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00003402 "#define b \\\n"
3403 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003404 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003405 "a",
3406 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00003407 verifyFormat("#define A \\\n"
3408 " { \\\n"
3409 " {\n"
3410 "#define B \\\n"
3411 " } \\\n"
3412 " }",
3413 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00003414 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00003415 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00003416 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00003417 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00003418}
3419
Daniel Jasper40e19212013-05-29 13:16:10 +00003420TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
3421 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
3422 EXPECT_EQ("class A : public QObject {\n"
3423 " Q_OBJECT\n"
3424 "\n"
3425 " A() {}\n"
3426 "};",
3427 format("class A : public QObject {\n"
3428 " Q_OBJECT\n"
3429 "\n"
3430 " A() {\n}\n"
3431 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00003432 EXPECT_EQ("MACRO\n"
3433 "/*static*/ int i;",
3434 format("MACRO\n"
3435 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00003436 EXPECT_EQ("SOME_MACRO\n"
3437 "namespace {\n"
3438 "void f();\n"
3439 "}",
3440 format("SOME_MACRO\n"
3441 " namespace {\n"
3442 "void f( );\n"
3443 "}"));
Daniel Jasper40e19212013-05-29 13:16:10 +00003444 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00003445 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
3446 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00003447 // Only if everything is upper case.
3448 EXPECT_EQ("class A : public QObject {\n"
3449 " Q_Object A() {}\n"
3450 "};",
3451 format("class A : public QObject {\n"
3452 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00003453 " A() {\n}\n"
3454 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00003455
3456 // Only if the next line can actually start an unwrapped line.
3457 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
3458 format("SOME_WEIRD_LOG_MACRO\n"
3459 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00003460
3461 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00003462 "(n, buffers))\n",
3463 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00003464}
3465
Alexander Kornienkode644272013-04-08 22:16:06 +00003466TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
3467 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3468 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3469 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003470 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00003471 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3472 "int *createScopDetectionPass() { return 0; }",
3473 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3474 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3475 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
3476 " class X {};\n"
3477 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3478 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003479 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
3480 // braces, so that inner block is indented one level more.
3481 EXPECT_EQ("int q() {\n"
3482 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3483 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3484 " IPC_END_MESSAGE_MAP()\n"
3485 "}",
3486 format("int q() {\n"
3487 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3488 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3489 " IPC_END_MESSAGE_MAP()\n"
3490 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00003491
Daniel Jasper352dae12014-01-03 11:50:46 +00003492 // Same inside macros.
3493 EXPECT_EQ("#define LIST(L) \\\n"
3494 " L(A) \\\n"
3495 " L(B) \\\n"
3496 " L(C)",
3497 format("#define LIST(L) \\\n"
3498 " L(A) \\\n"
3499 " L(B) \\\n"
3500 " L(C)",
3501 getGoogleStyle()));
3502
Daniel Jasper545c6522013-09-17 09:26:07 +00003503 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003504 EXPECT_EQ("int q() {\n"
3505 " f(x);\n"
3506 " f(x) {}\n"
3507 " f(x)->g();\n"
3508 " f(x)->*g();\n"
3509 " f(x).g();\n"
3510 " f(x) = x;\n"
3511 " f(x) += x;\n"
3512 " f(x) -= x;\n"
3513 " f(x) *= x;\n"
3514 " f(x) /= x;\n"
3515 " f(x) %= x;\n"
3516 " f(x) &= x;\n"
3517 " f(x) |= x;\n"
3518 " f(x) ^= x;\n"
3519 " f(x) >>= x;\n"
3520 " f(x) <<= x;\n"
3521 " f(x)[y].z();\n"
3522 " LOG(INFO) << x;\n"
3523 " ifstream(x) >> x;\n"
3524 "}\n",
3525 format("int q() {\n"
3526 " f(x)\n;\n"
3527 " f(x)\n {}\n"
3528 " f(x)\n->g();\n"
3529 " f(x)\n->*g();\n"
3530 " f(x)\n.g();\n"
3531 " f(x)\n = x;\n"
3532 " f(x)\n += x;\n"
3533 " f(x)\n -= x;\n"
3534 " f(x)\n *= x;\n"
3535 " f(x)\n /= x;\n"
3536 " f(x)\n %= x;\n"
3537 " f(x)\n &= x;\n"
3538 " f(x)\n |= x;\n"
3539 " f(x)\n ^= x;\n"
3540 " f(x)\n >>= x;\n"
3541 " f(x)\n <<= x;\n"
3542 " f(x)\n[y].z();\n"
3543 " LOG(INFO)\n << x;\n"
3544 " ifstream(x)\n >> x;\n"
3545 "}\n"));
3546 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003547 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003548 " if (1) {\n"
3549 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003550 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003551 " while (1) {\n"
3552 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003553 " F(x)\n"
3554 " G(x);\n"
3555 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003556 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003557 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003558 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003559 " }\n"
3560 "}\n",
3561 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003562 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003563 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003564 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003565 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003566 "F(x)\n"
3567 "G(x);\n"
3568 "F(x)\n"
3569 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003570 "}\n"));
3571 EXPECT_EQ("class A {\n"
3572 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00003573 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003574 " A(X x)\n" // FIXME: function-level try blocks are broken.
3575 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003576 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003577 " }\n"
3578 "};",
3579 format("class A {\n"
3580 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00003581 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003582 " A(X x)\n"
3583 " try : t(0) {} catch (...) {}\n"
3584 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00003585 EXPECT_EQ("class SomeClass {\n"
3586 "public:\n"
3587 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3588 "};",
3589 format("class SomeClass {\n"
3590 "public:\n"
3591 " SomeClass()\n"
3592 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3593 "};"));
3594 EXPECT_EQ("class SomeClass {\n"
3595 "public:\n"
3596 " SomeClass()\n"
3597 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3598 "};",
3599 format("class SomeClass {\n"
3600 "public:\n"
3601 " SomeClass()\n"
3602 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3603 "};",
3604 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00003605
3606 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00003607}
3608
Manuel Klimek4fe43002013-05-22 12:51:29 +00003609TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
3610 verifyFormat("#define A \\\n"
3611 " f({ \\\n"
3612 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003613 " });",
3614 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00003615}
3616
Manuel Klimekef2cfb12013-01-05 22:14:16 +00003617TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
3618 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
3619}
3620
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003621TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003622 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003623}
3624
Manuel Klimek1058d982013-01-06 20:07:31 +00003625TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3626 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
3627 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3628 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
3629 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3630}
Manuel Klimek1abf7892013-01-04 23:34:14 +00003631
Daniel Jaspere2408e32015-05-06 11:16:43 +00003632TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003633 EXPECT_EQ(
3634 "#define A \\\n int i; \\\n int j;",
3635 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003636 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00003637 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003638 EXPECT_EQ("/* \\ \\ \\\n*/", format("\\\n/* \\ \\ \\\n*/"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00003639 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003640}
3641
Alexander Kornienko00691cf2015-01-12 13:11:12 +00003642TEST_F(FormatTest, DontCrashOnBlockComments) {
3643 EXPECT_EQ(
3644 "int xxxxxxxxx; /* "
3645 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\n"
3646 "zzzzzz\n"
3647 "0*/",
3648 format("int xxxxxxxxx; /* "
3649 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzz\n"
3650 "0*/"));
3651}
3652
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003653TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3654 verifyFormat("#define A \\\n"
3655 " int v( \\\n"
3656 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003657 " int i;",
3658 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003659}
3660
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003661TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00003662 EXPECT_EQ(
3663 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3664 " \\\n"
3665 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3666 "\n"
3667 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3668 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3669 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
3670 "\\\n"
3671 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3672 " \n"
3673 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3674 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003675}
3676
Manuel Klimek52b15152013-01-09 15:25:02 +00003677TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3678 EXPECT_EQ("int\n"
3679 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003680 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003681 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003682 verifyFormat("functionCallTo(\n"
3683 " someOtherFunction(\n"
3684 " withSomeParameters, whichInSequence,\n"
3685 " areLongerThanALine(andAnotherCall,\n"
3686 "#define A B\n"
3687 " withMoreParamters,\n"
3688 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003689 " andMoreParameters),\n"
3690 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003691 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00003692 verifyFormat("Foo::Foo()\n"
3693 "#ifdef BAR\n"
3694 " : baz(0)\n"
3695 "#endif\n"
3696 "{\n"
3697 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00003698 verifyFormat("void f() {\n"
3699 " if (true)\n"
3700 "#ifdef A\n"
3701 " f(42);\n"
3702 " x();\n"
3703 "#else\n"
3704 " g();\n"
3705 " x();\n"
3706 "#endif\n"
3707 "}");
3708 verifyFormat("void f(param1, param2,\n"
3709 " param3,\n"
3710 "#ifdef A\n"
3711 " param4(param5,\n"
3712 "#ifdef A1\n"
3713 " param6,\n"
3714 "#ifdef A2\n"
3715 " param7),\n"
3716 "#else\n"
3717 " param8),\n"
3718 " param9,\n"
3719 "#endif\n"
3720 " param10,\n"
3721 "#endif\n"
3722 " param11)\n"
3723 "#else\n"
3724 " param12)\n"
3725 "#endif\n"
3726 "{\n"
3727 " x();\n"
3728 "}",
3729 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00003730 verifyFormat("#if 1\n"
3731 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003732 verifyFormat("#if 1\n"
3733 "#endif\n"
3734 "#if 1\n"
3735 "#else\n"
3736 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00003737 verifyFormat("DEBUG({\n"
3738 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3739 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3740 "});\n"
3741 "#if a\n"
3742 "#else\n"
3743 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00003744
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003745 verifyIncompleteFormat("void f(\n"
3746 "#if A\n"
3747 " );\n"
3748 "#else\n"
3749 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00003750}
3751
Manuel Klimek14bd9172014-01-29 08:49:02 +00003752TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3753 verifyFormat("#endif\n"
3754 "#if B");
3755}
3756
Manuel Klimek88033d72013-10-21 08:11:15 +00003757TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3758 FormatStyle SingleLine = getLLVMStyle();
3759 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00003760 verifyFormat("#if 0\n"
3761 "#elif 1\n"
3762 "#endif\n"
3763 "void foo() {\n"
3764 " if (test) foo2();\n"
3765 "}",
3766 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00003767}
3768
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003769TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00003770 verifyFormat("functionCall({ int i; });");
3771 verifyFormat("functionCall({\n"
3772 " int i;\n"
3773 " int j;\n"
3774 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00003775 verifyFormat("functionCall(\n"
3776 " {\n"
3777 " int i;\n"
3778 " int j;\n"
3779 " },\n"
3780 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00003781 verifyFormat("functionA(functionB({\n"
3782 " int i;\n"
3783 " int j;\n"
3784 " }),\n"
3785 " aaaa, bbbb, cccc);");
3786 verifyFormat("functionCall(\n"
3787 " {\n"
3788 " int i;\n"
3789 " int j;\n"
3790 " },\n"
3791 " aaaa, bbbb, // comment\n"
3792 " cccc);");
3793 verifyFormat("functionA(functionB({\n"
3794 " int i;\n"
3795 " int j;\n"
3796 " }),\n"
3797 " aaaa, bbbb, // comment\n"
3798 " cccc);");
3799 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3800 verifyFormat("functionCall(aaaa, bbbb, {\n"
3801 " int i;\n"
3802 " int j;\n"
3803 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00003804 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00003805 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00003806 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003807 " int i; // break\n"
3808 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00003809 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3810 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003811 verifyFormat("DEBUG({\n"
3812 " if (a)\n"
3813 " f();\n"
3814 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003815}
3816
3817TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003818 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003819 "int i;",
3820 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003821}
3822
3823TEST_F(FormatTest, LayoutNestedBlocks) {
3824 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3825 " struct s {\n"
3826 " int i;\n"
3827 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003828 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003829 " for (int i = 0; i < 10; ++i)\n"
3830 " return;\n"
3831 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003832 verifyFormat("call(parameter, {\n"
3833 " something();\n"
3834 " // Comment using all columns.\n"
3835 " somethingelse();\n"
3836 "});",
3837 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00003838 verifyFormat("DEBUG( //\n"
3839 " { f(); }, a);");
3840 verifyFormat("DEBUG( //\n"
3841 " {\n"
3842 " f(); //\n"
3843 " },\n"
3844 " a);");
3845
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003846 EXPECT_EQ("call(parameter, {\n"
3847 " something();\n"
3848 " // Comment too\n"
3849 " // looooooooooong.\n"
3850 " somethingElse();\n"
3851 "});",
3852 format("call(parameter, {\n"
3853 " something();\n"
3854 " // Comment too looooooooooong.\n"
3855 " somethingElse();\n"
3856 "});",
3857 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003858 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003859 EXPECT_EQ("DEBUG({ // comment\n"
3860 " int i;\n"
3861 "});",
3862 format("DEBUG({ // comment\n"
3863 "int i;\n"
3864 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003865 EXPECT_EQ("DEBUG({\n"
3866 " int i;\n"
3867 "\n"
3868 " // comment\n"
3869 " int j;\n"
3870 "});",
3871 format("DEBUG({\n"
3872 " int i;\n"
3873 "\n"
3874 " // comment\n"
3875 " int j;\n"
3876 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003877
3878 verifyFormat("DEBUG({\n"
3879 " if (a)\n"
3880 " return;\n"
3881 "});");
3882 verifyGoogleFormat("DEBUG({\n"
3883 " if (a) return;\n"
3884 "});");
3885 FormatStyle Style = getGoogleStyle();
3886 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003887 verifyFormat("Debug(aaaaa,\n"
3888 " {\n"
3889 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3890 " },\n"
3891 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003892 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003893
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003894 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3895
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003896 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003897}
3898
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003899TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3900 EXPECT_EQ("#define MACRO() \\\n"
3901 " Debug(aaa, /* force line break */ \\\n"
3902 " { \\\n"
3903 " int i; \\\n"
3904 " int j; \\\n"
3905 " })",
3906 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3907 " { int i; int j; })",
3908 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003909
3910 EXPECT_EQ("#define A \\\n"
3911 " [] { \\\n"
3912 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3913 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3914 " }",
3915 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3916 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3917 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003918}
3919
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003920TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3921 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003922 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003923 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003924}
3925
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003926TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3927 FormatStyle Style = getLLVMStyle();
3928 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3929 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3930 verifyFormat("FOO_BEGIN\n"
3931 " FOO_ENTRY\n"
3932 "FOO_END", Style);
3933 verifyFormat("FOO_BEGIN\n"
3934 " NESTED_FOO_BEGIN\n"
3935 " NESTED_FOO_ENTRY\n"
3936 " NESTED_FOO_END\n"
3937 "FOO_END", Style);
3938 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3939 " int x;\n"
3940 " x = 1;\n"
3941 "FOO_END(Baz)", Style);
3942}
3943
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003944//===----------------------------------------------------------------------===//
3945// Line break tests.
3946//===----------------------------------------------------------------------===//
3947
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003948TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003949 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003950 "void f() {\n"
3951 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3952 " parameter, parameter, parameter)),\n"
3953 " SecondLongCall(parameter));\n"
3954 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003955 verifyFormat(
3956 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3957 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3958 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3959 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3960 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003961 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3962 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3963 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3964 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003965 verifyFormat(
3966 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3967 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3968 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3969 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003970 verifyFormat("int a = bbbb && ccc &&\n"
3971 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003972 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003973 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003974}
3975
Daniel Jasperd69fc772013-05-08 14:12:04 +00003976TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3977 verifyFormat(
3978 "bool aaaaaaa =\n"
3979 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3980 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003981 verifyFormat(
3982 "bool aaaaaaa =\n"
3983 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3984 " bbbbbbbb();");
3985
Daniel Jasperd69fc772013-05-08 14:12:04 +00003986 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3987 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3988 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003989 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3990 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3991 " ccccccccc == ddddddddddd;");
3992 verifyFormat(
3993 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3994 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3995 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003996
3997 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3998 " aaaaaa) &&\n"
3999 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00004000 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
4001 " aaaaaa) >>\n"
4002 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00004003 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00004004 " SourceMgr.getSpellingColumnNumber(\n"
4005 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
4006 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00004007
Daniel Jasper68d888c2013-06-03 08:42:05 +00004008 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4009 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
4010 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00004011 verifyFormat("b = a &&\n"
4012 " // Comment\n"
4013 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00004014
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00004015 // If the LHS of a comparison is not a binary expression itself, the
4016 // additional linebreak confuses many people.
4017 verifyFormat(
4018 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4019 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
4020 "}");
4021 verifyFormat(
4022 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4023 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4024 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00004025 verifyFormat(
4026 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
4027 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4028 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00004029 // Even explicit parentheses stress the precedence enough to make the
4030 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00004031 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4032 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4033 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00004034 // This cases is borderline, but with the indentation it is still readable.
4035 verifyFormat(
4036 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4037 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4038 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
4039 "}",
4040 getLLVMStyleWithColumns(75));
4041
4042 // If the LHS is a binary expression, we should still use the additional break
4043 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00004044 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4045 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4046 " 5) {\n"
4047 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00004048
Daniel Jasper571f1af2013-05-14 20:39:56 +00004049 FormatStyle OnePerLine = getLLVMStyle();
4050 OnePerLine.BinPackParameters = false;
4051 verifyFormat(
4052 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4053 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4054 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
4055 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00004056
4057 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
4058 " .aaa(aaaaaaaaaaaaa) *\n"
4059 " aaaaaaa +\n"
4060 " aaaaaaa;",
4061 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00004062}
4063
Daniel Jasper6bee6822013-04-08 20:33:42 +00004064TEST_F(FormatTest, ExpressionIndentation) {
4065 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4066 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4067 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4068 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4069 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4070 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
4071 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4072 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
4073 " ccccccccccccccccccccccccccccccccccccccccc;");
4074 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4075 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4076 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4077 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4078 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4079 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4080 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4081 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4082 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4083 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4084 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4085 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00004086 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004087 "} else if (aaaaa && bbbbb > // break\n"
4088 " ccccc) {\n"
4089 "}");
4090 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00004091 "} else if (aaaaa &&\n"
4092 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004093 " ccccc &&\n"
4094 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00004095 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00004096
4097 // Presence of a trailing comment used to change indentation of b.
4098 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
4099 " b;\n"
4100 "return aaaaaaaaaaaaaaaaaaa +\n"
4101 " b; //",
4102 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00004103}
4104
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004105TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
4106 // Not sure what the best system is here. Like this, the LHS can be found
4107 // immediately above an operator (everything with the same or a higher
4108 // indent). The RHS is aligned right of the operator and so compasses
4109 // everything until something with the same indent as the operator is found.
4110 // FIXME: Is this a good system?
4111 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00004112 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004113 verifyFormat(
4114 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004115 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4116 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4117 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4118 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4119 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004120 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004121 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4122 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004123 Style);
4124 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004125 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4126 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004127 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4128 Style);
4129 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004130 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4131 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004132 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4133 Style);
4134 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4135 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004136 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4137 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004138 Style);
4139 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004140 "} else if (aaaaa\n"
4141 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004142 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004143 "}",
4144 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00004145 verifyFormat("return (a)\n"
4146 " // comment\n"
4147 " + b;",
4148 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004149 verifyFormat(
4150 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4151 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4152 " + cc;",
4153 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00004154
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00004155 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4156 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4157 Style);
4158
Daniel Jasper9e5ede02013-11-08 19:56:28 +00004159 // Forced by comments.
4160 verifyFormat(
4161 "unsigned ContentSize =\n"
4162 " sizeof(int16_t) // DWARF ARange version number\n"
4163 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4164 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
4165 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00004166
4167 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
4168 " == boost::fusion::at_c<1>(iiii).second;",
4169 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00004170
4171 Style.ColumnLimit = 60;
4172 verifyFormat("zzzzzzzzzz\n"
4173 " = bbbbbbbbbbbbbbbbb\n"
4174 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
4175 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004176}
4177
Daniel Jasperb1270392017-02-01 23:27:37 +00004178TEST_F(FormatTest, EnforcedOperatorWraps) {
4179 // Here we'd like to wrap after the || operators, but a comment is forcing an
4180 // earlier wrap.
4181 verifyFormat("bool x = aaaaa //\n"
4182 " || bbbbb\n"
4183 " //\n"
4184 " || cccc;");
4185}
4186
Daniel Jasper3219e432014-12-02 13:24:51 +00004187TEST_F(FormatTest, NoOperandAlignment) {
4188 FormatStyle Style = getLLVMStyle();
4189 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00004190 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
4191 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4192 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4193 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004194 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00004195 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4196 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4197 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4198 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4199 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4200 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4201 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4202 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4203 " > ccccccccccccccccccccccccccccccccccccccccc;",
4204 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004205
4206 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4207 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4208 " + cc;",
4209 Style);
4210 verifyFormat("int a = aa\n"
4211 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004212 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00004213 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00004214
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004215 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00004216 verifyFormat("return (a > b\n"
4217 " // comment1\n"
4218 " // comment2\n"
4219 " || c);",
4220 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004221}
4222
Daniel Jasperac043c92014-09-15 11:11:00 +00004223TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
4224 FormatStyle Style = getLLVMStyle();
4225 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4226 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4227 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00004228 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4229 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00004230}
4231
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004232TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004233 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004234 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
4235 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004236 verifyFormat("Constructor()\n"
4237 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004238 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004239 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004240 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004241 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004242
Daniel Jasper7b259cd2015-08-27 11:59:31 +00004243 verifyFormat("template <typename T>\n"
4244 "Constructor() : Initializer(FitsOnTheLine) {}",
4245 getLLVMStyleWithColumns(45));
4246
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004247 verifyFormat(
4248 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004249 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004250
4251 verifyFormat(
4252 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004253 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004254 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004255 verifyFormat(
4256 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004257 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004258 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00004259 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4260 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4261 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004262
4263 verifyFormat("Constructor()\n"
4264 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4265 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4266 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004267 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004268
Daniel Jasper65585ed2013-01-28 13:31:35 +00004269 verifyFormat("Constructor()\n"
4270 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004271 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00004272
Daniel Jasper62e68172013-02-25 15:59:54 +00004273 verifyFormat("Constructor(int Parameter = 0)\n"
4274 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4275 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00004276 verifyFormat("Constructor()\n"
4277 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4278 "}",
4279 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00004280 verifyFormat("Constructor()\n"
4281 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4282 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00004283
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004284 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00004285 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004286 verifyFormat("Constructor()\n"
4287 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4288 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
4289 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004290
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004291 FormatStyle OnePerLine = getLLVMStyle();
4292 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00004293 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004294 verifyFormat("SomeClass::Constructor()\n"
4295 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4296 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004297 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004298 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004299 verifyFormat("SomeClass::Constructor()\n"
4300 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4301 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004302 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004303 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004304 verifyFormat("MyClass::MyClass(int var)\n"
4305 " : some_var_(var), // 4 space indent\n"
4306 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004307 "}",
4308 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00004309 verifyFormat("Constructor()\n"
4310 " : aaaaa(aaaaaa),\n"
4311 " aaaaa(aaaaaa),\n"
4312 " aaaaa(aaaaaa),\n"
4313 " aaaaa(aaaaaa),\n"
4314 " aaaaa(aaaaaa) {}",
4315 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00004316 verifyFormat("Constructor()\n"
4317 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4318 " aaaaaaaaaaaaaaaaaaaaaa) {}",
4319 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00004320 OnePerLine.BinPackParameters = false;
4321 verifyFormat(
4322 "Constructor()\n"
4323 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4324 " aaaaaaaaaaa().aaa(),\n"
4325 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4326 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00004327 OnePerLine.ColumnLimit = 60;
4328 verifyFormat("Constructor()\n"
4329 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
4330 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4331 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00004332
4333 EXPECT_EQ("Constructor()\n"
4334 " : // Comment forcing unwanted break.\n"
4335 " aaaa(aaaa) {}",
4336 format("Constructor() :\n"
4337 " // Comment forcing unwanted break.\n"
4338 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004339}
4340
4341TEST_F(FormatTest, MemoizationTests) {
4342 // This breaks if the memoization lookup does not take \c Indent and
4343 // \c LastSpace into account.
4344 verifyFormat(
4345 "extern CFRunLoopTimerRef\n"
4346 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
4347 " CFTimeInterval interval, CFOptionFlags flags,\n"
4348 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00004349 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004350
4351 // Deep nesting somewhat works around our memoization.
4352 verifyFormat(
4353 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4354 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4355 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4356 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4357 " aaaaa())))))))))))))))))))))))))))))))))))))));",
4358 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00004359 verifyFormat(
4360 "aaaaa(\n"
4361 " aaaaa,\n"
4362 " aaaaa(\n"
4363 " aaaaa,\n"
4364 " aaaaa(\n"
4365 " aaaaa,\n"
4366 " aaaaa(\n"
4367 " aaaaa,\n"
4368 " aaaaa(\n"
4369 " aaaaa,\n"
4370 " aaaaa(\n"
4371 " aaaaa,\n"
4372 " aaaaa(\n"
4373 " aaaaa,\n"
4374 " aaaaa(\n"
4375 " aaaaa,\n"
4376 " aaaaa(\n"
4377 " aaaaa,\n"
4378 " aaaaa(\n"
4379 " aaaaa,\n"
4380 " aaaaa(\n"
4381 " aaaaa,\n"
4382 " aaaaa(\n"
4383 " aaaaa,\n"
4384 " aaaaa))))))))))));",
4385 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00004386 verifyFormat(
4387 "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"
4388 " a),\n"
4389 " a),\n"
4390 " a),\n"
4391 " a),\n"
4392 " a),\n"
4393 " a),\n"
4394 " a),\n"
4395 " a),\n"
4396 " a),\n"
4397 " a),\n"
4398 " a),\n"
4399 " a),\n"
4400 " a),\n"
4401 " a),\n"
4402 " a),\n"
4403 " a),\n"
4404 " a)",
4405 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00004406
4407 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004408 FormatStyle OnePerLine = getLLVMStyle();
4409 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004410 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00004411 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00004412 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00004413 for (unsigned i = 0, e = 80; i != e; ++i) {
4414 input += " a,\n";
4415 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004416 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004417 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004418}
4419
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004420TEST_F(FormatTest, BreaksAsHighAsPossible) {
4421 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004422 "void f() {\n"
4423 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
4424 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
4425 " f();\n"
4426 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00004427 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004428 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004429}
4430
Daniel Jasper6728fc12013-04-11 14:29:13 +00004431TEST_F(FormatTest, BreaksFunctionDeclarations) {
4432 // Principially, we break function declarations in a certain order:
4433 // 1) break amongst arguments.
4434 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
4435 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004436 verifyFormat("template <class TemplateIt>\n"
4437 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
4438 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00004439
4440 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00004441 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004442 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004443 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004444 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004445
4446 // 3) break after (.
4447 verifyFormat(
4448 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00004449 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
4450 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004451
4452 // 4) break before after nested name specifiers.
4453 verifyFormat(
4454 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004455 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
4456 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004457 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004458
4459 // However, there are exceptions, if a sufficient amount of lines can be
4460 // saved.
4461 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
4462 // more adjusting.
4463 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4464 " Cccccccccccccc cccccccccc,\n"
4465 " Cccccccccccccc cccccccccc,\n"
4466 " Cccccccccccccc cccccccccc,\n"
4467 " Cccccccccccccc cccccccccc);");
4468 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004469 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004470 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4471 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4472 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004473 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004474 verifyFormat(
4475 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4476 " Cccccccccccccc cccccccccc,\n"
4477 " Cccccccccccccc cccccccccc,\n"
4478 " Cccccccccccccc cccccccccc,\n"
4479 " Cccccccccccccc cccccccccc,\n"
4480 " Cccccccccccccc cccccccccc,\n"
4481 " Cccccccccccccc cccccccccc);");
4482 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4483 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4484 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4485 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4486 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00004487
4488 // Break after multi-line parameters.
4489 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4490 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4491 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4492 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00004493 verifyFormat("void SomeLoooooooooooongFunction(\n"
4494 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
4495 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4496 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004497
4498 // Treat overloaded operators like other functions.
4499 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4500 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00004501 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4502 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00004503 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4504 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
4505 verifyGoogleFormat(
4506 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
4507 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004508 verifyGoogleFormat(
4509 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
4510 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00004511 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4512 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4513 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
4514 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00004515 verifyGoogleFormat(
4516 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
4517 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4518 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00004519 verifyGoogleFormat(
4520 "template <typename T>\n"
4521 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4522 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
4523 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00004524
4525 FormatStyle Style = getLLVMStyle();
4526 Style.PointerAlignment = FormatStyle::PAS_Left;
4527 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4528 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
4529 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004530 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
4531 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4532 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00004533}
4534
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004535TEST_F(FormatTest, TrailingReturnType) {
4536 verifyFormat("auto foo() -> int;\n");
4537 verifyFormat("struct S {\n"
4538 " auto bar() const -> int;\n"
4539 "};");
4540 verifyFormat("template <size_t Order, typename T>\n"
4541 "auto load_img(const std::string &filename)\n"
4542 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00004543 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
4544 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00004545 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00004546 verifyFormat("template <typename T>\n"
4547 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
4548 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00004549
4550 // Not trailing return types.
4551 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004552}
4553
Daniel Jasper5be31f72013-05-21 09:16:31 +00004554TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004555 // Avoid breaking before trailing 'const' or other trailing annotations, if
4556 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00004557 FormatStyle Style = getGoogleStyle();
4558 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00004559 verifyFormat("void someLongFunction(\n"
4560 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00004561 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00004562 verifyFormat("LoooooongReturnType\n"
4563 "someLoooooooongFunction() const {}",
4564 getLLVMStyleWithColumns(47));
4565 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
4566 " const {}",
4567 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004568 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4569 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
4570 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4571 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
4572 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4573 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00004574 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
4575 " aaaaaaaaaaa aaaaa) const override;");
4576 verifyGoogleFormat(
4577 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4578 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004579
Daniel Jasper5550de62014-02-17 07:57:46 +00004580 // Even if the first parameter has to be wrapped.
4581 verifyFormat("void someLongFunction(\n"
4582 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004583 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00004584 verifyFormat("void someLongFunction(\n"
4585 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004586 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00004587 verifyFormat("void someLongFunction(\n"
4588 " int someLongParameter) override {}",
4589 Style);
4590 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004591 " int someLongParameter) OVERRIDE {}",
4592 Style);
4593 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004594 " int someLongParameter) final {}",
4595 Style);
4596 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004597 " int someLongParameter) FINAL {}",
4598 Style);
4599 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004600 " int parameter) const override {}",
4601 Style);
4602
Daniel Jaspere3f907f2014-06-02 09:52:08 +00004603 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
4604 verifyFormat("void someLongFunction(\n"
4605 " int someLongParameter) const\n"
4606 "{\n"
4607 "}",
4608 Style);
4609
Daniel Jasper5550de62014-02-17 07:57:46 +00004610 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004611 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
4612 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4613 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00004614
4615 // Breaking before function-like trailing annotations is fine to keep them
4616 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00004617 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4618 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4619 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4620 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4621 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4622 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00004623 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4624 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00004625 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004626
4627 verifyFormat(
4628 "void aaaaaaaaaaaaaaaaaa()\n"
4629 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4630 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
4631 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4632 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004633 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004634 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004635 " GUARDED_BY(aaaaaaaaaaaa);");
4636 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004637 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004638 " GUARDED_BY(aaaaaaaaaaaa);");
4639 verifyGoogleFormat(
4640 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4641 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004642 verifyGoogleFormat(
4643 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4644 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004645}
4646
Daniel Jasperf090f032015-05-18 09:47:22 +00004647TEST_F(FormatTest, FunctionAnnotations) {
4648 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004649 "int OldFunction(const string &parameter) {}");
4650 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004651 "string OldFunction(const string &parameter) {}");
4652 verifyFormat("template <typename T>\n"
4653 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4654 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004655
4656 // Not function annotations.
4657 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4658 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004659 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4660 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004661 verifyFormat("MACRO(abc).function() // wrap\n"
4662 " << abc;");
4663 verifyFormat("MACRO(abc)->function() // wrap\n"
4664 " << abc;");
4665 verifyFormat("MACRO(abc)::function() // wrap\n"
4666 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004667}
4668
Daniel Jasperf7935112012-12-03 18:12:45 +00004669TEST_F(FormatTest, BreaksDesireably) {
4670 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4671 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004672 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004673 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4674 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4675 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004676
4677 verifyFormat(
4678 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004679 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004680
4681 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4682 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4683 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004684
4685 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004686 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4687 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4688 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004689 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4690 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004691
4692 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4693 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4694
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004695 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004696 "void f() {\n"
4697 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4698 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4699 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004700 verifyFormat(
4701 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4702 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4703 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004704 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4705 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4706 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004707 "aaaaaa(aaa,\n"
4708 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004709 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4710 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004711 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4712 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4713 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004714
Daniel Jasper739b85f2015-06-29 10:42:59 +00004715 // Indent consistently independent of call expression and unary operator.
4716 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4717 " dddddddddddddddddddddddddddddd));");
4718 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4719 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004720 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004721 " dddddddddddddddddddddddddddddd));");
4722
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004723 // This test case breaks on an incorrect memoization, i.e. an optimization not
4724 // taking into account the StopAt value.
4725 verifyFormat(
4726 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004727 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4728 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4729 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004730
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004731 verifyFormat("{\n {\n {\n"
4732 " Annotation.SpaceRequiredBefore =\n"
4733 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4734 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4735 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004736
4737 // Break on an outer level if there was a break on an inner level.
4738 EXPECT_EQ("f(g(h(a, // comment\n"
4739 " b, c),\n"
4740 " d, e),\n"
4741 " x, y);",
4742 format("f(g(h(a, // comment\n"
4743 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004744
4745 // Prefer breaking similar line breaks.
4746 verifyFormat(
4747 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4748 " NSTrackingMouseEnteredAndExited |\n"
4749 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004750}
4751
Daniel Jasper18210d72014-10-09 09:52:05 +00004752TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4753 FormatStyle NoBinPacking = getGoogleStyle();
4754 NoBinPacking.BinPackParameters = false;
4755 NoBinPacking.BinPackArguments = true;
4756 verifyFormat("void f() {\n"
4757 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4758 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4759 "}",
4760 NoBinPacking);
4761 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4762 " int aaaaaaaaaaaaaaaaaaaa,\n"
4763 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4764 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004765
Daniel Jasper00693b082016-01-09 15:56:47 +00004766 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4767 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4768 " vector<int> bbbbbbbbbbbbbbb);",
4769 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004770 // FIXME: This behavior difference is probably not wanted. However, currently
4771 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4772 // template arguments from BreakBeforeParameter being set because of the
4773 // one-per-line formatting.
4774 verifyFormat(
4775 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4776 " aaaaaaaaaa> aaaaaaaaaa);",
4777 NoBinPacking);
4778 verifyFormat(
4779 "void fffffffffff(\n"
4780 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4781 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004782}
4783
Daniel Jasper9278eb92013-01-16 14:59:02 +00004784TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004785 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004786 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004787 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004788 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4789 " aaaaaaaaaaaaaaaaaaaa,\n"
4790 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4791 NoBinPacking);
4792 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4793 " aaaaaaaaaaaaa,\n"
4794 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4795 NoBinPacking);
4796 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004797 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4798 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4799 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4800 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004801 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4802 NoBinPacking);
4803 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4804 " .aaaaaaaaaaaaaaaaaa();",
4805 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004806 verifyFormat("void f() {\n"
4807 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4808 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4809 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004810 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004811
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004812 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004813 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4814 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004815 " aaaaaaaaaaaa);",
4816 NoBinPacking);
4817 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004818 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4819 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004820 " test);",
4821 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004822
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004823 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4824 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004825 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4826 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004827 NoBinPacking);
4828 verifyFormat("a(\"a\"\n"
4829 " \"a\",\n"
4830 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004831
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004832 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004833 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004834 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004835 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004836 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004837 verifyFormat(
4838 "void f() {\n"
4839 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4840 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004841 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004842 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004843 verifyFormat(
4844 "template <class SomeType, class SomeOtherType>\n"
4845 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4846 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004847}
4848
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004849TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4850 FormatStyle Style = getLLVMStyleWithColumns(15);
4851 Style.ExperimentalAutoDetectBinPacking = true;
4852 EXPECT_EQ("aaa(aaaa,\n"
4853 " aaaa,\n"
4854 " aaaa);\n"
4855 "aaa(aaaa,\n"
4856 " aaaa,\n"
4857 " aaaa);",
4858 format("aaa(aaaa,\n" // one-per-line
4859 " aaaa,\n"
4860 " aaaa );\n"
4861 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4862 Style));
4863 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4864 " aaaa);\n"
4865 "aaa(aaaa, aaaa,\n"
4866 " aaaa);",
4867 format("aaa(aaaa, aaaa,\n" // bin-packed
4868 " aaaa );\n"
4869 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4870 Style));
4871}
4872
Daniel Jasper04468962013-01-18 10:56:38 +00004873TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004874 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4875 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4876 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4877 " .StartsWith(\".init\", ORDER_INIT)\n"
4878 " .StartsWith(\".fini\", ORDER_FINI)\n"
4879 " .StartsWith(\".hash\", ORDER_HASH)\n"
4880 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004881
Daniel Jaspereb50c672013-02-15 20:33:06 +00004882 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004883 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004884 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004885 "aaaaaaa->aaaaaaa\n"
4886 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4887 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004888 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004889 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004890 "aaaaaaa->aaaaaaa\n"
4891 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4892 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4893 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004894 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004895 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004896 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004897 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4898 " aaaaaa->aaaaaaaaaaaa()\n"
4899 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004900 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004901 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004902 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004903 "void f() {\n"
4904 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004905 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004906 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004907 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004908 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004909 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004910 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004911 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004912 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004913 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004914 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004915 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004916
4917 verifyFormat(
4918 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4919 verifyFormat("aaaaaaaaaaaaaaa()\n"
4920 " .aaaaaaaaaaaaaaa()\n"
4921 " .aaaaaaaaaaaaaaa()\n"
4922 " .aaaaaaaaaaaaaaa()\n"
4923 " .aaaaaaaaaaaaaaa();");
4924 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4925 " .aaaaaaaaaaaaaaa()\n"
4926 " .aaaaaaaaaaaaaaa()\n"
4927 " .aaaaaaaaaaaaaaa();");
4928 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4929 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4930 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004931 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4932 " ->aaaaaaaaaaaaaae(0)\n"
4933 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004934
Daniel Jasper775954b2015-04-24 10:08:09 +00004935 // Don't linewrap after very short segments.
4936 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4937 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4938 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4939 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4940 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4941 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4942 verifyFormat("aaa()\n"
4943 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4944 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4945 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4946
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004947 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4948 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4949 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4950 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4951 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004952 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004953
Daniel Jaspera41aa532014-09-19 08:01:25 +00004954 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004955 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4956 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004957
4958 // Prefer not to create "hanging" indents.
4959 verifyFormat(
4960 "return !soooooooooooooome_map\n"
4961 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4962 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004963 verifyFormat(
4964 "return aaaaaaaaaaaaaaaa\n"
4965 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4966 " .aaaa(aaaaaaaaaaaaaa);");
4967 // No hanging indent here.
4968 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4969 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4970 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4971 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004972 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4973 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4974 getLLVMStyleWithColumns(60));
4975 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4976 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4977 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4978 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004979 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4980 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4981 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004982}
4983
Daniel Jasperde5c2072012-12-24 00:13:23 +00004984TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4985 verifyFormat(
4986 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004987 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004988 verifyFormat(
4989 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4990 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4991
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004992 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004993 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004994 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4995 " ccccccccccccccccccccccccc) {\n}");
4996
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004997 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004998 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004999 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
5000 " ccccccccccccccccccccccccc) {\n}");
5001
Daniel Jasperde5c2072012-12-24 00:13:23 +00005002 verifyFormat(
5003 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005004 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00005005 verifyFormat(
5006 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
5007 " ccccccccccccccccccccccccc) {\n}");
5008
Daniel Jasper400adc62013-02-08 15:28:42 +00005009 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
5010 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
5011 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
5012 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00005013 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
5014 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
5015 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
5016 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5017
Daniel Jasper400adc62013-02-08 15:28:42 +00005018 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
5019 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
5020 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00005021 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
5022 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
5023 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00005024}
5025
Daniel Jasper43b65482013-01-23 12:27:43 +00005026TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00005027 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00005028 "unsigned Cost =\n"
5029 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
5030 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00005031 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00005032 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
5033 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00005034
5035 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00005036 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
5037 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00005038 verifyFormat("unsigned OriginalStartColumn =\n"
5039 " SourceMgr.getSpellingColumnNumber(\n"
5040 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
5041 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00005042}
5043
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005044TEST_F(FormatTest, AlignsAfterAssignments) {
5045 verifyFormat(
5046 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00005047 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005048 verifyFormat(
5049 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00005050 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005051 verifyFormat(
5052 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00005053 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005054 verifyFormat(
5055 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00005056 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00005057 verifyFormat(
5058 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5059 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5060 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005061}
5062
5063TEST_F(FormatTest, AlignsAfterReturn) {
5064 verifyFormat(
5065 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5066 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
5067 verifyFormat(
5068 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5069 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00005070 verifyFormat(
5071 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005072 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00005073 verifyFormat(
5074 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005075 " aaaaaaaaaaaaaaaaaaaaaa());");
5076 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5077 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5078 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5079 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
5080 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00005081 verifyFormat("return\n"
5082 " // true if code is one of a or b.\n"
5083 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005084}
5085
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005086TEST_F(FormatTest, AlignsAfterOpenBracket) {
5087 verifyFormat(
5088 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5089 " aaaaaaaaa aaaaaaa) {}");
5090 verifyFormat(
5091 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5092 " aaaaaaaaaaa aaaaaaaaa);");
5093 verifyFormat(
5094 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5095 " aaaaaaaaaaaaaaaaaaaaa));");
5096 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005097 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00005098 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5099 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
5100 Style);
5101 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5102 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
5103 Style);
5104 verifyFormat("SomeLongVariableName->someFunction(\n"
5105 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
5106 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005107 verifyFormat(
5108 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5109 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5110 Style);
5111 verifyFormat(
5112 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5113 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5114 Style);
5115 verifyFormat(
5116 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5117 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5118 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005119
Daniel Jasper2a9f7202016-02-08 09:52:54 +00005120 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
5121 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
5122 " b));",
5123 Style);
5124
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005125 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5126 Style.BinPackArguments = false;
5127 Style.BinPackParameters = false;
5128 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5129 " aaaaaaaaaaa aaaaaaaa,\n"
5130 " aaaaaaaaa aaaaaaa,\n"
5131 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5132 Style);
5133 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5134 " aaaaaaaaaaa aaaaaaaaa,\n"
5135 " aaaaaaaaaaa aaaaaaaaa,\n"
5136 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5137 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00005138 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
5139 " aaaaaaaaaaaaaaa,\n"
5140 " aaaaaaaaaaaaaaaaaaaaa,\n"
5141 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005142 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00005143 verifyFormat(
5144 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
5145 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5146 Style);
5147 verifyFormat(
5148 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
5149 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5150 Style);
5151 verifyFormat(
5152 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5153 " aaaaaaaaaaaaaaaaaaaaa(\n"
5154 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
5155 " aaaaaaaaaaaaaaaa);",
5156 Style);
5157 verifyFormat(
5158 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5159 " aaaaaaaaaaaaaaaaaaaaa(\n"
5160 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
5161 " aaaaaaaaaaaaaaaa);",
5162 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005163}
5164
Daniel Jasper3219e432014-12-02 13:24:51 +00005165TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
5166 FormatStyle Style = getLLVMStyleWithColumns(40);
5167 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5168 " bbbbbbbbbbbbbbbbbbbbbb);",
5169 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005170 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00005171 Style.AlignOperands = false;
5172 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5173 " bbbbbbbbbbbbbbbbbbbbbb);",
5174 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005175 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00005176 Style.AlignOperands = true;
5177 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5178 " bbbbbbbbbbbbbbbbbbbbbb);",
5179 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005180 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00005181 Style.AlignOperands = false;
5182 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5183 " bbbbbbbbbbbbbbbbbbbbbb);",
5184 Style);
5185}
5186
Daniel Jasper399d24b2013-01-09 07:06:56 +00005187TEST_F(FormatTest, BreaksConditionalExpressions) {
5188 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005189 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5190 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5191 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5192 verifyFormat(
5193 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005194 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5195 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00005196 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005197 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5198 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5199 verifyFormat(
5200 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005201 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5202 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005203 verifyFormat(
5204 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
5205 " : aaaaaaaaaaaaa);");
5206 verifyFormat(
5207 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00005208 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005209 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5210 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005211 verifyFormat(
5212 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5213 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5214 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005215 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5216 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5217 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5218 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5219 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5220 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5221 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5222 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5223 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5224 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5225 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5226 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005227 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5228 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5229 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5230 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5231 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00005232 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5233 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5234 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005235 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5236 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5237 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5238 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00005239 verifyFormat(
5240 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5241 " ? aaaaaaaaaaaaaaa\n"
5242 " : aaaaaaaaaaaaaaa;");
5243 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005244 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00005245 " ? b\n"
5246 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00005247 verifyFormat("return aaaa == bbbb\n"
5248 " // comment\n"
5249 " ? aaaa\n"
5250 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005251 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005252 " format(TheLine.First,\n"
5253 " IndentForLevel[TheLine.Level] >= 0\n"
5254 " ? IndentForLevel[TheLine.Level]\n"
5255 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005256 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005257 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00005258 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5259 " ? aaaaaaaaaaaaaaa\n"
5260 " : bbbbbbbbbbbbbbb //\n"
5261 " ? ccccccccccccccc\n"
5262 " : ddddddddddddddd;");
5263 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5264 " ? aaaaaaaaaaaaaaa\n"
5265 " : (bbbbbbbbbbbbbbb //\n"
5266 " ? ccccccccccccccc\n"
5267 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005268 verifyFormat(
5269 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5270 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5271 " aaaaaaaaaaaaaaaaaaaaa +\n"
5272 " aaaaaaaaaaaaaaaaaaaaa\n"
5273 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00005274 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005275 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5276 " : aaaaaaaaaaaaaaaaaaaaaa\n"
5277 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00005278
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005279 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00005280 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005281 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00005282 "void f() {\n"
5283 " g(aaa,\n"
5284 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5285 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5286 " ? aaaaaaaaaaaaaaa\n"
5287 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005288 "}",
5289 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005290 verifyFormat(
5291 "void f() {\n"
5292 " g(aaa,\n"
5293 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5294 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5295 " ?: aaaaaaaaaaaaaaa);\n"
5296 "}",
5297 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00005298
5299 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
5300 " // comment.\n"
5301 " ccccccccccccccccccccccccccccccccccccccc\n"
5302 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5303 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00005304
5305 // Assignments in conditional expressions. Apparently not uncommon :-(.
5306 verifyFormat("return a != b\n"
5307 " // comment\n"
5308 " ? a = b\n"
5309 " : a = b;");
5310 verifyFormat("return a != b\n"
5311 " // comment\n"
5312 " ? a = a != b\n"
5313 " // comment\n"
5314 " ? a = b\n"
5315 " : a\n"
5316 " : a;\n");
5317 verifyFormat("return a != b\n"
5318 " // comment\n"
5319 " ? a\n"
5320 " : a = a != b\n"
5321 " // comment\n"
5322 " ? a = b\n"
5323 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00005324}
5325
Daniel Jasper165b29e2013-11-08 00:57:11 +00005326TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
5327 FormatStyle Style = getLLVMStyle();
5328 Style.BreakBeforeTernaryOperators = false;
5329 Style.ColumnLimit = 70;
5330 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005331 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5332 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5333 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5334 Style);
5335 verifyFormat(
5336 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005337 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5338 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005339 Style);
5340 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005341 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5342 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5343 Style);
5344 verifyFormat(
5345 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005346 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5347 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005348 Style);
5349 verifyFormat(
5350 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
5351 " aaaaaaaaaaaaa);",
5352 Style);
5353 verifyFormat(
5354 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5355 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5356 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5357 " aaaaaaaaaaaaa);",
5358 Style);
5359 verifyFormat(
5360 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5361 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5362 " aaaaaaaaaaaaa);",
5363 Style);
5364 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5365 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5366 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5367 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5368 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5369 Style);
5370 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5371 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5372 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5373 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5374 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5375 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5376 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5377 Style);
5378 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5379 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
5380 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5381 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5382 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5383 Style);
5384 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5385 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5386 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5387 Style);
5388 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00005389 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00005390 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5391 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5392 Style);
5393 verifyFormat(
5394 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5395 " aaaaaaaaaaaaaaa :\n"
5396 " aaaaaaaaaaaaaaa;",
5397 Style);
5398 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5399 " aaaaaaaaa ?\n"
5400 " b :\n"
5401 " c);",
5402 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00005403 verifyFormat("unsigned Indent =\n"
5404 " format(TheLine.First,\n"
5405 " IndentForLevel[TheLine.Level] >= 0 ?\n"
5406 " IndentForLevel[TheLine.Level] :\n"
5407 " TheLine * 2,\n"
5408 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
5409 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005410 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5411 " aaaaaaaaaaaaaaa :\n"
5412 " bbbbbbbbbbbbbbb ? //\n"
5413 " ccccccccccccccc :\n"
5414 " ddddddddddddddd;",
5415 Style);
5416 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5417 " aaaaaaaaaaaaaaa :\n"
5418 " (bbbbbbbbbbbbbbb ? //\n"
5419 " ccccccccccccccc :\n"
5420 " ddddddddddddddd);",
5421 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00005422 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5423 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
5424 " ccccccccccccccccccccccccccc;",
5425 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00005426 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5427 " aaaaa :\n"
5428 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
5429 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005430}
5431
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005432TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
5433 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
5434 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
5435 verifyFormat("bool a = true, b = false;");
5436
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005437 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005438 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005439 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00005440 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005441 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00005442 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005443 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00005444 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00005445 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
5446 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
5447 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5448 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
5449 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
5450 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005451
Daniel Jasperbea1ab42015-03-01 18:55:26 +00005452 FormatStyle Style = getGoogleStyle();
5453 Style.PointerAlignment = FormatStyle::PAS_Left;
5454 Style.DerivePointerAlignment = false;
5455 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5456 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
5457 " *b = bbbbbbbbbbbbbbbbbbb;",
5458 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00005459 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5460 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
5461 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00005462 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00005463 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005464}
5465
Nico Weber4a5030c2013-01-12 01:28:06 +00005466TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
5467 verifyFormat("arr[foo ? bar : baz];");
5468 verifyFormat("f()[foo ? bar : baz];");
5469 verifyFormat("(a + b)[foo ? bar : baz];");
5470 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
5471}
5472
Daniel Jasperf7935112012-12-03 18:12:45 +00005473TEST_F(FormatTest, AlignsStringLiterals) {
5474 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
5475 " \"short literal\");");
5476 verifyFormat(
5477 "looooooooooooooooooooooooongFunction(\n"
5478 " \"short literal\"\n"
5479 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005480 verifyFormat("someFunction(\"Always break between multi-line\"\n"
5481 " \" string literals\",\n"
5482 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005483 EXPECT_EQ("fun + \"1243\" /* comment */\n"
5484 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005485 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00005486 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005487 getLLVMStyleWithColumns(28)));
5488 EXPECT_EQ(
5489 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5490 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
5491 " \"aaaaaaaaaaaaaaaa\";",
5492 format("aaaaaa ="
5493 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
5494 "aaaaaaaaaaaaaaaaaaaaa\" "
5495 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005496 verifyFormat("a = a + \"a\"\n"
5497 " \"a\"\n"
5498 " \"a\";");
5499 verifyFormat("f(\"a\", \"b\"\n"
5500 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005501
5502 verifyFormat(
5503 "#define LL_FORMAT \"ll\"\n"
5504 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
5505 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00005506
5507 verifyFormat("#define A(X) \\\n"
5508 " \"aaaaa\" #X \"bbbbbb\" \\\n"
5509 " \"ccccc\"",
5510 getLLVMStyleWithColumns(23));
5511 verifyFormat("#define A \"def\"\n"
5512 "f(\"abc\" A \"ghi\"\n"
5513 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005514
5515 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005516 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005517 verifyFormat("#define A(X) \\\n"
5518 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
5519 " L\"ccccc\"",
5520 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00005521
5522 verifyFormat("f(@\"a\"\n"
5523 " @\"b\");");
5524 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00005525 " @\"b\"\n"
5526 " @\"c\";");
5527 verifyFormat("NSString s = @\"a\"\n"
5528 " \"b\"\n"
5529 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00005530}
5531
Zachary Turner448592e2015-12-18 22:20:15 +00005532TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005533 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005534 // No declarations or definitions should be moved to own line.
5535 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
5536 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005537 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005538 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005539 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005540 "int f() { return 1; }\n"
5541 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005542 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00005543
5544 // All declarations and definitions should have the return type moved to its
5545 // own
5546 // line.
5547 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
5548 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005549 " int\n"
5550 " f() {\n"
5551 " return 1;\n"
5552 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005553 " int\n"
5554 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005555 "};\n"
5556 "int\n"
5557 "f() {\n"
5558 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005559 "}\n"
5560 "int\n"
5561 "g();\n",
5562 Style);
5563
5564 // Top-level definitions, and no kinds of declarations should have the
5565 // return type moved to its own line.
5566 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
5567 verifyFormat("class B {\n"
5568 " int f() { return 1; }\n"
5569 " int g();\n"
5570 "};\n"
5571 "int\n"
5572 "f() {\n"
5573 " return 1;\n"
5574 "}\n"
5575 "int g();\n",
5576 Style);
5577
5578 // Top-level definitions and declarations should have the return type moved
5579 // to its own line.
5580 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
5581 verifyFormat("class C {\n"
5582 " int f() { return 1; }\n"
5583 " int g();\n"
5584 "};\n"
5585 "int\n"
5586 "f() {\n"
5587 " return 1;\n"
5588 "}\n"
5589 "int\n"
5590 "g();\n",
5591 Style);
5592
5593 // All definitions should have the return type moved to its own line, but no
5594 // kinds of declarations.
5595 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5596 verifyFormat("class D {\n"
5597 " int\n"
5598 " f() {\n"
5599 " return 1;\n"
5600 " }\n"
5601 " int g();\n"
5602 "};\n"
5603 "int\n"
5604 "f() {\n"
5605 " return 1;\n"
5606 "}\n"
5607 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005608 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005609 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005610 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005611 " return \"\";\n"
5612 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005613 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005614 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005615 verifyFormat("template <class T>\n"
5616 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005617 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005618 " return NULL;\n"
5619 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005620 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005621 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00005622 verifyFormat("class C {\n"
5623 " int\n"
5624 " operator+() {\n"
5625 " return 1;\n"
5626 " }\n"
5627 " int\n"
5628 " operator()() {\n"
5629 " return 1;\n"
5630 " }\n"
5631 "};\n",
5632 Style);
5633 verifyFormat("void\n"
5634 "A::operator()() {}\n"
5635 "void\n"
5636 "A::operator>>() {}\n"
5637 "void\n"
5638 "A::operator+() {}\n",
5639 Style);
5640 verifyFormat("void *operator new(std::size_t s);", // No break here.
5641 Style);
5642 verifyFormat("void *\n"
5643 "operator new(std::size_t s) {}",
5644 Style);
5645 verifyFormat("void *\n"
5646 "operator delete[](void *ptr) {}",
5647 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005648 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005649 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005650 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005651 "{\n"
5652 " return \"\";\n"
5653 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005654 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005655 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005656 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005657 "T *\n" // Problem here: no line break
5658 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005659 "{\n"
5660 " return NULL;\n"
5661 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005662 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005663 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005664}
5665
Alexander Kornienko58611712013-07-04 12:02:44 +00005666TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5667 FormatStyle NoBreak = getLLVMStyle();
5668 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5669 FormatStyle Break = getLLVMStyle();
5670 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005671 verifyFormat("aaaa = \"bbbb\"\n"
5672 " \"cccc\";",
5673 NoBreak);
5674 verifyFormat("aaaa =\n"
5675 " \"bbbb\"\n"
5676 " \"cccc\";",
5677 Break);
5678 verifyFormat("aaaa(\"bbbb\"\n"
5679 " \"cccc\");",
5680 NoBreak);
5681 verifyFormat("aaaa(\n"
5682 " \"bbbb\"\n"
5683 " \"cccc\");",
5684 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005685 verifyFormat("aaaa(qqq, \"bbbb\"\n"
5686 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005687 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005688 verifyFormat("aaaa(qqq,\n"
5689 " \"bbbb\"\n"
5690 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005691 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005692 verifyFormat("aaaa(qqq,\n"
5693 " L\"bbbb\"\n"
5694 " L\"cccc\");",
5695 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005696 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5697 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005698 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005699 verifyFormat("string s = someFunction(\n"
5700 " \"abc\"\n"
5701 " \"abc\");",
5702 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005703
Daniel Jasper3251fff2014-06-10 06:27:23 +00005704 // As we break before unary operators, breaking right after them is bad.
5705 verifyFormat("string foo = abc ? \"x\"\n"
5706 " \"blah blah blah blah blah blah\"\n"
5707 " : \"y\";",
5708 Break);
5709
Daniel Jasperc834c702013-07-17 15:38:19 +00005710 // Don't break if there is no column gain.
5711 verifyFormat("f(\"aaaa\"\n"
5712 " \"bbbb\");",
5713 Break);
5714
5715 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005716 EXPECT_EQ("x = \"a\\\n"
5717 "b\\\n"
5718 "c\";",
5719 format("x = \"a\\\n"
5720 "b\\\n"
5721 "c\";",
5722 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005723 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005724 " \"a\\\n"
5725 "b\\\n"
5726 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005727 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005728 "b\\\n"
5729 "c\";",
5730 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005731
5732 // Exempt ObjC strings for now.
5733 EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005734 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005735 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005736 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005737 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005738
5739 Break.ColumnLimit = 0;
5740 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005741}
5742
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005743TEST_F(FormatTest, AlignsPipes) {
5744 verifyFormat(
5745 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5746 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5747 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5748 verifyFormat(
5749 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5750 " << aaaaaaaaaaaaaaaaaaaa;");
5751 verifyFormat(
5752 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5753 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5754 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005755 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5756 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5757 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005758 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5759 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5760 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5761 verifyFormat(
5762 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5763 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5764 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005765 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5766 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5767 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5768 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005769 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5770 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005771 verifyFormat(
5772 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5773 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005774
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005775 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5776 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005777 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5778 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5779 " aaaaaaaaaaaaaaaaaaaaa)\n"
5780 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005781 verifyFormat("LOG_IF(aaa == //\n"
5782 " bbb)\n"
5783 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005784
Daniel Jasper467ddb12013-08-12 12:58:05 +00005785 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005786 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5787 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005788 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5789 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5790 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005791 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5792 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005793 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5794 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5795 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5796 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5797 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5798 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5799 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005800
Daniel Jasperc238c872013-04-02 14:33:13 +00005801 verifyFormat(
5802 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5803 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005804
5805 // Incomplete string literal.
5806 EXPECT_EQ("llvm::errs() << \"\n"
5807 " << a;",
5808 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005809
5810 verifyFormat("void f() {\n"
5811 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5812 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5813 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005814
5815 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005816 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5817 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5818 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005819
5820 // Handle '\n'.
5821 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5822 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5823 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5824 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5825 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5826 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5827 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005828}
5829
Daniel Jasper7209bb92016-12-13 11:16:42 +00005830TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5831 verifyFormat("return out << \"somepacket = {\\n\"\n"
5832 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5833 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5834 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5835 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5836 " << \"}\";");
5837
5838 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5839 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5840 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5841 verifyFormat(
5842 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5843 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5844 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5845 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5846 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5847 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5848 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5849 verifyFormat(
5850 "void f() {\n"
5851 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5852 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5853 "}");
5854
5855 // Breaking before the first "<<" is generally not desirable.
5856 verifyFormat(
5857 "llvm::errs()\n"
5858 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5859 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5860 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5861 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5862 getLLVMStyleWithColumns(70));
5863 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5864 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5865 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5866 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5867 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5868 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5869 getLLVMStyleWithColumns(70));
5870
5871 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5872 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5873 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5874 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5875 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5876 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005877 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5878 " (aaaa + aaaa);",
5879 getLLVMStyleWithColumns(40));
5880 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5881 " (aaaaaaa + aaaaa));",
5882 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005883 verifyFormat(
5884 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5885 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5886 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005887}
5888
Daniel Jasperf7935112012-12-03 18:12:45 +00005889TEST_F(FormatTest, UnderstandsEquals) {
5890 verifyFormat(
5891 "aaaaaaaaaaaaaaaaa =\n"
5892 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5893 verifyFormat(
5894 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005895 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005896 verifyFormat(
5897 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005898 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005899 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005900 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5901 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005902
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005903 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5904 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005905}
5906
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005907TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005908 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5909 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005910
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005911 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5912 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005913
5914 verifyFormat(
5915 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5916 " Parameter2);");
5917
5918 verifyFormat(
5919 "ShortObject->shortFunction(\n"
5920 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5921 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5922
5923 verifyFormat("loooooooooooooongFunction(\n"
5924 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5925
5926 verifyFormat(
5927 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5928 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5929
Daniel Jasper687af3b2013-02-14 14:26:07 +00005930 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5931 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005932 verifyFormat("void f() {\n"
5933 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5934 " .Times(2)\n"
5935 " .WillRepeatedly(Return(SomeValue));\n"
5936 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005937 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5938 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005939 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005940 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5941 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005942 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005943 verifyFormat("void f() {\n"
5944 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5945 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5946 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005947 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5948 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5949 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5950 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5951 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005952 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5953 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5954 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5955 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5956 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005957
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005958 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005959 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005960 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005961 verifyFormat(
5962 "aaaaaaaaaaa->aaaaaaaaa(\n"
5963 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5964 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005965
5966 verifyFormat(
5967 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5968 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005969 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5970 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5971 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5972 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005973
Daniel Jasper9b334242013-03-15 14:57:30 +00005974 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005975 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5976 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005977
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005978 FormatStyle NoBinPacking = getLLVMStyle();
5979 NoBinPacking.BinPackParameters = false;
5980 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5981 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5982 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5983 " aaaaaaaaaaaaaaaaaaa,\n"
5984 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5985 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005986
5987 // If there is a subsequent call, change to hanging indentation.
5988 verifyFormat(
5989 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5990 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5991 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5992 verifyFormat(
5993 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5994 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005995 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5996 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5997 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5998 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5999 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6000 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00006001}
6002
Daniel Jasperac5c1c22013-01-02 15:08:56 +00006003TEST_F(FormatTest, WrapsTemplateDeclarations) {
6004 verifyFormat("template <typename T>\n"
6005 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00006006 verifyFormat("template <typename T>\n"
6007 "// T should be one of {A, B}.\n"
6008 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00006009 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00006010 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00006011 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006012 verifyFormat("template <typename T>\n"
6013 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
6014 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00006015 verifyFormat(
6016 "template <typename T>\n"
6017 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
6018 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00006019 verifyFormat(
6020 "template <typename T>\n"
6021 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
6022 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
6023 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00006024 verifyFormat("template <typename T>\n"
6025 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00006026 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00006027 verifyFormat(
6028 "template <typename T1, typename T2 = char, typename T3 = char,\n"
6029 " typename T4 = char>\n"
6030 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00006031 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
6032 " template <typename> class cccccccccccccccccccccc,\n"
6033 " typename ddddddddddddd>\n"
6034 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00006035 verifyFormat(
6036 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
6037 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00006038
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006039 verifyFormat("void f() {\n"
6040 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
6041 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
6042 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00006043
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00006044 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00006045 verifyFormat("template <typename T> void f();");
6046 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006047 verifyFormat(
6048 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6049 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6050 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
6051 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6052 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6053 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
6054 " bbbbbbbbbbbbbbbbbbbbbbbb);",
6055 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00006056 EXPECT_EQ("static_cast<A< //\n"
6057 " B> *>(\n"
6058 "\n"
6059 " );",
6060 format("static_cast<A<//\n"
6061 " B>*>(\n"
6062 "\n"
6063 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00006064 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6065 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00006066
6067 FormatStyle AlwaysBreak = getLLVMStyle();
6068 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
6069 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
6070 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
6071 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
6072 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6073 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
6074 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
6075 verifyFormat("template <template <typename> class Fooooooo,\n"
6076 " template <typename> class Baaaaaaar>\n"
6077 "struct C {};",
6078 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00006079 verifyFormat("template <typename T> // T can be A, B or C.\n"
6080 "struct C {};",
6081 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00006082 verifyFormat("template <enum E> class A {\n"
6083 "public:\n"
6084 " E *f();\n"
6085 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00006086}
6087
Daniel Jasper45797022013-01-25 10:57:27 +00006088TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
6089 verifyFormat(
6090 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6091 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6092 verifyFormat(
6093 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6094 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6095 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
6096
Daniel Jasper0f0234e2013-05-08 10:00:18 +00006097 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00006098 verifyFormat(
6099 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6100 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00006101 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00006102
Daniel Jasper45797022013-01-25 10:57:27 +00006103 verifyFormat(
6104 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00006105 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00006106
6107 // Breaking at nested name specifiers is generally not desirable.
6108 verifyFormat(
6109 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6110 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00006111
6112 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00006113 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
6114 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6115 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00006116 " aaaaaaaaaaaaaaaaaaaaa);",
6117 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00006118
6119 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6120 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6121 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00006122}
6123
Daniel Jasperf7935112012-12-03 18:12:45 +00006124TEST_F(FormatTest, UnderstandsTemplateParameters) {
6125 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006126 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006127 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
6128 verifyFormat("bool x = a < 1 || 2 > a;");
6129 verifyFormat("bool x = 5 < f<int>();");
6130 verifyFormat("bool x = f<int>() > 5;");
6131 verifyFormat("bool x = 5 < a<int>::x;");
6132 verifyFormat("bool x = a < 4 ? a > 2 : false;");
6133 verifyFormat("bool x = f() ? a < 2 : a > 2;");
6134
6135 verifyGoogleFormat("A<A<int>> a;");
6136 verifyGoogleFormat("A<A<A<int>>> a;");
6137 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006138 verifyGoogleFormat("A<A<int> > a;");
6139 verifyGoogleFormat("A<A<A<int> > > a;");
6140 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00006141 verifyGoogleFormat("A<::A<int>> a;");
6142 verifyGoogleFormat("A<::A> a;");
6143 verifyGoogleFormat("A< ::A> a;");
6144 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006145 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
6146 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00006147 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
6148 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006149 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
6150 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006151
Nico Weber7533b4d2014-09-24 17:17:32 +00006152 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
6153
Daniel Jasperf7935112012-12-03 18:12:45 +00006154 verifyFormat("test >> a >> b;");
6155 verifyFormat("test << a >> b;");
6156
6157 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006158 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00006159 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00006160 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
6161 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00006162 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00006163 verifyFormat("f(a.operator()<A>());");
6164 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6165 " .template operator()<A>());",
6166 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00006167
6168 // Not template parameters.
6169 verifyFormat("return a < b && c > d;");
6170 verifyFormat("void f() {\n"
6171 " while (a < b && c > d) {\n"
6172 " }\n"
6173 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006174 verifyFormat("template <typename... Types>\n"
6175 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00006176
6177 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6178 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
6179 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00006180 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00006181 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00006182 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00006183}
6184
Malcolm Parsons6af3f142016-11-03 16:57:30 +00006185TEST_F(FormatTest, BitshiftOperatorWidth) {
6186 EXPECT_EQ("int a = 1 << 2; /* foo\n"
6187 " bar */",
6188 format("int a=1<<2; /* foo\n"
6189 " bar */"));
6190
6191 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
6192 " bar */",
6193 format("int b =256>>1 ; /* foo\n"
6194 " bar */"));
6195}
6196
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006197TEST_F(FormatTest, UnderstandsBinaryOperators) {
6198 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00006199 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00006200}
6201
6202TEST_F(FormatTest, UnderstandsPointersToMembers) {
6203 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006204 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006205 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006206 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006207 verifyFormat("void f() {\n"
6208 " (a->*f)();\n"
6209 " a->*x;\n"
6210 " (a.*f)();\n"
6211 " ((*a).*f)();\n"
6212 " a.*x;\n"
6213 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00006214 verifyFormat("void f() {\n"
6215 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
6216 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
6217 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00006218 verifyFormat(
6219 "(aaaaaaaaaa->*bbbbbbb)(\n"
6220 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006221 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006222 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006223 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006224}
6225
Daniel Jasper8dd40472012-12-21 09:41:31 +00006226TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00006227 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00006228 verifyFormat("f(-1, -2, -3);");
6229 verifyFormat("a[-1] = 5;");
6230 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006231 verifyFormat("if (i == -1) {\n}");
6232 verifyFormat("if (i != -1) {\n}");
6233 verifyFormat("if (i > -1) {\n}");
6234 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00006235 verifyFormat("++(a->f());");
6236 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00006237 verifyFormat("(a->f())++;");
6238 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006239 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00006240
6241 verifyFormat("a-- > b;");
6242 verifyFormat("b ? -a : c;");
6243 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006244 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00006245 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006246 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00006247
6248 verifyFormat("return -1;");
6249 verifyFormat("switch (a) {\n"
6250 "case -1:\n"
6251 " break;\n"
6252 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00006253 verifyFormat("#define X -1");
6254 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00006255
Chandler Carruthf8b72662014-03-02 12:37:31 +00006256 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
6257 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00006258
6259 verifyFormat("int a = /* confusing comment */ -1;");
6260 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
6261 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006262}
6263
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006264TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00006265 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006266 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00006267 "}");
6268 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00006269 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00006270 verifyFormat("*aaa = aaaaaaa( // break\n"
6271 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00006272}
6273
Daniel Jasper8863ada2013-08-26 08:10:17 +00006274TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00006275 verifyFormat("bool operator<();");
6276 verifyFormat("bool operator>();");
6277 verifyFormat("bool operator=();");
6278 verifyFormat("bool operator==();");
6279 verifyFormat("bool operator!=();");
6280 verifyFormat("int operator+();");
6281 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00006282 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006283 verifyFormat("bool operator();");
6284 verifyFormat("bool operator()();");
6285 verifyFormat("bool operator[]();");
6286 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006287 verifyFormat("operator int();");
6288 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006289 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006290 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006291 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006292 verifyFormat("void *operator new(std::size_t size);");
6293 verifyFormat("void *operator new[](std::size_t size);");
6294 verifyFormat("void operator delete(void *ptr);");
6295 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00006296 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
6297 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00006298 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00006299 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006300
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006301 verifyFormat(
6302 "ostream &operator<<(ostream &OutputStream,\n"
6303 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00006304 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
6305 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
6306 " return left.group < right.group;\n"
6307 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00006308 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00006309 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006310
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006311 verifyGoogleFormat("operator void*();");
6312 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00006313 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00006314
6315 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00006316 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
6317 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006318}
6319
Daniel Jasper1c220482015-02-25 10:30:06 +00006320TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00006321 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
6322 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
6323 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
6324 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
6325 verifyFormat("Deleted &operator=(const Deleted &) &;");
6326 verifyFormat("Deleted &operator=(const Deleted &) &&;");
6327 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
6328 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
6329 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
6330 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
6331 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00006332 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00006333 verifyFormat("template <typename T>\n"
6334 "void F(T) && = delete;",
6335 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00006336
Daniel Jasperaf642c62015-08-25 13:40:51 +00006337 FormatStyle AlignLeft = getLLVMStyle();
6338 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00006339 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00006340 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
6341 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
6342 AlignLeft);
6343 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
6344 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006345 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
6346 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
6347 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
6348 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00006349 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00006350
6351 FormatStyle Spaces = getLLVMStyle();
6352 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006353 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
6354 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
6355 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
6356 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006357
6358 Spaces.SpacesInCStyleCastParentheses = false;
6359 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006360 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
6361 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
6362 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
6363 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006364}
6365
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006366TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00006367 verifyFormat("void f() {\n"
6368 " A *a = new A;\n"
6369 " A *a = new (placement) A;\n"
6370 " delete a;\n"
6371 " delete (A *)a;\n"
6372 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00006373 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6374 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00006375 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6376 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6377 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00006378 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006379}
6380
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006381TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006382 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006383 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006384 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006385 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006386 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006387 verifyIndependentOfContext("int a = b * 10;");
6388 verifyIndependentOfContext("int a = 10 * b;");
6389 verifyIndependentOfContext("int a = b * c;");
6390 verifyIndependentOfContext("int a += b * c;");
6391 verifyIndependentOfContext("int a -= b * c;");
6392 verifyIndependentOfContext("int a *= b * c;");
6393 verifyIndependentOfContext("int a /= b * c;");
6394 verifyIndependentOfContext("int a = *b;");
6395 verifyIndependentOfContext("int a = *b * c;");
6396 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00006397 verifyIndependentOfContext("int a = b * (10);");
6398 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006399 verifyIndependentOfContext("return 10 * b;");
6400 verifyIndependentOfContext("return *b * *c;");
6401 verifyIndependentOfContext("return a & ~b;");
6402 verifyIndependentOfContext("f(b ? *c : *d);");
6403 verifyIndependentOfContext("int a = b ? *c : *d;");
6404 verifyIndependentOfContext("*b = a;");
6405 verifyIndependentOfContext("a * ~b;");
6406 verifyIndependentOfContext("a * !b;");
6407 verifyIndependentOfContext("a * +b;");
6408 verifyIndependentOfContext("a * -b;");
6409 verifyIndependentOfContext("a * ++b;");
6410 verifyIndependentOfContext("a * --b;");
6411 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00006412 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006413 verifyIndependentOfContext("f() * b;");
6414 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006415 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006416 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00006417 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006418 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00006419 verifyIndependentOfContext("return sizeof(int **);");
6420 verifyIndependentOfContext("return sizeof(int ******);");
6421 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00006422 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006423 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00006424 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00006425 verifyGoogleFormat("return sizeof(int**);");
6426 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
6427 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006428 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00006429 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00006430 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00006431 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00006432 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00006433 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00006434 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00006435 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00006436 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00006437 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00006438 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00006439 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00006440 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00006441 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00006442 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00006443 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00006444 verifyFormat("void f(const MyOverride &override);");
6445 verifyFormat("void f(const MyFinal &final);");
6446 verifyIndependentOfContext("bool a = f() && override.f();");
6447 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00006448
Daniel Jasper5b49f472013-01-23 12:10:53 +00006449 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00006450
Daniel Jasper5b49f472013-01-23 12:10:53 +00006451 verifyIndependentOfContext("A<int *> a;");
6452 verifyIndependentOfContext("A<int **> a;");
6453 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00006454 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006455 verifyIndependentOfContext(
6456 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006457 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00006458 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00006459 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00006460 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00006461 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00006462
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00006463 verifyFormat(
6464 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6465 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6466
Daniel Jasper1f5d6372016-06-13 14:45:12 +00006467 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00006468 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00006469 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006470 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00006471 verifyGoogleFormat("A<int*> a;");
6472 verifyGoogleFormat("A<int**> a;");
6473 verifyGoogleFormat("A<int*, int*> a;");
6474 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006475 verifyGoogleFormat("f(b ? *c : *d);");
6476 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00006477 verifyGoogleFormat("Type* t = **x;");
6478 verifyGoogleFormat("Type* t = *++*x;");
6479 verifyGoogleFormat("*++*x;");
6480 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
6481 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006482 verifyGoogleFormat(
6483 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00006484 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00006485 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
6486 verifyGoogleFormat("template <typename T>\n"
6487 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00006488
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006489 FormatStyle Left = getLLVMStyle();
6490 Left.PointerAlignment = FormatStyle::PAS_Left;
6491 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00006492 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00006493 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006494
Daniel Jasper5b49f472013-01-23 12:10:53 +00006495 verifyIndependentOfContext("a = *(x + y);");
6496 verifyIndependentOfContext("a = &(x + y);");
6497 verifyIndependentOfContext("*(x + y).call();");
6498 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006499 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00006500
Daniel Jasper5b49f472013-01-23 12:10:53 +00006501 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00006502 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00006503 "int *MyValues = {\n"
6504 " *A, // Operator detection might be confused by the '{'\n"
6505 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00006506 "};");
Nico Weber80a82762013-01-17 17:17:19 +00006507
Daniel Jasper5b49f472013-01-23 12:10:53 +00006508 verifyIndependentOfContext("if (int *a = &b)");
6509 verifyIndependentOfContext("if (int &a = *b)");
6510 verifyIndependentOfContext("if (a & b[i])");
6511 verifyIndependentOfContext("if (a::b::c::d & b[i])");
6512 verifyIndependentOfContext("if (*b[i])");
6513 verifyIndependentOfContext("if (int *a = (&b))");
6514 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00006515 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00006516 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00006517 verifyFormat("void f() {\n"
6518 " for (const int &v : Values) {\n"
6519 " }\n"
6520 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006521 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
6522 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00006523 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00006524
Daniel Jaspera98da3d2013-11-07 19:56:07 +00006525 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006526 verifyFormat("#define MACRO \\\n"
6527 " int *i = a * b; \\\n"
6528 " void f(a *b);",
6529 getLLVMStyleWithColumns(19));
6530
Daniel Jasper97b89482013-03-13 07:49:51 +00006531 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006532 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006533 verifyIndependentOfContext("T **t = new T *;");
6534 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00006535 verifyGoogleFormat("A = new SomeType*[Length]();");
6536 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006537 verifyGoogleFormat("T** t = new T*;");
6538 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006539
Daniel Jasper990ff972013-05-07 14:17:18 +00006540 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006541 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00006542 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00006543 verifyFormat("STATIC_ASSERT((a & b) == 0);");
6544 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006545 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006546 "typename t::if<x && y>::type f() {}");
6547 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006548 verifyFormat("vector<int *> v;");
6549 verifyFormat("vector<int *const> v;");
6550 verifyFormat("vector<int *const **const *> v;");
6551 verifyFormat("vector<int *volatile> v;");
6552 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006553 verifyFormat("foo<b && false>();");
6554 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00006555 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00006556 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006557 "template <class T, class = typename std::enable_if<\n"
6558 " std::is_integral<T>::value &&\n"
6559 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
6560 "void F();",
6561 getLLVMStyleWithColumns(70));
6562 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00006563 "template <class T,\n"
6564 " class = typename std::enable_if<\n"
6565 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006566 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
6567 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006568 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00006569 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006570 verifyFormat(
6571 "template <class T,\n"
6572 " class = typename ::std::enable_if<\n"
6573 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6574 "void F();",
6575 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006576
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006577 verifyIndependentOfContext("MACRO(int *i);");
6578 verifyIndependentOfContext("MACRO(auto *a);");
6579 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006580 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006581 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006582 // FIXME: Is there a way to make this work?
6583 // verifyIndependentOfContext("MACRO(A *a);");
6584
Daniel Jasper32ccb032014-06-23 07:36:18 +00006585 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006586 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006587
Daniel Jasper866468a2014-04-14 13:15:29 +00006588 EXPECT_EQ("#define OP(x) \\\n"
6589 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6590 " return s << a.DebugString(); \\\n"
6591 " }",
6592 format("#define OP(x) \\\n"
6593 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6594 " return s << a.DebugString(); \\\n"
6595 " }",
6596 getLLVMStyleWithColumns(50)));
6597
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006598 // FIXME: We cannot handle this case yet; we might be able to figure out that
6599 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006600 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006601
6602 FormatStyle PointerMiddle = getLLVMStyle();
6603 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6604 verifyFormat("delete *x;", PointerMiddle);
6605 verifyFormat("int * x;", PointerMiddle);
6606 verifyFormat("template <int * y> f() {}", PointerMiddle);
6607 verifyFormat("int * f(int * a) {}", PointerMiddle);
6608 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6609 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6610 verifyFormat("A<int *> a;", PointerMiddle);
6611 verifyFormat("A<int **> a;", PointerMiddle);
6612 verifyFormat("A<int *, int *> a;", PointerMiddle);
6613 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006614 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6615 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006616 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006617
6618 // Member function reference qualifiers aren't binary operators.
6619 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006620 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006621 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006622 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006623 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006624 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006625}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006626
Daniel Jasperee6d6502013-07-17 20:25:02 +00006627TEST_F(FormatTest, UnderstandsAttributes) {
6628 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006629 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6630 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006631 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006632 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006633 verifyFormat("__attribute__((nodebug)) void\n"
6634 "foo() {}\n",
6635 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006636}
6637
Daniel Jasper10cd5812013-05-06 06:35:44 +00006638TEST_F(FormatTest, UnderstandsEllipsis) {
6639 verifyFormat("int printf(const char *fmt, ...);");
6640 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006641 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6642
6643 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006644 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006645 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006646}
6647
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006648TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006649 EXPECT_EQ("int *a;\n"
6650 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006651 "int *a;",
6652 format("int *a;\n"
6653 "int* a;\n"
6654 "int *a;",
6655 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006656 EXPECT_EQ("int* a;\n"
6657 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006658 "int* a;",
6659 format("int* a;\n"
6660 "int* a;\n"
6661 "int *a;",
6662 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006663 EXPECT_EQ("int *a;\n"
6664 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006665 "int *a;",
6666 format("int *a;\n"
6667 "int * a;\n"
6668 "int * a;",
6669 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006670 EXPECT_EQ("auto x = [] {\n"
6671 " int *a;\n"
6672 " int *a;\n"
6673 " int *a;\n"
6674 "};",
6675 format("auto x=[]{int *a;\n"
6676 "int * a;\n"
6677 "int * a;};",
6678 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006679}
6680
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006681TEST_F(FormatTest, UnderstandsRvalueReferences) {
6682 verifyFormat("int f(int &&a) {}");
6683 verifyFormat("int f(int a, char &&b) {}");
6684 verifyFormat("void f() { int &&a = b; }");
6685 verifyGoogleFormat("int f(int a, char&& b) {}");
6686 verifyGoogleFormat("void f() { int&& a = b; }");
6687
Daniel Jasper1eff9082013-05-27 16:36:33 +00006688 verifyIndependentOfContext("A<int &&> a;");
6689 verifyIndependentOfContext("A<int &&, int &&> a;");
6690 verifyGoogleFormat("A<int&&> a;");
6691 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006692
6693 // Not rvalue references:
6694 verifyFormat("template <bool B, bool C> class A {\n"
6695 " static_assert(B && C, \"Something is wrong\");\n"
6696 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006697 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6698 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006699 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006700}
6701
Manuel Klimekc1237a82013-01-23 14:08:21 +00006702TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6703 verifyFormat("void f() {\n"
6704 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006705 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006706 "}",
6707 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006708}
6709
Daniel Jasperef906a92013-01-13 08:01:36 +00006710TEST_F(FormatTest, FormatsCasts) {
6711 verifyFormat("Type *A = static_cast<Type *>(P);");
6712 verifyFormat("Type *A = (Type *)P;");
6713 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6714 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006715 verifyFormat("int a = (int)2.0f;");
6716 verifyFormat("x[(int32)y];");
6717 verifyFormat("x = (int32)y;");
6718 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6719 verifyFormat("int a = (int)*b;");
6720 verifyFormat("int a = (int)2.0f;");
6721 verifyFormat("int a = (int)~0;");
6722 verifyFormat("int a = (int)++a;");
6723 verifyFormat("int a = (int)sizeof(int);");
6724 verifyFormat("int a = (int)+2;");
6725 verifyFormat("my_int a = (my_int)2.0f;");
6726 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006727 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006728 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006729 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006730 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006731 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006732
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006733 verifyFormat("void f() { my_int a = (my_int)*b; }");
6734 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6735 verifyFormat("my_int a = (my_int)~0;");
6736 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006737 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006738 verifyFormat("my_int a = (my_int)1;");
6739 verifyFormat("my_int a = (my_int *)1;");
6740 verifyFormat("my_int a = (const my_int)-1;");
6741 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006742 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006743 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006744 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006745 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006746
6747 // FIXME: single value wrapped with paren will be treated as cast.
6748 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006749
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006750 verifyFormat("{ (void)F; }");
6751
Daniel Jasper998cabc2013-07-18 14:46:07 +00006752 // Don't break after a cast's
6753 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6754 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6755 " bbbbbbbbbbbbbbbbbbbbbb);");
6756
Daniel Jasperef906a92013-01-13 08:01:36 +00006757 // These are not casts.
6758 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006759 verifyFormat("f(foo)->b;");
6760 verifyFormat("f(foo).b;");
6761 verifyFormat("f(foo)(b);");
6762 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006763 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006764 verifyFormat("(*funptr)(foo)[4];");
6765 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006766 verifyFormat("void f(int *);");
6767 verifyFormat("void f(int *) = 0;");
6768 verifyFormat("void f(SmallVector<int>) {}");
6769 verifyFormat("void f(SmallVector<int>);");
6770 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006771 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006772 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006773 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006774 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6775 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006776 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006777
Daniel Jasperba0bda92013-02-23 08:07:18 +00006778 // These are not casts, but at some point were confused with casts.
6779 verifyFormat("virtual void foo(int *) override;");
6780 verifyFormat("virtual void foo(char &) const;");
6781 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006782 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006783 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006784 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006785 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006786
6787 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6788 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006789 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006790 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006791 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6792 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6793 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006794}
6795
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006796TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006797 verifyFormat("A<bool()> a;");
6798 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006799 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006800 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006801 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006802 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006803 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006804 verifyFormat("template <class CallbackClass>\n"
6805 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006806
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006807 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6808 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006809 verifyGoogleFormat(
6810 "template <class CallbackClass>\n"
6811 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006812
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006813 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006814 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006815 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006816 verifyFormat("some_var = function(*some_pointer_var)[0];");
6817 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006818 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006819 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006820}
6821
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006822TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6823 verifyFormat("A (*foo_)[6];");
6824 verifyFormat("vector<int> (*foo_)[6];");
6825}
6826
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006827TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6828 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6829 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6830 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6831 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006832 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6833 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006834
6835 // Different ways of ()-initializiation.
6836 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6837 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6838 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6839 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6840 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6841 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006842 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6843 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006844}
6845
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006846TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006847 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006848 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006849 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006850 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006851 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006852 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006853 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6854 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006855 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6856 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006857 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6858 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006859 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6860 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006861 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6862 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006863 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6864 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6865 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6866 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006867 FormatStyle Indented = getLLVMStyle();
6868 Indented.IndentWrappedFunctionNames = true;
6869 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6870 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6871 Indented);
6872 verifyFormat(
6873 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6874 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6875 Indented);
6876 verifyFormat(
6877 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6878 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6879 Indented);
6880 verifyFormat(
6881 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6882 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6883 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006884
6885 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006886 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6887 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6888 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006889
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006890 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006891 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006892 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006893 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6894 " SourceLocation L, IdentifierIn *II,\n"
6895 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006896 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006897 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006898 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006899 " const SomeType<string, SomeOtherTemplateParameter>\n"
6900 " &ReallyReallyLongParameterName,\n"
6901 " const SomeType<string, SomeOtherTemplateParameter>\n"
6902 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006903 verifyFormat("template <typename A>\n"
6904 "SomeLoooooooooooooooooooooongType<\n"
6905 " typename some_namespace::SomeOtherType<A>::Type>\n"
6906 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006907
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006908 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006909 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6910 " aaaaaaaaaaaaaaaaaaaaaaa;");
6911 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006912 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6913 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006914 verifyGoogleFormat(
6915 "some_namespace::LongReturnType\n"
6916 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006917 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006918
6919 verifyGoogleFormat("template <typename T>\n"
6920 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006921 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006922 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6923 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006924
6925 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006926 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6927 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006928 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6929 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6930 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6931 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6932 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6933 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6934 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006935}
6936
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006937TEST_F(FormatTest, FormatsArrays) {
6938 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6939 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006940 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6941 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006942 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6943 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006944 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6945 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6946 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6947 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6948 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6949 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6950 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6951 verifyFormat(
6952 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6953 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6954 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006955 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6956 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006957
6958 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6959 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006960 verifyFormat(
6961 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6962 " .aaaaaaa[0]\n"
6963 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006964 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006965
6966 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006967
6968 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6969 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006970}
6971
Daniel Jaspere9de2602012-12-06 09:56:08 +00006972TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6973 verifyFormat("(a)->b();");
6974 verifyFormat("--a;");
6975}
6976
Daniel Jasper8b529712012-12-04 13:02:32 +00006977TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006978 verifyFormat("#include <string>\n"
6979 "#include <a/b/c.h>\n"
6980 "#include \"a/b/string\"\n"
6981 "#include \"string.h\"\n"
6982 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006983 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006984 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006985 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006986 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006987 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006988 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
6989 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006990 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6991 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006992
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006993 verifyFormat("#import <string>");
6994 verifyFormat("#import <a/b/c.h>");
6995 verifyFormat("#import \"a/b/string\"");
6996 verifyFormat("#import \"string.h\"");
6997 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006998 verifyFormat("#if __has_include(<strstream>)\n"
6999 "#include <strstream>\n"
7000 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00007001
Daniel Jasper343643b2014-08-13 08:29:18 +00007002 verifyFormat("#define MY_IMPORT <a/b>");
7003
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00007004 // Protocol buffer definition or missing "#".
7005 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
7006 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00007007
7008 FormatStyle Style = getLLVMStyle();
7009 Style.AlwaysBreakBeforeMultilineStrings = true;
7010 Style.ColumnLimit = 0;
7011 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00007012
7013 // But 'import' might also be a regular C++ namespace.
7014 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7015 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00007016}
7017
Alexander Kornienko578fdd82012-12-06 18:03:27 +00007018//===----------------------------------------------------------------------===//
7019// Error recovery tests.
7020//===----------------------------------------------------------------------===//
7021
Daniel Jasper66e9dee2013-02-14 09:19:04 +00007022TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007023 FormatStyle NoBinPacking = getLLVMStyle();
7024 NoBinPacking.BinPackParameters = false;
7025 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
7026 " double *min_x,\n"
7027 " double *max_x,\n"
7028 " double *min_y,\n"
7029 " double *max_y,\n"
7030 " double *min_z,\n"
7031 " double *max_z, ) {}",
7032 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00007033}
7034
Daniel Jasper83a54d22013-01-10 09:26:47 +00007035TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00007036 verifyFormat("void f() { return; }\n42");
7037 verifyFormat("void f() {\n"
7038 " if (0)\n"
7039 " return;\n"
7040 "}\n"
7041 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00007042 verifyFormat("void f() { return }\n42");
7043 verifyFormat("void f() {\n"
7044 " if (0)\n"
7045 " return\n"
7046 "}\n"
7047 "42");
7048}
7049
7050TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
7051 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
7052 EXPECT_EQ("void f() {\n"
7053 " if (a)\n"
7054 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007055 "}",
7056 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00007057 EXPECT_EQ("namespace N {\n"
7058 "void f()\n"
7059 "}",
7060 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00007061 EXPECT_EQ("namespace N {\n"
7062 "void f() {}\n"
7063 "void g()\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007064 "}",
7065 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00007066}
7067
Daniel Jasper2df93312013-01-09 10:16:05 +00007068TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
7069 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00007070 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007071 " b;",
7072 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00007073 verifyFormat("function(\n"
7074 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007075 " LoooooooooooongArgument);\n",
7076 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00007077}
7078
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007079TEST_F(FormatTest, IncorrectAccessSpecifier) {
7080 verifyFormat("public:");
7081 verifyFormat("class A {\n"
7082 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007083 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007084 "};");
7085 verifyFormat("public\n"
7086 "int qwerty;");
7087 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007088 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007089 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007090 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007091 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007092 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007093}
Daniel Jasperf7935112012-12-03 18:12:45 +00007094
Daniel Jasper291f9362013-03-20 15:58:10 +00007095TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
7096 verifyFormat("{");
7097 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00007098 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00007099}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007100
7101TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007102 verifyFormat("do {\n}");
7103 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007104 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007105 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007106 "wheeee(fun);");
7107 verifyFormat("do {\n"
7108 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00007109 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007110}
7111
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007112TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00007113 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007114 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007115 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007116 verifyFormat("while {\n foo;\n foo();\n}");
7117 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00007118}
7119
Daniel Jasperc0880a92013-01-04 18:52:56 +00007120TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007121 verifyIncompleteFormat("namespace {\n"
7122 "class Foo { Foo (\n"
7123 "};\n"
7124 "} // comment");
Daniel Jasperc0880a92013-01-04 18:52:56 +00007125}
7126
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007127TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007128 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007129 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
7130 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007131 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007132
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007133 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007134 " {\n"
7135 " breakme(\n"
7136 " qwe);\n"
7137 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007138 format("{\n"
7139 " {\n"
7140 " breakme(qwe);\n"
7141 "}\n",
7142 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007143}
7144
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00007145TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007146 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007147 " avariable,\n"
7148 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007149 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00007150}
7151
Manuel Klimek762dd182013-01-21 10:07:49 +00007152TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007153 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00007154}
7155
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007156TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007157 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00007158 verifyFormat("vector<int> x{\n"
7159 " 1, 2, 3, 4,\n"
7160 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007161 verifyFormat("vector<T> x{{}, {}, {}, {}};");
7162 verifyFormat("f({1, 2});");
7163 verifyFormat("auto v = Foo{-1};");
7164 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
7165 verifyFormat("Class::Class : member{1, 2, 3} {}");
7166 verifyFormat("new vector<int>{1, 2, 3};");
7167 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00007168 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007169 verifyFormat("return {arg1, arg2};");
7170 verifyFormat("return {arg1, SomeType{parameter}};");
7171 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
7172 verifyFormat("new T{arg1, arg2};");
7173 verifyFormat("f(MyMap[{composite, key}]);");
7174 verifyFormat("class Class {\n"
7175 " T member = {arg1, arg2};\n"
7176 "};");
7177 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00007178 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
7179 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00007180
Daniel Jasper438059e2014-05-22 12:11:13 +00007181 verifyFormat("int foo(int i) { return fo1{}(i); }");
7182 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007183 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00007184 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00007185 verifyFormat("Node n{1, Node{1000}, //\n"
7186 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00007187 verifyFormat("Aaaa aaaaaaa{\n"
7188 " {\n"
7189 " aaaa,\n"
7190 " },\n"
7191 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00007192 verifyFormat("class C : public D {\n"
7193 " SomeClass SC{2};\n"
7194 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00007195 verifyFormat("class C : public A {\n"
7196 " class D : public B {\n"
7197 " void f() { int i{2}; }\n"
7198 " };\n"
7199 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00007200 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00007201
Daniel Jaspere4ada022016-12-13 10:05:03 +00007202 // Cases where distinguising braced lists and blocks is hard.
7203 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
7204 verifyFormat("void f() {\n"
7205 " return; // comment\n"
7206 "}\n"
7207 "SomeType t;");
7208 verifyFormat("void f() {\n"
7209 " if (a) {\n"
7210 " f();\n"
7211 " }\n"
7212 "}\n"
7213 "SomeType t;");
7214
Daniel Jasper08434342015-05-26 07:26:26 +00007215 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007216 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00007217 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007218 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
7219 " bbbbb,\n"
7220 " ccccc,\n"
7221 " ddddd,\n"
7222 " eeeee,\n"
7223 " ffffff,\n"
7224 " ggggg,\n"
7225 " hhhhhh,\n"
7226 " iiiiii,\n"
7227 " jjjjjj,\n"
7228 " kkkkkk};",
7229 NoBinPacking);
7230 verifyFormat("const Aaaaaa aaaaa = {\n"
7231 " aaaaa,\n"
7232 " bbbbb,\n"
7233 " ccccc,\n"
7234 " ddddd,\n"
7235 " eeeee,\n"
7236 " ffffff,\n"
7237 " ggggg,\n"
7238 " hhhhhh,\n"
7239 " iiiiii,\n"
7240 " jjjjjj,\n"
7241 " kkkkkk,\n"
7242 "};",
7243 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00007244 verifyFormat(
7245 "const Aaaaaa aaaaa = {\n"
7246 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
7247 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
7248 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
7249 "};",
7250 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007251
Chandler Carruthf8b72662014-03-02 12:37:31 +00007252 // FIXME: The alignment of these trailing comments might be bad. Then again,
7253 // this might be utterly useless in real code.
7254 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00007255 " : some_value{ //\n"
7256 " aaaaaaa, //\n"
7257 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00007258
Chandler Carruthf8b72662014-03-02 12:37:31 +00007259 // In braced lists, the first comment is always assumed to belong to the
7260 // first element. Thus, it can be moved to the next or previous line as
7261 // appropriate.
7262 EXPECT_EQ("function({// First element:\n"
7263 " 1,\n"
7264 " // Second element:\n"
7265 " 2});",
7266 format("function({\n"
7267 " // First element:\n"
7268 " 1,\n"
7269 " // Second element:\n"
7270 " 2});"));
7271 EXPECT_EQ("std::vector<int> MyNumbers{\n"
7272 " // First element:\n"
7273 " 1,\n"
7274 " // Second element:\n"
7275 " 2};",
7276 format("std::vector<int> MyNumbers{// First element:\n"
7277 " 1,\n"
7278 " // Second element:\n"
7279 " 2};",
7280 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00007281 // A trailing comma should still lead to an enforced line break.
7282 EXPECT_EQ("vector<int> SomeVector = {\n"
7283 " // aaa\n"
7284 " 1, 2,\n"
7285 "};",
7286 format("vector<int> SomeVector = { // aaa\n"
7287 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00007288
Chandler Carruthf8b72662014-03-02 12:37:31 +00007289 FormatStyle ExtraSpaces = getLLVMStyle();
7290 ExtraSpaces.Cpp11BracedListStyle = false;
7291 ExtraSpaces.ColumnLimit = 75;
7292 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
7293 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
7294 verifyFormat("f({ 1, 2 });", ExtraSpaces);
7295 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
7296 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
7297 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
7298 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
7299 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
7300 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
7301 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
7302 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
7303 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
7304 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
7305 verifyFormat("class Class {\n"
7306 " T member = { arg1, arg2 };\n"
7307 "};",
7308 ExtraSpaces);
7309 verifyFormat(
7310 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7311 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
7312 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
7313 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
7314 ExtraSpaces);
7315 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00007316 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007317 ExtraSpaces);
7318 verifyFormat(
7319 "someFunction(OtherParam,\n"
7320 " BracedList{ // comment 1 (Forcing interesting break)\n"
7321 " param1, param2,\n"
7322 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00007323 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007324 ExtraSpaces);
7325 verifyFormat(
7326 "std::this_thread::sleep_for(\n"
7327 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
7328 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00007329 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00007330 " aaaaaaa,\n"
7331 " aaaaaaaaaa,\n"
7332 " aaaaa,\n"
7333 " aaaaaaaaaaaaaaa,\n"
7334 " aaa,\n"
7335 " aaaaaaaaaa,\n"
7336 " a,\n"
7337 " aaaaaaaaaaaaaaaaaaaaa,\n"
7338 " aaaaaaaaaaaa,\n"
7339 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
7340 " aaaaaaa,\n"
7341 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007342 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00007343}
7344
Daniel Jasper33b909c2013-10-25 14:29:37 +00007345TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007346 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7347 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7348 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7349 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7350 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7351 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007352 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007353 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00007354 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007355 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7356 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007357 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007358 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7359 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7360 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
7361 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7362 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7363 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7364 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007365 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007366 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7367 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007368 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7369 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7370 " // Separating comment.\n"
7371 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
7372 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7373 " // Leading comment\n"
7374 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7375 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007376 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7377 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007378 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00007379 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7380 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007381 getLLVMStyleWithColumns(38));
7382 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007383 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
7384 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007385 verifyFormat(
7386 "static unsigned SomeValues[10][3] = {\n"
7387 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
7388 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
7389 verifyFormat("static auto fields = new vector<string>{\n"
7390 " \"aaaaaaaaaaaaa\",\n"
7391 " \"aaaaaaaaaaaaa\",\n"
7392 " \"aaaaaaaaaaaa\",\n"
7393 " \"aaaaaaaaaaaaaa\",\n"
7394 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7395 " \"aaaaaaaaaaaa\",\n"
7396 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7397 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00007398 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
7399 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
7400 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
7401 " 3, cccccccccccccccccccccc};",
7402 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00007403
7404 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00007405 verifyFormat("vector<int> x = {\n"
7406 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
7407 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00007408 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00007409 verifyFormat("vector<int> x = {\n"
7410 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00007411 "};",
7412 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00007413 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7414 " 1, 1, 1, 1,\n"
7415 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00007416 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007417
Daniel Jasper60c27072015-05-13 08:16:00 +00007418 // Trailing comment in the first line.
7419 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
7420 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
7421 " 111111111, 222222222, 3333333333, 444444444, //\n"
7422 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00007423 // Trailing comment in the last line.
7424 verifyFormat("int aaaaa[] = {\n"
7425 " 1, 2, 3, // comment\n"
7426 " 4, 5, 6 // comment\n"
7427 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00007428
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007429 // With nested lists, we should either format one item per line or all nested
7430 // lists one on line.
7431 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007432 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
7433 " {aaaaaaaaaaaaaaaaaaa},\n"
7434 " {aaaaaaaaaaaaaaaaaaaaa},\n"
7435 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00007436 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00007437 verifyFormat(
7438 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007439 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
7440 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
7441 " {aaa, aaa},\n"
7442 " {aaa, aaa},\n"
7443 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
7444 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7445 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00007446
7447 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007448 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
7449 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00007450
7451 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00007452
Daniel Jaspereb65e912015-12-21 18:31:15 +00007453 // No braced initializer here.
7454 verifyFormat("void f() {\n"
7455 " struct Dummy {};\n"
7456 " f(v);\n"
7457 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00007458
7459 // Long lists should be formatted in columns even if they are nested.
7460 verifyFormat(
7461 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7462 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7463 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7464 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7465 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7466 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00007467
7468 // Allow "single-column" layout even if that violates the column limit. There
7469 // isn't going to be a better way.
7470 verifyFormat("std::vector<int> a = {\n"
7471 " aaaaaaaa,\n"
7472 " aaaaaaaa,\n"
7473 " aaaaaaaa,\n"
7474 " aaaaaaaa,\n"
7475 " aaaaaaaaaa,\n"
7476 " aaaaaaaa,\n"
7477 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
7478 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00007479 verifyFormat("vector<int> aaaa = {\n"
7480 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7481 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7482 " aaaaaa.aaaaaaa,\n"
7483 " aaaaaa.aaaaaaa,\n"
7484 " aaaaaa.aaaaaaa,\n"
7485 " aaaaaa.aaaaaaa,\n"
7486 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007487
7488 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00007489 verifyFormat("someFunction(Param, {List1, List2,\n"
7490 " List3});",
7491 getLLVMStyleWithColumns(35));
7492 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007493 " {List1, List2,\n"
7494 " List3});",
7495 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00007496 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
7497 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007498}
7499
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007500TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007501 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00007502 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007503
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007504 verifyFormat("void f() { return 42; }");
7505 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007506 " return 42;\n"
7507 "}",
7508 DoNotMerge);
7509 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007510 " // Comment\n"
7511 "}");
7512 verifyFormat("{\n"
7513 "#error {\n"
7514 " int a;\n"
7515 "}");
7516 verifyFormat("{\n"
7517 " int a;\n"
7518 "#error {\n"
7519 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00007520 verifyFormat("void f() {} // comment");
7521 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00007522 verifyFormat("void f() {\n"
7523 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007524 DoNotMerge);
7525 verifyFormat("void f() {\n"
7526 " int a;\n"
7527 "} // comment",
7528 DoNotMerge);
7529 verifyFormat("void f() {\n"
7530 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00007531 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007532
7533 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7534 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7535
7536 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7537 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007538 verifyFormat("class C {\n"
7539 " C()\n"
7540 " : iiiiiiii(nullptr),\n"
7541 " kkkkkkk(nullptr),\n"
7542 " mmmmmmm(nullptr),\n"
7543 " nnnnnnn(nullptr) {}\n"
7544 "};",
7545 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007546
7547 FormatStyle NoColumnLimit = getLLVMStyle();
7548 NoColumnLimit.ColumnLimit = 0;
7549 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7550 EXPECT_EQ("class C {\n"
7551 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007552 "};",
7553 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007554 EXPECT_EQ("A()\n"
7555 " : b(0) {\n"
7556 "}",
7557 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7558
7559 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007560 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7561 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007562 EXPECT_EQ("A()\n"
7563 " : b(0) {\n"
7564 "}",
7565 format("A():b(0){}", DoNotMergeNoColumnLimit));
7566 EXPECT_EQ("A()\n"
7567 " : b(0) {\n"
7568 "}",
7569 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007570
7571 verifyFormat("#define A \\\n"
7572 " void f() { \\\n"
7573 " int i; \\\n"
7574 " }",
7575 getLLVMStyleWithColumns(20));
7576 verifyFormat("#define A \\\n"
7577 " void f() { int i; }",
7578 getLLVMStyleWithColumns(21));
7579 verifyFormat("#define A \\\n"
7580 " void f() { \\\n"
7581 " int i; \\\n"
7582 " } \\\n"
7583 " int j;",
7584 getLLVMStyleWithColumns(22));
7585 verifyFormat("#define A \\\n"
7586 " void f() { int i; } \\\n"
7587 " int j;",
7588 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007589}
7590
Daniel Jasperd74cf402014-04-08 12:46:38 +00007591TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7592 FormatStyle MergeInlineOnly = getLLVMStyle();
7593 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7594 verifyFormat("class C {\n"
7595 " int f() { return 42; }\n"
7596 "};",
7597 MergeInlineOnly);
7598 verifyFormat("int f() {\n"
7599 " return 42;\n"
7600 "}",
7601 MergeInlineOnly);
7602}
7603
Manuel Klimeke01bab52013-01-15 13:38:33 +00007604TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7605 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007606 verifyFormat("struct foo a = {bar};\nint n;");
7607 verifyFormat("class foo a = {bar};\nint n;");
7608 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007609
7610 // Elaborate types inside function definitions.
7611 verifyFormat("struct foo f() {}\nint n;");
7612 verifyFormat("class foo f() {}\nint n;");
7613 verifyFormat("union foo f() {}\nint n;");
7614
7615 // Templates.
7616 verifyFormat("template <class X> void f() {}\nint n;");
7617 verifyFormat("template <struct X> void f() {}\nint n;");
7618 verifyFormat("template <union X> void f() {}\nint n;");
7619
7620 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007621 verifyFormat("struct {\n} n;");
7622 verifyFormat(
7623 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007624 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007625 verifyFormat("class MACRO Z {\n} n;");
7626 verifyFormat("class MACRO(X) Z {\n} n;");
7627 verifyFormat("class __attribute__(X) Z {\n} n;");
7628 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007629 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007630 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007631 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7632 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007633
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007634 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007635 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007636
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007637 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007638 verifyFormat(
7639 "template <typename F>\n"
7640 "Matcher(const Matcher<F> &Other,\n"
7641 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7642 " !is_same<F, T>::value>::type * = 0)\n"
7643 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7644
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007645 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007646 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007647 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007648
7649 // FIXME:
7650 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007651 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007652
Manuel Klimeke01bab52013-01-15 13:38:33 +00007653 // Elaborate types where incorrectly parsing the structural element would
7654 // break the indent.
7655 verifyFormat("if (true)\n"
7656 " class X x;\n"
7657 "else\n"
7658 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007659
7660 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007661 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007662}
7663
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007664TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007665 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7666 format("#error Leave all white!!!!! space* alone!\n"));
7667 EXPECT_EQ(
7668 "#warning Leave all white!!!!! space* alone!\n",
7669 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007670 EXPECT_EQ("#error 1", format(" # error 1"));
7671 EXPECT_EQ("#warning 1", format(" # warning 1"));
7672}
7673
Daniel Jasper4431aa92013-04-23 13:54:04 +00007674TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007675 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007676 verifyFormat("#if (AAAA && BBBB)");
7677 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007678 // FIXME: Come up with a better indentation for #elif.
7679 verifyFormat(
7680 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7681 " defined(BBBBBBBB)\n"
7682 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7683 " defined(BBBBBBBB)\n"
7684 "#endif",
7685 getLLVMStyleWithColumns(65));
7686}
7687
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007688TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7689 FormatStyle AllowsMergedIf = getGoogleStyle();
7690 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7691 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7692 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007693 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7694 EXPECT_EQ("if (true) return 42;",
7695 format("if (true)\nreturn 42;", AllowsMergedIf));
7696 FormatStyle ShortMergedIf = AllowsMergedIf;
7697 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007698 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007699 " if (true) return 42;",
7700 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007701 verifyFormat("#define A \\\n"
7702 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007703 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007704 "#define B",
7705 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007706 verifyFormat("#define A \\\n"
7707 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007708 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007709 "g();",
7710 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007711 verifyFormat("{\n"
7712 "#ifdef A\n"
7713 " // Comment\n"
7714 " if (true) continue;\n"
7715 "#endif\n"
7716 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007717 " if (true) continue;\n"
7718 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007719 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007720 ShortMergedIf.ColumnLimit = 29;
7721 verifyFormat("#define A \\\n"
7722 " if (aaaaaaaaaa) return 1; \\\n"
7723 " return 2;",
7724 ShortMergedIf);
7725 ShortMergedIf.ColumnLimit = 28;
7726 verifyFormat("#define A \\\n"
7727 " if (aaaaaaaaaa) \\\n"
7728 " return 1; \\\n"
7729 " return 2;",
7730 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007731}
7732
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007733TEST_F(FormatTest, BlockCommentsInControlLoops) {
7734 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7735 " f();\n"
7736 "}");
7737 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7738 " f();\n"
7739 "} /* another comment */ else /* comment #3 */ {\n"
7740 " g();\n"
7741 "}");
7742 verifyFormat("while (0) /* a comment in a strange place */ {\n"
7743 " f();\n"
7744 "}");
7745 verifyFormat("for (;;) /* a comment in a strange place */ {\n"
7746 " f();\n"
7747 "}");
7748 verifyFormat("do /* a comment in a strange place */ {\n"
7749 " f();\n"
7750 "} /* another comment */ while (0);");
7751}
7752
7753TEST_F(FormatTest, BlockComments) {
7754 EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
7755 format("/* *//* */ /* */\n/* *//* */ /* */"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007756 EXPECT_EQ("/* */ a /* */ b;", format(" /* */ a/* */ b;"));
Daniel Jaspera49393f2013-08-28 09:07:32 +00007757 EXPECT_EQ("#define A /*123*/ \\\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007758 " b\n"
7759 "/* */\n"
7760 "someCall(\n"
7761 " parameter);",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00007762 format("#define A /*123*/ b\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007763 "/* */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007764 "someCall(parameter);",
7765 getLLVMStyleWithColumns(15)));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007766
7767 EXPECT_EQ("#define A\n"
7768 "/* */ someCall(\n"
7769 " parameter);",
7770 format("#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007771 "/* */someCall(parameter);",
7772 getLLVMStyleWithColumns(15)));
Daniel Jasper51fb2b22013-05-30 06:40:07 +00007773 EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007774 EXPECT_EQ("/*\n"
7775 "*\n"
7776 " * aaaaaa\n"
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00007777 " * aaaaaa\n"
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007778 "*/",
7779 format("/*\n"
7780 "*\n"
7781 " * aaaaaa aaaaaa\n"
7782 "*/",
7783 getLLVMStyleWithColumns(10)));
Daniel Jasperce257f22013-05-30 17:27:48 +00007784 EXPECT_EQ("/*\n"
7785 "**\n"
7786 "* aaaaaa\n"
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007787 "*aaaaaa\n"
Daniel Jasperce257f22013-05-30 17:27:48 +00007788 "*/",
7789 format("/*\n"
7790 "**\n"
7791 "* aaaaaa aaaaaa\n"
7792 "*/",
7793 getLLVMStyleWithColumns(10)));
Daniel Jasperacadc8e2016-06-08 09:45:08 +00007794 EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7795 " /* line 1\n"
7796 " bbbbbbbbbbbb */\n"
7797 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7798 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7799 " /* line 1\n"
7800 " bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7801 getLLVMStyleWithColumns(50)));
Daniel Jasper1f140982013-02-04 07:32:14 +00007802
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007803 FormatStyle NoBinPacking = getLLVMStyle();
7804 NoBinPacking.BinPackParameters = false;
Daniel Jasper1f140982013-02-04 07:32:14 +00007805 EXPECT_EQ("someFunction(1, /* comment 1 */\n"
7806 " 2, /* comment 2 */\n"
7807 " 3, /* comment 3 */\n"
Daniel Jasper14e40ec2013-02-04 08:34:57 +00007808 " aaaa,\n"
7809 " bbbb);",
Daniel Jasper1f140982013-02-04 07:32:14 +00007810 format("someFunction (1, /* comment 1 */\n"
7811 " 2, /* comment 2 */ \n"
7812 " 3, /* comment 3 */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007813 "aaaa, bbbb );",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007814 NoBinPacking));
Daniel Jasper38396592013-02-06 15:23:09 +00007815 verifyFormat(
7816 "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7817 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7818 EXPECT_EQ(
7819 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7820 " aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7821 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
7822 format(
7823 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7824 " aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7825 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
Daniel Jasper94f0e132013-02-06 20:07:35 +00007826 EXPECT_EQ(
7827 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7828 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7829 "int cccccccccccccccccccccccccccccc; /* comment */\n",
7830 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7831 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7832 "int cccccccccccccccccccccccccccccc; /* comment */\n"));
Daniel Jasper022612d2013-07-01 09:34:09 +00007833
7834 verifyFormat("void f(int * /* unused */) {}");
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007835
7836 EXPECT_EQ("/*\n"
7837 " **\n"
7838 " */",
7839 format("/*\n"
7840 " **\n"
7841 " */"));
7842 EXPECT_EQ("/*\n"
7843 " *q\n"
7844 " */",
7845 format("/*\n"
7846 " *q\n"
7847 " */"));
7848 EXPECT_EQ("/*\n"
7849 " * q\n"
7850 " */",
7851 format("/*\n"
7852 " * q\n"
7853 " */"));
7854 EXPECT_EQ("/*\n"
7855 " **/",
7856 format("/*\n"
7857 " **/"));
7858 EXPECT_EQ("/*\n"
7859 " ***/",
7860 format("/*\n"
7861 " ***/"));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007862}
7863
Manuel Klimek82b836a2013-02-06 16:40:56 +00007864TEST_F(FormatTest, BlockCommentsInMacros) {
7865 EXPECT_EQ("#define A \\\n"
7866 " { \\\n"
7867 " /* one line */ \\\n"
7868 " someCall();",
7869 format("#define A { \\\n"
7870 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007871 " someCall();",
7872 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007873 EXPECT_EQ("#define A \\\n"
7874 " { \\\n"
7875 " /* previous */ \\\n"
7876 " /* one line */ \\\n"
7877 " someCall();",
7878 format("#define A { \\\n"
7879 " /* previous */ \\\n"
7880 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007881 " someCall();",
7882 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007883}
7884
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007885TEST_F(FormatTest, BlockCommentsAtEndOfLine) {
7886 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007887 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007888 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007889 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007890 "};",
7891 getLLVMStyleWithColumns(15)));
7892 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007893 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007894 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007895 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007896 "};",
7897 getLLVMStyleWithColumns(15)));
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007898 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007899 " 1111 /* a\n"
Krasimir Georgiev91834222017-01-25 13:58:58 +00007900 " */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007901 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007902 format("a = {1111 /* a */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007903 "};",
7904 getLLVMStyleWithColumns(15)));
7905}
7906
Manuel Klimek82b836a2013-02-06 16:40:56 +00007907TEST_F(FormatTest, IndentLineCommentsInStartOfBlockAtEndOfFile) {
Manuel Klimek82b836a2013-02-06 16:40:56 +00007908 verifyFormat("{\n"
Marianne Mailhot-Sarrasin03137c62016-04-14 14:56:49 +00007909 " // a\n"
7910 " // b");
Manuel Klimek82b836a2013-02-06 16:40:56 +00007911}
7912
Manuel Klimekd33516e2013-01-23 10:09:28 +00007913TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007914 verifyFormat("void f(int *a);");
7915 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007916 verifyFormat("class A {\n void f(int *a);\n};");
7917 verifyFormat("class A {\n int *a;\n};");
7918 verifyFormat("namespace a {\n"
7919 "namespace b {\n"
7920 "class A {\n"
7921 " void f() {}\n"
7922 " int *a;\n"
7923 "};\n"
7924 "}\n"
7925 "}");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007926}
7927
Manuel Klimekd33516e2013-01-23 10:09:28 +00007928TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7929 verifyFormat("while");
7930 verifyFormat("operator");
7931}
7932
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007933TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7934 // This code would be painfully slow to format if we didn't skip it.
7935 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
7936 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7937 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7938 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7939 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7940 "A(1, 1)\n"
7941 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7942 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7943 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7944 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7945 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7946 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7947 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7948 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7949 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7950 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7951 // Deeply nested part is untouched, rest is formatted.
7952 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7953 format(std::string("int i;\n") + Code + "int j;\n",
7954 getLLVMStyle(), IC_ExpectIncomplete));
7955}
7956
Nico Weber7e6a7a12013-01-08 17:56:31 +00007957//===----------------------------------------------------------------------===//
7958// Objective-C tests.
7959//===----------------------------------------------------------------------===//
7960
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007961TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7962 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7963 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7964 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007965 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007966 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7967 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7968 format("-(NSInteger)Method3:(id)anObject;"));
7969 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7970 format("-(NSInteger)Method4:(id)anObject;"));
7971 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7972 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7973 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7974 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007975 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7976 "forAllCells:(BOOL)flag;",
7977 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7978 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007979
7980 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007981 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7982 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007983 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7984 " inRange:(NSRange)range\n"
7985 " outRange:(NSRange)out_range\n"
7986 " outRange1:(NSRange)out_range1\n"
7987 " outRange2:(NSRange)out_range2\n"
7988 " outRange3:(NSRange)out_range3\n"
7989 " outRange4:(NSRange)out_range4\n"
7990 " outRange5:(NSRange)out_range5\n"
7991 " outRange6:(NSRange)out_range6\n"
7992 " outRange7:(NSRange)out_range7\n"
7993 " outRange8:(NSRange)out_range8\n"
7994 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007995
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007996 // When the function name has to be wrapped.
7997 FormatStyle Style = getLLVMStyle();
7998 Style.IndentWrappedFunctionNames = false;
7999 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
8000 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
8001 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
8002 "}",
8003 Style);
8004 Style.IndentWrappedFunctionNames = true;
8005 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
8006 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
8007 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
8008 "}",
8009 Style);
8010
Nico Weberd6f962f2013-01-10 20:18:33 +00008011 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00008012 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00008013 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
8014 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00008015 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00008016
Daniel Jasper37194282013-05-28 08:33:00 +00008017 verifyFormat("- (int (*)())foo:(int (*)())f;");
8018 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00008019
8020 // If there's no return type (very rare in practice!), LLVM and Google style
8021 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00008022 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00008023 verifyFormat("- foo:(int)f;");
8024 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00008025}
8026
Nico Weber0588b502013-02-07 00:19:29 +00008027
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008028TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00008029 EXPECT_EQ("\"some text \"\n"
8030 "\"other\";",
8031 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00008032 EXPECT_EQ("\"some text \"\n"
8033 "\"other\";",
8034 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008035 EXPECT_EQ(
8036 "#define A \\\n"
8037 " \"some \" \\\n"
8038 " \"text \" \\\n"
8039 " \"other\";",
8040 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
8041 EXPECT_EQ(
8042 "#define A \\\n"
8043 " \"so \" \\\n"
8044 " \"text \" \\\n"
8045 " \"other\";",
8046 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
8047
8048 EXPECT_EQ("\"some text\"",
8049 format("\"some text\"", getLLVMStyleWithColumns(1)));
8050 EXPECT_EQ("\"some text\"",
8051 format("\"some text\"", getLLVMStyleWithColumns(11)));
8052 EXPECT_EQ("\"some \"\n"
8053 "\"text\"",
8054 format("\"some text\"", getLLVMStyleWithColumns(10)));
8055 EXPECT_EQ("\"some \"\n"
8056 "\"text\"",
8057 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00008058 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008059 "\" tex\"\n"
8060 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008061 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00008062 EXPECT_EQ("\"some\"\n"
8063 "\" tex\"\n"
8064 "\" and\"",
8065 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
8066 EXPECT_EQ("\"some\"\n"
8067 "\"/tex\"\n"
8068 "\"/and\"",
8069 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008070
8071 EXPECT_EQ("variable =\n"
8072 " \"long string \"\n"
8073 " \"literal\";",
8074 format("variable = \"long string literal\";",
8075 getLLVMStyleWithColumns(20)));
8076
8077 EXPECT_EQ("variable = f(\n"
8078 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00008079 " \"literal\",\n"
8080 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00008081 " loooooooooooooooooooong);",
8082 format("variable = f(\"long string literal\", short, "
8083 "loooooooooooooooooooong);",
8084 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008085
Daniel Jaspera44991332015-04-29 13:06:49 +00008086 EXPECT_EQ(
8087 "f(g(\"long string \"\n"
8088 " \"literal\"),\n"
8089 " b);",
8090 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008091 EXPECT_EQ("f(g(\"long string \"\n"
8092 " \"literal\",\n"
8093 " a),\n"
8094 " b);",
8095 format("f(g(\"long string literal\", a), b);",
8096 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008097 EXPECT_EQ(
8098 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00008099 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008100 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
8101 EXPECT_EQ("f(\"one two three four five six \"\n"
8102 " \"seven\".split(\n"
8103 " really_looooong_variable));",
8104 format("f(\"one two three four five six seven\"."
8105 "split(really_looooong_variable));",
8106 getLLVMStyleWithColumns(33)));
8107
8108 EXPECT_EQ("f(\"some \"\n"
8109 " \"text\",\n"
8110 " other);",
8111 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00008112
8113 // Only break as a last resort.
8114 verifyFormat(
8115 "aaaaaaaaaaaaaaaaaaaa(\n"
8116 " aaaaaaaaaaaaaaaaaaaa,\n"
8117 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00008118
Daniel Jaspera44991332015-04-29 13:06:49 +00008119 EXPECT_EQ("\"splitmea\"\n"
8120 "\"trandomp\"\n"
8121 "\"oint\"",
8122 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00008123
Daniel Jaspera44991332015-04-29 13:06:49 +00008124 EXPECT_EQ("\"split/\"\n"
8125 "\"pathat/\"\n"
8126 "\"slashes\"",
8127 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008128
Daniel Jaspera44991332015-04-29 13:06:49 +00008129 EXPECT_EQ("\"split/\"\n"
8130 "\"pathat/\"\n"
8131 "\"slashes\"",
8132 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00008133 EXPECT_EQ("\"split at \"\n"
8134 "\"spaces/at/\"\n"
8135 "\"slashes.at.any$\"\n"
8136 "\"non-alphanumeric%\"\n"
8137 "\"1111111111characte\"\n"
8138 "\"rs\"",
8139 format("\"split at "
8140 "spaces/at/"
8141 "slashes.at."
8142 "any$non-"
8143 "alphanumeric%"
8144 "1111111111characte"
8145 "rs\"",
8146 getLLVMStyleWithColumns(20)));
8147
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008148 // Verify that splitting the strings understands
8149 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00008150 EXPECT_EQ(
8151 "aaaaaaaaaaaa(\n"
8152 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8153 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8154 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8155 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8156 "aaaaaaaaaaaaaaaaaaaaaa\");",
8157 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00008158 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8159 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8160 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8161 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8162 "aaaaaaaaaaaaaaaaaaaaaa\";",
8163 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00008164 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8165 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8166 format("llvm::outs() << "
8167 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8168 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00008169 EXPECT_EQ("ffff(\n"
8170 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8171 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8172 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8173 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8174 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008175
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008176 FormatStyle Style = getLLVMStyleWithColumns(12);
8177 Style.BreakStringLiterals = false;
8178 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8179
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008180 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
8181 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00008182 EXPECT_EQ("#define A \\\n"
8183 " \"some \" \\\n"
8184 " \"text \" \\\n"
8185 " \"other\";",
8186 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008187}
8188
Manuel Klimek9e321992015-07-28 15:50:24 +00008189TEST_F(FormatTest, FullyRemoveEmptyLines) {
8190 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8191 NoEmptyLines.MaxEmptyLinesToKeep = 0;
8192 EXPECT_EQ("int i = a(b());",
8193 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8194}
8195
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008196TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8197 EXPECT_EQ(
8198 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8199 "(\n"
8200 " \"x\t\");",
8201 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8202 "aaaaaaa("
8203 "\"x\t\");"));
8204}
8205
Daniel Jasper174b0122014-01-09 14:18:12 +00008206TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00008207 EXPECT_EQ(
8208 "u8\"utf8 string \"\n"
8209 "u8\"literal\";",
8210 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8211 EXPECT_EQ(
8212 "u\"utf16 string \"\n"
8213 "u\"literal\";",
8214 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8215 EXPECT_EQ(
8216 "U\"utf32 string \"\n"
8217 "U\"literal\";",
8218 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8219 EXPECT_EQ("L\"wide string \"\n"
8220 "L\"literal\";",
8221 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00008222 EXPECT_EQ("@\"NSString \"\n"
8223 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00008224 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00008225
8226 // This input makes clang-format try to split the incomplete unicode escape
8227 // sequence, which used to lead to a crasher.
8228 verifyNoCrash(
8229 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8230 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008231}
8232
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00008233TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8234 FormatStyle Style = getGoogleStyleWithColumns(15);
8235 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8236 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8237 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8238 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8239 EXPECT_EQ("u8R\"x(raw literal)x\";",
8240 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008241}
8242
8243TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8244 FormatStyle Style = getLLVMStyleWithColumns(20);
8245 EXPECT_EQ(
8246 "_T(\"aaaaaaaaaaaaaa\")\n"
8247 "_T(\"aaaaaaaaaaaaaa\")\n"
8248 "_T(\"aaaaaaaaaaaa\")",
8249 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
8250 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
8251 " _T(\"aaaaaa\"),\n"
8252 " z);",
8253 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8254
8255 // FIXME: Handle embedded spaces in one iteration.
8256 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8257 // "_T(\"aaaaaaaaaaaaa\")\n"
8258 // "_T(\"aaaaaaaaaaaaa\")\n"
8259 // "_T(\"a\")",
8260 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8261 // getLLVMStyleWithColumns(20)));
8262 EXPECT_EQ(
8263 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8264 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008265 EXPECT_EQ("f(\n"
8266 "#if !TEST\n"
8267 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8268 "#endif\n"
8269 " );",
8270 format("f(\n"
8271 "#if !TEST\n"
8272 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8273 "#endif\n"
8274 ");"));
8275 EXPECT_EQ("f(\n"
8276 "\n"
8277 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8278 format("f(\n"
8279 "\n"
8280 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008281}
8282
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008283TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008284 EXPECT_EQ(
8285 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8286 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8287 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8288 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8289 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8290 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8291}
8292
8293TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8294 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008295 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008296 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8297 "multiline raw string literal xxxxxxxxxxxxxx\n"
8298 ")x\",\n"
8299 " a),\n"
8300 " b);",
8301 format("fffffffffff(g(R\"x(\n"
8302 "multiline raw string literal xxxxxxxxxxxxxx\n"
8303 ")x\", a), b);",
8304 getGoogleStyleWithColumns(20)));
8305 EXPECT_EQ("fffffffffff(\n"
8306 " g(R\"x(qqq\n"
8307 "multiline raw string literal xxxxxxxxxxxxxx\n"
8308 ")x\",\n"
8309 " a),\n"
8310 " b);",
8311 format("fffffffffff(g(R\"x(qqq\n"
8312 "multiline raw string literal xxxxxxxxxxxxxx\n"
8313 ")x\", a), b);",
8314 getGoogleStyleWithColumns(20)));
8315
8316 EXPECT_EQ("fffffffffff(R\"x(\n"
8317 "multiline raw string literal xxxxxxxxxxxxxx\n"
8318 ")x\");",
8319 format("fffffffffff(R\"x(\n"
8320 "multiline raw string literal xxxxxxxxxxxxxx\n"
8321 ")x\");",
8322 getGoogleStyleWithColumns(20)));
8323 EXPECT_EQ("fffffffffff(R\"x(\n"
8324 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008325 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008326 format("fffffffffff(R\"x(\n"
8327 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008328 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008329 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008330 EXPECT_EQ("fffffffffff(\n"
8331 " R\"x(\n"
8332 "multiline raw string literal xxxxxxxxxxxxxx\n"
8333 ")x\" +\n"
8334 " bbbbbb);",
8335 format("fffffffffff(\n"
8336 " R\"x(\n"
8337 "multiline raw string literal xxxxxxxxxxxxxx\n"
8338 ")x\" + bbbbbb);",
8339 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008340}
8341
Alexander Kornienkobe633902013-06-14 11:46:10 +00008342TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008343 verifyFormat("string a = \"unterminated;");
8344 EXPECT_EQ("function(\"unterminated,\n"
8345 " OtherParameter);",
8346 format("function( \"unterminated,\n"
8347 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008348}
8349
8350TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008351 FormatStyle Style = getLLVMStyle();
8352 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008353 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008354 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008355}
8356
Daniel Jaspera44991332015-04-29 13:06:49 +00008357TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008358
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008359TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8360 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8361 " \"ddeeefff\");",
8362 format("someFunction(\"aaabbbcccdddeeefff\");",
8363 getLLVMStyleWithColumns(25)));
8364 EXPECT_EQ("someFunction1234567890(\n"
8365 " \"aaabbbcccdddeeefff\");",
8366 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8367 getLLVMStyleWithColumns(26)));
8368 EXPECT_EQ("someFunction1234567890(\n"
8369 " \"aaabbbcccdddeeeff\"\n"
8370 " \"f\");",
8371 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8372 getLLVMStyleWithColumns(25)));
8373 EXPECT_EQ("someFunction1234567890(\n"
8374 " \"aaabbbcccdddeeeff\"\n"
8375 " \"f\");",
8376 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8377 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008378 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8379 " \"ddde \"\n"
8380 " \"efff\");",
8381 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008382 getLLVMStyleWithColumns(25)));
8383 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8384 " \"ddeeefff\");",
8385 format("someFunction(\"aaabbbccc ddeeefff\");",
8386 getLLVMStyleWithColumns(25)));
8387 EXPECT_EQ("someFunction1234567890(\n"
8388 " \"aaabb \"\n"
8389 " \"cccdddeeefff\");",
8390 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8391 getLLVMStyleWithColumns(25)));
8392 EXPECT_EQ("#define A \\\n"
8393 " string s = \\\n"
8394 " \"123456789\" \\\n"
8395 " \"0\"; \\\n"
8396 " int i;",
8397 format("#define A string s = \"1234567890\"; int i;",
8398 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008399 // FIXME: Put additional penalties on breaking at non-whitespace locations.
8400 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8401 " \"dddeeeff\"\n"
8402 " \"f\");",
8403 format("someFunction(\"aaabbbcc dddeeefff\");",
8404 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008405}
8406
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008407TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008408 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8409 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008410 EXPECT_EQ("\"test\"\n"
8411 "\"\\n\"",
8412 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8413 EXPECT_EQ("\"tes\\\\\"\n"
8414 "\"n\"",
8415 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8416 EXPECT_EQ("\"\\\\\\\\\"\n"
8417 "\"\\n\"",
8418 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008419 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008420 EXPECT_EQ("\"\\uff01\"\n"
8421 "\"test\"",
8422 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8423 EXPECT_EQ("\"\\Uff01ff02\"",
8424 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8425 EXPECT_EQ("\"\\x000000000001\"\n"
8426 "\"next\"",
8427 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8428 EXPECT_EQ("\"\\x000000000001next\"",
8429 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8430 EXPECT_EQ("\"\\x000000000001\"",
8431 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8432 EXPECT_EQ("\"test\"\n"
8433 "\"\\000000\"\n"
8434 "\"000001\"",
8435 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8436 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008437 "\"00000000\"\n"
8438 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008439 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008440}
8441
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008442TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8443 verifyFormat("void f() {\n"
8444 " return g() {}\n"
8445 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008446 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008447 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008448 "}");
8449}
8450
Manuel Klimek421147e2014-01-24 09:25:23 +00008451TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8452 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008453 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008454}
8455
Manuel Klimek13b97d82013-05-13 08:42:42 +00008456TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8457 verifyFormat("class X {\n"
8458 " void f() {\n"
8459 " }\n"
8460 "};",
8461 getLLVMStyleWithColumns(12));
8462}
8463
8464TEST_F(FormatTest, ConfigurableIndentWidth) {
8465 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8466 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008467 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008468 verifyFormat("void f() {\n"
8469 " someFunction();\n"
8470 " if (true) {\n"
8471 " f();\n"
8472 " }\n"
8473 "}",
8474 EightIndent);
8475 verifyFormat("class X {\n"
8476 " void f() {\n"
8477 " }\n"
8478 "};",
8479 EightIndent);
8480 verifyFormat("int x[] = {\n"
8481 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008482 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008483 EightIndent);
8484}
8485
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008486TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008487 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008488 "f();",
8489 getLLVMStyleWithColumns(8));
8490}
8491
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008492TEST_F(FormatTest, ConfigurableUseOfTab) {
8493 FormatStyle Tab = getLLVMStyleWithColumns(42);
8494 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008495 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008496 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008497
8498 EXPECT_EQ("if (aaaaaaaa && // q\n"
8499 " bb)\t\t// w\n"
8500 "\t;",
8501 format("if (aaaaaaaa &&// q\n"
8502 "bb)// w\n"
8503 ";",
8504 Tab));
8505 EXPECT_EQ("if (aaa && bbb) // w\n"
8506 "\t;",
8507 format("if(aaa&&bbb)// w\n"
8508 ";",
8509 Tab));
8510
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008511 verifyFormat("class X {\n"
8512 "\tvoid f() {\n"
8513 "\t\tsomeFunction(parameter1,\n"
8514 "\t\t\t parameter2);\n"
8515 "\t}\n"
8516 "};",
8517 Tab);
8518 verifyFormat("#define A \\\n"
8519 "\tvoid f() { \\\n"
8520 "\t\tsomeFunction( \\\n"
8521 "\t\t parameter1, \\\n"
8522 "\t\t parameter2); \\\n"
8523 "\t}",
8524 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008525
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008526 Tab.TabWidth = 4;
8527 Tab.IndentWidth = 8;
8528 verifyFormat("class TabWidth4Indent8 {\n"
8529 "\t\tvoid f() {\n"
8530 "\t\t\t\tsomeFunction(parameter1,\n"
8531 "\t\t\t\t\t\t\t parameter2);\n"
8532 "\t\t}\n"
8533 "};",
8534 Tab);
8535
8536 Tab.TabWidth = 4;
8537 Tab.IndentWidth = 4;
8538 verifyFormat("class TabWidth4Indent4 {\n"
8539 "\tvoid f() {\n"
8540 "\t\tsomeFunction(parameter1,\n"
8541 "\t\t\t\t\t parameter2);\n"
8542 "\t}\n"
8543 "};",
8544 Tab);
8545
8546 Tab.TabWidth = 8;
8547 Tab.IndentWidth = 4;
8548 verifyFormat("class TabWidth8Indent4 {\n"
8549 " void f() {\n"
8550 "\tsomeFunction(parameter1,\n"
8551 "\t\t parameter2);\n"
8552 " }\n"
8553 "};",
8554 Tab);
8555
Alexander Kornienko39856b72013-09-10 09:38:25 +00008556 Tab.TabWidth = 8;
8557 Tab.IndentWidth = 8;
8558 EXPECT_EQ("/*\n"
8559 "\t a\t\tcomment\n"
8560 "\t in multiple lines\n"
8561 " */",
8562 format(" /*\t \t \n"
8563 " \t \t a\t\tcomment\t \t\n"
8564 " \t \t in multiple lines\t\n"
8565 " \t */",
8566 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008567
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008568 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008569 verifyFormat("{\n"
8570 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8571 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8572 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8573 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8574 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8575 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008576 "};",
8577 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008578 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008579 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008580 "\ta2,\n"
8581 "\ta3\n"
8582 "};",
8583 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008584 EXPECT_EQ("if (aaaaaaaa && // q\n"
8585 " bb) // w\n"
8586 "\t;",
8587 format("if (aaaaaaaa &&// q\n"
8588 "bb)// w\n"
8589 ";",
8590 Tab));
8591 verifyFormat("class X {\n"
8592 "\tvoid f() {\n"
8593 "\t\tsomeFunction(parameter1,\n"
8594 "\t\t parameter2);\n"
8595 "\t}\n"
8596 "};",
8597 Tab);
8598 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008599 "\tQ(\n"
8600 "\t {\n"
8601 "\t\t int a;\n"
8602 "\t\t someFunction(aaaaaaaa,\n"
8603 "\t\t bbbbbbb);\n"
8604 "\t },\n"
8605 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008606 "}",
8607 Tab);
8608 EXPECT_EQ("{\n"
8609 "\t/* aaaa\n"
8610 "\t bbbb */\n"
8611 "}",
8612 format("{\n"
8613 "/* aaaa\n"
8614 " bbbb */\n"
8615 "}",
8616 Tab));
8617 EXPECT_EQ("{\n"
8618 "\t/*\n"
8619 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8620 "\t bbbbbbbbbbbbb\n"
8621 "\t*/\n"
8622 "}",
8623 format("{\n"
8624 "/*\n"
8625 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8626 "*/\n"
8627 "}",
8628 Tab));
8629 EXPECT_EQ("{\n"
8630 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8631 "\t// bbbbbbbbbbbbb\n"
8632 "}",
8633 format("{\n"
8634 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8635 "}",
8636 Tab));
8637 EXPECT_EQ("{\n"
8638 "\t/*\n"
8639 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8640 "\t bbbbbbbbbbbbb\n"
8641 "\t*/\n"
8642 "}",
8643 format("{\n"
8644 "\t/*\n"
8645 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8646 "\t*/\n"
8647 "}",
8648 Tab));
8649 EXPECT_EQ("{\n"
8650 "\t/*\n"
8651 "\n"
8652 "\t*/\n"
8653 "}",
8654 format("{\n"
8655 "\t/*\n"
8656 "\n"
8657 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008658 "}",
8659 Tab));
8660 EXPECT_EQ("{\n"
8661 "\t/*\n"
8662 " asdf\n"
8663 "\t*/\n"
8664 "}",
8665 format("{\n"
8666 "\t/*\n"
8667 " asdf\n"
8668 "\t*/\n"
8669 "}",
8670 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008671
8672 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008673 EXPECT_EQ("/*\n"
8674 " a\t\tcomment\n"
8675 " in multiple lines\n"
8676 " */",
8677 format(" /*\t \t \n"
8678 " \t \t a\t\tcomment\t \t\n"
8679 " \t \t in multiple lines\t\n"
8680 " \t */",
8681 Tab));
8682 EXPECT_EQ("/* some\n"
8683 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008684 format(" \t \t /* some\n"
8685 " \t \t comment */",
8686 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008687 EXPECT_EQ("int a; /* some\n"
8688 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008689 format(" \t \t int a; /* some\n"
8690 " \t \t comment */",
8691 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008692
Alexander Kornienko39856b72013-09-10 09:38:25 +00008693 EXPECT_EQ("int a; /* some\n"
8694 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008695 format(" \t \t int\ta; /* some\n"
8696 " \t \t comment */",
8697 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008698 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8699 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008700 format(" \t \t f(\"\t\t\"); /* some\n"
8701 " \t \t comment */",
8702 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008703 EXPECT_EQ("{\n"
8704 " /*\n"
8705 " * Comment\n"
8706 " */\n"
8707 " int i;\n"
8708 "}",
8709 format("{\n"
8710 "\t/*\n"
8711 "\t * Comment\n"
8712 "\t */\n"
8713 "\t int i;\n"
8714 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008715
8716 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8717 Tab.TabWidth = 8;
8718 Tab.IndentWidth = 8;
8719 EXPECT_EQ("if (aaaaaaaa && // q\n"
8720 " bb) // w\n"
8721 "\t;",
8722 format("if (aaaaaaaa &&// q\n"
8723 "bb)// w\n"
8724 ";",
8725 Tab));
8726 EXPECT_EQ("if (aaa && bbb) // w\n"
8727 "\t;",
8728 format("if(aaa&&bbb)// w\n"
8729 ";",
8730 Tab));
8731 verifyFormat("class X {\n"
8732 "\tvoid f() {\n"
8733 "\t\tsomeFunction(parameter1,\n"
8734 "\t\t\t parameter2);\n"
8735 "\t}\n"
8736 "};",
8737 Tab);
8738 verifyFormat("#define A \\\n"
8739 "\tvoid f() { \\\n"
8740 "\t\tsomeFunction( \\\n"
8741 "\t\t parameter1, \\\n"
8742 "\t\t parameter2); \\\n"
8743 "\t}",
8744 Tab);
8745 Tab.TabWidth = 4;
8746 Tab.IndentWidth = 8;
8747 verifyFormat("class TabWidth4Indent8 {\n"
8748 "\t\tvoid f() {\n"
8749 "\t\t\t\tsomeFunction(parameter1,\n"
8750 "\t\t\t\t\t\t\t parameter2);\n"
8751 "\t\t}\n"
8752 "};",
8753 Tab);
8754 Tab.TabWidth = 4;
8755 Tab.IndentWidth = 4;
8756 verifyFormat("class TabWidth4Indent4 {\n"
8757 "\tvoid f() {\n"
8758 "\t\tsomeFunction(parameter1,\n"
8759 "\t\t\t\t\t parameter2);\n"
8760 "\t}\n"
8761 "};",
8762 Tab);
8763 Tab.TabWidth = 8;
8764 Tab.IndentWidth = 4;
8765 verifyFormat("class TabWidth8Indent4 {\n"
8766 " void f() {\n"
8767 "\tsomeFunction(parameter1,\n"
8768 "\t\t parameter2);\n"
8769 " }\n"
8770 "};",
8771 Tab);
8772 Tab.TabWidth = 8;
8773 Tab.IndentWidth = 8;
8774 EXPECT_EQ("/*\n"
8775 "\t a\t\tcomment\n"
8776 "\t in multiple lines\n"
8777 " */",
8778 format(" /*\t \t \n"
8779 " \t \t a\t\tcomment\t \t\n"
8780 " \t \t in multiple lines\t\n"
8781 " \t */",
8782 Tab));
8783 verifyFormat("{\n"
8784 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8785 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8786 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8787 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8788 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8789 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8790 "};",
8791 Tab);
8792 verifyFormat("enum AA {\n"
8793 "\ta1, // Force multiple lines\n"
8794 "\ta2,\n"
8795 "\ta3\n"
8796 "};",
8797 Tab);
8798 EXPECT_EQ("if (aaaaaaaa && // q\n"
8799 " bb) // w\n"
8800 "\t;",
8801 format("if (aaaaaaaa &&// q\n"
8802 "bb)// w\n"
8803 ";",
8804 Tab));
8805 verifyFormat("class X {\n"
8806 "\tvoid f() {\n"
8807 "\t\tsomeFunction(parameter1,\n"
8808 "\t\t\t parameter2);\n"
8809 "\t}\n"
8810 "};",
8811 Tab);
8812 verifyFormat("{\n"
8813 "\tQ(\n"
8814 "\t {\n"
8815 "\t\t int a;\n"
8816 "\t\t someFunction(aaaaaaaa,\n"
8817 "\t\t\t\t bbbbbbb);\n"
8818 "\t },\n"
8819 "\t p);\n"
8820 "}",
8821 Tab);
8822 EXPECT_EQ("{\n"
8823 "\t/* aaaa\n"
8824 "\t bbbb */\n"
8825 "}",
8826 format("{\n"
8827 "/* aaaa\n"
8828 " bbbb */\n"
8829 "}",
8830 Tab));
8831 EXPECT_EQ("{\n"
8832 "\t/*\n"
8833 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8834 "\t bbbbbbbbbbbbb\n"
8835 "\t*/\n"
8836 "}",
8837 format("{\n"
8838 "/*\n"
8839 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8840 "*/\n"
8841 "}",
8842 Tab));
8843 EXPECT_EQ("{\n"
8844 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8845 "\t// bbbbbbbbbbbbb\n"
8846 "}",
8847 format("{\n"
8848 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8849 "}",
8850 Tab));
8851 EXPECT_EQ("{\n"
8852 "\t/*\n"
8853 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8854 "\t bbbbbbbbbbbbb\n"
8855 "\t*/\n"
8856 "}",
8857 format("{\n"
8858 "\t/*\n"
8859 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8860 "\t*/\n"
8861 "}",
8862 Tab));
8863 EXPECT_EQ("{\n"
8864 "\t/*\n"
8865 "\n"
8866 "\t*/\n"
8867 "}",
8868 format("{\n"
8869 "\t/*\n"
8870 "\n"
8871 "\t*/\n"
8872 "}",
8873 Tab));
8874 EXPECT_EQ("{\n"
8875 "\t/*\n"
8876 " asdf\n"
8877 "\t*/\n"
8878 "}",
8879 format("{\n"
8880 "\t/*\n"
8881 " asdf\n"
8882 "\t*/\n"
8883 "}",
8884 Tab));
8885 EXPECT_EQ("/*\n"
8886 "\t a\t\tcomment\n"
8887 "\t in multiple lines\n"
8888 " */",
8889 format(" /*\t \t \n"
8890 " \t \t a\t\tcomment\t \t\n"
8891 " \t \t in multiple lines\t\n"
8892 " \t */",
8893 Tab));
8894 EXPECT_EQ("/* some\n"
8895 " comment */",
8896 format(" \t \t /* some\n"
8897 " \t \t comment */",
8898 Tab));
8899 EXPECT_EQ("int a; /* some\n"
8900 " comment */",
8901 format(" \t \t int a; /* some\n"
8902 " \t \t comment */",
8903 Tab));
8904 EXPECT_EQ("int a; /* some\n"
8905 "comment */",
8906 format(" \t \t int\ta; /* some\n"
8907 " \t \t comment */",
8908 Tab));
8909 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8910 " comment */",
8911 format(" \t \t f(\"\t\t\"); /* some\n"
8912 " \t \t comment */",
8913 Tab));
8914 EXPECT_EQ("{\n"
8915 " /*\n"
8916 " * Comment\n"
8917 " */\n"
8918 " int i;\n"
8919 "}",
8920 format("{\n"
8921 "\t/*\n"
8922 "\t * Comment\n"
8923 "\t */\n"
8924 "\t int i;\n"
8925 "}"));
8926 Tab.AlignConsecutiveAssignments = true;
8927 Tab.AlignConsecutiveDeclarations = true;
8928 Tab.TabWidth = 4;
8929 Tab.IndentWidth = 4;
8930 verifyFormat("class Assign {\n"
8931 "\tvoid f() {\n"
8932 "\t\tint x = 123;\n"
8933 "\t\tint random = 4;\n"
8934 "\t\tstd::string alphabet =\n"
8935 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8936 "\t}\n"
8937 "};",
8938 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008939}
8940
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008941TEST_F(FormatTest, CalculatesOriginalColumn) {
8942 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8943 "q\"; /* some\n"
8944 " comment */",
8945 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8946 "q\"; /* some\n"
8947 " comment */",
8948 getLLVMStyle()));
8949 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8950 "/* some\n"
8951 " comment */",
8952 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8953 " /* some\n"
8954 " comment */",
8955 getLLVMStyle()));
8956 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8957 "qqq\n"
8958 "/* some\n"
8959 " comment */",
8960 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8961 "qqq\n"
8962 " /* some\n"
8963 " comment */",
8964 getLLVMStyle()));
8965 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8966 "wwww; /* some\n"
8967 " comment */",
8968 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8969 "wwww; /* some\n"
8970 " comment */",
8971 getLLVMStyle()));
8972}
8973
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008974TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008975 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008976 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008977
8978 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008979 " continue;",
8980 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008981 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008982 " continue;",
8983 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008984 verifyFormat("if(true)\n"
8985 " f();\n"
8986 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008987 " f();",
8988 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008989 verifyFormat("do {\n"
8990 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008991 "} while(something());",
8992 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008993 verifyFormat("switch(x) {\n"
8994 "default:\n"
8995 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008996 "}",
8997 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008998 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008999 verifyFormat("size_t x = sizeof(x);", NoSpace);
9000 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
9001 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
9002 verifyFormat("alignas(128) char a[128];", NoSpace);
9003 verifyFormat("size_t x = alignof(MyType);", NoSpace);
9004 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
9005 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009006 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009007 verifyFormat("T A::operator()();", NoSpace);
9008 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009009
9010 FormatStyle Space = getLLVMStyle();
9011 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
9012
9013 verifyFormat("int f ();", Space);
9014 verifyFormat("void f (int a, T b) {\n"
9015 " while (true)\n"
9016 " continue;\n"
9017 "}",
9018 Space);
9019 verifyFormat("if (true)\n"
9020 " f ();\n"
9021 "else if (true)\n"
9022 " f ();",
9023 Space);
9024 verifyFormat("do {\n"
9025 " do_something ();\n"
9026 "} while (something ());",
9027 Space);
9028 verifyFormat("switch (x) {\n"
9029 "default:\n"
9030 " break;\n"
9031 "}",
9032 Space);
9033 verifyFormat("A::A () : a (1) {}", Space);
9034 verifyFormat("void f () __attribute__ ((asdf));", Space);
9035 verifyFormat("*(&a + 1);\n"
9036 "&((&a)[1]);\n"
9037 "a[(b + c) * d];\n"
9038 "(((a + 1) * 2) + 3) * 4;",
9039 Space);
9040 verifyFormat("#define A(x) x", Space);
9041 verifyFormat("#define A (x) x", Space);
9042 verifyFormat("#if defined(x)\n"
9043 "#endif",
9044 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00009045 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00009046 verifyFormat("size_t x = sizeof (x);", Space);
9047 verifyFormat("auto f (int x) -> decltype (x);", Space);
9048 verifyFormat("int f (T x) noexcept (x.create ());", Space);
9049 verifyFormat("alignas (128) char a[128];", Space);
9050 verifyFormat("size_t x = alignof (MyType);", Space);
9051 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
9052 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009053 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009054 verifyFormat("T A::operator() ();", Space);
9055 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009056}
9057
9058TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
9059 FormatStyle Spaces = getLLVMStyle();
9060
9061 Spaces.SpacesInParentheses = true;
9062 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009063 verifyFormat("call();", Spaces);
9064 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00009065 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
9066 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009067 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009068 " continue;",
9069 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009070 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009071 " continue;",
9072 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009073 verifyFormat("if ( true )\n"
9074 " f();\n"
9075 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009076 " f();",
9077 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009078 verifyFormat("do {\n"
9079 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009080 "} while ( something() );",
9081 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009082 verifyFormat("switch ( x ) {\n"
9083 "default:\n"
9084 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009085 "}",
9086 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009087
9088 Spaces.SpacesInParentheses = false;
9089 Spaces.SpacesInCStyleCastParentheses = true;
9090 verifyFormat("Type *A = ( Type * )P;", Spaces);
9091 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
9092 verifyFormat("x = ( int32 )y;", Spaces);
9093 verifyFormat("int a = ( int )(2.0f);", Spaces);
9094 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
9095 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
9096 verifyFormat("#define x (( int )-1)", Spaces);
9097
Daniel Jasper92e09822015-03-18 12:59:19 +00009098 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00009099 Spaces.SpacesInParentheses = false;
9100 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009101 Spaces.SpacesInCStyleCastParentheses = true;
9102 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009103 verifyFormat("call( );", Spaces);
9104 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009105 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009106 " continue;",
9107 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009108 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009109 " continue;",
9110 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009111 verifyFormat("if (true)\n"
9112 " f( );\n"
9113 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009114 " f( );",
9115 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009116 verifyFormat("do {\n"
9117 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009118 "} while (something( ));",
9119 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009120 verifyFormat("switch (x) {\n"
9121 "default:\n"
9122 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009123 "}",
9124 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009125
Daniel Jasper92e09822015-03-18 12:59:19 +00009126 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009127 Spaces.SpaceAfterCStyleCast = true;
9128 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009129 verifyFormat("call( );", Spaces);
9130 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009131 verifyFormat("while (( bool ) 1)\n"
9132 " continue;",
9133 Spaces);
9134 verifyFormat("for (;;)\n"
9135 " continue;",
9136 Spaces);
9137 verifyFormat("if (true)\n"
9138 " f( );\n"
9139 "else if (true)\n"
9140 " f( );",
9141 Spaces);
9142 verifyFormat("do {\n"
9143 " do_something(( int ) i);\n"
9144 "} while (something( ));",
9145 Spaces);
9146 verifyFormat("switch (x) {\n"
9147 "default:\n"
9148 " break;\n"
9149 "}",
9150 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009151
9152 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009153 Spaces.SpacesInCStyleCastParentheses = false;
9154 Spaces.SpaceAfterCStyleCast = true;
9155 verifyFormat("while ((bool) 1)\n"
9156 " continue;",
9157 Spaces);
9158 verifyFormat("do {\n"
9159 " do_something((int) i);\n"
9160 "} while (something( ));",
9161 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009162}
9163
Daniel Jasperad981f82014-08-26 11:41:14 +00009164TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9165 verifyFormat("int a[5];");
9166 verifyFormat("a[3] += 42;");
9167
9168 FormatStyle Spaces = getLLVMStyle();
9169 Spaces.SpacesInSquareBrackets = true;
9170 // Lambdas unchanged.
9171 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9172 verifyFormat("return [i, args...] {};", Spaces);
9173
9174 // Not lambdas.
9175 verifyFormat("int a[ 5 ];", Spaces);
9176 verifyFormat("a[ 3 ] += 42;", Spaces);
9177 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9178 verifyFormat("double &operator[](int i) { return 0; }\n"
9179 "int i;",
9180 Spaces);
9181 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9182 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9183 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9184}
9185
Daniel Jasperd94bff32013-09-25 15:15:02 +00009186TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9187 verifyFormat("int a = 5;");
9188 verifyFormat("a += 42;");
9189 verifyFormat("a or_eq 8;");
9190
9191 FormatStyle Spaces = getLLVMStyle();
9192 Spaces.SpaceBeforeAssignmentOperators = false;
9193 verifyFormat("int a= 5;", Spaces);
9194 verifyFormat("a+= 42;", Spaces);
9195 verifyFormat("a or_eq 8;", Spaces);
9196}
9197
Daniel Jaspera44991332015-04-29 13:06:49 +00009198TEST_F(FormatTest, AlignConsecutiveAssignments) {
9199 FormatStyle Alignment = getLLVMStyle();
9200 Alignment.AlignConsecutiveAssignments = false;
9201 verifyFormat("int a = 5;\n"
9202 "int oneTwoThree = 123;",
9203 Alignment);
9204 verifyFormat("int a = 5;\n"
9205 "int oneTwoThree = 123;",
9206 Alignment);
9207
9208 Alignment.AlignConsecutiveAssignments = true;
9209 verifyFormat("int a = 5;\n"
9210 "int oneTwoThree = 123;",
9211 Alignment);
9212 verifyFormat("int a = method();\n"
9213 "int oneTwoThree = 133;",
9214 Alignment);
9215 verifyFormat("a &= 5;\n"
9216 "bcd *= 5;\n"
9217 "ghtyf += 5;\n"
9218 "dvfvdb -= 5;\n"
9219 "a /= 5;\n"
9220 "vdsvsv %= 5;\n"
9221 "sfdbddfbdfbb ^= 5;\n"
9222 "dvsdsv |= 5;\n"
9223 "int dsvvdvsdvvv = 123;",
9224 Alignment);
9225 verifyFormat("int i = 1, j = 10;\n"
9226 "something = 2000;",
9227 Alignment);
9228 verifyFormat("something = 2000;\n"
9229 "int i = 1, j = 10;\n",
9230 Alignment);
9231 verifyFormat("something = 2000;\n"
9232 "another = 911;\n"
9233 "int i = 1, j = 10;\n"
9234 "oneMore = 1;\n"
9235 "i = 2;",
9236 Alignment);
9237 verifyFormat("int a = 5;\n"
9238 "int one = 1;\n"
9239 "method();\n"
9240 "int oneTwoThree = 123;\n"
9241 "int oneTwo = 12;",
9242 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009243 verifyFormat("int oneTwoThree = 123;\n"
9244 "int oneTwo = 12;\n"
9245 "method();\n",
9246 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009247 verifyFormat("int oneTwoThree = 123; // comment\n"
9248 "int oneTwo = 12; // comment",
9249 Alignment);
9250 EXPECT_EQ("int a = 5;\n"
9251 "\n"
9252 "int oneTwoThree = 123;",
9253 format("int a = 5;\n"
9254 "\n"
9255 "int oneTwoThree= 123;",
9256 Alignment));
9257 EXPECT_EQ("int a = 5;\n"
9258 "int one = 1;\n"
9259 "\n"
9260 "int oneTwoThree = 123;",
9261 format("int a = 5;\n"
9262 "int one = 1;\n"
9263 "\n"
9264 "int oneTwoThree = 123;",
9265 Alignment));
9266 EXPECT_EQ("int a = 5;\n"
9267 "int one = 1;\n"
9268 "\n"
9269 "int oneTwoThree = 123;\n"
9270 "int oneTwo = 12;",
9271 format("int a = 5;\n"
9272 "int one = 1;\n"
9273 "\n"
9274 "int oneTwoThree = 123;\n"
9275 "int oneTwo = 12;",
9276 Alignment));
9277 Alignment.AlignEscapedNewlinesLeft = true;
9278 verifyFormat("#define A \\\n"
9279 " int aaaa = 12; \\\n"
9280 " int b = 23; \\\n"
9281 " int ccc = 234; \\\n"
9282 " int dddddddddd = 2345;",
9283 Alignment);
9284 Alignment.AlignEscapedNewlinesLeft = false;
9285 verifyFormat("#define A "
9286 " \\\n"
9287 " int aaaa = 12; "
9288 " \\\n"
9289 " int b = 23; "
9290 " \\\n"
9291 " int ccc = 234; "
9292 " \\\n"
9293 " int dddddddddd = 2345;",
9294 Alignment);
9295 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9296 "k = 4, int l = 5,\n"
9297 " int m = 6) {\n"
9298 " int j = 10;\n"
9299 " otherThing = 1;\n"
9300 "}",
9301 Alignment);
9302 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9303 " int i = 1;\n"
9304 " int j = 2;\n"
9305 " int big = 10000;\n"
9306 "}",
9307 Alignment);
9308 verifyFormat("class C {\n"
9309 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009310 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009311 " virtual void f() = 0;\n"
9312 "};",
9313 Alignment);
9314 verifyFormat("int i = 1;\n"
9315 "if (SomeType t = getSomething()) {\n"
9316 "}\n"
9317 "int j = 2;\n"
9318 "int big = 10000;",
9319 Alignment);
9320 verifyFormat("int j = 7;\n"
9321 "for (int k = 0; k < N; ++k) {\n"
9322 "}\n"
9323 "int j = 2;\n"
9324 "int big = 10000;\n"
9325 "}",
9326 Alignment);
9327 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9328 verifyFormat("int i = 1;\n"
9329 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9330 " = someLooooooooooooooooongFunction();\n"
9331 "int j = 2;",
9332 Alignment);
9333 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9334 verifyFormat("int i = 1;\n"
9335 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9336 " someLooooooooooooooooongFunction();\n"
9337 "int j = 2;",
9338 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009339
9340 verifyFormat("auto lambda = []() {\n"
9341 " auto i = 0;\n"
9342 " return 0;\n"
9343 "};\n"
9344 "int i = 0;\n"
9345 "auto v = type{\n"
9346 " i = 1, //\n"
9347 " (i = 2), //\n"
9348 " i = 3 //\n"
9349 "};",
9350 Alignment);
9351
Daniel Jaspera44991332015-04-29 13:06:49 +00009352 // FIXME: Should align all three assignments
9353 verifyFormat(
9354 "int i = 1;\n"
9355 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9356 " loooooooooooooooooooooongParameterB);\n"
9357 "int j = 2;",
9358 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009359
9360 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9361 " typename B = very_long_type_name_1,\n"
9362 " typename T_2 = very_long_type_name_2>\n"
9363 "auto foo() {}\n",
9364 Alignment);
9365 verifyFormat("int a, b = 1;\n"
9366 "int c = 2;\n"
9367 "int dd = 3;\n",
9368 Alignment);
9369 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9370 "float b[1][] = {{3.f}};\n",
9371 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009372}
9373
Daniel Jaspere12597c2015-10-01 10:06:54 +00009374TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9375 FormatStyle Alignment = getLLVMStyle();
9376 Alignment.AlignConsecutiveDeclarations = false;
9377 verifyFormat("float const a = 5;\n"
9378 "int oneTwoThree = 123;",
9379 Alignment);
9380 verifyFormat("int a = 5;\n"
9381 "float const oneTwoThree = 123;",
9382 Alignment);
9383
9384 Alignment.AlignConsecutiveDeclarations = true;
9385 verifyFormat("float const a = 5;\n"
9386 "int oneTwoThree = 123;",
9387 Alignment);
9388 verifyFormat("int a = method();\n"
9389 "float const oneTwoThree = 133;",
9390 Alignment);
9391 verifyFormat("int i = 1, j = 10;\n"
9392 "something = 2000;",
9393 Alignment);
9394 verifyFormat("something = 2000;\n"
9395 "int i = 1, j = 10;\n",
9396 Alignment);
9397 verifyFormat("float something = 2000;\n"
9398 "double another = 911;\n"
9399 "int i = 1, j = 10;\n"
9400 "const int *oneMore = 1;\n"
9401 "unsigned i = 2;",
9402 Alignment);
9403 verifyFormat("float a = 5;\n"
9404 "int one = 1;\n"
9405 "method();\n"
9406 "const double oneTwoThree = 123;\n"
9407 "const unsigned int oneTwo = 12;",
9408 Alignment);
9409 verifyFormat("int oneTwoThree{0}; // comment\n"
9410 "unsigned oneTwo; // comment",
9411 Alignment);
9412 EXPECT_EQ("float const a = 5;\n"
9413 "\n"
9414 "int oneTwoThree = 123;",
9415 format("float const a = 5;\n"
9416 "\n"
9417 "int oneTwoThree= 123;",
9418 Alignment));
9419 EXPECT_EQ("float a = 5;\n"
9420 "int one = 1;\n"
9421 "\n"
9422 "unsigned oneTwoThree = 123;",
9423 format("float a = 5;\n"
9424 "int one = 1;\n"
9425 "\n"
9426 "unsigned oneTwoThree = 123;",
9427 Alignment));
9428 EXPECT_EQ("float a = 5;\n"
9429 "int one = 1;\n"
9430 "\n"
9431 "unsigned oneTwoThree = 123;\n"
9432 "int oneTwo = 12;",
9433 format("float a = 5;\n"
9434 "int one = 1;\n"
9435 "\n"
9436 "unsigned oneTwoThree = 123;\n"
9437 "int oneTwo = 12;",
9438 Alignment));
9439 Alignment.AlignConsecutiveAssignments = true;
9440 verifyFormat("float something = 2000;\n"
9441 "double another = 911;\n"
9442 "int i = 1, j = 10;\n"
9443 "const int *oneMore = 1;\n"
9444 "unsigned i = 2;",
9445 Alignment);
9446 verifyFormat("int oneTwoThree = {0}; // comment\n"
9447 "unsigned oneTwo = 0; // comment",
9448 Alignment);
9449 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9450 " int const i = 1;\n"
9451 " int * j = 2;\n"
9452 " int big = 10000;\n"
9453 "\n"
9454 " unsigned oneTwoThree = 123;\n"
9455 " int oneTwo = 12;\n"
9456 " method();\n"
9457 " float k = 2;\n"
9458 " int ll = 10000;\n"
9459 "}",
9460 format("void SomeFunction(int parameter= 0) {\n"
9461 " int const i= 1;\n"
9462 " int *j=2;\n"
9463 " int big = 10000;\n"
9464 "\n"
9465 "unsigned oneTwoThree =123;\n"
9466 "int oneTwo = 12;\n"
9467 " method();\n"
9468 "float k= 2;\n"
9469 "int ll=10000;\n"
9470 "}",
9471 Alignment));
9472 Alignment.AlignConsecutiveAssignments = false;
9473 Alignment.AlignEscapedNewlinesLeft = true;
9474 verifyFormat("#define A \\\n"
9475 " int aaaa = 12; \\\n"
9476 " float b = 23; \\\n"
9477 " const int ccc = 234; \\\n"
9478 " unsigned dddddddddd = 2345;",
9479 Alignment);
9480 Alignment.AlignEscapedNewlinesLeft = false;
9481 Alignment.ColumnLimit = 30;
9482 verifyFormat("#define A \\\n"
9483 " int aaaa = 12; \\\n"
9484 " float b = 23; \\\n"
9485 " const int ccc = 234; \\\n"
9486 " int dddddddddd = 2345;",
9487 Alignment);
9488 Alignment.ColumnLimit = 80;
9489 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9490 "k = 4, int l = 5,\n"
9491 " int m = 6) {\n"
9492 " const int j = 10;\n"
9493 " otherThing = 1;\n"
9494 "}",
9495 Alignment);
9496 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9497 " int const i = 1;\n"
9498 " int * j = 2;\n"
9499 " int big = 10000;\n"
9500 "}",
9501 Alignment);
9502 verifyFormat("class C {\n"
9503 "public:\n"
9504 " int i = 1;\n"
9505 " virtual void f() = 0;\n"
9506 "};",
9507 Alignment);
9508 verifyFormat("float i = 1;\n"
9509 "if (SomeType t = getSomething()) {\n"
9510 "}\n"
9511 "const unsigned j = 2;\n"
9512 "int big = 10000;",
9513 Alignment);
9514 verifyFormat("float j = 7;\n"
9515 "for (int k = 0; k < N; ++k) {\n"
9516 "}\n"
9517 "unsigned j = 2;\n"
9518 "int big = 10000;\n"
9519 "}",
9520 Alignment);
9521 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9522 verifyFormat("float i = 1;\n"
9523 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9524 " = someLooooooooooooooooongFunction();\n"
9525 "int j = 2;",
9526 Alignment);
9527 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9528 verifyFormat("int i = 1;\n"
9529 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9530 " someLooooooooooooooooongFunction();\n"
9531 "int j = 2;",
9532 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009533
9534 Alignment.AlignConsecutiveAssignments = true;
9535 verifyFormat("auto lambda = []() {\n"
9536 " auto ii = 0;\n"
9537 " float j = 0;\n"
9538 " return 0;\n"
9539 "};\n"
9540 "int i = 0;\n"
9541 "float i2 = 0;\n"
9542 "auto v = type{\n"
9543 " i = 1, //\n"
9544 " (i = 2), //\n"
9545 " i = 3 //\n"
9546 "};",
9547 Alignment);
9548 Alignment.AlignConsecutiveAssignments = false;
9549
Daniel Jaspere12597c2015-10-01 10:06:54 +00009550 // FIXME: Should align all three declarations
9551 verifyFormat(
9552 "int i = 1;\n"
9553 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9554 " loooooooooooooooooooooongParameterB);\n"
9555 "int j = 2;",
9556 Alignment);
9557
9558 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9559 // We expect declarations and assignments to align, as long as it doesn't
9560 // exceed the column limit, starting a new alignemnt sequence whenever it
9561 // happens.
9562 Alignment.AlignConsecutiveAssignments = true;
9563 Alignment.ColumnLimit = 30;
9564 verifyFormat("float ii = 1;\n"
9565 "unsigned j = 2;\n"
9566 "int someVerylongVariable = 1;\n"
9567 "AnotherLongType ll = 123456;\n"
9568 "VeryVeryLongType k = 2;\n"
9569 "int myvar = 1;",
9570 Alignment);
9571 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009572 Alignment.AlignConsecutiveAssignments = false;
9573
9574 verifyFormat(
9575 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9576 " typename LongType, typename B>\n"
9577 "auto foo() {}\n",
9578 Alignment);
9579 verifyFormat("float a, b = 1;\n"
9580 "int c = 2;\n"
9581 "int dd = 3;\n",
9582 Alignment);
9583 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9584 "float b[1][] = {{3.f}};\n",
9585 Alignment);
9586 Alignment.AlignConsecutiveAssignments = true;
9587 verifyFormat("float a, b = 1;\n"
9588 "int c = 2;\n"
9589 "int dd = 3;\n",
9590 Alignment);
9591 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9592 "float b[1][] = {{3.f}};\n",
9593 Alignment);
9594 Alignment.AlignConsecutiveAssignments = false;
9595
9596 Alignment.ColumnLimit = 30;
9597 Alignment.BinPackParameters = false;
9598 verifyFormat("void foo(float a,\n"
9599 " float b,\n"
9600 " int c,\n"
9601 " uint32_t *d) {\n"
9602 " int * e = 0;\n"
9603 " float f = 0;\n"
9604 " double g = 0;\n"
9605 "}\n"
9606 "void bar(ino_t a,\n"
9607 " int b,\n"
9608 " uint32_t *c,\n"
9609 " bool d) {}\n",
9610 Alignment);
9611 Alignment.BinPackParameters = true;
9612 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009613}
9614
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009615TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009616 FormatStyle LinuxBraceStyle = getLLVMStyle();
9617 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009618 verifyFormat("namespace a\n"
9619 "{\n"
9620 "class A\n"
9621 "{\n"
9622 " void f()\n"
9623 " {\n"
9624 " if (true) {\n"
9625 " a();\n"
9626 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009627 " } else {\n"
9628 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009629 " }\n"
9630 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009631 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009632 "};\n"
9633 "struct B {\n"
9634 " int x;\n"
9635 "};\n"
9636 "}\n",
9637 LinuxBraceStyle);
9638 verifyFormat("enum X {\n"
9639 " Y = 0,\n"
9640 "}\n",
9641 LinuxBraceStyle);
9642 verifyFormat("struct S {\n"
9643 " int Type;\n"
9644 " union {\n"
9645 " int x;\n"
9646 " double y;\n"
9647 " } Value;\n"
9648 " class C\n"
9649 " {\n"
9650 " MyFavoriteType Value;\n"
9651 " } Class;\n"
9652 "}\n",
9653 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009654}
9655
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009656TEST_F(FormatTest, MozillaBraceBreaking) {
9657 FormatStyle MozillaBraceStyle = getLLVMStyle();
9658 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
9659 verifyFormat("namespace a {\n"
9660 "class A\n"
9661 "{\n"
9662 " void f()\n"
9663 " {\n"
9664 " if (true) {\n"
9665 " a();\n"
9666 " b();\n"
9667 " }\n"
9668 " }\n"
9669 " void g() { return; }\n"
9670 "};\n"
9671 "enum E\n"
9672 "{\n"
9673 " A,\n"
9674 " // foo\n"
9675 " B,\n"
9676 " C\n"
9677 "};\n"
9678 "struct B\n"
9679 "{\n"
9680 " int x;\n"
9681 "};\n"
9682 "}\n",
9683 MozillaBraceStyle);
9684 verifyFormat("struct S\n"
9685 "{\n"
9686 " int Type;\n"
9687 " union\n"
9688 " {\n"
9689 " int x;\n"
9690 " double y;\n"
9691 " } Value;\n"
9692 " class C\n"
9693 " {\n"
9694 " MyFavoriteType Value;\n"
9695 " } Class;\n"
9696 "}\n",
9697 MozillaBraceStyle);
9698}
9699
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009700TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009701 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9702 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009703 verifyFormat("namespace a {\n"
9704 "class A {\n"
9705 " void f()\n"
9706 " {\n"
9707 " if (true) {\n"
9708 " a();\n"
9709 " b();\n"
9710 " }\n"
9711 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009712 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009713 "};\n"
9714 "struct B {\n"
9715 " int x;\n"
9716 "};\n"
9717 "}\n",
9718 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009719
Daniel Jasperd9670872014-08-05 12:06:20 +00009720 verifyFormat("void foo()\n"
9721 "{\n"
9722 " if (a) {\n"
9723 " a();\n"
9724 " }\n"
9725 " else {\n"
9726 " b();\n"
9727 " }\n"
9728 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009729 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009730
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009731 verifyFormat("#ifdef _DEBUG\n"
9732 "int foo(int i = 0)\n"
9733 "#else\n"
9734 "int foo(int i = 5)\n"
9735 "#endif\n"
9736 "{\n"
9737 " return i;\n"
9738 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009739 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009740
9741 verifyFormat("void foo() {}\n"
9742 "void bar()\n"
9743 "#ifdef _DEBUG\n"
9744 "{\n"
9745 " foo();\n"
9746 "}\n"
9747 "#else\n"
9748 "{\n"
9749 "}\n"
9750 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009751 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009752
9753 verifyFormat("void foobar() { int i = 5; }\n"
9754 "#ifdef _DEBUG\n"
9755 "void bar() {}\n"
9756 "#else\n"
9757 "void bar() { foobar(); }\n"
9758 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009759 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009760}
9761
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009762TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009763 FormatStyle AllmanBraceStyle = getLLVMStyle();
9764 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009765 verifyFormat("namespace a\n"
9766 "{\n"
9767 "class A\n"
9768 "{\n"
9769 " void f()\n"
9770 " {\n"
9771 " if (true)\n"
9772 " {\n"
9773 " a();\n"
9774 " b();\n"
9775 " }\n"
9776 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009777 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009778 "};\n"
9779 "struct B\n"
9780 "{\n"
9781 " int x;\n"
9782 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009783 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009784 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009785
9786 verifyFormat("void f()\n"
9787 "{\n"
9788 " if (true)\n"
9789 " {\n"
9790 " a();\n"
9791 " }\n"
9792 " else if (false)\n"
9793 " {\n"
9794 " b();\n"
9795 " }\n"
9796 " else\n"
9797 " {\n"
9798 " c();\n"
9799 " }\n"
9800 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009801 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009802
9803 verifyFormat("void f()\n"
9804 "{\n"
9805 " for (int i = 0; i < 10; ++i)\n"
9806 " {\n"
9807 " a();\n"
9808 " }\n"
9809 " while (false)\n"
9810 " {\n"
9811 " b();\n"
9812 " }\n"
9813 " do\n"
9814 " {\n"
9815 " c();\n"
9816 " } while (false)\n"
9817 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009818 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009819
9820 verifyFormat("void f(int a)\n"
9821 "{\n"
9822 " switch (a)\n"
9823 " {\n"
9824 " case 0:\n"
9825 " break;\n"
9826 " case 1:\n"
9827 " {\n"
9828 " break;\n"
9829 " }\n"
9830 " case 2:\n"
9831 " {\n"
9832 " }\n"
9833 " break;\n"
9834 " default:\n"
9835 " break;\n"
9836 " }\n"
9837 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009838 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009839
9840 verifyFormat("enum X\n"
9841 "{\n"
9842 " Y = 0,\n"
9843 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009844 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009845 verifyFormat("enum X\n"
9846 "{\n"
9847 " Y = 0\n"
9848 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009849 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009850
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009851 verifyFormat("@interface BSApplicationController ()\n"
9852 "{\n"
9853 "@private\n"
9854 " id _extraIvar;\n"
9855 "}\n"
9856 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009857 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009858
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009859 verifyFormat("#ifdef _DEBUG\n"
9860 "int foo(int i = 0)\n"
9861 "#else\n"
9862 "int foo(int i = 5)\n"
9863 "#endif\n"
9864 "{\n"
9865 " return i;\n"
9866 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009867 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009868
9869 verifyFormat("void foo() {}\n"
9870 "void bar()\n"
9871 "#ifdef _DEBUG\n"
9872 "{\n"
9873 " foo();\n"
9874 "}\n"
9875 "#else\n"
9876 "{\n"
9877 "}\n"
9878 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009879 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009880
9881 verifyFormat("void foobar() { int i = 5; }\n"
9882 "#ifdef _DEBUG\n"
9883 "void bar() {}\n"
9884 "#else\n"
9885 "void bar() { foobar(); }\n"
9886 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009887 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009888
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009889 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009890 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009891 " // ...\n"
9892 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009893 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009894 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009895 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009896 " // ...\n"
9897 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009898 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009899 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009900 // .. or dict literals.
9901 verifyFormat("void f()\n"
9902 "{\n"
9903 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
9904 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009905 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009906 verifyFormat("int f()\n"
9907 "{ // comment\n"
9908 " return 42;\n"
9909 "}",
9910 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009911
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009912 AllmanBraceStyle.ColumnLimit = 19;
9913 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9914 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009915 verifyFormat("void f()\n"
9916 "{\n"
9917 " int i;\n"
9918 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009919 AllmanBraceStyle);
9920 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009921
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009922 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009923 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9924 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9925 verifyFormat("void f(bool b)\n"
9926 "{\n"
9927 " if (b)\n"
9928 " {\n"
9929 " return;\n"
9930 " }\n"
9931 "}\n",
9932 BreakBeforeBraceShortIfs);
9933 verifyFormat("void f(bool b)\n"
9934 "{\n"
9935 " if (b) return;\n"
9936 "}\n",
9937 BreakBeforeBraceShortIfs);
9938 verifyFormat("void f(bool b)\n"
9939 "{\n"
9940 " while (b)\n"
9941 " {\n"
9942 " return;\n"
9943 " }\n"
9944 "}\n",
9945 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009946}
9947
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009948TEST_F(FormatTest, GNUBraceBreaking) {
9949 FormatStyle GNUBraceStyle = getLLVMStyle();
9950 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9951 verifyFormat("namespace a\n"
9952 "{\n"
9953 "class A\n"
9954 "{\n"
9955 " void f()\n"
9956 " {\n"
9957 " int a;\n"
9958 " {\n"
9959 " int b;\n"
9960 " }\n"
9961 " if (true)\n"
9962 " {\n"
9963 " a();\n"
9964 " b();\n"
9965 " }\n"
9966 " }\n"
9967 " void g() { return; }\n"
9968 "}\n"
9969 "}",
9970 GNUBraceStyle);
9971
9972 verifyFormat("void f()\n"
9973 "{\n"
9974 " if (true)\n"
9975 " {\n"
9976 " a();\n"
9977 " }\n"
9978 " else if (false)\n"
9979 " {\n"
9980 " b();\n"
9981 " }\n"
9982 " else\n"
9983 " {\n"
9984 " c();\n"
9985 " }\n"
9986 "}\n",
9987 GNUBraceStyle);
9988
9989 verifyFormat("void f()\n"
9990 "{\n"
9991 " for (int i = 0; i < 10; ++i)\n"
9992 " {\n"
9993 " a();\n"
9994 " }\n"
9995 " while (false)\n"
9996 " {\n"
9997 " b();\n"
9998 " }\n"
9999 " do\n"
10000 " {\n"
10001 " c();\n"
10002 " }\n"
10003 " while (false);\n"
10004 "}\n",
10005 GNUBraceStyle);
10006
10007 verifyFormat("void f(int a)\n"
10008 "{\n"
10009 " switch (a)\n"
10010 " {\n"
10011 " case 0:\n"
10012 " break;\n"
10013 " case 1:\n"
10014 " {\n"
10015 " break;\n"
10016 " }\n"
10017 " case 2:\n"
10018 " {\n"
10019 " }\n"
10020 " break;\n"
10021 " default:\n"
10022 " break;\n"
10023 " }\n"
10024 "}\n",
10025 GNUBraceStyle);
10026
10027 verifyFormat("enum X\n"
10028 "{\n"
10029 " Y = 0,\n"
10030 "}\n",
10031 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010032
10033 verifyFormat("@interface BSApplicationController ()\n"
10034 "{\n"
10035 "@private\n"
10036 " id _extraIvar;\n"
10037 "}\n"
10038 "@end\n",
10039 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010040
10041 verifyFormat("#ifdef _DEBUG\n"
10042 "int foo(int i = 0)\n"
10043 "#else\n"
10044 "int foo(int i = 5)\n"
10045 "#endif\n"
10046 "{\n"
10047 " return i;\n"
10048 "}",
10049 GNUBraceStyle);
10050
10051 verifyFormat("void foo() {}\n"
10052 "void bar()\n"
10053 "#ifdef _DEBUG\n"
10054 "{\n"
10055 " foo();\n"
10056 "}\n"
10057 "#else\n"
10058 "{\n"
10059 "}\n"
10060 "#endif",
10061 GNUBraceStyle);
10062
10063 verifyFormat("void foobar() { int i = 5; }\n"
10064 "#ifdef _DEBUG\n"
10065 "void bar() {}\n"
10066 "#else\n"
10067 "void bar() { foobar(); }\n"
10068 "#endif",
10069 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010070}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010071
10072TEST_F(FormatTest, WebKitBraceBreaking) {
10073 FormatStyle WebKitBraceStyle = getLLVMStyle();
10074 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
10075 verifyFormat("namespace a {\n"
10076 "class A {\n"
10077 " void f()\n"
10078 " {\n"
10079 " if (true) {\n"
10080 " a();\n"
10081 " b();\n"
10082 " }\n"
10083 " }\n"
10084 " void g() { return; }\n"
10085 "};\n"
10086 "enum E {\n"
10087 " A,\n"
10088 " // foo\n"
10089 " B,\n"
10090 " C\n"
10091 "};\n"
10092 "struct B {\n"
10093 " int x;\n"
10094 "};\n"
10095 "}\n",
10096 WebKitBraceStyle);
10097 verifyFormat("struct S {\n"
10098 " int Type;\n"
10099 " union {\n"
10100 " int x;\n"
10101 " double y;\n"
10102 " } Value;\n"
10103 " class C {\n"
10104 " MyFavoriteType Value;\n"
10105 " } Class;\n"
10106 "};\n",
10107 WebKitBraceStyle);
10108}
10109
Manuel Klimekd5735502013-08-12 03:51:17 +000010110TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10111 verifyFormat("void f() {\n"
10112 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010113 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010114 " }\n"
10115 "}\n",
10116 getLLVMStyle());
10117}
10118
Daniel Jasper9613c812013-08-07 16:29:23 +000010119TEST_F(FormatTest, UnderstandsPragmas) {
10120 verifyFormat("#pragma omp reduction(| : var)");
10121 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010122
10123 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10124 "(including parentheses).",
10125 format("#pragma mark Any non-hyphenated or hyphenated string "
10126 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010127}
10128
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010129TEST_F(FormatTest, UnderstandPragmaOption) {
10130 verifyFormat("#pragma option -C -A");
10131
10132 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10133}
10134
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010135#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10136 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010137 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10138 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010139
10140TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010141 SmallVector<FormatStyle, 3> Styles;
10142 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010143
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010144 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010145 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10146 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10147 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010148
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010149 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010150 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10151 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10152 EXPECT_ALL_STYLES_EQUAL(Styles);
10153
Nico Weber514ecc82014-02-02 20:50:45 +000010154 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010155 EXPECT_TRUE(
10156 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10157 EXPECT_TRUE(
10158 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10159 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010160
Nico Weber514ecc82014-02-02 20:50:45 +000010161 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010162 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10163 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10164 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010165
10166 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010167 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10168 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10169 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010170
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010171 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010172 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10173 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10174 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010175
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010176 Styles[0] = getGNUStyle();
10177 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10178 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10179 EXPECT_ALL_STYLES_EQUAL(Styles);
10180
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010181 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10182}
10183
10184TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10185 SmallVector<FormatStyle, 8> Styles;
10186 Styles.resize(2);
10187
10188 Styles[0] = getGoogleStyle();
10189 Styles[1] = getLLVMStyle();
10190 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10191 EXPECT_ALL_STYLES_EQUAL(Styles);
10192
10193 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010194 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010195 Styles[1] = getLLVMStyle();
10196 Styles[1].Language = FormatStyle::LK_JavaScript;
10197 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10198
10199 Styles[2] = getLLVMStyle();
10200 Styles[2].Language = FormatStyle::LK_JavaScript;
10201 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10202 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010203 &Styles[2])
10204 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010205
10206 Styles[3] = getLLVMStyle();
10207 Styles[3].Language = FormatStyle::LK_JavaScript;
10208 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10209 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010210 &Styles[3])
10211 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010212
10213 Styles[4] = getLLVMStyle();
10214 Styles[4].Language = FormatStyle::LK_JavaScript;
10215 EXPECT_EQ(0, parseConfiguration("---\n"
10216 "BasedOnStyle: LLVM\n"
10217 "IndentWidth: 123\n"
10218 "---\n"
10219 "BasedOnStyle: Google\n"
10220 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010221 &Styles[4])
10222 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010223 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010224}
10225
Daniel Jasper91881d92014-09-29 08:07:46 +000010226#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010227 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010228 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010229 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010230 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010231 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010232
Daniel Jasper91881d92014-09-29 08:07:46 +000010233#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10234
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010235#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10236 Style.STRUCT.FIELD = false; \
10237 EXPECT_EQ(0, \
10238 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10239 .value()); \
10240 EXPECT_TRUE(Style.STRUCT.FIELD); \
10241 EXPECT_EQ(0, \
10242 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10243 .value()); \
10244 EXPECT_FALSE(Style.STRUCT.FIELD);
10245
10246#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10247 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10248
Daniel Jasper00853002014-09-16 16:22:30 +000010249#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10250 EXPECT_NE(VALUE, Style.FIELD); \
10251 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10252 EXPECT_EQ(VALUE, Style.FIELD)
10253
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010254TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010255 FormatStyle Style = {};
10256 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010257 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +000010258 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010259 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010260 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010261 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010262 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010263 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010264 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010265 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010266 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010267 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010268 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010269 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010270 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010271 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +000010272 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010273 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010274 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010275 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010276 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010277 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010278 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010279 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010280 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010281 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010282 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010283 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010284 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010285 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010286 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010287 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010288 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010289 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010290 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010291 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010292 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010293 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010294 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010295
10296 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10297 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10298 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10299 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10300 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10301 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10302 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10303 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
10304 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10305 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10306 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010307}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010308
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010309#undef CHECK_PARSE_BOOL
10310
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010311TEST_F(FormatTest, ParsesConfiguration) {
10312 FormatStyle Style = {};
10313 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010314 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010315 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10316 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010317 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010318 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10319 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010320 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10321 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010322 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10323 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10324 PenaltyReturnTypeOnItsOwnLine, 1234u);
10325 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10326 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010327 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010328 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010329 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010330
Daniel Jasper553d4872014-06-17 12:40:34 +000010331 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010332 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10333 FormatStyle::PAS_Left);
10334 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10335 FormatStyle::PAS_Right);
10336 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10337 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010338 // For backward compatibility:
10339 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10340 FormatStyle::PAS_Left);
10341 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10342 FormatStyle::PAS_Right);
10343 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10344 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010345
Alexander Kornienkod6538332013-05-07 15:32:14 +000010346 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010347 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10348 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010349 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10350 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10351 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10352
Daniel Jasperac043c92014-09-15 11:11:00 +000010353 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010354 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10355 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010356 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10357 FormatStyle::BOS_None);
10358 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10359 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010360 // For backward compatibility:
10361 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10362 FormatStyle::BOS_None);
10363 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10364 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010365
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010366 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10367 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10368 FormatStyle::BAS_Align);
10369 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10370 FormatStyle::BAS_DontAlign);
10371 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10372 FormatStyle::BAS_AlwaysBreak);
10373 // For backward compatibility:
10374 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10375 FormatStyle::BAS_DontAlign);
10376 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10377 FormatStyle::BAS_Align);
10378
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010379 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010380 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10381 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10382 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010383 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10384 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010385 // For backward compatibility:
10386 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10387 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010388
Daniel Jasperd74cf402014-04-08 12:46:38 +000010389 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010390 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10391 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10392 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10393 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010394 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10395 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010396 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10397 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010398 // For backward compatibility:
10399 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10400 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10401 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10402 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010403
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010404 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10405 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10406 FormatStyle::SBPO_Never);
10407 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10408 FormatStyle::SBPO_Always);
10409 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10410 FormatStyle::SBPO_ControlStatements);
10411 // For backward compatibility:
10412 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10413 FormatStyle::SBPO_Never);
10414 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10415 FormatStyle::SBPO_ControlStatements);
10416
Alexander Kornienkod6538332013-05-07 15:32:14 +000010417 Style.ColumnLimit = 123;
10418 FormatStyle BaseStyle = getLLVMStyle();
10419 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10420 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10421
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010422 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10423 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10424 FormatStyle::BS_Attach);
10425 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10426 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010427 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10428 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010429 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10430 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010431 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10432 FormatStyle::BS_Allman);
10433 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010434 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10435 FormatStyle::BS_WebKit);
10436 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10437 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010438
Zachary Turner448592e2015-12-18 22:20:15 +000010439 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10440 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10441 FormatStyle::RTBS_None);
10442 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10443 FormatStyle::RTBS_All);
10444 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010445 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010446 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10447 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10448 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10449 AlwaysBreakAfterReturnType,
10450 FormatStyle::RTBS_TopLevelDefinitions);
10451
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010452 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10453 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10454 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10455 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10456 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10457 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10458 AlwaysBreakAfterDefinitionReturnType,
10459 FormatStyle::DRTBS_TopLevel);
10460
Daniel Jasper65ee3472013-07-31 23:16:02 +000010461 Style.NamespaceIndentation = FormatStyle::NI_All;
10462 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10463 FormatStyle::NI_None);
10464 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10465 FormatStyle::NI_Inner);
10466 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10467 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010468
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010469 // FIXME: This is required because parsing a configuration simply overwrites
10470 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010471 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010472 std::vector<std::string> BoostForeach;
10473 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010474 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010475 std::vector<std::string> BoostAndQForeach;
10476 BoostAndQForeach.push_back("BOOST_FOREACH");
10477 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010478 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10479 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010480
10481 Style.IncludeCategories.clear();
10482 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10483 {".*", 1}};
10484 CHECK_PARSE("IncludeCategories:\n"
10485 " - Regex: abc/.*\n"
10486 " Priority: 2\n"
10487 " - Regex: .*\n"
10488 " Priority: 1",
10489 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010490 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010491}
10492
10493TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10494 FormatStyle Style = {};
10495 Style.Language = FormatStyle::LK_Cpp;
10496 CHECK_PARSE("Language: Cpp\n"
10497 "IndentWidth: 12",
10498 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010499 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10500 "IndentWidth: 34",
10501 &Style),
10502 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010503 EXPECT_EQ(12u, Style.IndentWidth);
10504 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10505 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10506
10507 Style.Language = FormatStyle::LK_JavaScript;
10508 CHECK_PARSE("Language: JavaScript\n"
10509 "IndentWidth: 12",
10510 IndentWidth, 12u);
10511 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010512 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10513 "IndentWidth: 34",
10514 &Style),
10515 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010516 EXPECT_EQ(23u, Style.IndentWidth);
10517 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10518 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10519
10520 CHECK_PARSE("BasedOnStyle: LLVM\n"
10521 "IndentWidth: 67",
10522 IndentWidth, 67u);
10523
10524 CHECK_PARSE("---\n"
10525 "Language: JavaScript\n"
10526 "IndentWidth: 12\n"
10527 "---\n"
10528 "Language: Cpp\n"
10529 "IndentWidth: 34\n"
10530 "...\n",
10531 IndentWidth, 12u);
10532
10533 Style.Language = FormatStyle::LK_Cpp;
10534 CHECK_PARSE("---\n"
10535 "Language: JavaScript\n"
10536 "IndentWidth: 12\n"
10537 "---\n"
10538 "Language: Cpp\n"
10539 "IndentWidth: 34\n"
10540 "...\n",
10541 IndentWidth, 34u);
10542 CHECK_PARSE("---\n"
10543 "IndentWidth: 78\n"
10544 "---\n"
10545 "Language: JavaScript\n"
10546 "IndentWidth: 56\n"
10547 "...\n",
10548 IndentWidth, 78u);
10549
10550 Style.ColumnLimit = 123;
10551 Style.IndentWidth = 234;
10552 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10553 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010554 EXPECT_FALSE(parseConfiguration("---\n"
10555 "IndentWidth: 456\n"
10556 "BreakBeforeBraces: Allman\n"
10557 "---\n"
10558 "Language: JavaScript\n"
10559 "IndentWidth: 111\n"
10560 "TabWidth: 111\n"
10561 "---\n"
10562 "Language: Cpp\n"
10563 "BreakBeforeBraces: Stroustrup\n"
10564 "TabWidth: 789\n"
10565 "...\n",
10566 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010567 EXPECT_EQ(123u, Style.ColumnLimit);
10568 EXPECT_EQ(456u, Style.IndentWidth);
10569 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10570 EXPECT_EQ(789u, Style.TabWidth);
10571
Rafael Espindola1f243172014-06-12 11:35:17 +000010572 EXPECT_EQ(parseConfiguration("---\n"
10573 "Language: JavaScript\n"
10574 "IndentWidth: 56\n"
10575 "---\n"
10576 "IndentWidth: 78\n"
10577 "...\n",
10578 &Style),
10579 ParseError::Error);
10580 EXPECT_EQ(parseConfiguration("---\n"
10581 "Language: JavaScript\n"
10582 "IndentWidth: 56\n"
10583 "---\n"
10584 "Language: JavaScript\n"
10585 "IndentWidth: 78\n"
10586 "...\n",
10587 &Style),
10588 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010589
10590 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10591}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010592
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010593#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010594
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010595TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10596 FormatStyle Style = {};
10597 Style.Language = FormatStyle::LK_JavaScript;
10598 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010599 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010600 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010601
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010602 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010603 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010604 "BasedOnStyle: Google\n"
10605 "---\n"
10606 "Language: JavaScript\n"
10607 "IndentWidth: 76\n"
10608 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010609 &Style)
10610 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010611 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010612 EXPECT_EQ(76u, Style.IndentWidth);
10613 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10614}
10615
Alexander Kornienkod6538332013-05-07 15:32:14 +000010616TEST_F(FormatTest, ConfigurationRoundTripTest) {
10617 FormatStyle Style = getLLVMStyle();
10618 std::string YAML = configurationAsText(Style);
10619 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010620 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010621 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10622 EXPECT_EQ(Style, ParsedStyle);
10623}
10624
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010625TEST_F(FormatTest, WorksFor8bitEncodings) {
10626 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10627 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10628 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10629 "\"\xef\xee\xf0\xf3...\"",
10630 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10631 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10632 "\xef\xee\xf0\xf3...\"",
10633 getLLVMStyleWithColumns(12)));
10634}
10635
Alexander Kornienko393e3082013-11-13 14:04:17 +000010636TEST_F(FormatTest, HandlesUTF8BOM) {
10637 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10638 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10639 format("\xef\xbb\xbf#include <iostream>"));
10640 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10641 format("\xef\xbb\xbf\n#include <iostream>"));
10642}
10643
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010644// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10645#if !defined(_MSC_VER)
10646
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010647TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10648 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10649 getLLVMStyleWithColumns(35));
10650 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010651 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010652 verifyFormat("// Однажды в студёную зимнюю пору...",
10653 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010654 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010655 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10656 getLLVMStyleWithColumns(39));
10657 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010658 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010659}
10660
10661TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010662 // Non-printable characters' width is currently considered to be the length in
10663 // bytes in UTF8. The characters can be displayed in very different manner
10664 // (zero-width, single width with a substitution glyph, expanded to their code
10665 // (e.g. "<8d>"), so there's no single correct way to handle them.
10666 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010667 "\"\xc2\x8d\";",
10668 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010669 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010670 "\"\xc2\x8d\";",
10671 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010672 EXPECT_EQ("\"Однажды, в \"\n"
10673 "\"студёную \"\n"
10674 "\"зимнюю \"\n"
10675 "\"пору,\"",
10676 format("\"Однажды, в студёную зимнюю пору,\"",
10677 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010678 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010679 "\"一 二 三 \"\n"
10680 "\"四 五六 \"\n"
10681 "\"七 八 九 \"\n"
10682 "\"十\"",
10683 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010684 EXPECT_EQ("\"一\t二 \"\n"
10685 "\"\t三 \"\n"
10686 "\"四 五\t六 \"\n"
10687 "\"\t七 \"\n"
10688 "\"八九十\tqq\"",
10689 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10690 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010691
10692 // UTF8 character in an escape sequence.
10693 EXPECT_EQ("\"aaaaaa\"\n"
10694 "\"\\\xC2\x8D\"",
10695 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010696}
10697
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010698TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10699 EXPECT_EQ("const char *sssss =\n"
10700 " \"一二三四五六七八\\\n"
10701 " 九 十\";",
10702 format("const char *sssss = \"一二三四五六七八\\\n"
10703 " 九 十\";",
10704 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010705}
10706
10707TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010708 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10709 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010710 EXPECT_EQ("// Я из лесу\n"
10711 "// вышел; был\n"
10712 "// сильный\n"
10713 "// мороз.",
10714 format("// Я из лесу вышел; был сильный мороз.",
10715 getLLVMStyleWithColumns(13)));
10716 EXPECT_EQ("// 一二三\n"
10717 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010718 "// 八 九\n"
10719 "// 十",
10720 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010721}
10722
10723TEST_F(FormatTest, SplitsUTF8BlockComments) {
10724 EXPECT_EQ("/* Гляжу,\n"
10725 " * поднимается\n"
10726 " * медленно в\n"
10727 " * гору\n"
10728 " * Лошадка,\n"
10729 " * везущая\n"
10730 " * хворосту\n"
10731 " * воз. */",
10732 format("/* Гляжу, поднимается медленно в гору\n"
10733 " * Лошадка, везущая хворосту воз. */",
10734 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010735 EXPECT_EQ(
10736 "/* 一二三\n"
10737 " * 四五六七\n"
10738 " * 八 九\n"
10739 " * 十 */",
10740 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010741 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10742 " * 𝕓𝕪𝕥𝕖\n"
10743 " * 𝖀𝕿𝕱-𝟠 */",
10744 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010745}
10746
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010747#endif // _MSC_VER
10748
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010749TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10750 FormatStyle Style = getLLVMStyle();
10751
10752 Style.ConstructorInitializerIndentWidth = 4;
10753 verifyFormat(
10754 "SomeClass::Constructor()\n"
10755 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10756 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10757 Style);
10758
10759 Style.ConstructorInitializerIndentWidth = 2;
10760 verifyFormat(
10761 "SomeClass::Constructor()\n"
10762 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10763 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10764 Style);
10765
10766 Style.ConstructorInitializerIndentWidth = 0;
10767 verifyFormat(
10768 "SomeClass::Constructor()\n"
10769 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10770 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10771 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010772 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10773 verifyFormat(
10774 "SomeLongTemplateVariableName<\n"
10775 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10776 Style);
10777 verifyFormat(
10778 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10779 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10780 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010781}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010782
Daniel Jasper00853002014-09-16 16:22:30 +000010783TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10784 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010785 Style.BreakConstructorInitializersBeforeComma = true;
10786 Style.ConstructorInitializerIndentWidth = 4;
10787 verifyFormat("SomeClass::Constructor()\n"
10788 " : a(a)\n"
10789 " , b(b)\n"
10790 " , c(c) {}",
10791 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010792 verifyFormat("SomeClass::Constructor()\n"
10793 " : a(a) {}",
10794 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010795
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010796 Style.ColumnLimit = 0;
10797 verifyFormat("SomeClass::Constructor()\n"
10798 " : a(a) {}",
10799 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010800 verifyFormat("SomeClass::Constructor() noexcept\n"
10801 " : a(a) {}",
10802 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010803 verifyFormat("SomeClass::Constructor()\n"
10804 " : a(a)\n"
10805 " , b(b)\n"
10806 " , c(c) {}",
10807 Style);
10808 verifyFormat("SomeClass::Constructor()\n"
10809 " : a(a) {\n"
10810 " foo();\n"
10811 " bar();\n"
10812 "}",
10813 Style);
10814
Daniel Jasperd74cf402014-04-08 12:46:38 +000010815 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010816 verifyFormat("SomeClass::Constructor()\n"
10817 " : a(a)\n"
10818 " , b(b)\n"
10819 " , c(c) {\n}",
10820 Style);
10821 verifyFormat("SomeClass::Constructor()\n"
10822 " : a(a) {\n}",
10823 Style);
10824
10825 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010826 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010827 Style.ConstructorInitializerIndentWidth = 2;
10828 verifyFormat("SomeClass::Constructor()\n"
10829 " : a(a)\n"
10830 " , b(b)\n"
10831 " , c(c) {}",
10832 Style);
10833
10834 Style.ConstructorInitializerIndentWidth = 0;
10835 verifyFormat("SomeClass::Constructor()\n"
10836 ": a(a)\n"
10837 ", b(b)\n"
10838 ", c(c) {}",
10839 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010840
10841 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10842 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010843 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10844 verifyFormat(
10845 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10846 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010847 verifyFormat(
10848 "SomeClass::Constructor()\n"
10849 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10850 Style);
10851 Style.ConstructorInitializerIndentWidth = 4;
10852 Style.ColumnLimit = 60;
10853 verifyFormat("SomeClass::Constructor()\n"
10854 " : aaaaaaaa(aaaaaaaa)\n"
10855 " , aaaaaaaa(aaaaaaaa)\n"
10856 " , aaaaaaaa(aaaaaaaa) {}",
10857 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010858}
10859
Daniel Jasper38efc132014-10-21 07:51:54 +000010860TEST_F(FormatTest, Destructors) {
10861 verifyFormat("void F(int &i) { i.~int(); }");
10862 verifyFormat("void F(int &i) { i->~int(); }");
10863}
10864
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010865TEST_F(FormatTest, FormatsWithWebKitStyle) {
10866 FormatStyle Style = getWebKitStyle();
10867
10868 // Don't indent in outer namespaces.
10869 verifyFormat("namespace outer {\n"
10870 "int i;\n"
10871 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010872 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010873 "} // namespace inner\n"
10874 "} // namespace outer\n"
10875 "namespace other_outer {\n"
10876 "int i;\n"
10877 "}",
10878 Style);
10879
10880 // Don't indent case labels.
10881 verifyFormat("switch (variable) {\n"
10882 "case 1:\n"
10883 "case 2:\n"
10884 " doSomething();\n"
10885 " break;\n"
10886 "default:\n"
10887 " ++variable;\n"
10888 "}",
10889 Style);
10890
10891 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010892 EXPECT_EQ("void f()\n"
10893 "{\n"
10894 " if (aaaaaaaaaaaaaaaa\n"
10895 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10896 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10897 " return;\n"
10898 "}",
10899 format("void f() {\n"
10900 "if (aaaaaaaaaaaaaaaa\n"
10901 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10902 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10903 "return;\n"
10904 "}",
10905 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010906
Daniel Jasper35995672014-04-29 14:05:20 +000010907 // Allow functions on a single line.
10908 verifyFormat("void f() { return; }", Style);
10909
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010910 // Constructor initializers are formatted one per line with the "," on the
10911 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010912 verifyFormat("Constructor()\n"
10913 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10914 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010915 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010916 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10917 "{\n"
10918 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010919 Style);
10920 verifyFormat("SomeClass::Constructor()\n"
10921 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010922 "{\n"
10923 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010924 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010925 EXPECT_EQ("SomeClass::Constructor()\n"
10926 " : a(a)\n"
10927 "{\n"
10928 "}",
10929 format("SomeClass::Constructor():a(a){}", Style));
10930 verifyFormat("SomeClass::Constructor()\n"
10931 " : a(a)\n"
10932 " , b(b)\n"
10933 " , c(c)\n"
10934 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010935 "}",
10936 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010937 verifyFormat("SomeClass::Constructor()\n"
10938 " : a(a)\n"
10939 "{\n"
10940 " foo();\n"
10941 " bar();\n"
10942 "}",
10943 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010944
Daniel Jasper65ee3472013-07-31 23:16:02 +000010945 // Access specifiers should be aligned left.
10946 verifyFormat("class C {\n"
10947 "public:\n"
10948 " int i;\n"
10949 "};",
10950 Style);
10951
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010952 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010953 verifyFormat("int a; // Do not\n"
10954 "double b; // align comments.",
10955 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010956
Daniel Jasper3219e432014-12-02 13:24:51 +000010957 // Do not align operands.
10958 EXPECT_EQ("ASSERT(aaaa\n"
10959 " || bbbb);",
10960 format("ASSERT ( aaaa\n||bbbb);", Style));
10961
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010962 // Accept input's line breaks.
10963 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10964 " || bbbbbbbbbbbbbbb) {\n"
10965 " i++;\n"
10966 "}",
10967 format("if (aaaaaaaaaaaaaaa\n"
10968 "|| bbbbbbbbbbbbbbb) { i++; }",
10969 Style));
10970 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10971 " i++;\n"
10972 "}",
10973 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010974
10975 // Don't automatically break all macro definitions (llvm.org/PR17842).
10976 verifyFormat("#define aNumber 10", Style);
10977 // However, generally keep the line breaks that the user authored.
10978 EXPECT_EQ("#define aNumber \\\n"
10979 " 10",
10980 format("#define aNumber \\\n"
10981 " 10",
10982 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010983
10984 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010985 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10986 " copyItems:YES];",
10987 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10988 "copyItems:YES];",
10989 Style));
10990 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10991 " copyItems:YES];",
10992 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10993 " copyItems:YES];",
10994 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010995 // FIXME: This does not seem right, there should be more indentation before
10996 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010997 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010998 " @\"a\",\n"
10999 " @\"a\"\n"
11000 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011001 " copyItems:YES];",
11002 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
11003 " @\"a\",\n"
11004 " @\"a\"\n"
11005 " ]\n"
11006 " copyItems:YES];",
11007 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011008 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011009 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11010 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011011 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11012 " copyItems:YES];",
11013 Style));
11014
11015 verifyFormat("[self.a b:c c:d];", Style);
11016 EXPECT_EQ("[self.a b:c\n"
11017 " c:d];",
11018 format("[self.a b:c\n"
11019 "c:d];",
11020 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011021}
11022
Manuel Klimekffdeb592013-09-03 15:10:01 +000011023TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011024 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
11025 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
11026 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
11027 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
11028 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000011029 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000011030 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011031 verifyFormat("void f() {\n"
11032 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
11033 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011034 verifyFormat("void f() {\n"
11035 " other(x.begin(), //\n"
11036 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000011037 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011038 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000011039 verifyFormat("SomeFunction([]() { // A cool function...\n"
11040 " return 43;\n"
11041 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000011042 EXPECT_EQ("SomeFunction([]() {\n"
11043 "#define A a\n"
11044 " return 43;\n"
11045 "});",
11046 format("SomeFunction([](){\n"
11047 "#define A a\n"
11048 "return 43;\n"
11049 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000011050 verifyFormat("void f() {\n"
11051 " SomeFunction([](decltype(x), A *a) {});\n"
11052 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011053 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11054 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000011055 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
11056 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11057 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011058 verifyFormat("Constructor()\n"
11059 " : Field([] { // comment\n"
11060 " int i;\n"
11061 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011062 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11063 " return some_parameter.size();\n"
11064 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011065 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11066 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011067 verifyFormat("int i = aaaaaa ? 1 //\n"
11068 " : [] {\n"
11069 " return 2; //\n"
11070 " }();");
11071 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11072 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11073 " return x == 2; // force break\n"
11074 " });");
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011075 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n"
11076 " int iiiiiiiiiiii) {\n"
11077 " return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n"
11078 "});",
11079 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011080 verifyFormat("SomeFunction({[&] {\n"
11081 " // comment\n"
11082 " },\n"
11083 " [&] {\n"
11084 " // comment\n"
11085 " }});");
11086 verifyFormat("SomeFunction({[&] {\n"
11087 " // comment\n"
11088 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011089 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11090 " [&]() { return true; },\n"
11091 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011092
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011093 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011094 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011095 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011096 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11097 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011098 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011099 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011100 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11101 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011102 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011103 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11104 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011105 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011106 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011107 verifyFormat(
11108 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11109 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11110 " return aaaaaaaaaaaaaaaaa;\n"
11111 " });",
11112 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011113 verifyFormat("[]() //\n"
11114 " -> int {\n"
11115 " return 1; //\n"
11116 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011117
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011118 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011119 verifyFormat("SomeFunction(\n"
11120 " []() {\n"
11121 " int i = 42;\n"
11122 " return i;\n"
11123 " },\n"
11124 " []() {\n"
11125 " int j = 43;\n"
11126 " return j;\n"
11127 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011128
Daniel Jasperda18fd82014-06-10 06:39:03 +000011129 // More complex introducers.
11130 verifyFormat("return [i, args...] {};");
11131
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011132 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011133 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011134 verifyFormat("double &operator[](int i) { return 0; }\n"
11135 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011136 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011137 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011138 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011139
11140 // Other corner cases.
11141 verifyFormat("void f() {\n"
11142 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
11143 " );\n"
11144 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011145
11146 // Lambdas created through weird macros.
11147 verifyFormat("void f() {\n"
11148 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011149 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011150 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011151
11152 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11153 " doo_dah();\n"
11154 " doo_dah();\n"
11155 " })) {\n"
11156 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011157 verifyFormat("auto lambda = []() {\n"
11158 " int a = 2\n"
11159 "#if A\n"
11160 " + 2\n"
11161 "#endif\n"
11162 " ;\n"
11163 "};");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011164}
11165
Manuel Klimek516e0542013-09-04 13:25:30 +000011166TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011167 FormatStyle ShortBlocks = getLLVMStyle();
11168 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11169 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11170 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11171 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11172 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11173 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11174 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011175
Daniel Jasper76284682014-10-22 09:12:44 +000011176 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11177 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11178 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011179
Daniel Jasper76284682014-10-22 09:12:44 +000011180 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011181 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011182 "}];");
11183 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011184 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011185 "}]};");
11186 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011187 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011188 "}];");
11189 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011190 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011191 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011192 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011193 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011194 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011195 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011196 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011197
11198 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011199 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011200 "}];",
11201 getLLVMStyleWithColumns(60));
11202 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011203 " NSString *path = [self sessionFilePath];\n"
11204 " if (path) {\n"
11205 " // ...\n"
11206 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011207 "});");
11208 verifyFormat("[[SessionService sharedService]\n"
11209 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011210 " if (window) {\n"
11211 " [self windowDidLoad:window];\n"
11212 " } else {\n"
11213 " [self errorLoadingWindow];\n"
11214 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011215 " }];");
11216 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011217 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011218 "};\n",
11219 getLLVMStyleWithColumns(40));
11220 verifyFormat("[[SessionService sharedService]\n"
11221 " loadWindowWithCompletionBlock: //\n"
11222 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011223 " if (window) {\n"
11224 " [self windowDidLoad:window];\n"
11225 " } else {\n"
11226 " [self errorLoadingWindow];\n"
11227 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011228 " }];",
11229 getLLVMStyleWithColumns(60));
11230 verifyFormat("[myObject doSomethingWith:arg1\n"
11231 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011232 " // ...\n"
11233 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011234 " }\n"
11235 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011236 " // ...\n"
11237 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011238 " }\n"
11239 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011240 " // ...\n"
11241 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011242 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011243 verifyFormat("[myObject doSomethingWith:arg1\n"
11244 " firstBlock:-1\n"
11245 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011246 " // ...\n"
11247 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011248 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011249
11250 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011251 " @autoreleasepool {\n"
11252 " if (a) {\n"
11253 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011254 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011255 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011256 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011257 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011258 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11259 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011260
11261 FormatStyle FourIndent = getLLVMStyle();
11262 FourIndent.ObjCBlockIndentWidth = 4;
11263 verifyFormat("[operation setCompletionBlock:^{\n"
11264 " [self onOperationDone];\n"
11265 "}];",
11266 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011267}
11268
Daniel Jasper289afc02015-04-23 09:23:17 +000011269TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11270 FormatStyle ZeroColumn = getLLVMStyle();
11271 ZeroColumn.ColumnLimit = 0;
11272
11273 verifyFormat("[[SessionService sharedService] "
11274 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11275 " if (window) {\n"
11276 " [self windowDidLoad:window];\n"
11277 " } else {\n"
11278 " [self errorLoadingWindow];\n"
11279 " }\n"
11280 "}];",
11281 ZeroColumn);
11282 EXPECT_EQ("[[SessionService sharedService]\n"
11283 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11284 " if (window) {\n"
11285 " [self windowDidLoad:window];\n"
11286 " } else {\n"
11287 " [self errorLoadingWindow];\n"
11288 " }\n"
11289 " }];",
11290 format("[[SessionService sharedService]\n"
11291 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11292 " if (window) {\n"
11293 " [self windowDidLoad:window];\n"
11294 " } else {\n"
11295 " [self errorLoadingWindow];\n"
11296 " }\n"
11297 "}];",
11298 ZeroColumn));
11299 verifyFormat("[myObject doSomethingWith:arg1\n"
11300 " firstBlock:^(Foo *a) {\n"
11301 " // ...\n"
11302 " int i;\n"
11303 " }\n"
11304 " secondBlock:^(Bar *b) {\n"
11305 " // ...\n"
11306 " int i;\n"
11307 " }\n"
11308 " thirdBlock:^Foo(Bar *b) {\n"
11309 " // ...\n"
11310 " int i;\n"
11311 " }];",
11312 ZeroColumn);
11313 verifyFormat("f(^{\n"
11314 " @autoreleasepool {\n"
11315 " if (a) {\n"
11316 " g();\n"
11317 " }\n"
11318 " }\n"
11319 "});",
11320 ZeroColumn);
11321 verifyFormat("void (^largeBlock)(void) = ^{\n"
11322 " // ...\n"
11323 "};",
11324 ZeroColumn);
11325
11326 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11327 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011328 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011329 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11330 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11331 " int i;\n"
11332 "};",
11333 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11334}
11335
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011336TEST_F(FormatTest, SupportsCRLF) {
11337 EXPECT_EQ("int a;\r\n"
11338 "int b;\r\n"
11339 "int c;\r\n",
11340 format("int a;\r\n"
11341 " int b;\r\n"
11342 " int c;\r\n",
11343 getLLVMStyle()));
11344 EXPECT_EQ("int a;\r\n"
11345 "int b;\r\n"
11346 "int c;\r\n",
11347 format("int a;\r\n"
11348 " int b;\n"
11349 " int c;\r\n",
11350 getLLVMStyle()));
11351 EXPECT_EQ("int a;\n"
11352 "int b;\n"
11353 "int c;\n",
11354 format("int a;\r\n"
11355 " int b;\n"
11356 " int c;\n",
11357 getLLVMStyle()));
11358 EXPECT_EQ("\"aaaaaaa \"\r\n"
11359 "\"bbbbbbb\";\r\n",
11360 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11361 EXPECT_EQ("#define A \\\r\n"
11362 " b; \\\r\n"
11363 " c; \\\r\n"
11364 " d;\r\n",
11365 format("#define A \\\r\n"
11366 " b; \\\r\n"
11367 " c; d; \r\n",
11368 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011369
11370 EXPECT_EQ("/*\r\n"
11371 "multi line block comments\r\n"
11372 "should not introduce\r\n"
11373 "an extra carriage return\r\n"
11374 "*/\r\n",
11375 format("/*\r\n"
11376 "multi line block comments\r\n"
11377 "should not introduce\r\n"
11378 "an extra carriage return\r\n"
11379 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011380}
11381
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011382TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11383 verifyFormat("MY_CLASS(C) {\n"
11384 " int i;\n"
11385 " int j;\n"
11386 "};");
11387}
11388
Daniel Jasper6633ab82013-10-18 10:38:14 +000011389TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11390 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11391 TwoIndent.ContinuationIndentWidth = 2;
11392
11393 EXPECT_EQ("int i =\n"
11394 " longFunction(\n"
11395 " arg);",
11396 format("int i = longFunction(arg);", TwoIndent));
11397
11398 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11399 SixIndent.ContinuationIndentWidth = 6;
11400
11401 EXPECT_EQ("int i =\n"
11402 " longFunction(\n"
11403 " arg);",
11404 format("int i = longFunction(arg);", SixIndent));
11405}
11406
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011407TEST_F(FormatTest, SpacesInAngles) {
11408 FormatStyle Spaces = getLLVMStyle();
11409 Spaces.SpacesInAngles = true;
11410
11411 verifyFormat("static_cast< int >(arg);", Spaces);
11412 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11413 verifyFormat("f< int, float >();", Spaces);
11414 verifyFormat("template <> g() {}", Spaces);
11415 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011416 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11417 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11418 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011419
11420 Spaces.Standard = FormatStyle::LS_Cpp03;
11421 Spaces.SpacesInAngles = true;
11422 verifyFormat("A< A< int > >();", Spaces);
11423
11424 Spaces.SpacesInAngles = false;
11425 verifyFormat("A<A<int> >();", Spaces);
11426
11427 Spaces.Standard = FormatStyle::LS_Cpp11;
11428 Spaces.SpacesInAngles = true;
11429 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011430
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011431 Spaces.SpacesInAngles = false;
11432 verifyFormat("A<A<int>>();", Spaces);
11433}
11434
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011435TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11436 FormatStyle Style = getLLVMStyle();
11437 Style.SpaceAfterTemplateKeyword = false;
11438 verifyFormat("template<int> void foo();", Style);
11439}
11440
Jacques Pienaarfc275112015-02-18 23:48:37 +000011441TEST_F(FormatTest, TripleAngleBrackets) {
11442 verifyFormat("f<<<1, 1>>>();");
11443 verifyFormat("f<<<1, 1, 1, s>>>();");
11444 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011445 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011446 verifyFormat("f<param><<<1, 1>>>();");
11447 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011448 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011449 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11450 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011451 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11452 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011453}
11454
11455TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011456 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011457 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011458 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11459 "aaallvm::outs() <<");
11460 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11461 "aaaallvm::outs()\n <<");
11462}
11463
Manuel Klimek819788d2014-03-18 11:22:45 +000011464TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11465 std::string code = "#if A\n"
11466 "#if B\n"
11467 "a.\n"
11468 "#endif\n"
11469 " a = 1;\n"
11470 "#else\n"
11471 "#endif\n"
11472 "#if C\n"
11473 "#else\n"
11474 "#endif\n";
11475 EXPECT_EQ(code, format(code));
11476}
11477
Manuel Klimek68b03042014-04-14 09:14:11 +000011478TEST_F(FormatTest, HandleConflictMarkers) {
11479 // Git/SVN conflict markers.
11480 EXPECT_EQ("int a;\n"
11481 "void f() {\n"
11482 " callme(some(parameter1,\n"
11483 "<<<<<<< text by the vcs\n"
11484 " parameter2),\n"
11485 "||||||| text by the vcs\n"
11486 " parameter2),\n"
11487 " parameter3,\n"
11488 "======= text by the vcs\n"
11489 " parameter2, parameter3),\n"
11490 ">>>>>>> text by the vcs\n"
11491 " otherparameter);\n",
11492 format("int a;\n"
11493 "void f() {\n"
11494 " callme(some(parameter1,\n"
11495 "<<<<<<< text by the vcs\n"
11496 " parameter2),\n"
11497 "||||||| text by the vcs\n"
11498 " parameter2),\n"
11499 " parameter3,\n"
11500 "======= text by the vcs\n"
11501 " parameter2,\n"
11502 " parameter3),\n"
11503 ">>>>>>> text by the vcs\n"
11504 " otherparameter);\n"));
11505
11506 // Perforce markers.
11507 EXPECT_EQ("void f() {\n"
11508 " function(\n"
11509 ">>>> text by the vcs\n"
11510 " parameter,\n"
11511 "==== text by the vcs\n"
11512 " parameter,\n"
11513 "==== text by the vcs\n"
11514 " parameter,\n"
11515 "<<<< text by the vcs\n"
11516 " parameter);\n",
11517 format("void f() {\n"
11518 " function(\n"
11519 ">>>> text by the vcs\n"
11520 " parameter,\n"
11521 "==== text by the vcs\n"
11522 " parameter,\n"
11523 "==== text by the vcs\n"
11524 " parameter,\n"
11525 "<<<< text by the vcs\n"
11526 " parameter);\n"));
11527
11528 EXPECT_EQ("<<<<<<<\n"
11529 "|||||||\n"
11530 "=======\n"
11531 ">>>>>>>",
11532 format("<<<<<<<\n"
11533 "|||||||\n"
11534 "=======\n"
11535 ">>>>>>>"));
11536
11537 EXPECT_EQ("<<<<<<<\n"
11538 "|||||||\n"
11539 "int i;\n"
11540 "=======\n"
11541 ">>>>>>>",
11542 format("<<<<<<<\n"
11543 "|||||||\n"
11544 "int i;\n"
11545 "=======\n"
11546 ">>>>>>>"));
11547
11548 // FIXME: Handle parsing of macros around conflict markers correctly:
11549 EXPECT_EQ("#define Macro \\\n"
11550 "<<<<<<<\n"
11551 "Something \\\n"
11552 "|||||||\n"
11553 "Else \\\n"
11554 "=======\n"
11555 "Other \\\n"
11556 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011557 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011558 format("#define Macro \\\n"
11559 "<<<<<<<\n"
11560 " Something \\\n"
11561 "|||||||\n"
11562 " Else \\\n"
11563 "=======\n"
11564 " Other \\\n"
11565 ">>>>>>>\n"
11566 " End\n"
11567 "int i;\n"));
11568}
11569
Daniel Jasper471894432014-08-06 13:40:26 +000011570TEST_F(FormatTest, DisableRegions) {
11571 EXPECT_EQ("int i;\n"
11572 "// clang-format off\n"
11573 " int j;\n"
11574 "// clang-format on\n"
11575 "int k;",
11576 format(" int i;\n"
11577 " // clang-format off\n"
11578 " int j;\n"
11579 " // clang-format on\n"
11580 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011581 EXPECT_EQ("int i;\n"
11582 "/* clang-format off */\n"
11583 " int j;\n"
11584 "/* clang-format on */\n"
11585 "int k;",
11586 format(" int i;\n"
11587 " /* clang-format off */\n"
11588 " int j;\n"
11589 " /* clang-format on */\n"
11590 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011591
11592 // Don't reflow comments within disabled regions.
11593 EXPECT_EQ(
11594 "// clang-format off\n"
11595 "// long long long long long long line\n"
11596 "/* clang-format on */\n"
11597 "/* long long long\n"
11598 " * long long long\n"
11599 " * line */\n"
11600 "int i;\n"
11601 "/* clang-format off */\n"
11602 "/* long long long long long long line */\n",
11603 format("// clang-format off\n"
11604 "// long long long long long long line\n"
11605 "/* clang-format on */\n"
11606 "/* long long long long long long line */\n"
11607 "int i;\n"
11608 "/* clang-format off */\n"
11609 "/* long long long long long long line */\n",
11610 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011611}
11612
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011613TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11614 format("? ) =");
11615 verifyNoCrash("#define a\\\n /**/}");
11616}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011617
Daniel Jasper498f5582015-12-25 08:53:31 +000011618TEST_F(FormatTest, FormatsTableGenCode) {
11619 FormatStyle Style = getLLVMStyle();
11620 Style.Language = FormatStyle::LK_TableGen;
11621 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11622}
11623
Nico Weberb2673a12016-11-10 21:49:25 +000011624TEST_F(FormatTest, ArrayOfTemplates) {
11625 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11626 format("auto a = new unique_ptr<int > [ 10];"));
11627
11628 FormatStyle Spaces = getLLVMStyle();
11629 Spaces.SpacesInSquareBrackets = true;
11630 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11631 format("auto a = new unique_ptr<int > [10];", Spaces));
11632}
11633
11634TEST_F(FormatTest, ArrayAsTemplateType) {
11635 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11636 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11637
11638 FormatStyle Spaces = getLLVMStyle();
11639 Spaces.SpacesInSquareBrackets = true;
11640 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11641 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11642}
11643
Eric Liu547d8792016-03-24 13:22:42 +000011644TEST(FormatStyle, GetStyleOfFile) {
11645 vfs::InMemoryFileSystem FS;
11646 // Test 1: format file in the same directory.
11647 ASSERT_TRUE(
11648 FS.addFile("/a/.clang-format", 0,
11649 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11650 ASSERT_TRUE(
11651 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011652 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011653 ASSERT_TRUE((bool)Style1);
11654 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011655
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011656 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011657 ASSERT_TRUE(
11658 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011659 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011660 ASSERT_TRUE((bool)Style2);
11661 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011662
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011663 // Test 2.2: no format on 'none' fallback style.
11664 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11665 ASSERT_TRUE((bool)Style2);
11666 ASSERT_EQ(*Style2, getNoStyle());
11667
11668 // Test 2.3: format if config is found with no based style while fallback is
11669 // 'none'.
11670 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11671 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11672 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11673 ASSERT_TRUE((bool)Style2);
11674 ASSERT_EQ(*Style2, getLLVMStyle());
11675
11676 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11677 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11678 ASSERT_TRUE((bool)Style2);
11679 ASSERT_EQ(*Style2, getLLVMStyle());
11680
Eric Liu547d8792016-03-24 13:22:42 +000011681 // Test 3: format file in parent directory.
11682 ASSERT_TRUE(
11683 FS.addFile("/c/.clang-format", 0,
11684 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11685 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11686 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011687 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011688 ASSERT_TRUE((bool)Style3);
11689 ASSERT_EQ(*Style3, getGoogleStyle());
11690
11691 // Test 4: error on invalid fallback style
11692 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11693 ASSERT_FALSE((bool)Style4);
11694 llvm::consumeError(Style4.takeError());
11695
11696 // Test 5: error on invalid yaml on command line
11697 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11698 ASSERT_FALSE((bool)Style5);
11699 llvm::consumeError(Style5.takeError());
11700
11701 // Test 6: error on invalid style
11702 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11703 ASSERT_FALSE((bool)Style6);
11704 llvm::consumeError(Style6.takeError());
11705
11706 // Test 7: found config file, error on parsing it
11707 ASSERT_TRUE(
11708 FS.addFile("/d/.clang-format", 0,
11709 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11710 "InvalidKey: InvalidValue")));
11711 ASSERT_TRUE(
11712 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11713 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11714 ASSERT_FALSE((bool)Style7);
11715 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011716}
11717
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011718TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11719 // Column limit is 20.
11720 std::string Code = "Type *a =\n"
11721 " new Type();\n"
11722 "g(iiiii, 0, jjjjj,\n"
11723 " 0, kkkkk, 0, mm);\n"
11724 "int bad = format ;";
11725 std::string Expected = "auto a = new Type();\n"
11726 "g(iiiii, nullptr,\n"
11727 " jjjjj, nullptr,\n"
11728 " kkkkk, nullptr,\n"
11729 " mm);\n"
11730 "int bad = format ;";
11731 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011732 tooling::Replacements Replaces = toReplacements(
11733 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11734 "auto "),
11735 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11736 "nullptr"),
11737 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11738 "nullptr"),
11739 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11740 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011741
11742 format::FormatStyle Style = format::getLLVMStyle();
11743 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011744 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11745 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11746 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11747 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11748 EXPECT_TRUE(static_cast<bool>(Result));
11749 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011750}
11751
Eric Liubaf58c22016-05-18 13:43:48 +000011752TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11753 std::string Code = "#include \"a.h\"\n"
11754 "#include \"c.h\"\n"
11755 "\n"
11756 "int main() {\n"
11757 " return 0;\n"
11758 "}";
11759 std::string Expected = "#include \"a.h\"\n"
11760 "#include \"b.h\"\n"
11761 "#include \"c.h\"\n"
11762 "\n"
11763 "int main() {\n"
11764 " return 0;\n"
11765 "}";
11766 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011767 tooling::Replacements Replaces = toReplacements(
11768 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11769 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011770
11771 format::FormatStyle Style = format::getLLVMStyle();
11772 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011773 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11774 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11775 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11776 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11777 EXPECT_TRUE(static_cast<bool>(Result));
11778 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011779}
11780
Krasimir Georgiev13dbaa02017-02-01 10:10:04 +000011781TEST_F(FormatTest, AlignTrailingComments) {
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011782 EXPECT_EQ("#define MACRO(V) \\\n"
11783 " V(Rt2) /* one more char */ \\\n"
11784 " V(Rs) /* than here */ \\\n"
11785 "/* comment 3 */\n",
11786 format("#define MACRO(V)\\\n"
11787 "V(Rt2) /* one more char */ \\\n"
11788 "V(Rs) /* than here */ \\\n"
11789 "/* comment 3 */ \\\n",
11790 getLLVMStyleWithColumns(40)));
Krasimir Georgiev13dbaa02017-02-01 10:10:04 +000011791 EXPECT_EQ("int i = f(abc, // line 1\n"
11792 " d, // line 2\n"
11793 " // line 3\n"
11794 " b);",
11795 format("int i = f(abc, // line 1\n"
11796 " d, // line 2\n"
11797 " // line 3\n"
11798 " b);",
11799 getLLVMStyleWithColumns(40)));
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011800}
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011801} // end namespace
11802} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011803} // end namespace clang