blob: 6cc9d1979fae6ee6ee1967633b94e446e1dd5170 [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)));
Krasimir Georgievb6ccd382017-02-02 14:36:50 +0000954 EXPECT_EQ("enum A {\n"
955 " a, // line 1\n"
956 " // line 2\n"
957 "};",
958 format("enum A {\n"
959 " a, // line 1\n"
960 " // line 2\n"
961 "};",
962 getLLVMStyleWithColumns(20)));
963 EXPECT_EQ("enum A {\n"
964 " a, // line 1\n"
965 " // line 2\n"
966 "};",
967 format("enum A {\n"
968 " a, // line 1\n"
969 " // line 2\n"
970 "};",
971 getLLVMStyleWithColumns(20)));
972 EXPECT_EQ("enum A {\n"
973 " a, // line 1\n"
974 " // line 2\n"
975 " b\n"
976 "};",
977 format("enum A {\n"
978 " a, // line 1\n"
979 " // line 2\n"
980 " b\n"
981 "};",
982 getLLVMStyleWithColumns(20)));
983 EXPECT_EQ("enum A {\n"
984 " a, // line 1\n"
985 " // line 2\n"
986 " b\n"
987 "};",
988 format("enum A {\n"
989 " a, // line 1\n"
990 " // line 2\n"
991 " b\n"
992 "};",
993 getLLVMStyleWithColumns(20)));
Daniel Jaspere25509f2012-12-17 11:29:41 +0000994 verifyFormat(
995 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000996 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // Trailing comment");
Daniel Jasperd8bb2db2013-01-09 09:33:39 +0000997 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
998 " // Comment inside a statement.\n"
999 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper4281c5a2014-10-07 14:45:34 +00001000 verifyFormat("SomeFunction(a,\n"
1001 " // comment\n"
1002 " b + x);");
1003 verifyFormat("SomeFunction(a, a,\n"
1004 " // comment\n"
1005 " b + x);");
Daniel Jasper38396592013-02-06 15:23:09 +00001006 verifyFormat(
1007 "bool aaaaaaaaaaaaa = // comment\n"
1008 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
1009 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Manuel Klimekc74d2922013-01-07 08:54:53 +00001010
Daniel Jasper525264c2013-02-13 19:25:54 +00001011 verifyFormat("int aaaa; // aaaaa\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00001012 "int aa; // aaaaaaa",
1013 getLLVMStyleWithColumns(20));
Daniel Jasper525264c2013-02-13 19:25:54 +00001014
Daniel Jasper304a9862013-01-21 22:49:20 +00001015 EXPECT_EQ("void f() { // This does something ..\n"
1016 "}\n"
1017 "int a; // This is unrelated",
1018 format("void f() { // This does something ..\n"
1019 " }\n"
1020 "int a; // This is unrelated"));
Daniel Jasper251b3c92013-07-01 11:22:57 +00001021 EXPECT_EQ("class C {\n"
1022 " void f() { // This does something ..\n"
1023 " } // awesome..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +00001024 "\n"
Daniel Jasper251b3c92013-07-01 11:22:57 +00001025 " int a; // This is unrelated\n"
1026 "};",
1027 format("class C{void f() { // This does something ..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +00001028 " } // awesome..\n"
1029 " \n"
Daniel Jasper251b3c92013-07-01 11:22:57 +00001030 "int a; // This is unrelated\n"
1031 "};"));
Daniel Jasper304a9862013-01-21 22:49:20 +00001032
Daniel Jasper5ad1e192013-01-07 11:09:06 +00001033 EXPECT_EQ("int i; // single line trailing comment",
Manuel Klimekc74d2922013-01-07 08:54:53 +00001034 format("int i;\\\n// single line trailing comment"));
Daniel Jasper5ad1e192013-01-07 11:09:06 +00001035
1036 verifyGoogleFormat("int a; // Trailing comment.");
Daniel Jasperddaa9be2013-01-29 19:41:55 +00001037
1038 verifyFormat("someFunction(anotherFunction( // Force break.\n"
1039 " parameter));");
Daniel Jaspera885dbe2013-02-05 09:34:14 +00001040
1041 verifyGoogleFormat("#endif // HEADER_GUARD");
Daniel Jasperf79f9352013-02-06 22:04:05 +00001042
1043 verifyFormat("const char *test[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001044 " // A\n"
1045 " \"aaaa\",\n"
1046 " // B\n"
1047 " \"aaaaa\"};");
Daniel Jaspereef30492013-02-11 12:36:37 +00001048 verifyGoogleFormat(
1049 "aaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001050 " aaaaaaaaaaaaaaaaaaaaaa); // 81_cols_with_this_comment");
Alexander Kornienkob1be9d62013-04-03 12:38:53 +00001051 EXPECT_EQ("D(a, {\n"
1052 " // test\n"
1053 " int a;\n"
1054 "});",
1055 format("D(a, {\n"
1056 "// test\n"
1057 "int a;\n"
1058 "});"));
Manuel Klimekc5730802013-05-23 11:42:52 +00001059
1060 EXPECT_EQ("lineWith(); // comment\n"
1061 "// at start\n"
1062 "otherLine();",
1063 format("lineWith(); // comment\n"
1064 "// at start\n"
1065 "otherLine();"));
1066 EXPECT_EQ("lineWith(); // comment\n"
Daniel Jasperbb37a2f2016-02-01 11:20:55 +00001067 "/*\n"
1068 " * at start */\n"
1069 "otherLine();",
1070 format("lineWith(); // comment\n"
1071 "/*\n"
1072 " * at start */\n"
1073 "otherLine();"));
1074 EXPECT_EQ("lineWith(); // comment\n"
Manuel Klimekc5730802013-05-23 11:42:52 +00001075 " // at start\n"
1076 "otherLine();",
1077 format("lineWith(); // comment\n"
1078 " // at start\n"
1079 "otherLine();"));
Manuel Klimekb27375f2013-05-23 19:54:43 +00001080
1081 EXPECT_EQ("lineWith(); // comment\n"
1082 "// at start\n"
1083 "otherLine(); // comment",
1084 format("lineWith(); // comment\n"
1085 "// at start\n"
1086 "otherLine(); // comment"));
Manuel Klimek75ef31f2013-05-23 20:46:07 +00001087 EXPECT_EQ("lineWith();\n"
1088 "// at start\n"
1089 "otherLine(); // comment",
1090 format("lineWith();\n"
1091 " // at start\n"
1092 "otherLine(); // comment"));
1093 EXPECT_EQ("// first\n"
1094 "// at start\n"
1095 "otherLine(); // comment",
1096 format("// first\n"
1097 " // at start\n"
1098 "otherLine(); // comment"));
1099 EXPECT_EQ("f();\n"
1100 "// first\n"
1101 "// at start\n"
1102 "otherLine(); // comment",
1103 format("f();\n"
1104 "// first\n"
1105 " // at start\n"
1106 "otherLine(); // comment"));
Daniel Jasper0e93cdb2013-11-08 23:31:14 +00001107 verifyFormat("f(); // comment\n"
1108 "// first\n"
1109 "// at start\n"
1110 "otherLine();");
1111 EXPECT_EQ("f(); // comment\n"
1112 "// first\n"
1113 "// at start\n"
1114 "otherLine();",
1115 format("f(); // comment\n"
1116 "// first\n"
1117 " // at start\n"
1118 "otherLine();"));
1119 EXPECT_EQ("f(); // comment\n"
1120 " // first\n"
1121 "// at start\n"
1122 "otherLine();",
1123 format("f(); // comment\n"
1124 " // first\n"
1125 "// at start\n"
1126 "otherLine();"));
Daniel Jasper49532102015-01-07 14:00:11 +00001127 EXPECT_EQ("void f() {\n"
1128 " lineWith(); // comment\n"
1129 " // at start\n"
1130 "}",
1131 format("void f() {\n"
1132 " lineWith(); // comment\n"
1133 " // at start\n"
1134 "}"));
Benjamin Kramerdab50462016-01-11 16:27:16 +00001135 EXPECT_EQ("int xy; // a\n"
1136 "int z; // b",
1137 format("int xy; // a\n"
1138 "int z; //b"));
1139 EXPECT_EQ("int xy; // a\n"
1140 "int z; // bb",
1141 format("int xy; // a\n"
1142 "int z; //bb",
1143 getLLVMStyleWithColumns(12)));
Daniel Jasper66935022014-04-27 10:03:19 +00001144
Daniel Jaspera44991332015-04-29 13:06:49 +00001145 verifyFormat("#define A \\\n"
1146 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1147 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1148 getLLVMStyleWithColumns(60));
Daniel Jasper66935022014-04-27 10:03:19 +00001149 verifyFormat(
1150 "#define A \\\n"
1151 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1152 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1153 getLLVMStyleWithColumns(61));
Daniel Jasper8acf8222014-05-07 09:23:05 +00001154
1155 verifyFormat("if ( // This is some comment\n"
1156 " x + 3) {\n"
1157 "}");
1158 EXPECT_EQ("if ( // This is some comment\n"
1159 " // spanning two lines\n"
1160 " x + 3) {\n"
1161 "}",
1162 format("if( // This is some comment\n"
1163 " // spanning two lines\n"
1164 " x + 3) {\n"
1165 "}"));
Daniel Jasper9b79efb2015-01-19 11:49:32 +00001166
1167 verifyNoCrash("/\\\n/");
1168 verifyNoCrash("/\\\n* */");
Daniel Jasper62c78f52015-05-06 08:58:57 +00001169 // The 0-character somehow makes the lexer return a proper comment.
1170 verifyNoCrash(StringRef("/*\\\0\n/", 6));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001171}
1172
Daniel Jasper14e58e52014-03-21 11:58:45 +00001173TEST_F(FormatTest, KeepsParameterWithTrailingCommentsOnTheirOwnLine) {
1174 EXPECT_EQ("SomeFunction(a,\n"
1175 " b, // comment\n"
1176 " c);",
1177 format("SomeFunction(a,\n"
1178 " b, // comment\n"
1179 " c);"));
Daniel Jasper28df0a32014-03-21 12:15:40 +00001180 EXPECT_EQ("SomeFunction(a, b,\n"
1181 " // comment\n"
1182 " c);",
1183 format("SomeFunction(a,\n"
1184 " b,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001185 " // comment\n"
Daniel Jasper28df0a32014-03-21 12:15:40 +00001186 " c);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001187 EXPECT_EQ("SomeFunction(a, b, // comment (unclear relation)\n"
1188 " c);",
1189 format("SomeFunction(a, b, // comment (unclear relation)\n"
1190 " c);"));
1191 EXPECT_EQ("SomeFunction(a, // comment\n"
1192 " b,\n"
1193 " c); // comment",
1194 format("SomeFunction(a, // comment\n"
1195 " b,\n"
1196 " c); // comment"));
Daniel Jasper35e41222016-11-29 09:40:01 +00001197 EXPECT_EQ("aaaaaaaaaa(aaaa(aaaa,\n"
1198 " aaaa), //\n"
1199 " aaaa, bbbbb);",
1200 format("aaaaaaaaaa(aaaa(aaaa,\n"
1201 "aaaa), //\n"
1202 "aaaa, bbbbb);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001203}
1204
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001205TEST_F(FormatTest, RemovesTrailingWhitespaceOfComments) {
1206 EXPECT_EQ("// comment", format("// comment "));
1207 EXPECT_EQ("int aaaaaaa, bbbbbbb; // comment",
1208 format("int aaaaaaa, bbbbbbb; // comment ",
1209 getLLVMStyleWithColumns(33)));
Alexander Kornienko9ab4a772013-09-06 17:24:54 +00001210 EXPECT_EQ("// comment\\\n", format("// comment\\\n \t \v \f "));
1211 EXPECT_EQ("// comment \\\n", format("// comment \\\n \t \v \f "));
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001212}
1213
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001214TEST_F(FormatTest, UnderstandsBlockComments) {
Nico Weber8084cff2013-06-26 00:15:19 +00001215 verifyFormat("f(/*noSpaceAfterParameterNamingComment=*/true);");
Daniel Jasper2b2c9672016-05-08 18:14:01 +00001216 verifyFormat("void f() { g(/*aaa=*/x, /*bbb=*/!y, /*c=*/::c); }");
Daniel Jasper38c82402013-11-29 09:27:43 +00001217 EXPECT_EQ("f(aaaaaaaaaaaaaaaaaaaaaaaaa, /* Trailing comment for aa... */\n"
1218 " bbbbbbbbbbbbbbbbbbbbbbbbb);",
1219 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \\\n"
1220 "/* Trailing comment for aa... */\n"
1221 " bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001222 EXPECT_EQ(
1223 "f(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1224 " /* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);",
1225 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \n"
1226 "/* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper61a40782013-06-06 16:08:57 +00001227 EXPECT_EQ(
1228 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1229 " aaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001230 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001231 "}",
1232 format("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1233 " aaaaaaaaaaaaaaaaaa ,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001234 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001235 "}"));
Daniel Jasper99302ed2016-05-27 08:59:34 +00001236 verifyFormat("f(/* aaaaaaaaaaaaaaaaaa = */\n"
1237 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperddaa9be2013-01-29 19:41:55 +00001238
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00001239 FormatStyle NoBinPacking = getLLVMStyle();
1240 NoBinPacking.BinPackParameters = false;
1241 verifyFormat("aaaaaaaa(/* parameter 1 */ aaaaaa,\n"
1242 " /* parameter 2 */ aaaaaa,\n"
1243 " /* parameter 3 */ aaaaaa,\n"
1244 " /* parameter 4 */ aaaaaa);",
1245 NoBinPacking);
Daniel Jasper03b1bc72014-03-28 15:06:01 +00001246
1247 // Aligning block comments in macros.
1248 verifyGoogleFormat("#define A \\\n"
1249 " int i; /*a*/ \\\n"
1250 " int jjj; /*b*/");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001251}
1252
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001253TEST_F(FormatTest, AlignsBlockComments) {
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001254 EXPECT_EQ("/*\n"
1255 " * Really multi-line\n"
1256 " * comment.\n"
1257 " */\n"
1258 "void f() {}",
1259 format(" /*\n"
1260 " * Really multi-line\n"
1261 " * comment.\n"
1262 " */\n"
1263 " void f() {}"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001264 EXPECT_EQ("class C {\n"
1265 " /*\n"
1266 " * Another multi-line\n"
1267 " * comment.\n"
1268 " */\n"
1269 " void f() {}\n"
1270 "};",
1271 format("class C {\n"
1272 "/*\n"
1273 " * Another multi-line\n"
1274 " * comment.\n"
1275 " */\n"
1276 "void f() {}\n"
1277 "};"));
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001278 EXPECT_EQ("/*\n"
1279 " 1. This is a comment with non-trivial formatting.\n"
1280 " 1.1. We have to indent/outdent all lines equally\n"
1281 " 1.1.1. to keep the formatting.\n"
1282 " */",
1283 format(" /*\n"
1284 " 1. This is a comment with non-trivial formatting.\n"
1285 " 1.1. We have to indent/outdent all lines equally\n"
1286 " 1.1.1. to keep the formatting.\n"
1287 " */"));
1288 EXPECT_EQ("/*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001289 "Don't try to outdent if there's not enough indentation.\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001290 "*/",
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001291 format(" /*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001292 " Don't try to outdent if there's not enough indentation.\n"
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001293 " */"));
Manuel Klimek281dcbe2013-05-28 08:55:01 +00001294
1295 EXPECT_EQ("int i; /* Comment with empty...\n"
1296 " *\n"
1297 " * line. */",
1298 format("int i; /* Comment with empty...\n"
1299 " *\n"
1300 " * line. */"));
Alexander Kornienko67d9c8c2014-04-17 16:12:46 +00001301 EXPECT_EQ("int foobar = 0; /* comment */\n"
1302 "int bar = 0; /* multiline\n"
1303 " comment 1 */\n"
1304 "int baz = 0; /* multiline\n"
1305 " comment 2 */\n"
1306 "int bzz = 0; /* multiline\n"
1307 " comment 3 */",
1308 format("int foobar = 0; /* comment */\n"
1309 "int bar = 0; /* multiline\n"
1310 " comment 1 */\n"
1311 "int baz = 0; /* multiline\n"
1312 " comment 2 */\n"
1313 "int bzz = 0; /* multiline\n"
1314 " comment 3 */"));
1315 EXPECT_EQ("int foobar = 0; /* comment */\n"
1316 "int bar = 0; /* multiline\n"
1317 " comment */\n"
1318 "int baz = 0; /* multiline\n"
1319 "comment */",
1320 format("int foobar = 0; /* comment */\n"
1321 "int bar = 0; /* multiline\n"
1322 "comment */\n"
1323 "int baz = 0; /* multiline\n"
1324 "comment */"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001325}
1326
Daniel Jaspera0a50392015-12-01 13:28:53 +00001327TEST_F(FormatTest, CommentReflowingCanBeTurnedOff) {
1328 FormatStyle Style = getLLVMStyleWithColumns(20);
1329 Style.ReflowComments = false;
1330 verifyFormat("// aaaaaaaaa aaaaaaaaaa aaaaaaaaaa", Style);
1331 verifyFormat("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa */", Style);
1332}
1333
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001334TEST_F(FormatTest, CorrectlyHandlesLengthOfBlockComments) {
1335 EXPECT_EQ("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1336 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */",
1337 format("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1338 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */"));
Alexander Kornienkoaa620e12013-07-01 13:42:42 +00001339 EXPECT_EQ(
1340 "void ffffffffffff(\n"
1341 " int aaaaaaaa, int bbbbbbbb,\n"
1342 " int cccccccccccc) { /*\n"
1343 " aaaaaaaaaa\n"
1344 " aaaaaaaaaaaaa\n"
1345 " bbbbbbbbbbbbbb\n"
1346 " bbbbbbbbbb\n"
1347 " */\n"
1348 "}",
1349 format("void ffffffffffff(int aaaaaaaa, int bbbbbbbb, int cccccccccccc)\n"
1350 "{ /*\n"
1351 " aaaaaaaaaa aaaaaaaaaaaaa\n"
1352 " bbbbbbbbbbbbbb bbbbbbbbbb\n"
1353 " */\n"
1354 "}",
1355 getLLVMStyleWithColumns(40)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001356}
1357
Alexander Kornienko94042342013-07-16 23:47:22 +00001358TEST_F(FormatTest, DontBreakNonTrailingBlockComments) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00001359 EXPECT_EQ("void ffffffffff(\n"
1360 " int aaaaa /* test */);",
Alexander Kornienko94042342013-07-16 23:47:22 +00001361 format("void ffffffffff(int aaaaa /* test */);",
1362 getLLVMStyleWithColumns(35)));
1363}
1364
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001365TEST_F(FormatTest, SplitsLongCxxComments) {
1366 EXPECT_EQ("// A comment that\n"
1367 "// doesn't fit on\n"
1368 "// one line",
1369 format("// A comment that doesn't fit on one line",
1370 getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001371 EXPECT_EQ("/// A comment that\n"
1372 "/// doesn't fit on\n"
1373 "/// one line",
1374 format("/// A comment that doesn't fit on one line",
1375 getLLVMStyleWithColumns(20)));
1376 EXPECT_EQ("//! A comment that\n"
1377 "//! doesn't fit on\n"
1378 "//! one line",
1379 format("//! A comment that doesn't fit on one line",
1380 getLLVMStyleWithColumns(20)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00001381 EXPECT_EQ("// a b c d\n"
1382 "// e f g\n"
1383 "// h i j k",
Daniel Jaspera44991332015-04-29 13:06:49 +00001384 format("// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
1385 EXPECT_EQ(
1386 "// a b c d\n"
1387 "// e f g\n"
1388 "// h i j k",
1389 format("\\\n// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001390 EXPECT_EQ("if (true) // A comment that\n"
1391 " // doesn't fit on\n"
1392 " // one line",
1393 format("if (true) // A comment that doesn't fit on one line ",
1394 getLLVMStyleWithColumns(30)));
1395 EXPECT_EQ("// Don't_touch_leading_whitespace",
1396 format("// Don't_touch_leading_whitespace",
1397 getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001398 EXPECT_EQ("// Add leading\n"
1399 "// whitespace",
1400 format("//Add leading whitespace", getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001401 EXPECT_EQ("/// Add leading\n"
1402 "/// whitespace",
1403 format("///Add leading whitespace", getLLVMStyleWithColumns(20)));
1404 EXPECT_EQ("//! Add leading\n"
1405 "//! whitespace",
1406 format("//!Add leading whitespace", getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001407 EXPECT_EQ("// whitespace", format("//whitespace", getLLVMStyle()));
1408 EXPECT_EQ("// Even if it makes the line exceed the column\n"
1409 "// limit",
1410 format("//Even if it makes the line exceed the column limit",
1411 getLLVMStyleWithColumns(51)));
1412 EXPECT_EQ("//--But not here", format("//--But not here", getLLVMStyle()));
Krasimir Georgievb796ceb2017-01-31 15:40:15 +00001413 EXPECT_EQ("/// line 1\n"
1414 "// add leading whitespace",
1415 format("/// line 1\n"
1416 "//add leading whitespace",
1417 getLLVMStyleWithColumns(30)));
1418 EXPECT_EQ("/// line 1\n"
1419 "/// line 2\n"
1420 "//! line 3\n"
1421 "//! line 4\n"
1422 "//! line 5\n"
1423 "// line 6\n"
1424 "// line 7",
1425 format("///line 1\n"
1426 "///line 2\n"
1427 "//! line 3\n"
1428 "//!line 4\n"
1429 "//!line 5\n"
1430 "// line 6\n"
1431 "//line 7", getLLVMStyleWithColumns(20)));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001432
1433 EXPECT_EQ("// aa bb cc dd",
1434 format("// aa bb cc dd ",
1435 getLLVMStyleWithColumns(15)));
1436
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001437 EXPECT_EQ("// A comment before\n"
1438 "// a macro\n"
1439 "// definition\n"
1440 "#define a b",
1441 format("// A comment before a macro definition\n"
1442 "#define a b",
1443 getLLVMStyleWithColumns(20)));
Daniel Jaspere068ac72014-10-27 17:13:59 +00001444 EXPECT_EQ("void ffffff(\n"
1445 " int aaaaaaaaa, // wwww\n"
1446 " int bbbbbbbbbb, // xxxxxxx\n"
1447 " // yyyyyyyyyy\n"
1448 " int c, int d, int e) {}",
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001449 format("void ffffff(\n"
1450 " int aaaaaaaaa, // wwww\n"
Daniel Jasper19a541e2013-12-19 16:45:34 +00001451 " int bbbbbbbbbb, // xxxxxxx yyyyyyyyyy\n"
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001452 " int c, int d, int e) {}",
1453 getLLVMStyleWithColumns(40)));
Alexander Kornienkob93062e2013-06-20 13:58:37 +00001454 EXPECT_EQ("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1455 format("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1456 getLLVMStyleWithColumns(20)));
Alexander Kornienko3abbb8a2013-11-12 17:30:49 +00001457 EXPECT_EQ(
1458 "#define XXX // a b c d\n"
1459 " // e f g h",
1460 format("#define XXX // a b c d e f g h", getLLVMStyleWithColumns(22)));
1461 EXPECT_EQ(
1462 "#define XXX // q w e r\n"
1463 " // t y u i",
1464 format("#define XXX //q w e r t y u i", getLLVMStyleWithColumns(22)));
Krasimir Georgieve518e0b2017-01-30 21:00:01 +00001465 EXPECT_EQ("{\n"
1466 " //\n"
1467 " //\\\n"
1468 " // long 1 2 3 4\n"
1469 " // 5\n"
1470 "}",
1471 format("{\n"
1472 " //\n"
1473 " //\\\n"
1474 " // long 1 2 3 4 5\n"
1475 "}",
1476 getLLVMStyleWithColumns(20)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001477}
Manuel Klimek9043c742013-05-27 15:23:34 +00001478
Alexander Kornienko4504f932014-03-10 13:14:56 +00001479TEST_F(FormatTest, PreservesHangingIndentInCxxComments) {
1480 EXPECT_EQ("// A comment\n"
1481 "// that doesn't\n"
1482 "// fit on one\n"
1483 "// line",
1484 format("// A comment that doesn't fit on one line",
1485 getLLVMStyleWithColumns(20)));
1486 EXPECT_EQ("/// A comment\n"
1487 "/// that doesn't\n"
1488 "/// fit on one\n"
1489 "/// line",
1490 format("/// A comment that doesn't fit on one line",
1491 getLLVMStyleWithColumns(20)));
1492}
1493
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001494TEST_F(FormatTest, DontSplitLineCommentsWithEscapedNewlines) {
1495 EXPECT_EQ("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1496 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1497 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1498 format("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1499 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1500 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
1501 EXPECT_EQ("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1502 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1503 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1504 format("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1505 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1506 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1507 getLLVMStyleWithColumns(50)));
1508 // FIXME: One day we might want to implement adjustment of leading whitespace
1509 // of the consecutive lines in this kind of comment:
Daniel Jasper4355e7f2014-07-09 07:50:33 +00001510 EXPECT_EQ("double\n"
1511 " a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1512 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1513 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1514 format("double a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1515 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1516 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001517 getLLVMStyleWithColumns(49)));
1518}
1519
Alexander Kornienkoce9161a2014-01-02 15:13:14 +00001520TEST_F(FormatTest, DontSplitLineCommentsWithPragmas) {
1521 FormatStyle Pragmas = getLLVMStyleWithColumns(30);
1522 Pragmas.CommentPragmas = "^ IWYU pragma:";
1523 EXPECT_EQ(
1524 "// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb",
1525 format("// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb", Pragmas));
1526 EXPECT_EQ(
1527 "/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */",
1528 format("/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */", Pragmas));
1529}
1530
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001531TEST_F(FormatTest, PriorityOfCommentBreaking) {
Daniel Jasper2739af32013-08-28 10:03:58 +00001532 EXPECT_EQ("if (xxx ==\n"
1533 " yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001534 " zzz)\n"
1535 " q();",
1536 format("if (xxx == yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
1537 " zzz) q();",
1538 getLLVMStyleWithColumns(40)));
1539 EXPECT_EQ("if (xxxxxxxxxx ==\n"
1540 " yyy && // aaaaaa bbbbbbbb cccc\n"
1541 " zzz)\n"
1542 " q();",
1543 format("if (xxxxxxxxxx == yyy && // aaaaaa bbbbbbbb cccc\n"
1544 " zzz) q();",
1545 getLLVMStyleWithColumns(40)));
1546 EXPECT_EQ("if (xxxxxxxxxx &&\n"
1547 " yyy || // aaaaaa bbbbbbbb cccc\n"
1548 " zzz)\n"
1549 " q();",
1550 format("if (xxxxxxxxxx && yyy || // aaaaaa bbbbbbbb cccc\n"
1551 " zzz) q();",
1552 getLLVMStyleWithColumns(40)));
Daniel Jasper19a541e2013-12-19 16:45:34 +00001553 EXPECT_EQ("fffffffff(\n"
1554 " &xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1555 " zzz);",
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001556 format("fffffffff(&xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1557 " zzz);",
1558 getLLVMStyleWithColumns(40)));
Manuel Klimek9043c742013-05-27 15:23:34 +00001559}
1560
1561TEST_F(FormatTest, MultiLineCommentsInDefines) {
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001562 EXPECT_EQ("#define A(x) /* \\\n"
1563 " a comment \\\n"
1564 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001565 " f();",
1566 format("#define A(x) /* \\\n"
1567 " a comment \\\n"
1568 " inside */ \\\n"
1569 " f();",
1570 getLLVMStyleWithColumns(17)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001571 EXPECT_EQ("#define A( \\\n"
1572 " x) /* \\\n"
1573 " a comment \\\n"
1574 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001575 " f();",
1576 format("#define A( \\\n"
1577 " x) /* \\\n"
1578 " a comment \\\n"
1579 " inside */ \\\n"
1580 " f();",
1581 getLLVMStyleWithColumns(17)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001582}
1583
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001584TEST_F(FormatTest, ParsesCommentsAdjacentToPPDirectives) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001585 EXPECT_EQ("namespace {}\n// Test\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001586 format("namespace {}\n // Test\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001587 EXPECT_EQ("namespace {}\n/* Test */\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001588 format("namespace {}\n /* Test */\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001589 EXPECT_EQ("namespace {}\n/* Test */ #define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001590 format("namespace {}\n /* Test */ #define A"));
1591}
1592
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001593TEST_F(FormatTest, SplitsLongLinesInComments) {
1594 EXPECT_EQ("/* This is a long\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001595 " * comment that\n"
1596 " * doesn't\n"
1597 " * fit on one line.\n"
1598 " */",
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001599 format("/* "
1600 "This is a long "
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001601 "comment that "
1602 "doesn't "
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001603 "fit on one line. */",
1604 getLLVMStyleWithColumns(20)));
Daniel Jaspera44991332015-04-29 13:06:49 +00001605 EXPECT_EQ(
1606 "/* a b c d\n"
1607 " * e f g\n"
1608 " * h i j k\n"
1609 " */",
1610 format("/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
1611 EXPECT_EQ(
1612 "/* a b c d\n"
1613 " * e f g\n"
1614 " * h i j k\n"
1615 " */",
1616 format("\\\n/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001617 EXPECT_EQ("/*\n"
1618 "This is a long\n"
1619 "comment that doesn't\n"
1620 "fit on one line.\n"
1621 "*/",
1622 format("/*\n"
1623 "This is a long "
1624 "comment that doesn't "
1625 "fit on one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001626 "*/",
1627 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001628 EXPECT_EQ("/*\n"
1629 " * This is a long\n"
1630 " * comment that\n"
1631 " * doesn't fit on\n"
1632 " * one line.\n"
1633 " */",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001634 format("/* \n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001635 " * This is a long "
1636 " comment that "
1637 " doesn't fit on "
1638 " one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001639 " */",
1640 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001641 EXPECT_EQ("/*\n"
1642 " * This_is_a_comment_with_words_that_dont_fit_on_one_line\n"
1643 " * so_it_should_be_broken\n"
1644 " * wherever_a_space_occurs\n"
1645 " */",
1646 format("/*\n"
1647 " * This_is_a_comment_with_words_that_dont_fit_on_one_line "
1648 " so_it_should_be_broken "
1649 " wherever_a_space_occurs \n"
1650 " */",
1651 getLLVMStyleWithColumns(20)));
1652 EXPECT_EQ("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001653 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001654 " */",
1655 format("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001656 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001657 " */",
1658 getLLVMStyleWithColumns(20)));
1659 EXPECT_EQ("{\n"
1660 " /*\n"
1661 " This is another\n"
1662 " long comment that\n"
1663 " doesn't fit on one\n"
1664 " line 1234567890\n"
1665 " */\n"
1666 "}",
1667 format("{\n"
1668 "/*\n"
1669 "This is another "
1670 " long comment that "
1671 " doesn't fit on one"
1672 " line 1234567890\n"
1673 "*/\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001674 "}",
1675 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001676 EXPECT_EQ("{\n"
1677 " /*\n"
1678 " * This i s\n"
1679 " * another comment\n"
1680 " * t hat doesn' t\n"
1681 " * fit on one l i\n"
1682 " * n e\n"
1683 " */\n"
1684 "}",
1685 format("{\n"
1686 "/*\n"
1687 " * This i s"
1688 " another comment"
1689 " t hat doesn' t"
1690 " fit on one l i"
1691 " n e\n"
1692 " */\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001693 "}",
1694 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001695 EXPECT_EQ("/*\n"
1696 " * This is a long\n"
1697 " * comment that\n"
1698 " * doesn't fit on\n"
1699 " * one line\n"
1700 " */",
1701 format(" /*\n"
1702 " * This is a long comment that doesn't fit on one line\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001703 " */",
1704 getLLVMStyleWithColumns(20)));
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001705 EXPECT_EQ("{\n"
1706 " if (something) /* This is a\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001707 " long\n"
1708 " comment */\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001709 " ;\n"
1710 "}",
1711 format("{\n"
1712 " if (something) /* This is a long comment */\n"
1713 " ;\n"
1714 "}",
1715 getLLVMStyleWithColumns(30)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001716
1717 EXPECT_EQ("/* A comment before\n"
1718 " * a macro\n"
1719 " * definition */\n"
1720 "#define a b",
1721 format("/* A comment before a macro definition */\n"
1722 "#define a b",
1723 getLLVMStyleWithColumns(20)));
1724
1725 EXPECT_EQ("/* some comment\n"
1726 " * a comment\n"
1727 "* that we break\n"
1728 " * another comment\n"
1729 "* we have to break\n"
1730 "* a left comment\n"
1731 " */",
1732 format(" /* some comment\n"
1733 " * a comment that we break\n"
1734 " * another comment we have to break\n"
1735 "* a left comment\n"
1736 " */",
1737 getLLVMStyleWithColumns(20)));
1738
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00001739 EXPECT_EQ("/**\n"
1740 " * multiline block\n"
1741 " * comment\n"
1742 " *\n"
1743 " */",
1744 format("/**\n"
1745 " * multiline block comment\n"
1746 " *\n"
1747 " */",
1748 getLLVMStyleWithColumns(20)));
1749
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001750 EXPECT_EQ("/*\n"
1751 "\n"
1752 "\n"
1753 " */\n",
1754 format(" /* \n"
1755 " \n"
1756 " \n"
1757 " */\n"));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001758
1759 EXPECT_EQ("/* a a */",
1760 format("/* a a */", getLLVMStyleWithColumns(15)));
1761 EXPECT_EQ("/* a a bc */",
1762 format("/* a a bc */", getLLVMStyleWithColumns(15)));
1763 EXPECT_EQ("/* aaa aaa\n"
1764 " * aaaaa */",
1765 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
1766 EXPECT_EQ("/* aaa aaa\n"
1767 " * aaaaa */",
1768 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001769}
1770
1771TEST_F(FormatTest, SplitsLongLinesInCommentsInPreprocessor) {
1772 EXPECT_EQ("#define X \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001773 " /* \\\n"
1774 " Test \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001775 " Macro comment \\\n"
1776 " with a long \\\n"
1777 " line \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001778 " */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001779 " A + B",
1780 format("#define X \\\n"
1781 " /*\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001782 " Test\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001783 " Macro comment with a long line\n"
1784 " */ \\\n"
1785 " A + B",
1786 getLLVMStyleWithColumns(20)));
1787 EXPECT_EQ("#define X \\\n"
1788 " /* Macro comment \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001789 " with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001790 " line */ \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001791 " A + B",
1792 format("#define X \\\n"
1793 " /* Macro comment with a long\n"
1794 " line */ \\\n"
1795 " A + B",
1796 getLLVMStyleWithColumns(20)));
1797 EXPECT_EQ("#define X \\\n"
1798 " /* Macro comment \\\n"
1799 " * with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001800 " * line */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001801 " A + B",
1802 format("#define X \\\n"
1803 " /* Macro comment with a long line */ \\\n"
1804 " A + B",
1805 getLLVMStyleWithColumns(20)));
1806}
1807
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001808TEST_F(FormatTest, CommentsInStaticInitializers) {
1809 EXPECT_EQ(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001810 "static SomeType type = {aaaaaaaaaaaaaaaaaaaa, /* comment */\n"
1811 " aaaaaaaaaaaaaaaaaaaa /* comment */,\n"
1812 " /* comment */ aaaaaaaaaaaaaaaaaaaa,\n"
1813 " aaaaaaaaaaaaaaaaaaaa, // comment\n"
1814 " aaaaaaaaaaaaaaaaaaaa};",
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001815 format("static SomeType type = { aaaaaaaaaaaaaaaaaaaa , /* comment */\n"
1816 " aaaaaaaaaaaaaaaaaaaa /* comment */ ,\n"
1817 " /* comment */ aaaaaaaaaaaaaaaaaaaa ,\n"
1818 " aaaaaaaaaaaaaaaaaaaa , // comment\n"
1819 " aaaaaaaaaaaaaaaaaaaa };"));
Chandler Carruthf8b72662014-03-02 12:37:31 +00001820 verifyFormat("static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1821 " bbbbbbbbbbb, ccccccccccc};");
1822 verifyFormat("static SomeType type = {aaaaaaaaaaa,\n"
1823 " // comment for bb....\n"
1824 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001825 verifyGoogleFormat(
Daniel Jaspere5777d22013-05-23 10:15:45 +00001826 "static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1827 " bbbbbbbbbbb, ccccccccccc};");
1828 verifyGoogleFormat("static SomeType type = {aaaaaaaaaaa,\n"
1829 " // comment for bb....\n"
1830 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001831
Chandler Carruthf8b72662014-03-02 12:37:31 +00001832 verifyFormat("S s = {{a, b, c}, // Group #1\n"
1833 " {d, e, f}, // Group #2\n"
1834 " {g, h, i}}; // Group #3");
1835 verifyFormat("S s = {{// Group #1\n"
1836 " a, b, c},\n"
1837 " {// Group #2\n"
1838 " d, e, f},\n"
1839 " {// Group #3\n"
1840 " g, h, i}};");
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001841
1842 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001843 " // Some comment\n"
1844 " a,\n"
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001845 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001846 " // Comment after empty line\n"
1847 " b}",
Daniel Jasperfb5e2412013-02-26 13:10:34 +00001848 format("S s = {\n"
1849 " // Some comment\n"
1850 " a,\n"
1851 " \n"
1852 " // Comment after empty line\n"
1853 " b\n"
1854 "}"));
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001855 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001856 " /* Some comment */\n"
1857 " a,\n"
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001858 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001859 " /* Comment after empty line */\n"
1860 " b}",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001861 format("S s = {\n"
1862 " /* Some comment */\n"
1863 " a,\n"
1864 " \n"
1865 " /* Comment after empty line */\n"
1866 " b\n"
1867 "}"));
Daniel Jaspera400cab2013-02-28 15:04:12 +00001868 verifyFormat("const uint8_t aaaaaaaaaaaaaaaaaaaaaa[0] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001869 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1870 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1871 " 0x00, 0x00, 0x00, 0x00}; // comment\n");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001872}
1873
Krasimir Georgiev84321612017-01-30 19:18:55 +00001874TEST_F(FormatTest, LineCommentsAfterRightBrace) {
1875 EXPECT_EQ("if (true) { // comment about branch\n"
1876 " // comment about f\n"
1877 " f();\n"
1878 "}",
1879 format("if (true) { // comment about branch\n"
1880 " // comment about f\n"
1881 " f();\n"
1882 "}",
1883 getLLVMStyleWithColumns(80)));
1884 EXPECT_EQ("if (1) { // if line 1\n"
1885 " // if line 2\n"
1886 " // if line 3\n"
1887 " // f line 1\n"
1888 " // f line 2\n"
1889 " f();\n"
1890 "} else { // else line 1\n"
1891 " // else line 2\n"
1892 " // else line 3\n"
1893 " // g line 1\n"
1894 " g();\n"
1895 "}",
1896 format("if (1) { // if line 1\n"
1897 " // if line 2\n"
1898 " // if line 3\n"
1899 " // f line 1\n"
1900 " // f line 2\n"
1901 " f();\n"
1902 "} else { // else line 1\n"
1903 " // else line 2\n"
1904 " // else line 3\n"
1905 " // g line 1\n"
1906 " g();\n"
1907 "}"));
1908 EXPECT_EQ("do { // line 1\n"
1909 " // line 2\n"
1910 " // line 3\n"
1911 " f();\n"
1912 "} while (true);",
1913 format("do { // line 1\n"
1914 " // line 2\n"
1915 " // line 3\n"
1916 " f();\n"
1917 "} while (true);",
1918 getLLVMStyleWithColumns(80)));
1919 EXPECT_EQ("while (a < b) { // line 1\n"
1920 " // line 2\n"
1921 " // line 3\n"
1922 " f();\n"
1923 "}",
1924 format("while (a < b) {// line 1\n"
1925 " // line 2\n"
1926 " // line 3\n"
1927 " f();\n"
1928 "}",
1929 getLLVMStyleWithColumns(80)));
1930}
1931
Krasimir Georgiev91834222017-01-25 13:58:58 +00001932TEST_F(FormatTest, ReflowsComments) {
1933 // Break a long line and reflow with the full next line.
1934 EXPECT_EQ("// long long long\n"
1935 "// long long",
1936 format("// long long long long\n"
1937 "// long",
1938 getLLVMStyleWithColumns(20)));
1939
1940 // Keep the trailing newline while reflowing.
1941 EXPECT_EQ("// long long long\n"
1942 "// long long\n",
1943 format("// long long long long\n"
1944 "// long\n",
1945 getLLVMStyleWithColumns(20)));
1946
1947 // Break a long line and reflow with a part of the next line.
1948 EXPECT_EQ("// long long long\n"
1949 "// long long\n"
1950 "// long_long",
1951 format("// long long long long\n"
1952 "// long long_long",
1953 getLLVMStyleWithColumns(20)));
1954
1955 // Break but do not reflow if the first word from the next line is too long.
1956 EXPECT_EQ("// long long long\n"
1957 "// long\n"
1958 "// long_long_long\n",
1959 format("// long long long long\n"
1960 "// long_long_long\n",
1961 getLLVMStyleWithColumns(20)));
1962
1963 // Don't break or reflow short lines.
1964 verifyFormat("// long\n"
1965 "// long long long lo\n"
1966 "// long long long lo\n"
1967 "// long",
1968 getLLVMStyleWithColumns(20));
1969
1970 // Keep prefixes and decorations while reflowing.
1971 EXPECT_EQ("/// long long long\n"
1972 "/// long long\n",
1973 format("/// long long long long\n"
1974 "/// long\n",
1975 getLLVMStyleWithColumns(20)));
1976 EXPECT_EQ("//! long long long\n"
1977 "//! long long\n",
1978 format("//! long long long long\n"
1979 "//! long\n",
1980 getLLVMStyleWithColumns(20)));
1981 EXPECT_EQ("/* long long long\n"
1982 " * long long */",
1983 format("/* long long long long\n"
1984 " * long */",
1985 getLLVMStyleWithColumns(20)));
1986
1987 // Don't bring leading whitespace up while reflowing.
1988 EXPECT_EQ("/* long long long\n"
1989 " * long long long\n"
1990 " */",
1991 format("/* long long long long\n"
1992 " * long long\n"
1993 " */",
1994 getLLVMStyleWithColumns(20)));
1995
1996 // Reflow the last line of a block comment with its trailing '*/'.
1997 EXPECT_EQ("/* long long long\n"
1998 " long long */",
1999 format("/* long long long long\n"
2000 " long */",
2001 getLLVMStyleWithColumns(20)));
2002
2003 // Reflow two short lines; keep the postfix of the last one.
2004 EXPECT_EQ("/* long long long\n"
2005 " * long long long */",
2006 format("/* long long long long\n"
2007 " * long\n"
2008 " * long */",
2009 getLLVMStyleWithColumns(20)));
2010
2011 // Put the postfix of the last short reflow line on a newline if it doesn't
2012 // fit.
2013 EXPECT_EQ("/* long long long\n"
2014 " * long long longg\n"
2015 " */",
2016 format("/* long long long long\n"
2017 " * long\n"
2018 " * longg */",
2019 getLLVMStyleWithColumns(20)));
2020
Krasimir Georgievaf1b9622017-01-31 14:31:44 +00002021 // Reflow lines with leading whitespace.
2022 EXPECT_EQ("{\n"
2023 " /*\n"
2024 " * long long long\n"
2025 " * long long long\n"
2026 " * long long long\n"
2027 " */\n"
2028 "}",
2029 format("{\n"
2030 "/*\n"
2031 " * long long long long\n"
2032 " * long\n"
2033 " * long long long long\n"
2034 " */\n"
2035 "}",
2036 getLLVMStyleWithColumns(20)));
2037
Krasimir Georgiev91834222017-01-25 13:58:58 +00002038 // Break single line block comments that are first in the line with ' *'
2039 // decoration.
2040 EXPECT_EQ("/* long long long\n"
2041 " * long */",
2042 format("/* long long long long */", getLLVMStyleWithColumns(20)));
2043
2044 // Break single line block comment that are not first in the line with ' '
2045 // decoration.
2046 EXPECT_EQ("int i; /* long long\n"
2047 " long */",
2048 format("int i; /* long long long */", getLLVMStyleWithColumns(20)));
2049
2050 // Reflow a line that goes just over the column limit.
2051 EXPECT_EQ("// long long long\n"
2052 "// lon long",
2053 format("// long long long lon\n"
2054 "// long",
2055 getLLVMStyleWithColumns(20)));
2056
2057 // Stop reflowing if the next line has a different indentation than the
2058 // previous line.
2059 EXPECT_EQ("// long long long\n"
2060 "// long\n"
2061 "// long long\n"
2062 "// long",
2063 format("// long long long long\n"
2064 "// long long\n"
2065 "// long",
2066 getLLVMStyleWithColumns(20)));
2067
2068 // Reflow into the last part of a really long line that has been broken into
2069 // multiple lines.
2070 EXPECT_EQ("// long long long\n"
2071 "// long long long\n"
2072 "// long long long\n",
2073 format("// long long long long long long long long\n"
2074 "// long\n",
2075 getLLVMStyleWithColumns(20)));
2076
2077 // Break the first line, then reflow the beginning of the second and third
2078 // line up.
2079 EXPECT_EQ("// long long long\n"
2080 "// lon1 lon2 lon2\n"
2081 "// lon2 lon3 lon3",
2082 format("// long long long lon1\n"
2083 "// lon2 lon2 lon2\n"
2084 "// lon3 lon3",
2085 getLLVMStyleWithColumns(20)));
2086
2087 // Reflow the beginning of the second line, then break the rest.
2088 EXPECT_EQ("// long long long\n"
2089 "// lon1 lon2 lon2\n"
2090 "// lon2 lon2 lon2\n"
2091 "// lon3",
2092 format("// long long long lon1\n"
2093 "// lon2 lon2 lon2 lon2 lon2 lon3",
2094 getLLVMStyleWithColumns(20)));
2095
2096 // Shrink the first line, then reflow the second line up.
2097 EXPECT_EQ("// long long long", format("// long long\n"
2098 "// long",
2099 getLLVMStyleWithColumns(20)));
2100
2101 // Don't shrink leading whitespace.
2102 EXPECT_EQ("int i; /// a",
2103 format("int i; /// a", getLLVMStyleWithColumns(20)));
2104
2105 // Shrink trailing whitespace if there is no postfix and reflow.
2106 EXPECT_EQ("// long long long\n"
2107 "// long long",
2108 format("// long long long long \n"
2109 "// long",
2110 getLLVMStyleWithColumns(20)));
2111
2112 // Shrink trailing whitespace to a single one if there is postfix.
2113 EXPECT_EQ("/* long long long */",
2114 format("/* long long long */", getLLVMStyleWithColumns(20)));
2115
2116 // Break a block comment postfix if exceeding the line limit.
2117 EXPECT_EQ("/* long\n"
2118 " */",
2119 format("/* long */", getLLVMStyleWithColumns(20)));
2120
2121 // Reflow indented comments.
2122 EXPECT_EQ("{\n"
2123 " // long long long\n"
2124 " // long long\n"
2125 " int i; /* long lon\n"
2126 " g long\n"
2127 " */\n"
2128 "}",
2129 format("{\n"
2130 " // long long long long\n"
2131 " // long\n"
2132 " int i; /* long lon g\n"
2133 " long */\n"
2134 "}",
2135 getLLVMStyleWithColumns(20)));
2136
2137 // Don't realign trailing comments after reflow has happened.
2138 EXPECT_EQ("// long long long\n"
2139 "// long long\n"
2140 "long i; // long",
2141 format("// long long long long\n"
2142 "// long\n"
2143 "long i; // long",
2144 getLLVMStyleWithColumns(20)));
2145 EXPECT_EQ("// long long long\n"
2146 "// longng long long\n"
2147 "// long lo",
2148 format("// long long long longng\n"
2149 "// long long long\n"
2150 "// lo",
2151 getLLVMStyleWithColumns(20)));
2152
2153 // Reflow lines after a broken line.
2154 EXPECT_EQ("int a; // Trailing\n"
2155 " // comment on\n"
2156 " // 2 or 3\n"
2157 " // lines.\n",
2158 format("int a; // Trailing comment\n"
2159 " // on 2\n"
2160 " // or 3\n"
2161 " // lines.\n",
2162 getLLVMStyleWithColumns(20)));
2163 EXPECT_EQ("/// This long line\n"
2164 "/// gets reflown.\n",
2165 format("/// This long line gets\n"
2166 "/// reflown.\n",
2167 getLLVMStyleWithColumns(20)));
2168 EXPECT_EQ("//! This long line\n"
2169 "//! gets reflown.\n",
2170 format(" //! This long line gets\n"
2171 " //! reflown.\n",
2172 getLLVMStyleWithColumns(20)));
2173 EXPECT_EQ("/* This long line\n"
2174 " * gets reflown.\n"
2175 " */\n",
2176 format("/* This long line gets\n"
2177 " * reflown.\n"
2178 " */\n",
2179 getLLVMStyleWithColumns(20)));
2180
2181 // Reflow after indentation makes a line too long.
2182 EXPECT_EQ("{\n"
2183 " // long long long\n"
2184 " // lo long\n"
2185 "}\n",
2186 format("{\n"
2187 "// long long long lo\n"
2188 "// long\n"
2189 "}\n",
2190 getLLVMStyleWithColumns(20)));
2191
2192 // Break and reflow multiple lines.
2193 EXPECT_EQ("/*\n"
2194 " * Reflow the end of\n"
2195 " * line by 11 22 33\n"
2196 " * 4.\n"
2197 " */\n",
2198 format("/*\n"
2199 " * Reflow the end of line\n"
2200 " * by\n"
2201 " * 11\n"
2202 " * 22\n"
2203 " * 33\n"
2204 " * 4.\n"
2205 " */\n",
2206 getLLVMStyleWithColumns(20)));
2207 EXPECT_EQ("/// First line gets\n"
2208 "/// broken. Second\n"
2209 "/// line gets\n"
2210 "/// reflown and\n"
2211 "/// broken. Third\n"
2212 "/// gets reflown.\n",
2213 format("/// First line gets broken.\n"
2214 "/// Second line gets reflown and broken.\n"
2215 "/// Third gets reflown.\n",
2216 getLLVMStyleWithColumns(20)));
2217 EXPECT_EQ("int i; // first long\n"
2218 " // long snd\n"
2219 " // long.\n",
2220 format("int i; // first long long\n"
2221 " // snd long.\n",
2222 getLLVMStyleWithColumns(20)));
2223 EXPECT_EQ("{\n"
2224 " // first long line\n"
2225 " // line second\n"
2226 " // long line line\n"
2227 " // third long line\n"
2228 " // line\n"
2229 "}\n",
2230 format("{\n"
2231 " // first long line line\n"
2232 " // second long line line\n"
2233 " // third long line line\n"
2234 "}\n",
2235 getLLVMStyleWithColumns(20)));
2236 EXPECT_EQ("int i; /* first line\n"
2237 " * second\n"
2238 " * line third\n"
2239 " * line\n"
2240 " */",
2241 format("int i; /* first line\n"
2242 " * second line\n"
2243 " * third line\n"
2244 " */",
2245 getLLVMStyleWithColumns(20)));
2246
2247 // Reflow the last two lines of a section that starts with a line having
2248 // different indentation.
2249 EXPECT_EQ(
2250 "// long\n"
2251 "// long long long\n"
2252 "// long long",
2253 format("// long\n"
2254 "// long long long long\n"
2255 "// long",
2256 getLLVMStyleWithColumns(20)));
2257
2258 // Keep the block comment endling '*/' while reflowing.
2259 EXPECT_EQ("/* Long long long\n"
2260 " * line short */\n",
2261 format("/* Long long long line\n"
2262 " * short */\n",
2263 getLLVMStyleWithColumns(20)));
2264
2265 // Don't reflow between separate blocks of comments.
2266 EXPECT_EQ("/* First comment\n"
2267 " * block will */\n"
2268 "/* Snd\n"
2269 " */\n",
2270 format("/* First comment block\n"
2271 " * will */\n"
2272 "/* Snd\n"
2273 " */\n",
2274 getLLVMStyleWithColumns(20)));
2275
2276 // Don't reflow across blank comment lines.
2277 EXPECT_EQ("int i; // This long\n"
2278 " // line gets\n"
2279 " // broken.\n"
Krasimir Georgiev13dbaa02017-02-01 10:10:04 +00002280 " //\n"
Krasimir Georgiev91834222017-01-25 13:58:58 +00002281 " // keep.\n",
2282 format("int i; // This long line gets broken.\n"
2283 " // \n"
2284 " // keep.\n",
2285 getLLVMStyleWithColumns(20)));
2286 EXPECT_EQ("{\n"
2287 " /// long long long\n"
2288 " /// long long\n"
2289 " ///\n"
2290 " /// long\n"
2291 "}",
2292 format("{\n"
2293 " /// long long long long\n"
2294 " /// long\n"
2295 " ///\n"
2296 " /// long\n"
2297 "}",
2298 getLLVMStyleWithColumns(20)));
2299 EXPECT_EQ("//! long long long\n"
2300 "//! long\n"
2301 "\n"
2302 "//! long",
2303 format("//! long long long long\n"
2304 "\n"
2305 "//! long",
2306 getLLVMStyleWithColumns(20)));
2307 EXPECT_EQ("/* long long long\n"
2308 " long\n"
2309 "\n"
2310 " long */",
2311 format("/* long long long long\n"
2312 "\n"
2313 " long */",
2314 getLLVMStyleWithColumns(20)));
2315 EXPECT_EQ("/* long long long\n"
2316 " * long\n"
2317 " *\n"
2318 " * long */",
2319 format("/* long long long long\n"
2320 " *\n"
2321 " * long */",
2322 getLLVMStyleWithColumns(20)));
2323
2324 // Don't reflow lines having content that is a single character.
2325 EXPECT_EQ("// long long long\n"
2326 "// long\n"
2327 "// l",
2328 format("// long long long long\n"
2329 "// l",
2330 getLLVMStyleWithColumns(20)));
2331
2332 // Don't reflow lines starting with two punctuation characters.
2333 EXPECT_EQ("// long long long\n"
2334 "// long\n"
2335 "// ... --- ...",
2336 format(
2337 "// long long long long\n"
2338 "// ... --- ...",
2339 getLLVMStyleWithColumns(20)));
Krasimir Georgiev8f62cf72017-01-31 11:38:02 +00002340
2341 // Don't reflow lines starting with '@'.
2342 EXPECT_EQ("// long long long\n"
2343 "// long\n"
2344 "// @param arg",
2345 format("// long long long long\n"
2346 "// @param arg",
2347 getLLVMStyleWithColumns(20)));
Krasimir Georgiev28912c02017-02-02 10:52:08 +00002348
2349 // Don't reflow lines starting with 'TODO'.
2350 EXPECT_EQ("// long long long\n"
2351 "// long\n"
2352 "// TODO: long",
2353 format("// long long long long\n"
2354 "// TODO: long",
2355 getLLVMStyleWithColumns(20)));
2356
2357 // Don't reflow lines starting with 'FIXME'.
2358 EXPECT_EQ("// long long long\n"
2359 "// long\n"
2360 "// FIXME: long",
2361 format("// long long long long\n"
2362 "// FIXME: long",
2363 getLLVMStyleWithColumns(20)));
2364
2365 // Don't reflow lines starting with 'XXX'.
2366 EXPECT_EQ("// long long long\n"
2367 "// long\n"
2368 "// XXX: long",
2369 format("// long long long long\n"
2370 "// XXX: long",
2371 getLLVMStyleWithColumns(20)));
Krasimir Georgiev8f62cf72017-01-31 11:38:02 +00002372
Krasimir Georgiev00c5c722017-02-02 15:32:19 +00002373 // Don't reflow comment pragmas.
2374 EXPECT_EQ("// long long long\n"
2375 "// long\n"
2376 "// IWYU pragma:",
2377 format("// long long long long\n"
2378 "// IWYU pragma:",
2379 getLLVMStyleWithColumns(20)));
2380 EXPECT_EQ("/* long long long\n"
2381 " * long\n"
2382 " * IWYU pragma:\n"
2383 " */",
2384 format("/* long long long long\n"
2385 " * IWYU pragma:\n"
2386 " */",
2387 getLLVMStyleWithColumns(20)));
2388
Krasimir Georgiev91834222017-01-25 13:58:58 +00002389 // Reflow lines that have a non-punctuation character among their first 2
2390 // characters.
2391 EXPECT_EQ("// long long long\n"
2392 "// long 'long'",
2393 format(
2394 "// long long long long\n"
2395 "// 'long'",
2396 getLLVMStyleWithColumns(20)));
2397
2398 // Don't reflow between separate blocks of comments.
2399 EXPECT_EQ("/* First comment\n"
2400 " * block will */\n"
2401 "/* Snd\n"
2402 " */\n",
2403 format("/* First comment block\n"
2404 " * will */\n"
2405 "/* Snd\n"
2406 " */\n",
2407 getLLVMStyleWithColumns(20)));
2408
2409 // Don't reflow lines having different indentation.
2410 EXPECT_EQ("// long long long\n"
2411 "// long\n"
2412 "// long",
2413 format("// long long long long\n"
2414 "// long",
2415 getLLVMStyleWithColumns(20)));
2416
2417 // Don't break or reflow after implicit string literals.
2418 verifyFormat("#include <t> // l l l\n"
2419 " // l",
2420 getLLVMStyleWithColumns(20));
2421
2422 // Don't break or reflow comments on import lines.
2423 EXPECT_EQ("#include \"t\" /* l l l\n"
2424 " * l */",
2425 format("#include \"t\" /* l l l\n"
2426 " * l */",
2427 getLLVMStyleWithColumns(20)));
2428
2429 // Don't reflow between different trailing comment sections.
2430 EXPECT_EQ("int i; // long long\n"
2431 " // long\n"
2432 "int j; // long long\n"
2433 " // long\n",
2434 format("int i; // long long long\n"
2435 "int j; // long long long\n",
2436 getLLVMStyleWithColumns(20)));
2437
2438 // Don't reflow if the first word on the next line is longer than the
2439 // available space at current line.
2440 EXPECT_EQ("int i; // trigger\n"
2441 " // reflow\n"
2442 " // longsec\n",
2443 format("int i; // trigger reflow\n"
2444 " // longsec\n",
2445 getLLVMStyleWithColumns(20)));
2446
2447 // Keep empty comment lines.
2448 EXPECT_EQ("/**/", format(" /**/", getLLVMStyleWithColumns(20)));
2449 EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
2450 EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
2451 EXPECT_EQ("//", format(" // ", getLLVMStyleWithColumns(20)));
2452 EXPECT_EQ("///", format(" /// ", getLLVMStyleWithColumns(20)));
2453}
2454
Alexander Kornienkof2e02122013-05-24 18:24:24 +00002455TEST_F(FormatTest, IgnoresIf0Contents) {
2456 EXPECT_EQ("#if 0\n"
2457 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
2458 "#endif\n"
2459 "void f() {}",
2460 format("#if 0\n"
2461 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
2462 "#endif\n"
2463 "void f( ) { }"));
2464 EXPECT_EQ("#if false\n"
2465 "void f( ) { }\n"
2466 "#endif\n"
2467 "void g() {}\n",
2468 format("#if false\n"
2469 "void f( ) { }\n"
2470 "#endif\n"
2471 "void g( ) { }\n"));
2472 EXPECT_EQ("enum E {\n"
2473 " One,\n"
2474 " Two,\n"
2475 "#if 0\n"
2476 "Three,\n"
2477 " Four,\n"
2478 "#endif\n"
2479 " Five\n"
2480 "};",
2481 format("enum E {\n"
2482 " One,Two,\n"
2483 "#if 0\n"
2484 "Three,\n"
2485 " Four,\n"
2486 "#endif\n"
2487 " Five};"));
2488 EXPECT_EQ("enum F {\n"
2489 " One,\n"
2490 "#if 1\n"
2491 " Two,\n"
2492 "#if 0\n"
2493 "Three,\n"
2494 " Four,\n"
2495 "#endif\n"
2496 " Five\n"
2497 "#endif\n"
2498 "};",
2499 format("enum F {\n"
2500 "One,\n"
2501 "#if 1\n"
2502 "Two,\n"
2503 "#if 0\n"
2504 "Three,\n"
2505 " Four,\n"
2506 "#endif\n"
2507 "Five\n"
2508 "#endif\n"
2509 "};"));
2510 EXPECT_EQ("enum G {\n"
2511 " One,\n"
2512 "#if 0\n"
2513 "Two,\n"
2514 "#else\n"
2515 " Three,\n"
2516 "#endif\n"
2517 " Four\n"
2518 "};",
2519 format("enum G {\n"
2520 "One,\n"
2521 "#if 0\n"
2522 "Two,\n"
2523 "#else\n"
2524 "Three,\n"
2525 "#endif\n"
2526 "Four\n"
2527 "};"));
2528 EXPECT_EQ("enum H {\n"
2529 " One,\n"
2530 "#if 0\n"
2531 "#ifdef Q\n"
2532 "Two,\n"
2533 "#else\n"
2534 "Three,\n"
2535 "#endif\n"
2536 "#endif\n"
2537 " Four\n"
2538 "};",
2539 format("enum H {\n"
2540 "One,\n"
2541 "#if 0\n"
2542 "#ifdef Q\n"
2543 "Two,\n"
2544 "#else\n"
2545 "Three,\n"
2546 "#endif\n"
2547 "#endif\n"
2548 "Four\n"
2549 "};"));
2550 EXPECT_EQ("enum I {\n"
2551 " One,\n"
2552 "#if /* test */ 0 || 1\n"
2553 "Two,\n"
2554 "Three,\n"
2555 "#endif\n"
2556 " Four\n"
2557 "};",
2558 format("enum I {\n"
2559 "One,\n"
2560 "#if /* test */ 0 || 1\n"
2561 "Two,\n"
2562 "Three,\n"
2563 "#endif\n"
2564 "Four\n"
2565 "};"));
2566 EXPECT_EQ("enum J {\n"
2567 " One,\n"
2568 "#if 0\n"
2569 "#if 0\n"
2570 "Two,\n"
2571 "#else\n"
2572 "Three,\n"
2573 "#endif\n"
2574 "Four,\n"
2575 "#endif\n"
2576 " Five\n"
2577 "};",
2578 format("enum J {\n"
2579 "One,\n"
2580 "#if 0\n"
2581 "#if 0\n"
2582 "Two,\n"
2583 "#else\n"
2584 "Three,\n"
2585 "#endif\n"
2586 "Four,\n"
2587 "#endif\n"
2588 "Five\n"
2589 "};"));
Alexander Kornienkof2e02122013-05-24 18:24:24 +00002590}
2591
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002592//===----------------------------------------------------------------------===//
2593// Tests for classes, namespaces, etc.
2594//===----------------------------------------------------------------------===//
2595
2596TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002597 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002598}
2599
2600TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
2601 verifyFormat("class A {\n"
2602 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00002603 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002604 "protected:\n"
2605 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002606 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002607 "};");
2608 verifyGoogleFormat("class A {\n"
2609 " public:\n"
2610 " protected:\n"
2611 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002612 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002613 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00002614 verifyFormat("class A {\n"
2615 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002616 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00002617 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002618 " void f2() {}\n"
2619 "protected slots:\n"
2620 " void f3() {}\n"
2621 "protected Q_SLOTS:\n"
2622 " void f4() {}\n"
2623 "private slots:\n"
2624 " void f5() {}\n"
2625 "private Q_SLOTS:\n"
2626 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00002627 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002628 " void g1();\n"
2629 "Q_SIGNALS:\n"
2630 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00002631 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00002632
2633 // Don't interpret 'signals' the wrong way.
2634 verifyFormat("signals.set();");
2635 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00002636 verifyFormat("{\n"
2637 " signals.set(); // This needs indentation.\n"
2638 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00002639 verifyFormat("void f() {\n"
2640 "label:\n"
2641 " signals.baz();\n"
2642 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002643}
2644
Alexander Kornienkofd433362013-03-27 17:08:02 +00002645TEST_F(FormatTest, SeparatesLogicalBlocks) {
2646 EXPECT_EQ("class A {\n"
2647 "public:\n"
2648 " void f();\n"
2649 "\n"
2650 "private:\n"
2651 " void g() {}\n"
2652 " // test\n"
2653 "protected:\n"
2654 " int h;\n"
2655 "};",
2656 format("class A {\n"
2657 "public:\n"
2658 "void f();\n"
2659 "private:\n"
2660 "void g() {}\n"
2661 "// test\n"
2662 "protected:\n"
2663 "int h;\n"
2664 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00002665 EXPECT_EQ("class A {\n"
2666 "protected:\n"
2667 "public:\n"
2668 " void f();\n"
2669 "};",
2670 format("class A {\n"
2671 "protected:\n"
2672 "\n"
2673 "public:\n"
2674 "\n"
2675 " void f();\n"
2676 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00002677
2678 // Even ensure proper spacing inside macros.
2679 EXPECT_EQ("#define B \\\n"
2680 " class A { \\\n"
2681 " protected: \\\n"
2682 " public: \\\n"
2683 " void f(); \\\n"
2684 " };",
2685 format("#define B \\\n"
2686 " class A { \\\n"
2687 " protected: \\\n"
2688 " \\\n"
2689 " public: \\\n"
2690 " \\\n"
2691 " void f(); \\\n"
2692 " };",
2693 getGoogleStyle()));
2694 // But don't remove empty lines after macros ending in access specifiers.
2695 EXPECT_EQ("#define A private:\n"
2696 "\n"
2697 "int i;",
2698 format("#define A private:\n"
2699 "\n"
2700 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00002701}
2702
Daniel Jasper83193602013-04-05 17:22:09 +00002703TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002704 verifyFormat("class A : public B {};");
2705 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002706
2707 verifyFormat(
2708 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002709 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00002710 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
2711 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002712 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002713 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002714 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002715 verifyFormat("class AAAAAAAAAAAA : public B,\n"
2716 " public C,\n"
2717 " public D,\n"
2718 " public E,\n"
2719 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002720 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00002721
2722 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002723 " ReallyReallyLongClassName {\n"
2724 " int i;\n"
2725 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00002726 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00002727 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
2728 " aaaaaaaaaaaaaaaa> {};");
2729 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
2730 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
2731 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00002732 verifyFormat("template <class R, class C>\n"
2733 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
2734 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00002735 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00002736}
2737
Manuel Klimek28cacc72013-01-07 18:10:23 +00002738TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002739 verifyFormat("class A {\n} a, b;");
2740 verifyFormat("struct A {\n} a, b;");
2741 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00002742}
2743
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002744TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002745 verifyFormat("enum {\n"
2746 " Zero,\n"
2747 " One = 1,\n"
2748 " Two = One + 1,\n"
2749 " Three = (One + Two),\n"
2750 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2751 " Five = (One, Two, Three, Four, 5)\n"
2752 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002753 verifyGoogleFormat("enum {\n"
2754 " Zero,\n"
2755 " One = 1,\n"
2756 " Two = One + 1,\n"
2757 " Three = (One + Two),\n"
2758 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2759 " Five = (One, Two, Three, Four, 5)\n"
2760 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002761 verifyFormat("enum Enum {};");
2762 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002763 verifyFormat("enum X E {} d;");
2764 verifyFormat("enum __attribute__((...)) E {} d;");
2765 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00002766 verifyFormat("enum {\n"
2767 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002768 "};",
2769 getLLVMStyleWithColumns(30));
2770
2771 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00002772 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002773
2774 EXPECT_EQ("enum KeepEmptyLines {\n"
2775 " ONE,\n"
2776 "\n"
2777 " TWO,\n"
2778 "\n"
2779 " THREE\n"
2780 "}",
2781 format("enum KeepEmptyLines {\n"
2782 " ONE,\n"
2783 "\n"
2784 " TWO,\n"
2785 "\n"
2786 "\n"
2787 " THREE\n"
2788 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00002789 verifyFormat("enum E { // comment\n"
2790 " ONE,\n"
2791 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00002792 "};\n"
2793 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002794 // Not enums.
2795 verifyFormat("enum X f() {\n"
2796 " a();\n"
2797 " return 42;\n"
2798 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00002799 verifyFormat("enum X Type::f() {\n"
2800 " a();\n"
2801 " return 42;\n"
2802 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002803 verifyFormat("enum ::X f() {\n"
2804 " a();\n"
2805 " return 42;\n"
2806 "}");
2807 verifyFormat("enum ns::X f() {\n"
2808 " a();\n"
2809 " return 42;\n"
2810 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002811}
2812
Daniel Jasperb7150872013-08-30 10:10:19 +00002813TEST_F(FormatTest, FormatsEnumsWithErrors) {
2814 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002815 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002816 " Two = 1;\n"
2817 "};");
2818 verifyFormat("namespace n {\n"
2819 "enum Type {\n"
2820 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002821 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002822 " int i;\n"
2823 "}\n"
2824 "void g() {}");
2825}
2826
Daniel Jasper2b41a822013-08-20 12:42:50 +00002827TEST_F(FormatTest, FormatsEnumStruct) {
2828 verifyFormat("enum struct {\n"
2829 " Zero,\n"
2830 " One = 1,\n"
2831 " Two = One + 1,\n"
2832 " Three = (One + Two),\n"
2833 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2834 " Five = (One, Two, Three, Four, 5)\n"
2835 "};");
2836 verifyFormat("enum struct Enum {};");
2837 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002838 verifyFormat("enum struct X E {} d;");
2839 verifyFormat("enum struct __attribute__((...)) E {} d;");
2840 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002841 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
2842}
2843
2844TEST_F(FormatTest, FormatsEnumClass) {
2845 verifyFormat("enum class {\n"
2846 " Zero,\n"
2847 " One = 1,\n"
2848 " Two = One + 1,\n"
2849 " Three = (One + Two),\n"
2850 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2851 " Five = (One, Two, Three, Four, 5)\n"
2852 "};");
2853 verifyFormat("enum class Enum {};");
2854 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002855 verifyFormat("enum class X E {} d;");
2856 verifyFormat("enum class __attribute__((...)) E {} d;");
2857 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002858 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
2859}
2860
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002861TEST_F(FormatTest, FormatsEnumTypes) {
2862 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002863 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002864 " B\n"
2865 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00002866 verifyFormat("enum X : int { A, B };");
2867 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002868}
2869
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002870TEST_F(FormatTest, FormatsNSEnums) {
2871 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
2872 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
2873 " // Information about someDecentlyLongValue.\n"
2874 " someDecentlyLongValue,\n"
2875 " // Information about anotherDecentlyLongValue.\n"
2876 " anotherDecentlyLongValue,\n"
2877 " // Information about aThirdDecentlyLongValue.\n"
2878 " aThirdDecentlyLongValue\n"
2879 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00002880 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
2881 " a = 1,\n"
2882 " b = 2,\n"
2883 " c = 3,\n"
2884 "};");
2885 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
2886 " a = 1,\n"
2887 " b = 2,\n"
2888 " c = 3,\n"
2889 "};");
2890 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
2891 " a = 1,\n"
2892 " b = 2,\n"
2893 " c = 3,\n"
2894 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002895}
2896
Nico Weber7769a902013-01-14 05:49:49 +00002897TEST_F(FormatTest, FormatsBitfields) {
2898 verifyFormat("struct Bitfields {\n"
2899 " unsigned sClass : 8;\n"
2900 " unsigned ValueKind : 2;\n"
2901 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00002902 verifyFormat("struct A {\n"
2903 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
2904 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
2905 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00002906 verifyFormat("struct MyStruct {\n"
2907 " uchar data;\n"
2908 " uchar : 8;\n"
2909 " uchar : 8;\n"
2910 " uchar other;\n"
2911 "};");
Nico Weber7769a902013-01-14 05:49:49 +00002912}
2913
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002914TEST_F(FormatTest, FormatsNamespaces) {
2915 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002916 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002917 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002918 "}");
2919 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002920 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002921 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002922 "}");
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002923 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002924 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002925 "void f() { f(); }\n"
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002926 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002927 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002928 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002929 "void f() { f(); }");
Manuel Klimek046b9302013-02-06 16:08:09 +00002930
2931 // This code is more common than we thought; if we
2932 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002933 // its own line, which is undesirable.
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002934 verifyFormat("namespace {};");
Manuel Klimek046b9302013-02-06 16:08:09 +00002935 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002936 "class A {};\n"
Manuel Klimek046b9302013-02-06 16:08:09 +00002937 "};");
Daniel Jasper251b3c92013-07-01 11:22:57 +00002938
2939 verifyFormat("namespace {\n"
2940 "int SomeVariable = 0; // comment\n"
2941 "} // namespace");
2942 EXPECT_EQ("#ifndef HEADER_GUARD\n"
2943 "#define HEADER_GUARD\n"
2944 "namespace my_namespace {\n"
2945 "int i;\n"
2946 "} // my_namespace\n"
2947 "#endif // HEADER_GUARD",
2948 format("#ifndef HEADER_GUARD\n"
2949 " #define HEADER_GUARD\n"
2950 " namespace my_namespace {\n"
2951 "int i;\n"
2952 "} // my_namespace\n"
2953 "#endif // HEADER_GUARD"));
Daniel Jasper65ee3472013-07-31 23:16:02 +00002954
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00002955 EXPECT_EQ("namespace A::B {\n"
2956 "class C {};\n"
2957 "}",
2958 format("namespace A::B {\n"
2959 "class C {};\n"
2960 "}"));
2961
Daniel Jasper65ee3472013-07-31 23:16:02 +00002962 FormatStyle Style = getLLVMStyle();
2963 Style.NamespaceIndentation = FormatStyle::NI_All;
2964 EXPECT_EQ("namespace out {\n"
2965 " int i;\n"
2966 " namespace in {\n"
2967 " int i;\n"
2968 " } // namespace\n"
2969 "} // namespace",
2970 format("namespace out {\n"
2971 "int i;\n"
2972 "namespace in {\n"
2973 "int i;\n"
2974 "} // namespace\n"
2975 "} // namespace",
2976 Style));
2977
2978 Style.NamespaceIndentation = FormatStyle::NI_Inner;
2979 EXPECT_EQ("namespace out {\n"
2980 "int i;\n"
2981 "namespace in {\n"
2982 " int i;\n"
2983 "} // namespace\n"
2984 "} // namespace",
2985 format("namespace out {\n"
2986 "int i;\n"
2987 "namespace in {\n"
2988 "int i;\n"
2989 "} // namespace\n"
2990 "} // namespace",
2991 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002992}
2993
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002994TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00002995
Daniel Jasper40aacf42013-03-14 13:45:21 +00002996TEST_F(FormatTest, FormatsInlineASM) {
2997 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00002998 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00002999 verifyFormat(
3000 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
3001 " \"cpuid\\n\\t\"\n"
3002 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00003003 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00003004 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00003005 EXPECT_EQ(
3006 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00003007 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00003008 " mov edx,[that] // vtable in edx\n"
3009 " mov eax,methodIndex\n"
3010 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00003011 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00003012 "}",
3013 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
3014 " __asm {\n"
3015 " mov edx,[that] // vtable in edx\n"
3016 " mov eax,methodIndex\n"
3017 " call [edx][eax*4] // stdcall\n"
3018 " }\n"
3019 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00003020 EXPECT_EQ("_asm {\n"
3021 " xor eax, eax;\n"
3022 " cpuid;\n"
3023 "}",
3024 format("_asm {\n"
3025 " xor eax, eax;\n"
3026 " cpuid;\n"
3027 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00003028 verifyFormat("void function() {\n"
3029 " // comment\n"
3030 " asm(\"\");\n"
3031 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00003032 EXPECT_EQ("__asm {\n"
3033 "}\n"
3034 "int i;",
3035 format("__asm {\n"
3036 "}\n"
3037 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00003038}
3039
Nico Weberd5650bd2013-01-07 16:36:17 +00003040TEST_F(FormatTest, FormatTryCatch) {
3041 verifyFormat("try {\n"
3042 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003043 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00003044 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003045 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00003046 " exit(42);\n"
3047 "}");
3048
3049 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00003050 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00003051 " return 5;\n"
3052 "}");
3053 verifyFormat("class A {\n"
3054 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003055 " A() try : a(0) {\n"
3056 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00003057 " throw;\n"
3058 " }\n"
3059 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00003060
3061 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003062 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00003063}
3064
Nico Weberfac23712015-02-04 15:26:27 +00003065TEST_F(FormatTest, FormatSEHTryCatch) {
3066 verifyFormat("__try {\n"
3067 " int a = b * c;\n"
3068 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
3069 " // Do nothing.\n"
3070 "}");
3071
3072 verifyFormat("__try {\n"
3073 " int a = b * c;\n"
3074 "} __finally {\n"
3075 " // Do nothing.\n"
3076 "}");
3077
3078 verifyFormat("DEBUG({\n"
3079 " __try {\n"
3080 " } __finally {\n"
3081 " }\n"
3082 "});\n");
3083}
3084
Daniel Jasper04a71a42014-05-08 11:58:24 +00003085TEST_F(FormatTest, IncompleteTryCatchBlocks) {
3086 verifyFormat("try {\n"
3087 " f();\n"
3088 "} catch {\n"
3089 " g();\n"
3090 "}");
3091 verifyFormat("try {\n"
3092 " f();\n"
3093 "} catch (A a) MACRO(x) {\n"
3094 " g();\n"
3095 "} catch (B b) MACRO(x) {\n"
3096 " g();\n"
3097 "}");
3098}
3099
3100TEST_F(FormatTest, FormatTryCatchBraceStyles) {
3101 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00003102 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
3103 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00003104 Style.BreakBeforeBraces = BraceStyle;
3105 verifyFormat("try {\n"
3106 " // something\n"
3107 "} catch (...) {\n"
3108 " // something\n"
3109 "}",
3110 Style);
3111 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00003112 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
3113 verifyFormat("try {\n"
3114 " // something\n"
3115 "}\n"
3116 "catch (...) {\n"
3117 " // something\n"
3118 "}",
3119 Style);
Nico Weberfac23712015-02-04 15:26:27 +00003120 verifyFormat("__try {\n"
3121 " // something\n"
3122 "}\n"
3123 "__finally {\n"
3124 " // something\n"
3125 "}",
3126 Style);
Nico Weber33381f52015-02-07 01:57:32 +00003127 verifyFormat("@try {\n"
3128 " // something\n"
3129 "}\n"
3130 "@finally {\n"
3131 " // something\n"
3132 "}",
3133 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00003134 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3135 verifyFormat("try\n"
3136 "{\n"
3137 " // something\n"
3138 "}\n"
3139 "catch (...)\n"
3140 "{\n"
3141 " // something\n"
3142 "}",
3143 Style);
3144 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
3145 verifyFormat("try\n"
3146 " {\n"
3147 " // something\n"
3148 " }\n"
3149 "catch (...)\n"
3150 " {\n"
3151 " // something\n"
3152 " }",
3153 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00003154 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
3155 Style.BraceWrapping.BeforeCatch = true;
3156 verifyFormat("try {\n"
3157 " // something\n"
3158 "}\n"
3159 "catch (...) {\n"
3160 " // something\n"
3161 "}",
3162 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00003163}
3164
Daniel Jaspere25509f2012-12-17 11:29:41 +00003165TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003166 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00003167
Daniel Jaspera44991332015-04-29 13:06:49 +00003168 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
3169 " 100000000, "
3170 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00003171
Daniel Jasper473c62c2013-05-17 09:35:01 +00003172 // Here, everything other than the "}" would fit on a line.
3173 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003174 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00003175 EXPECT_EQ("S s = {a,\n"
3176 "\n"
3177 " b};",
3178 format("S s = {\n"
3179 " a,\n"
3180 "\n"
3181 " b\n"
3182 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00003183
3184 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
3185 // line. However, the formatting looks a bit off and this probably doesn't
3186 // happen often in practice.
3187 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003188 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00003189 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00003190}
3191
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003192TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003193 verifyFormat("const struct A a = {.a = 1, .b = 2};");
3194 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
3195 " .bbbbbbbbbb = 2,\n"
3196 " .cccccccccc = 3,\n"
3197 " .dddddddddd = 4,\n"
3198 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003199 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003200 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
3201 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
3202 " .ccccccccccccccccccccccccccc = 3,\n"
3203 " .ddddddddddddddddddddddddddd = 4,\n"
3204 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003205
3206 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
3207}
3208
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003209TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003210 verifyFormat("static A x = {{{}}};\n");
3211 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
3212 " {init1, init2, init3, init4}}};",
3213 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00003214
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003215 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003216 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
3217 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
3218 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
3219 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00003220 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00003221 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
3222 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
3223 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00003224 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
3225 " {rect.fRight - rect.fLeft, rect.fBottom - "
3226 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003227
Daniel Jasper8a8ce242013-01-31 14:59:26 +00003228 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00003229 "SomeArrayOfSomeType a = {\n"
3230 " {{1, 2, 3},\n"
3231 " {1, 2, 3},\n"
3232 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
3233 " 333333333333333333333333333333},\n"
3234 " {1, 2, 3},\n"
3235 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00003236 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00003237 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00003238 " {{1, 2, 3}},\n"
3239 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00003240 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
3241 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00003242 " {{1, 2, 3}},\n"
3243 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00003244
Daniel Jaspera44991332015-04-29 13:06:49 +00003245 verifyFormat("struct {\n"
3246 " unsigned bit;\n"
3247 " const char *const name;\n"
3248 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
3249 " {kOsWin, \"Windows\"},\n"
3250 " {kOsLinux, \"Linux\"},\n"
3251 " {kOsCrOS, \"Chrome OS\"}};");
3252 verifyFormat("struct {\n"
3253 " unsigned bit;\n"
3254 " const char *const name;\n"
3255 "} kBitsToOs[] = {\n"
3256 " {kOsMac, \"Mac\"},\n"
3257 " {kOsWin, \"Windows\"},\n"
3258 " {kOsLinux, \"Linux\"},\n"
3259 " {kOsCrOS, \"Chrome OS\"},\n"
3260 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003261}
3262
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003263TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
3264 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3265 " \\\n"
3266 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
3267}
3268
Daniel Jasperda16db32013-01-07 10:48:50 +00003269TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00003270 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
3271 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00003272
3273 // Do break defaulted and deleted functions.
3274 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
3275 " default;",
3276 getLLVMStyleWithColumns(40));
3277 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
3278 " delete;",
3279 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00003280}
3281
3282TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
3283 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
3284 getLLVMStyleWithColumns(40));
3285 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
3286 getLLVMStyleWithColumns(40));
3287 EXPECT_EQ("#define Q \\\n"
3288 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
3289 " \"aaaaaaaa.cpp\"",
3290 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
3291 getLLVMStyleWithColumns(40)));
3292}
3293
3294TEST_F(FormatTest, UnderstandsLinePPDirective) {
3295 EXPECT_EQ("# 123 \"A string literal\"",
3296 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00003297}
3298
Manuel Klimek591b5802013-01-31 15:58:48 +00003299TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00003300 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00003301 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003302}
3303
3304TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
3305 EXPECT_EQ("#line 42 \"test\"\n",
3306 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003307 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
3308 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003309}
3310
3311TEST_F(FormatTest, EndOfFileEndsPPDirective) {
3312 EXPECT_EQ("#line 42 \"test\"",
3313 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003314 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003315}
3316
Daniel Jasper877615c2013-10-11 19:45:02 +00003317TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
3318 verifyFormat("#define A \\x20");
3319 verifyFormat("#define A \\ x20");
3320 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
3321 verifyFormat("#define A ''");
3322 verifyFormat("#define A ''qqq");
3323 verifyFormat("#define A `qqq");
3324 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00003325 EXPECT_EQ("const char *c = STRINGIFY(\n"
3326 "\\na : b);",
3327 format("const char * c = STRINGIFY(\n"
3328 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00003329
3330 verifyFormat("a\r\\");
3331 verifyFormat("a\v\\");
3332 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00003333}
3334
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003335TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003336 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
3337 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003338 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003339 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00003340 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00003341
3342 verifyFormat("#define A A\n#define A A");
3343 verifyFormat("#define A(X) A\n#define A A");
3344
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003345 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
3346 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003347}
3348
3349TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00003350 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003351 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003352 "#define A( \\\n"
3353 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003354 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00003355 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00003356 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003357 " #include \"a.h\"\n"
3358 "#define A(A,\\\n"
3359 " B)\n"
3360 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00003361 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003362 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003363}
3364
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003365TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00003366
3367TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
3368 EXPECT_EQ("#define A \\\n"
3369 " c; \\\n"
3370 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003371 "f;",
3372 format("#define A c; e;\n"
3373 "f;",
3374 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00003375}
3376
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003377TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00003378
Manuel Klimek1abf7892013-01-04 23:34:14 +00003379TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00003380 EXPECT_EQ("int x,\n"
3381 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003382 " y;",
3383 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00003384}
3385
Manuel Klimek09e07972013-01-05 21:34:55 +00003386TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00003387 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00003388 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00003389 verifyFormat("#define A \\\n"
3390 " { \\\n"
3391 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003392 " }",
3393 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00003394
3395 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003396 " void function##X()",
3397 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00003398
3399 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003400 " void a##b##c()",
3401 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00003402
Daniel Jasper39825ea2013-01-14 15:40:57 +00003403 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00003404}
3405
Manuel Klimekd053c5b2013-01-23 14:37:36 +00003406TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00003407 EXPECT_EQ("#define A (x)", format("#define A (x)"));
3408 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00003409}
3410
Manuel Klimek0c137952013-02-11 12:33:24 +00003411TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
3412 EXPECT_EQ("#define A b;", format("#define A \\\n"
3413 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003414 " b;",
3415 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003416 EXPECT_EQ("#define A \\\n"
3417 " \\\n"
3418 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003419 " b;",
3420 format("#define A \\\n"
3421 " \\\n"
3422 " a; \\\n"
3423 " b;",
3424 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003425 EXPECT_EQ("#define A \\\n"
3426 " a; \\\n"
3427 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003428 " b;",
3429 format("#define A \\\n"
3430 " a; \\\n"
3431 " \\\n"
3432 " b;",
3433 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003434}
3435
Daniel Jasper00475962013-02-19 17:14:38 +00003436TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003437 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00003438 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00003439 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00003440 " case 2\n",
3441 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00003442 verifyFormat("#define MACRO(a) \\\n"
3443 " if (a) \\\n"
3444 " f(); \\\n"
3445 " else \\\n"
3446 " g()",
3447 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00003448 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003449 verifyIncompleteFormat("#define STR(x) #x\n"
3450 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00003451 verifyFormat("#pragma omp threadprivate( \\\n"
3452 " y)), // expected-warning",
3453 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00003454 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00003455 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003456 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00003457 "#define b \\\n"
3458 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003459 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003460 "a",
3461 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00003462 verifyFormat("#define A \\\n"
3463 " { \\\n"
3464 " {\n"
3465 "#define B \\\n"
3466 " } \\\n"
3467 " }",
3468 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00003469 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00003470 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00003471 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00003472 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00003473}
3474
Daniel Jasper40e19212013-05-29 13:16:10 +00003475TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
3476 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
3477 EXPECT_EQ("class A : public QObject {\n"
3478 " Q_OBJECT\n"
3479 "\n"
3480 " A() {}\n"
3481 "};",
3482 format("class A : public QObject {\n"
3483 " Q_OBJECT\n"
3484 "\n"
3485 " A() {\n}\n"
3486 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00003487 EXPECT_EQ("MACRO\n"
3488 "/*static*/ int i;",
3489 format("MACRO\n"
3490 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00003491 EXPECT_EQ("SOME_MACRO\n"
3492 "namespace {\n"
3493 "void f();\n"
3494 "}",
3495 format("SOME_MACRO\n"
3496 " namespace {\n"
3497 "void f( );\n"
3498 "}"));
Daniel Jasper40e19212013-05-29 13:16:10 +00003499 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00003500 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
3501 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00003502 // Only if everything is upper case.
3503 EXPECT_EQ("class A : public QObject {\n"
3504 " Q_Object A() {}\n"
3505 "};",
3506 format("class A : public QObject {\n"
3507 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00003508 " A() {\n}\n"
3509 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00003510
3511 // Only if the next line can actually start an unwrapped line.
3512 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
3513 format("SOME_WEIRD_LOG_MACRO\n"
3514 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00003515
3516 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00003517 "(n, buffers))\n",
3518 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00003519}
3520
Alexander Kornienkode644272013-04-08 22:16:06 +00003521TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
3522 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3523 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3524 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003525 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00003526 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3527 "int *createScopDetectionPass() { return 0; }",
3528 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3529 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3530 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
3531 " class X {};\n"
3532 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3533 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003534 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
3535 // braces, so that inner block is indented one level more.
3536 EXPECT_EQ("int q() {\n"
3537 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3538 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3539 " IPC_END_MESSAGE_MAP()\n"
3540 "}",
3541 format("int q() {\n"
3542 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3543 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3544 " IPC_END_MESSAGE_MAP()\n"
3545 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00003546
Daniel Jasper352dae12014-01-03 11:50:46 +00003547 // Same inside macros.
3548 EXPECT_EQ("#define LIST(L) \\\n"
3549 " L(A) \\\n"
3550 " L(B) \\\n"
3551 " L(C)",
3552 format("#define LIST(L) \\\n"
3553 " L(A) \\\n"
3554 " L(B) \\\n"
3555 " L(C)",
3556 getGoogleStyle()));
3557
Daniel Jasper545c6522013-09-17 09:26:07 +00003558 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003559 EXPECT_EQ("int q() {\n"
3560 " f(x);\n"
3561 " f(x) {}\n"
3562 " f(x)->g();\n"
3563 " f(x)->*g();\n"
3564 " f(x).g();\n"
3565 " f(x) = x;\n"
3566 " f(x) += x;\n"
3567 " f(x) -= x;\n"
3568 " f(x) *= x;\n"
3569 " f(x) /= x;\n"
3570 " f(x) %= x;\n"
3571 " f(x) &= x;\n"
3572 " f(x) |= x;\n"
3573 " f(x) ^= x;\n"
3574 " f(x) >>= x;\n"
3575 " f(x) <<= x;\n"
3576 " f(x)[y].z();\n"
3577 " LOG(INFO) << x;\n"
3578 " ifstream(x) >> x;\n"
3579 "}\n",
3580 format("int q() {\n"
3581 " f(x)\n;\n"
3582 " f(x)\n {}\n"
3583 " f(x)\n->g();\n"
3584 " f(x)\n->*g();\n"
3585 " f(x)\n.g();\n"
3586 " f(x)\n = x;\n"
3587 " f(x)\n += x;\n"
3588 " f(x)\n -= x;\n"
3589 " f(x)\n *= x;\n"
3590 " f(x)\n /= x;\n"
3591 " f(x)\n %= x;\n"
3592 " f(x)\n &= x;\n"
3593 " f(x)\n |= x;\n"
3594 " f(x)\n ^= x;\n"
3595 " f(x)\n >>= x;\n"
3596 " f(x)\n <<= x;\n"
3597 " f(x)\n[y].z();\n"
3598 " LOG(INFO)\n << x;\n"
3599 " ifstream(x)\n >> x;\n"
3600 "}\n"));
3601 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003602 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003603 " if (1) {\n"
3604 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003605 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003606 " while (1) {\n"
3607 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003608 " F(x)\n"
3609 " G(x);\n"
3610 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003611 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003612 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003613 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003614 " }\n"
3615 "}\n",
3616 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003617 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003618 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003619 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003620 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003621 "F(x)\n"
3622 "G(x);\n"
3623 "F(x)\n"
3624 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003625 "}\n"));
3626 EXPECT_EQ("class A {\n"
3627 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00003628 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003629 " A(X x)\n" // FIXME: function-level try blocks are broken.
3630 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003631 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003632 " }\n"
3633 "};",
3634 format("class A {\n"
3635 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00003636 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003637 " A(X x)\n"
3638 " try : t(0) {} catch (...) {}\n"
3639 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00003640 EXPECT_EQ("class SomeClass {\n"
3641 "public:\n"
3642 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3643 "};",
3644 format("class SomeClass {\n"
3645 "public:\n"
3646 " SomeClass()\n"
3647 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3648 "};"));
3649 EXPECT_EQ("class SomeClass {\n"
3650 "public:\n"
3651 " SomeClass()\n"
3652 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3653 "};",
3654 format("class SomeClass {\n"
3655 "public:\n"
3656 " SomeClass()\n"
3657 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3658 "};",
3659 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00003660
3661 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00003662}
3663
Manuel Klimek4fe43002013-05-22 12:51:29 +00003664TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
3665 verifyFormat("#define A \\\n"
3666 " f({ \\\n"
3667 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003668 " });",
3669 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00003670}
3671
Manuel Klimekef2cfb12013-01-05 22:14:16 +00003672TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
3673 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
3674}
3675
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003676TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003677 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003678}
3679
Manuel Klimek1058d982013-01-06 20:07:31 +00003680TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3681 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
3682 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3683 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
3684 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3685}
Manuel Klimek1abf7892013-01-04 23:34:14 +00003686
Daniel Jaspere2408e32015-05-06 11:16:43 +00003687TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003688 EXPECT_EQ(
3689 "#define A \\\n int i; \\\n int j;",
3690 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003691 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00003692 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003693 EXPECT_EQ("/* \\ \\ \\\n*/", format("\\\n/* \\ \\ \\\n*/"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00003694 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003695}
3696
Alexander Kornienko00691cf2015-01-12 13:11:12 +00003697TEST_F(FormatTest, DontCrashOnBlockComments) {
3698 EXPECT_EQ(
3699 "int xxxxxxxxx; /* "
3700 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\n"
3701 "zzzzzz\n"
3702 "0*/",
3703 format("int xxxxxxxxx; /* "
3704 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzz\n"
3705 "0*/"));
3706}
3707
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003708TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3709 verifyFormat("#define A \\\n"
3710 " int v( \\\n"
3711 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003712 " int i;",
3713 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003714}
3715
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003716TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00003717 EXPECT_EQ(
3718 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3719 " \\\n"
3720 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3721 "\n"
3722 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3723 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3724 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
3725 "\\\n"
3726 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3727 " \n"
3728 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3729 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003730}
3731
Manuel Klimek52b15152013-01-09 15:25:02 +00003732TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3733 EXPECT_EQ("int\n"
3734 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003735 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003736 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003737 verifyFormat("functionCallTo(\n"
3738 " someOtherFunction(\n"
3739 " withSomeParameters, whichInSequence,\n"
3740 " areLongerThanALine(andAnotherCall,\n"
3741 "#define A B\n"
3742 " withMoreParamters,\n"
3743 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003744 " andMoreParameters),\n"
3745 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003746 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00003747 verifyFormat("Foo::Foo()\n"
3748 "#ifdef BAR\n"
3749 " : baz(0)\n"
3750 "#endif\n"
3751 "{\n"
3752 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00003753 verifyFormat("void f() {\n"
3754 " if (true)\n"
3755 "#ifdef A\n"
3756 " f(42);\n"
3757 " x();\n"
3758 "#else\n"
3759 " g();\n"
3760 " x();\n"
3761 "#endif\n"
3762 "}");
3763 verifyFormat("void f(param1, param2,\n"
3764 " param3,\n"
3765 "#ifdef A\n"
3766 " param4(param5,\n"
3767 "#ifdef A1\n"
3768 " param6,\n"
3769 "#ifdef A2\n"
3770 " param7),\n"
3771 "#else\n"
3772 " param8),\n"
3773 " param9,\n"
3774 "#endif\n"
3775 " param10,\n"
3776 "#endif\n"
3777 " param11)\n"
3778 "#else\n"
3779 " param12)\n"
3780 "#endif\n"
3781 "{\n"
3782 " x();\n"
3783 "}",
3784 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00003785 verifyFormat("#if 1\n"
3786 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003787 verifyFormat("#if 1\n"
3788 "#endif\n"
3789 "#if 1\n"
3790 "#else\n"
3791 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00003792 verifyFormat("DEBUG({\n"
3793 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3794 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3795 "});\n"
3796 "#if a\n"
3797 "#else\n"
3798 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00003799
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003800 verifyIncompleteFormat("void f(\n"
3801 "#if A\n"
3802 " );\n"
3803 "#else\n"
3804 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00003805}
3806
Manuel Klimek14bd9172014-01-29 08:49:02 +00003807TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3808 verifyFormat("#endif\n"
3809 "#if B");
3810}
3811
Manuel Klimek88033d72013-10-21 08:11:15 +00003812TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3813 FormatStyle SingleLine = getLLVMStyle();
3814 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00003815 verifyFormat("#if 0\n"
3816 "#elif 1\n"
3817 "#endif\n"
3818 "void foo() {\n"
3819 " if (test) foo2();\n"
3820 "}",
3821 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00003822}
3823
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003824TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00003825 verifyFormat("functionCall({ int i; });");
3826 verifyFormat("functionCall({\n"
3827 " int i;\n"
3828 " int j;\n"
3829 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00003830 verifyFormat("functionCall(\n"
3831 " {\n"
3832 " int i;\n"
3833 " int j;\n"
3834 " },\n"
3835 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00003836 verifyFormat("functionA(functionB({\n"
3837 " int i;\n"
3838 " int j;\n"
3839 " }),\n"
3840 " aaaa, bbbb, cccc);");
3841 verifyFormat("functionCall(\n"
3842 " {\n"
3843 " int i;\n"
3844 " int j;\n"
3845 " },\n"
3846 " aaaa, bbbb, // comment\n"
3847 " cccc);");
3848 verifyFormat("functionA(functionB({\n"
3849 " int i;\n"
3850 " int j;\n"
3851 " }),\n"
3852 " aaaa, bbbb, // comment\n"
3853 " cccc);");
3854 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3855 verifyFormat("functionCall(aaaa, bbbb, {\n"
3856 " int i;\n"
3857 " int j;\n"
3858 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00003859 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00003860 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00003861 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003862 " int i; // break\n"
3863 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00003864 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3865 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003866 verifyFormat("DEBUG({\n"
3867 " if (a)\n"
3868 " f();\n"
3869 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003870}
3871
3872TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003873 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003874 "int i;",
3875 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003876}
3877
3878TEST_F(FormatTest, LayoutNestedBlocks) {
3879 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3880 " struct s {\n"
3881 " int i;\n"
3882 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003883 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003884 " for (int i = 0; i < 10; ++i)\n"
3885 " return;\n"
3886 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003887 verifyFormat("call(parameter, {\n"
3888 " something();\n"
3889 " // Comment using all columns.\n"
3890 " somethingelse();\n"
3891 "});",
3892 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00003893 verifyFormat("DEBUG( //\n"
3894 " { f(); }, a);");
3895 verifyFormat("DEBUG( //\n"
3896 " {\n"
3897 " f(); //\n"
3898 " },\n"
3899 " a);");
3900
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003901 EXPECT_EQ("call(parameter, {\n"
3902 " something();\n"
3903 " // Comment too\n"
3904 " // looooooooooong.\n"
3905 " somethingElse();\n"
3906 "});",
3907 format("call(parameter, {\n"
3908 " something();\n"
3909 " // Comment too looooooooooong.\n"
3910 " somethingElse();\n"
3911 "});",
3912 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003913 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003914 EXPECT_EQ("DEBUG({ // comment\n"
3915 " int i;\n"
3916 "});",
3917 format("DEBUG({ // comment\n"
3918 "int i;\n"
3919 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003920 EXPECT_EQ("DEBUG({\n"
3921 " int i;\n"
3922 "\n"
3923 " // comment\n"
3924 " int j;\n"
3925 "});",
3926 format("DEBUG({\n"
3927 " int i;\n"
3928 "\n"
3929 " // comment\n"
3930 " int j;\n"
3931 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003932
3933 verifyFormat("DEBUG({\n"
3934 " if (a)\n"
3935 " return;\n"
3936 "});");
3937 verifyGoogleFormat("DEBUG({\n"
3938 " if (a) return;\n"
3939 "});");
3940 FormatStyle Style = getGoogleStyle();
3941 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003942 verifyFormat("Debug(aaaaa,\n"
3943 " {\n"
3944 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3945 " },\n"
3946 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003947 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003948
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003949 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3950
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003951 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003952}
3953
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003954TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3955 EXPECT_EQ("#define MACRO() \\\n"
3956 " Debug(aaa, /* force line break */ \\\n"
3957 " { \\\n"
3958 " int i; \\\n"
3959 " int j; \\\n"
3960 " })",
3961 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3962 " { int i; int j; })",
3963 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003964
3965 EXPECT_EQ("#define A \\\n"
3966 " [] { \\\n"
3967 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3968 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3969 " }",
3970 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3971 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3972 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003973}
3974
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003975TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3976 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003977 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003978 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003979}
3980
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003981TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3982 FormatStyle Style = getLLVMStyle();
3983 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3984 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3985 verifyFormat("FOO_BEGIN\n"
3986 " FOO_ENTRY\n"
3987 "FOO_END", Style);
3988 verifyFormat("FOO_BEGIN\n"
3989 " NESTED_FOO_BEGIN\n"
3990 " NESTED_FOO_ENTRY\n"
3991 " NESTED_FOO_END\n"
3992 "FOO_END", Style);
3993 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3994 " int x;\n"
3995 " x = 1;\n"
3996 "FOO_END(Baz)", Style);
3997}
3998
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003999//===----------------------------------------------------------------------===//
4000// Line break tests.
4001//===----------------------------------------------------------------------===//
4002
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004003TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004004 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004005 "void f() {\n"
4006 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
4007 " parameter, parameter, parameter)),\n"
4008 " SecondLongCall(parameter));\n"
4009 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00004010 verifyFormat(
4011 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4012 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4013 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4014 " aaaaaaaaaaaaaaaaaaaaaaaa);");
4015 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00004016 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4017 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
4018 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
4019 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00004020 verifyFormat(
4021 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
4022 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
4023 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
4024 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00004025 verifyFormat("int a = bbbb && ccc &&\n"
4026 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00004027 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00004028 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00004029}
4030
Daniel Jasperd69fc772013-05-08 14:12:04 +00004031TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
4032 verifyFormat(
4033 "bool aaaaaaa =\n"
4034 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
4035 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004036 verifyFormat(
4037 "bool aaaaaaa =\n"
4038 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
4039 " bbbbbbbb();");
4040
Daniel Jasperd69fc772013-05-08 14:12:04 +00004041 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
4042 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
4043 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004044 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
4045 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
4046 " ccccccccc == ddddddddddd;");
4047 verifyFormat(
4048 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
4049 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
4050 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00004051
4052 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
4053 " aaaaaa) &&\n"
4054 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00004055 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
4056 " aaaaaa) >>\n"
4057 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00004058 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00004059 " SourceMgr.getSpellingColumnNumber(\n"
4060 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
4061 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00004062
Daniel Jasper68d888c2013-06-03 08:42:05 +00004063 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4064 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
4065 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00004066 verifyFormat("b = a &&\n"
4067 " // Comment\n"
4068 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00004069
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00004070 // If the LHS of a comparison is not a binary expression itself, the
4071 // additional linebreak confuses many people.
4072 verifyFormat(
4073 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4074 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
4075 "}");
4076 verifyFormat(
4077 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4078 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4079 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00004080 verifyFormat(
4081 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
4082 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4083 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00004084 // Even explicit parentheses stress the precedence enough to make the
4085 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00004086 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4087 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4088 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00004089 // This cases is borderline, but with the indentation it is still readable.
4090 verifyFormat(
4091 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4092 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4093 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
4094 "}",
4095 getLLVMStyleWithColumns(75));
4096
4097 // If the LHS is a binary expression, we should still use the additional break
4098 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00004099 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4100 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4101 " 5) {\n"
4102 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00004103
Daniel Jasper571f1af2013-05-14 20:39:56 +00004104 FormatStyle OnePerLine = getLLVMStyle();
4105 OnePerLine.BinPackParameters = false;
4106 verifyFormat(
4107 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4108 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4109 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
4110 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00004111
4112 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
4113 " .aaa(aaaaaaaaaaaaa) *\n"
4114 " aaaaaaa +\n"
4115 " aaaaaaa;",
4116 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00004117}
4118
Daniel Jasper6bee6822013-04-08 20:33:42 +00004119TEST_F(FormatTest, ExpressionIndentation) {
4120 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4121 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4122 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4123 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4124 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4125 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
4126 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4127 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
4128 " ccccccccccccccccccccccccccccccccccccccccc;");
4129 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4130 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4131 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4132 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4133 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4134 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4135 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4136 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4137 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4138 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4139 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4140 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00004141 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004142 "} else if (aaaaa && bbbbb > // break\n"
4143 " ccccc) {\n"
4144 "}");
4145 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00004146 "} else if (aaaaa &&\n"
4147 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004148 " ccccc &&\n"
4149 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00004150 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00004151
4152 // Presence of a trailing comment used to change indentation of b.
4153 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
4154 " b;\n"
4155 "return aaaaaaaaaaaaaaaaaaa +\n"
4156 " b; //",
4157 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00004158}
4159
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004160TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
4161 // Not sure what the best system is here. Like this, the LHS can be found
4162 // immediately above an operator (everything with the same or a higher
4163 // indent). The RHS is aligned right of the operator and so compasses
4164 // everything until something with the same indent as the operator is found.
4165 // FIXME: Is this a good system?
4166 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00004167 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004168 verifyFormat(
4169 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004170 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4171 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4172 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4173 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4174 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004175 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004176 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4177 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004178 Style);
4179 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004180 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4181 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004182 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4183 Style);
4184 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004185 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4186 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004187 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4188 Style);
4189 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4190 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004191 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4192 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004193 Style);
4194 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004195 "} else if (aaaaa\n"
4196 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004197 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004198 "}",
4199 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00004200 verifyFormat("return (a)\n"
4201 " // comment\n"
4202 " + b;",
4203 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004204 verifyFormat(
4205 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4206 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4207 " + cc;",
4208 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00004209
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00004210 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4211 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4212 Style);
4213
Daniel Jasper9e5ede02013-11-08 19:56:28 +00004214 // Forced by comments.
4215 verifyFormat(
4216 "unsigned ContentSize =\n"
4217 " sizeof(int16_t) // DWARF ARange version number\n"
4218 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4219 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
4220 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00004221
4222 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
4223 " == boost::fusion::at_c<1>(iiii).second;",
4224 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00004225
4226 Style.ColumnLimit = 60;
4227 verifyFormat("zzzzzzzzzz\n"
4228 " = bbbbbbbbbbbbbbbbb\n"
4229 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
4230 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004231}
4232
Daniel Jasperb1270392017-02-01 23:27:37 +00004233TEST_F(FormatTest, EnforcedOperatorWraps) {
4234 // Here we'd like to wrap after the || operators, but a comment is forcing an
4235 // earlier wrap.
4236 verifyFormat("bool x = aaaaa //\n"
4237 " || bbbbb\n"
4238 " //\n"
4239 " || cccc;");
4240}
4241
Daniel Jasper3219e432014-12-02 13:24:51 +00004242TEST_F(FormatTest, NoOperandAlignment) {
4243 FormatStyle Style = getLLVMStyle();
4244 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00004245 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
4246 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4247 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4248 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004249 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00004250 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4251 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4252 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4253 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4254 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4255 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4256 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4257 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4258 " > ccccccccccccccccccccccccccccccccccccccccc;",
4259 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004260
4261 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4262 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4263 " + cc;",
4264 Style);
4265 verifyFormat("int a = aa\n"
4266 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004267 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00004268 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00004269
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004270 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00004271 verifyFormat("return (a > b\n"
4272 " // comment1\n"
4273 " // comment2\n"
4274 " || c);",
4275 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004276}
4277
Daniel Jasperac043c92014-09-15 11:11:00 +00004278TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
4279 FormatStyle Style = getLLVMStyle();
4280 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4281 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4282 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00004283 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4284 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00004285}
4286
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004287TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004288 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004289 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
4290 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004291 verifyFormat("Constructor()\n"
4292 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004293 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004294 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004295 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004296 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004297
Daniel Jasper7b259cd2015-08-27 11:59:31 +00004298 verifyFormat("template <typename T>\n"
4299 "Constructor() : Initializer(FitsOnTheLine) {}",
4300 getLLVMStyleWithColumns(45));
4301
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004302 verifyFormat(
4303 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004304 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004305
4306 verifyFormat(
4307 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004308 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004309 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004310 verifyFormat(
4311 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004312 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004313 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00004314 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4315 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4316 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004317
4318 verifyFormat("Constructor()\n"
4319 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4320 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4321 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004322 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004323
Daniel Jasper65585ed2013-01-28 13:31:35 +00004324 verifyFormat("Constructor()\n"
4325 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004326 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00004327
Daniel Jasper62e68172013-02-25 15:59:54 +00004328 verifyFormat("Constructor(int Parameter = 0)\n"
4329 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4330 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00004331 verifyFormat("Constructor()\n"
4332 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4333 "}",
4334 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00004335 verifyFormat("Constructor()\n"
4336 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4337 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00004338
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004339 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00004340 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004341 verifyFormat("Constructor()\n"
4342 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4343 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
4344 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004345
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004346 FormatStyle OnePerLine = getLLVMStyle();
4347 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00004348 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004349 verifyFormat("SomeClass::Constructor()\n"
4350 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4351 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004352 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004353 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004354 verifyFormat("SomeClass::Constructor()\n"
4355 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4356 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004357 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004358 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004359 verifyFormat("MyClass::MyClass(int var)\n"
4360 " : some_var_(var), // 4 space indent\n"
4361 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004362 "}",
4363 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00004364 verifyFormat("Constructor()\n"
4365 " : aaaaa(aaaaaa),\n"
4366 " aaaaa(aaaaaa),\n"
4367 " aaaaa(aaaaaa),\n"
4368 " aaaaa(aaaaaa),\n"
4369 " aaaaa(aaaaaa) {}",
4370 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00004371 verifyFormat("Constructor()\n"
4372 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4373 " aaaaaaaaaaaaaaaaaaaaaa) {}",
4374 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00004375 OnePerLine.BinPackParameters = false;
4376 verifyFormat(
4377 "Constructor()\n"
4378 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4379 " aaaaaaaaaaa().aaa(),\n"
4380 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4381 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00004382 OnePerLine.ColumnLimit = 60;
4383 verifyFormat("Constructor()\n"
4384 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
4385 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4386 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00004387
4388 EXPECT_EQ("Constructor()\n"
4389 " : // Comment forcing unwanted break.\n"
4390 " aaaa(aaaa) {}",
4391 format("Constructor() :\n"
4392 " // Comment forcing unwanted break.\n"
4393 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004394}
4395
4396TEST_F(FormatTest, MemoizationTests) {
4397 // This breaks if the memoization lookup does not take \c Indent and
4398 // \c LastSpace into account.
4399 verifyFormat(
4400 "extern CFRunLoopTimerRef\n"
4401 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
4402 " CFTimeInterval interval, CFOptionFlags flags,\n"
4403 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00004404 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004405
4406 // Deep nesting somewhat works around our memoization.
4407 verifyFormat(
4408 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4409 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4410 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4411 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4412 " aaaaa())))))))))))))))))))))))))))))))))))))));",
4413 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00004414 verifyFormat(
4415 "aaaaa(\n"
4416 " aaaaa,\n"
4417 " aaaaa(\n"
4418 " aaaaa,\n"
4419 " aaaaa(\n"
4420 " aaaaa,\n"
4421 " aaaaa(\n"
4422 " aaaaa,\n"
4423 " aaaaa(\n"
4424 " aaaaa,\n"
4425 " aaaaa(\n"
4426 " aaaaa,\n"
4427 " aaaaa(\n"
4428 " aaaaa,\n"
4429 " aaaaa(\n"
4430 " aaaaa,\n"
4431 " aaaaa(\n"
4432 " aaaaa,\n"
4433 " aaaaa(\n"
4434 " aaaaa,\n"
4435 " aaaaa(\n"
4436 " aaaaa,\n"
4437 " aaaaa(\n"
4438 " aaaaa,\n"
4439 " aaaaa))))))))))));",
4440 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00004441 verifyFormat(
4442 "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"
4443 " a),\n"
4444 " a),\n"
4445 " a),\n"
4446 " a),\n"
4447 " a),\n"
4448 " a),\n"
4449 " a),\n"
4450 " a),\n"
4451 " a),\n"
4452 " a),\n"
4453 " a),\n"
4454 " a),\n"
4455 " a),\n"
4456 " a),\n"
4457 " a),\n"
4458 " a),\n"
4459 " a)",
4460 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00004461
4462 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004463 FormatStyle OnePerLine = getLLVMStyle();
4464 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004465 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00004466 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00004467 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00004468 for (unsigned i = 0, e = 80; i != e; ++i) {
4469 input += " a,\n";
4470 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004471 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004472 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004473}
4474
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004475TEST_F(FormatTest, BreaksAsHighAsPossible) {
4476 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004477 "void f() {\n"
4478 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
4479 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
4480 " f();\n"
4481 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00004482 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004483 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004484}
4485
Daniel Jasper6728fc12013-04-11 14:29:13 +00004486TEST_F(FormatTest, BreaksFunctionDeclarations) {
4487 // Principially, we break function declarations in a certain order:
4488 // 1) break amongst arguments.
4489 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
4490 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004491 verifyFormat("template <class TemplateIt>\n"
4492 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
4493 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00004494
4495 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00004496 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004497 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004498 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004499 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004500
4501 // 3) break after (.
4502 verifyFormat(
4503 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00004504 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
4505 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004506
4507 // 4) break before after nested name specifiers.
4508 verifyFormat(
4509 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004510 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
4511 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004512 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004513
4514 // However, there are exceptions, if a sufficient amount of lines can be
4515 // saved.
4516 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
4517 // more adjusting.
4518 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4519 " Cccccccccccccc cccccccccc,\n"
4520 " Cccccccccccccc cccccccccc,\n"
4521 " Cccccccccccccc cccccccccc,\n"
4522 " Cccccccccccccc cccccccccc);");
4523 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004524 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004525 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4526 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4527 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004528 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004529 verifyFormat(
4530 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4531 " Cccccccccccccc cccccccccc,\n"
4532 " Cccccccccccccc cccccccccc,\n"
4533 " Cccccccccccccc cccccccccc,\n"
4534 " Cccccccccccccc cccccccccc,\n"
4535 " Cccccccccccccc cccccccccc,\n"
4536 " Cccccccccccccc cccccccccc);");
4537 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4538 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4539 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4540 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4541 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00004542
4543 // Break after multi-line parameters.
4544 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4545 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4546 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4547 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00004548 verifyFormat("void SomeLoooooooooooongFunction(\n"
4549 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
4550 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4551 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004552
4553 // Treat overloaded operators like other functions.
4554 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4555 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00004556 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4557 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00004558 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4559 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
4560 verifyGoogleFormat(
4561 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
4562 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004563 verifyGoogleFormat(
4564 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
4565 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00004566 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4567 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4568 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
4569 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00004570 verifyGoogleFormat(
4571 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
4572 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4573 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00004574 verifyGoogleFormat(
4575 "template <typename T>\n"
4576 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4577 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
4578 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00004579
4580 FormatStyle Style = getLLVMStyle();
4581 Style.PointerAlignment = FormatStyle::PAS_Left;
4582 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4583 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
4584 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004585 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
4586 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4587 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00004588}
4589
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004590TEST_F(FormatTest, TrailingReturnType) {
4591 verifyFormat("auto foo() -> int;\n");
4592 verifyFormat("struct S {\n"
4593 " auto bar() const -> int;\n"
4594 "};");
4595 verifyFormat("template <size_t Order, typename T>\n"
4596 "auto load_img(const std::string &filename)\n"
4597 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00004598 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
4599 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00004600 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00004601 verifyFormat("template <typename T>\n"
4602 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
4603 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00004604
4605 // Not trailing return types.
4606 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004607}
4608
Daniel Jasper5be31f72013-05-21 09:16:31 +00004609TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004610 // Avoid breaking before trailing 'const' or other trailing annotations, if
4611 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00004612 FormatStyle Style = getGoogleStyle();
4613 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00004614 verifyFormat("void someLongFunction(\n"
4615 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00004616 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00004617 verifyFormat("LoooooongReturnType\n"
4618 "someLoooooooongFunction() const {}",
4619 getLLVMStyleWithColumns(47));
4620 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
4621 " const {}",
4622 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004623 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4624 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
4625 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4626 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
4627 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4628 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00004629 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
4630 " aaaaaaaaaaa aaaaa) const override;");
4631 verifyGoogleFormat(
4632 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4633 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004634
Daniel Jasper5550de62014-02-17 07:57:46 +00004635 // Even if the first parameter has to be wrapped.
4636 verifyFormat("void someLongFunction(\n"
4637 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004638 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00004639 verifyFormat("void someLongFunction(\n"
4640 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004641 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00004642 verifyFormat("void someLongFunction(\n"
4643 " int someLongParameter) override {}",
4644 Style);
4645 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004646 " int someLongParameter) OVERRIDE {}",
4647 Style);
4648 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004649 " int someLongParameter) final {}",
4650 Style);
4651 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004652 " int someLongParameter) FINAL {}",
4653 Style);
4654 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004655 " int parameter) const override {}",
4656 Style);
4657
Daniel Jaspere3f907f2014-06-02 09:52:08 +00004658 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
4659 verifyFormat("void someLongFunction(\n"
4660 " int someLongParameter) const\n"
4661 "{\n"
4662 "}",
4663 Style);
4664
Daniel Jasper5550de62014-02-17 07:57:46 +00004665 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004666 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
4667 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4668 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00004669
4670 // Breaking before function-like trailing annotations is fine to keep them
4671 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00004672 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4673 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4674 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4675 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4676 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4677 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00004678 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4679 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00004680 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004681
4682 verifyFormat(
4683 "void aaaaaaaaaaaaaaaaaa()\n"
4684 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4685 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
4686 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4687 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004688 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004689 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004690 " GUARDED_BY(aaaaaaaaaaaa);");
4691 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004692 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004693 " GUARDED_BY(aaaaaaaaaaaa);");
4694 verifyGoogleFormat(
4695 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4696 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004697 verifyGoogleFormat(
4698 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4699 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004700}
4701
Daniel Jasperf090f032015-05-18 09:47:22 +00004702TEST_F(FormatTest, FunctionAnnotations) {
4703 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004704 "int OldFunction(const string &parameter) {}");
4705 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004706 "string OldFunction(const string &parameter) {}");
4707 verifyFormat("template <typename T>\n"
4708 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4709 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004710
4711 // Not function annotations.
4712 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4713 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004714 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4715 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004716 verifyFormat("MACRO(abc).function() // wrap\n"
4717 " << abc;");
4718 verifyFormat("MACRO(abc)->function() // wrap\n"
4719 " << abc;");
4720 verifyFormat("MACRO(abc)::function() // wrap\n"
4721 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004722}
4723
Daniel Jasperf7935112012-12-03 18:12:45 +00004724TEST_F(FormatTest, BreaksDesireably) {
4725 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4726 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004727 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004728 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4729 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4730 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004731
4732 verifyFormat(
4733 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004734 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004735
4736 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4737 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4738 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004739
4740 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004741 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4742 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4743 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004744 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4745 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004746
4747 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4748 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4749
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004750 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004751 "void f() {\n"
4752 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4753 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4754 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004755 verifyFormat(
4756 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4757 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4758 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004759 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4760 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4761 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004762 "aaaaaa(aaa,\n"
4763 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004764 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4765 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004766 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4767 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4768 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004769
Daniel Jasper739b85f2015-06-29 10:42:59 +00004770 // Indent consistently independent of call expression and unary operator.
4771 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4772 " dddddddddddddddddddddddddddddd));");
4773 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4774 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004775 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004776 " dddddddddddddddddddddddddddddd));");
4777
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004778 // This test case breaks on an incorrect memoization, i.e. an optimization not
4779 // taking into account the StopAt value.
4780 verifyFormat(
4781 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004782 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4783 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4784 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004785
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004786 verifyFormat("{\n {\n {\n"
4787 " Annotation.SpaceRequiredBefore =\n"
4788 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4789 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4790 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004791
4792 // Break on an outer level if there was a break on an inner level.
4793 EXPECT_EQ("f(g(h(a, // comment\n"
4794 " b, c),\n"
4795 " d, e),\n"
4796 " x, y);",
4797 format("f(g(h(a, // comment\n"
4798 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004799
4800 // Prefer breaking similar line breaks.
4801 verifyFormat(
4802 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4803 " NSTrackingMouseEnteredAndExited |\n"
4804 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004805}
4806
Daniel Jasper18210d72014-10-09 09:52:05 +00004807TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4808 FormatStyle NoBinPacking = getGoogleStyle();
4809 NoBinPacking.BinPackParameters = false;
4810 NoBinPacking.BinPackArguments = true;
4811 verifyFormat("void f() {\n"
4812 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4813 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4814 "}",
4815 NoBinPacking);
4816 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4817 " int aaaaaaaaaaaaaaaaaaaa,\n"
4818 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4819 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004820
Daniel Jasper00693b082016-01-09 15:56:47 +00004821 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4822 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4823 " vector<int> bbbbbbbbbbbbbbb);",
4824 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004825 // FIXME: This behavior difference is probably not wanted. However, currently
4826 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4827 // template arguments from BreakBeforeParameter being set because of the
4828 // one-per-line formatting.
4829 verifyFormat(
4830 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4831 " aaaaaaaaaa> aaaaaaaaaa);",
4832 NoBinPacking);
4833 verifyFormat(
4834 "void fffffffffff(\n"
4835 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4836 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004837}
4838
Daniel Jasper9278eb92013-01-16 14:59:02 +00004839TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004840 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004841 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004842 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004843 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4844 " aaaaaaaaaaaaaaaaaaaa,\n"
4845 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4846 NoBinPacking);
4847 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4848 " aaaaaaaaaaaaa,\n"
4849 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4850 NoBinPacking);
4851 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004852 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4853 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4854 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4855 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004856 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4857 NoBinPacking);
4858 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4859 " .aaaaaaaaaaaaaaaaaa();",
4860 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004861 verifyFormat("void f() {\n"
4862 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4863 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4864 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004865 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004866
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004867 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004868 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4869 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004870 " aaaaaaaaaaaa);",
4871 NoBinPacking);
4872 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004873 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4874 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004875 " test);",
4876 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004877
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004878 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4879 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004880 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4881 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004882 NoBinPacking);
4883 verifyFormat("a(\"a\"\n"
4884 " \"a\",\n"
4885 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004886
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004887 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004888 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004889 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004890 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004891 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004892 verifyFormat(
4893 "void f() {\n"
4894 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4895 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004896 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004897 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004898 verifyFormat(
4899 "template <class SomeType, class SomeOtherType>\n"
4900 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4901 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004902}
4903
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004904TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4905 FormatStyle Style = getLLVMStyleWithColumns(15);
4906 Style.ExperimentalAutoDetectBinPacking = true;
4907 EXPECT_EQ("aaa(aaaa,\n"
4908 " aaaa,\n"
4909 " aaaa);\n"
4910 "aaa(aaaa,\n"
4911 " aaaa,\n"
4912 " aaaa);",
4913 format("aaa(aaaa,\n" // one-per-line
4914 " aaaa,\n"
4915 " aaaa );\n"
4916 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4917 Style));
4918 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4919 " aaaa);\n"
4920 "aaa(aaaa, aaaa,\n"
4921 " aaaa);",
4922 format("aaa(aaaa, aaaa,\n" // bin-packed
4923 " aaaa );\n"
4924 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4925 Style));
4926}
4927
Daniel Jasper04468962013-01-18 10:56:38 +00004928TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004929 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4930 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4931 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4932 " .StartsWith(\".init\", ORDER_INIT)\n"
4933 " .StartsWith(\".fini\", ORDER_FINI)\n"
4934 " .StartsWith(\".hash\", ORDER_HASH)\n"
4935 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004936
Daniel Jaspereb50c672013-02-15 20:33:06 +00004937 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004938 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004939 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004940 "aaaaaaa->aaaaaaa\n"
4941 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4942 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004943 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004944 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004945 "aaaaaaa->aaaaaaa\n"
4946 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4947 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4948 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004949 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004950 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004951 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004952 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4953 " aaaaaa->aaaaaaaaaaaa()\n"
4954 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004955 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004956 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004957 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004958 "void f() {\n"
4959 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004960 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004961 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004962 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004963 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004964 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004965 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004966 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004967 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004968 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004969 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004970 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004971
4972 verifyFormat(
4973 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4974 verifyFormat("aaaaaaaaaaaaaaa()\n"
4975 " .aaaaaaaaaaaaaaa()\n"
4976 " .aaaaaaaaaaaaaaa()\n"
4977 " .aaaaaaaaaaaaaaa()\n"
4978 " .aaaaaaaaaaaaaaa();");
4979 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4980 " .aaaaaaaaaaaaaaa()\n"
4981 " .aaaaaaaaaaaaaaa()\n"
4982 " .aaaaaaaaaaaaaaa();");
4983 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4984 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4985 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004986 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4987 " ->aaaaaaaaaaaaaae(0)\n"
4988 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004989
Daniel Jasper775954b2015-04-24 10:08:09 +00004990 // Don't linewrap after very short segments.
4991 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4992 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4993 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4994 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4995 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4996 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4997 verifyFormat("aaa()\n"
4998 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4999 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5000 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5001
Daniel Jaspercc3114d2013-10-18 15:23:06 +00005002 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
5003 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5004 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
5005 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
5006 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00005007 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00005008
Daniel Jaspera41aa532014-09-19 08:01:25 +00005009 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00005010 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
5011 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00005012
5013 // Prefer not to create "hanging" indents.
5014 verifyFormat(
5015 "return !soooooooooooooome_map\n"
5016 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5017 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00005018 verifyFormat(
5019 "return aaaaaaaaaaaaaaaa\n"
5020 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
5021 " .aaaa(aaaaaaaaaaaaaa);");
5022 // No hanging indent here.
5023 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
5024 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5025 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
5026 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00005027 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5028 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5029 getLLVMStyleWithColumns(60));
5030 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
5031 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5032 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5033 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00005034 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5035 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5036 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00005037}
5038
Daniel Jasperde5c2072012-12-24 00:13:23 +00005039TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
5040 verifyFormat(
5041 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005042 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00005043 verifyFormat(
5044 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
5045 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
5046
Daniel Jasper8d1832e2013-01-07 13:26:07 +00005047 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005048 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00005049 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
5050 " ccccccccccccccccccccccccc) {\n}");
5051
Daniel Jasper8d1832e2013-01-07 13:26:07 +00005052 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005053 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00005054 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
5055 " ccccccccccccccccccccccccc) {\n}");
5056
Daniel Jasperde5c2072012-12-24 00:13:23 +00005057 verifyFormat(
5058 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005059 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00005060 verifyFormat(
5061 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
5062 " ccccccccccccccccccccccccc) {\n}");
5063
Daniel Jasper400adc62013-02-08 15:28:42 +00005064 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
5065 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
5066 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
5067 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00005068 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
5069 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
5070 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
5071 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5072
Daniel Jasper400adc62013-02-08 15:28:42 +00005073 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
5074 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
5075 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00005076 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
5077 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
5078 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00005079}
5080
Daniel Jasper43b65482013-01-23 12:27:43 +00005081TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00005082 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00005083 "unsigned Cost =\n"
5084 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
5085 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00005086 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00005087 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
5088 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00005089
5090 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00005091 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
5092 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00005093 verifyFormat("unsigned OriginalStartColumn =\n"
5094 " SourceMgr.getSpellingColumnNumber(\n"
5095 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
5096 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00005097}
5098
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005099TEST_F(FormatTest, AlignsAfterAssignments) {
5100 verifyFormat(
5101 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00005102 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005103 verifyFormat(
5104 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00005105 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005106 verifyFormat(
5107 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00005108 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005109 verifyFormat(
5110 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00005111 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00005112 verifyFormat(
5113 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5114 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5115 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005116}
5117
5118TEST_F(FormatTest, AlignsAfterReturn) {
5119 verifyFormat(
5120 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5121 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
5122 verifyFormat(
5123 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5124 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00005125 verifyFormat(
5126 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005127 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00005128 verifyFormat(
5129 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005130 " aaaaaaaaaaaaaaaaaaaaaa());");
5131 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5132 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5133 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5134 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
5135 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00005136 verifyFormat("return\n"
5137 " // true if code is one of a or b.\n"
5138 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005139}
5140
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005141TEST_F(FormatTest, AlignsAfterOpenBracket) {
5142 verifyFormat(
5143 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5144 " aaaaaaaaa aaaaaaa) {}");
5145 verifyFormat(
5146 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5147 " aaaaaaaaaaa aaaaaaaaa);");
5148 verifyFormat(
5149 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5150 " aaaaaaaaaaaaaaaaaaaaa));");
5151 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005152 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00005153 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5154 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
5155 Style);
5156 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5157 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
5158 Style);
5159 verifyFormat("SomeLongVariableName->someFunction(\n"
5160 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
5161 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005162 verifyFormat(
5163 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5164 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5165 Style);
5166 verifyFormat(
5167 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5168 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5169 Style);
5170 verifyFormat(
5171 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5172 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5173 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005174
Daniel Jasper2a9f7202016-02-08 09:52:54 +00005175 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
5176 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
5177 " b));",
5178 Style);
5179
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005180 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5181 Style.BinPackArguments = false;
5182 Style.BinPackParameters = false;
5183 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5184 " aaaaaaaaaaa aaaaaaaa,\n"
5185 " aaaaaaaaa aaaaaaa,\n"
5186 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5187 Style);
5188 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5189 " aaaaaaaaaaa aaaaaaaaa,\n"
5190 " aaaaaaaaaaa aaaaaaaaa,\n"
5191 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5192 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00005193 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
5194 " aaaaaaaaaaaaaaa,\n"
5195 " aaaaaaaaaaaaaaaaaaaaa,\n"
5196 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005197 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00005198 verifyFormat(
5199 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
5200 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5201 Style);
5202 verifyFormat(
5203 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
5204 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5205 Style);
5206 verifyFormat(
5207 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5208 " aaaaaaaaaaaaaaaaaaaaa(\n"
5209 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
5210 " aaaaaaaaaaaaaaaa);",
5211 Style);
5212 verifyFormat(
5213 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5214 " aaaaaaaaaaaaaaaaaaaaa(\n"
5215 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
5216 " aaaaaaaaaaaaaaaa);",
5217 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005218}
5219
Daniel Jasper3219e432014-12-02 13:24:51 +00005220TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
5221 FormatStyle Style = getLLVMStyleWithColumns(40);
5222 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5223 " bbbbbbbbbbbbbbbbbbbbbb);",
5224 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005225 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00005226 Style.AlignOperands = false;
5227 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5228 " bbbbbbbbbbbbbbbbbbbbbb);",
5229 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005230 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00005231 Style.AlignOperands = true;
5232 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5233 " bbbbbbbbbbbbbbbbbbbbbb);",
5234 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005235 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00005236 Style.AlignOperands = false;
5237 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5238 " bbbbbbbbbbbbbbbbbbbbbb);",
5239 Style);
5240}
5241
Daniel Jasper399d24b2013-01-09 07:06:56 +00005242TEST_F(FormatTest, BreaksConditionalExpressions) {
5243 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005244 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5245 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5246 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5247 verifyFormat(
5248 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005249 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5250 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00005251 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005252 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5253 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5254 verifyFormat(
5255 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005256 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5257 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005258 verifyFormat(
5259 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
5260 " : aaaaaaaaaaaaa);");
5261 verifyFormat(
5262 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00005263 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005264 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5265 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005266 verifyFormat(
5267 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5268 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5269 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005270 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5271 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5272 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5273 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5274 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5275 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5276 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5277 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5278 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5279 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5280 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5281 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005282 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5283 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5284 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5285 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5286 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00005287 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5288 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5289 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005290 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5291 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5292 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5293 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00005294 verifyFormat(
5295 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5296 " ? aaaaaaaaaaaaaaa\n"
5297 " : aaaaaaaaaaaaaaa;");
5298 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005299 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00005300 " ? b\n"
5301 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00005302 verifyFormat("return aaaa == bbbb\n"
5303 " // comment\n"
5304 " ? aaaa\n"
5305 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005306 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005307 " format(TheLine.First,\n"
5308 " IndentForLevel[TheLine.Level] >= 0\n"
5309 " ? IndentForLevel[TheLine.Level]\n"
5310 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005311 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005312 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00005313 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5314 " ? aaaaaaaaaaaaaaa\n"
5315 " : bbbbbbbbbbbbbbb //\n"
5316 " ? ccccccccccccccc\n"
5317 " : ddddddddddddddd;");
5318 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5319 " ? aaaaaaaaaaaaaaa\n"
5320 " : (bbbbbbbbbbbbbbb //\n"
5321 " ? ccccccccccccccc\n"
5322 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005323 verifyFormat(
5324 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5325 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5326 " aaaaaaaaaaaaaaaaaaaaa +\n"
5327 " aaaaaaaaaaaaaaaaaaaaa\n"
5328 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00005329 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005330 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5331 " : aaaaaaaaaaaaaaaaaaaaaa\n"
5332 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00005333
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005334 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00005335 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005336 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00005337 "void f() {\n"
5338 " g(aaa,\n"
5339 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5340 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5341 " ? aaaaaaaaaaaaaaa\n"
5342 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005343 "}",
5344 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005345 verifyFormat(
5346 "void f() {\n"
5347 " g(aaa,\n"
5348 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5349 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5350 " ?: aaaaaaaaaaaaaaa);\n"
5351 "}",
5352 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00005353
5354 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
5355 " // comment.\n"
5356 " ccccccccccccccccccccccccccccccccccccccc\n"
5357 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5358 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00005359
5360 // Assignments in conditional expressions. Apparently not uncommon :-(.
5361 verifyFormat("return a != b\n"
5362 " // comment\n"
5363 " ? a = b\n"
5364 " : a = b;");
5365 verifyFormat("return a != b\n"
5366 " // comment\n"
5367 " ? a = a != b\n"
5368 " // comment\n"
5369 " ? a = b\n"
5370 " : a\n"
5371 " : a;\n");
5372 verifyFormat("return a != b\n"
5373 " // comment\n"
5374 " ? a\n"
5375 " : a = a != b\n"
5376 " // comment\n"
5377 " ? a = b\n"
5378 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00005379}
5380
Daniel Jasper165b29e2013-11-08 00:57:11 +00005381TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
5382 FormatStyle Style = getLLVMStyle();
5383 Style.BreakBeforeTernaryOperators = false;
5384 Style.ColumnLimit = 70;
5385 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005386 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5387 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5388 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5389 Style);
5390 verifyFormat(
5391 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005392 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5393 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005394 Style);
5395 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005396 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5397 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5398 Style);
5399 verifyFormat(
5400 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005401 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5402 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005403 Style);
5404 verifyFormat(
5405 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
5406 " aaaaaaaaaaaaa);",
5407 Style);
5408 verifyFormat(
5409 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5410 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5411 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5412 " aaaaaaaaaaaaa);",
5413 Style);
5414 verifyFormat(
5415 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5416 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5417 " aaaaaaaaaaaaa);",
5418 Style);
5419 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5420 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5421 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5422 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5423 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5424 Style);
5425 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5426 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5427 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5428 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5429 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5430 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5431 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5432 Style);
5433 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5434 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
5435 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5436 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5437 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5438 Style);
5439 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5440 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5441 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5442 Style);
5443 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00005444 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00005445 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5446 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5447 Style);
5448 verifyFormat(
5449 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5450 " aaaaaaaaaaaaaaa :\n"
5451 " aaaaaaaaaaaaaaa;",
5452 Style);
5453 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5454 " aaaaaaaaa ?\n"
5455 " b :\n"
5456 " c);",
5457 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00005458 verifyFormat("unsigned Indent =\n"
5459 " format(TheLine.First,\n"
5460 " IndentForLevel[TheLine.Level] >= 0 ?\n"
5461 " IndentForLevel[TheLine.Level] :\n"
5462 " TheLine * 2,\n"
5463 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
5464 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005465 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5466 " aaaaaaaaaaaaaaa :\n"
5467 " bbbbbbbbbbbbbbb ? //\n"
5468 " ccccccccccccccc :\n"
5469 " ddddddddddddddd;",
5470 Style);
5471 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5472 " aaaaaaaaaaaaaaa :\n"
5473 " (bbbbbbbbbbbbbbb ? //\n"
5474 " ccccccccccccccc :\n"
5475 " ddddddddddddddd);",
5476 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00005477 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5478 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
5479 " ccccccccccccccccccccccccccc;",
5480 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00005481 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5482 " aaaaa :\n"
5483 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
5484 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005485}
5486
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005487TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
5488 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
5489 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
5490 verifyFormat("bool a = true, b = false;");
5491
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005492 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005493 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005494 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00005495 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005496 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00005497 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005498 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00005499 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00005500 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
5501 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
5502 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5503 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
5504 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
5505 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005506
Daniel Jasperbea1ab42015-03-01 18:55:26 +00005507 FormatStyle Style = getGoogleStyle();
5508 Style.PointerAlignment = FormatStyle::PAS_Left;
5509 Style.DerivePointerAlignment = false;
5510 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5511 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
5512 " *b = bbbbbbbbbbbbbbbbbbb;",
5513 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00005514 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5515 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
5516 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00005517 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00005518 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005519}
5520
Nico Weber4a5030c2013-01-12 01:28:06 +00005521TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
5522 verifyFormat("arr[foo ? bar : baz];");
5523 verifyFormat("f()[foo ? bar : baz];");
5524 verifyFormat("(a + b)[foo ? bar : baz];");
5525 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
5526}
5527
Daniel Jasperf7935112012-12-03 18:12:45 +00005528TEST_F(FormatTest, AlignsStringLiterals) {
5529 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
5530 " \"short literal\");");
5531 verifyFormat(
5532 "looooooooooooooooooooooooongFunction(\n"
5533 " \"short literal\"\n"
5534 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005535 verifyFormat("someFunction(\"Always break between multi-line\"\n"
5536 " \" string literals\",\n"
5537 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005538 EXPECT_EQ("fun + \"1243\" /* comment */\n"
5539 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005540 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00005541 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005542 getLLVMStyleWithColumns(28)));
5543 EXPECT_EQ(
5544 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5545 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
5546 " \"aaaaaaaaaaaaaaaa\";",
5547 format("aaaaaa ="
5548 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
5549 "aaaaaaaaaaaaaaaaaaaaa\" "
5550 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005551 verifyFormat("a = a + \"a\"\n"
5552 " \"a\"\n"
5553 " \"a\";");
5554 verifyFormat("f(\"a\", \"b\"\n"
5555 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005556
5557 verifyFormat(
5558 "#define LL_FORMAT \"ll\"\n"
5559 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
5560 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00005561
5562 verifyFormat("#define A(X) \\\n"
5563 " \"aaaaa\" #X \"bbbbbb\" \\\n"
5564 " \"ccccc\"",
5565 getLLVMStyleWithColumns(23));
5566 verifyFormat("#define A \"def\"\n"
5567 "f(\"abc\" A \"ghi\"\n"
5568 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005569
5570 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005571 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005572 verifyFormat("#define A(X) \\\n"
5573 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
5574 " L\"ccccc\"",
5575 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00005576
5577 verifyFormat("f(@\"a\"\n"
5578 " @\"b\");");
5579 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00005580 " @\"b\"\n"
5581 " @\"c\";");
5582 verifyFormat("NSString s = @\"a\"\n"
5583 " \"b\"\n"
5584 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00005585}
5586
Zachary Turner448592e2015-12-18 22:20:15 +00005587TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005588 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005589 // No declarations or definitions should be moved to own line.
5590 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
5591 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005592 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005593 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005594 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005595 "int f() { return 1; }\n"
5596 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005597 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00005598
5599 // All declarations and definitions should have the return type moved to its
5600 // own
5601 // line.
5602 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
5603 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005604 " int\n"
5605 " f() {\n"
5606 " return 1;\n"
5607 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005608 " int\n"
5609 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005610 "};\n"
5611 "int\n"
5612 "f() {\n"
5613 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005614 "}\n"
5615 "int\n"
5616 "g();\n",
5617 Style);
5618
5619 // Top-level definitions, and no kinds of declarations should have the
5620 // return type moved to its own line.
5621 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
5622 verifyFormat("class B {\n"
5623 " int f() { return 1; }\n"
5624 " int g();\n"
5625 "};\n"
5626 "int\n"
5627 "f() {\n"
5628 " return 1;\n"
5629 "}\n"
5630 "int g();\n",
5631 Style);
5632
5633 // Top-level definitions and declarations should have the return type moved
5634 // to its own line.
5635 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
5636 verifyFormat("class C {\n"
5637 " int f() { return 1; }\n"
5638 " int g();\n"
5639 "};\n"
5640 "int\n"
5641 "f() {\n"
5642 " return 1;\n"
5643 "}\n"
5644 "int\n"
5645 "g();\n",
5646 Style);
5647
5648 // All definitions should have the return type moved to its own line, but no
5649 // kinds of declarations.
5650 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5651 verifyFormat("class D {\n"
5652 " int\n"
5653 " f() {\n"
5654 " return 1;\n"
5655 " }\n"
5656 " int g();\n"
5657 "};\n"
5658 "int\n"
5659 "f() {\n"
5660 " return 1;\n"
5661 "}\n"
5662 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005663 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005664 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005665 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005666 " return \"\";\n"
5667 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005668 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005669 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005670 verifyFormat("template <class T>\n"
5671 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005672 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005673 " return NULL;\n"
5674 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005675 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005676 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00005677 verifyFormat("class C {\n"
5678 " int\n"
5679 " operator+() {\n"
5680 " return 1;\n"
5681 " }\n"
5682 " int\n"
5683 " operator()() {\n"
5684 " return 1;\n"
5685 " }\n"
5686 "};\n",
5687 Style);
5688 verifyFormat("void\n"
5689 "A::operator()() {}\n"
5690 "void\n"
5691 "A::operator>>() {}\n"
5692 "void\n"
5693 "A::operator+() {}\n",
5694 Style);
5695 verifyFormat("void *operator new(std::size_t s);", // No break here.
5696 Style);
5697 verifyFormat("void *\n"
5698 "operator new(std::size_t s) {}",
5699 Style);
5700 verifyFormat("void *\n"
5701 "operator delete[](void *ptr) {}",
5702 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005703 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005704 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005705 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005706 "{\n"
5707 " return \"\";\n"
5708 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005709 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005710 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005711 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005712 "T *\n" // Problem here: no line break
5713 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005714 "{\n"
5715 " return NULL;\n"
5716 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005717 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005718 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005719}
5720
Alexander Kornienko58611712013-07-04 12:02:44 +00005721TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5722 FormatStyle NoBreak = getLLVMStyle();
5723 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5724 FormatStyle Break = getLLVMStyle();
5725 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005726 verifyFormat("aaaa = \"bbbb\"\n"
5727 " \"cccc\";",
5728 NoBreak);
5729 verifyFormat("aaaa =\n"
5730 " \"bbbb\"\n"
5731 " \"cccc\";",
5732 Break);
5733 verifyFormat("aaaa(\"bbbb\"\n"
5734 " \"cccc\");",
5735 NoBreak);
5736 verifyFormat("aaaa(\n"
5737 " \"bbbb\"\n"
5738 " \"cccc\");",
5739 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005740 verifyFormat("aaaa(qqq, \"bbbb\"\n"
5741 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005742 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005743 verifyFormat("aaaa(qqq,\n"
5744 " \"bbbb\"\n"
5745 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005746 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005747 verifyFormat("aaaa(qqq,\n"
5748 " L\"bbbb\"\n"
5749 " L\"cccc\");",
5750 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005751 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5752 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005753 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005754 verifyFormat("string s = someFunction(\n"
5755 " \"abc\"\n"
5756 " \"abc\");",
5757 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005758
Daniel Jasper3251fff2014-06-10 06:27:23 +00005759 // As we break before unary operators, breaking right after them is bad.
5760 verifyFormat("string foo = abc ? \"x\"\n"
5761 " \"blah blah blah blah blah blah\"\n"
5762 " : \"y\";",
5763 Break);
5764
Daniel Jasperc834c702013-07-17 15:38:19 +00005765 // Don't break if there is no column gain.
5766 verifyFormat("f(\"aaaa\"\n"
5767 " \"bbbb\");",
5768 Break);
5769
5770 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005771 EXPECT_EQ("x = \"a\\\n"
5772 "b\\\n"
5773 "c\";",
5774 format("x = \"a\\\n"
5775 "b\\\n"
5776 "c\";",
5777 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005778 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005779 " \"a\\\n"
5780 "b\\\n"
5781 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005782 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005783 "b\\\n"
5784 "c\";",
5785 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005786
5787 // Exempt ObjC strings for now.
5788 EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005789 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005790 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005791 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005792 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005793
5794 Break.ColumnLimit = 0;
5795 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005796}
5797
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005798TEST_F(FormatTest, AlignsPipes) {
5799 verifyFormat(
5800 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5801 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5802 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5803 verifyFormat(
5804 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5805 " << aaaaaaaaaaaaaaaaaaaa;");
5806 verifyFormat(
5807 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5808 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5809 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005810 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5811 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5812 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005813 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5814 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5815 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5816 verifyFormat(
5817 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5818 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5819 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005820 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5821 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5822 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5823 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005824 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5825 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005826 verifyFormat(
5827 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5828 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005829
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005830 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5831 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005832 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5833 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5834 " aaaaaaaaaaaaaaaaaaaaa)\n"
5835 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005836 verifyFormat("LOG_IF(aaa == //\n"
5837 " bbb)\n"
5838 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005839
Daniel Jasper467ddb12013-08-12 12:58:05 +00005840 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005841 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5842 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005843 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5844 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5845 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005846 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5847 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005848 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5849 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5850 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5851 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5852 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5853 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5854 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005855
Daniel Jasperc238c872013-04-02 14:33:13 +00005856 verifyFormat(
5857 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5858 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005859
5860 // Incomplete string literal.
5861 EXPECT_EQ("llvm::errs() << \"\n"
5862 " << a;",
5863 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005864
5865 verifyFormat("void f() {\n"
5866 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5867 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5868 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005869
5870 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005871 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5872 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5873 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005874
5875 // Handle '\n'.
5876 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5877 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5878 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5879 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5880 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5881 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5882 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005883}
5884
Daniel Jasper7209bb92016-12-13 11:16:42 +00005885TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5886 verifyFormat("return out << \"somepacket = {\\n\"\n"
5887 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5888 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5889 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5890 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5891 " << \"}\";");
5892
5893 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5894 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5895 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5896 verifyFormat(
5897 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5898 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5899 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5900 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5901 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5902 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5903 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5904 verifyFormat(
5905 "void f() {\n"
5906 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5907 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5908 "}");
5909
5910 // Breaking before the first "<<" is generally not desirable.
5911 verifyFormat(
5912 "llvm::errs()\n"
5913 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5914 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5915 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5916 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5917 getLLVMStyleWithColumns(70));
5918 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5919 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5920 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5921 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5922 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5923 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5924 getLLVMStyleWithColumns(70));
5925
5926 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5927 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5928 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5929 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5930 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5931 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005932 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5933 " (aaaa + aaaa);",
5934 getLLVMStyleWithColumns(40));
5935 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5936 " (aaaaaaa + aaaaa));",
5937 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005938 verifyFormat(
5939 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5940 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5941 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005942}
5943
Daniel Jasperf7935112012-12-03 18:12:45 +00005944TEST_F(FormatTest, UnderstandsEquals) {
5945 verifyFormat(
5946 "aaaaaaaaaaaaaaaaa =\n"
5947 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5948 verifyFormat(
5949 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005950 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005951 verifyFormat(
5952 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005953 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005954 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005955 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5956 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005957
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005958 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5959 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005960}
5961
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005962TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005963 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5964 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005965
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005966 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5967 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005968
5969 verifyFormat(
5970 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5971 " Parameter2);");
5972
5973 verifyFormat(
5974 "ShortObject->shortFunction(\n"
5975 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5976 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5977
5978 verifyFormat("loooooooooooooongFunction(\n"
5979 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5980
5981 verifyFormat(
5982 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5983 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5984
Daniel Jasper687af3b2013-02-14 14:26:07 +00005985 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5986 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005987 verifyFormat("void f() {\n"
5988 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5989 " .Times(2)\n"
5990 " .WillRepeatedly(Return(SomeValue));\n"
5991 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005992 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5993 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005994 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005995 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5996 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005997 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005998 verifyFormat("void f() {\n"
5999 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6000 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
6001 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00006002 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6003 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6004 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6005 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6006 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00006007 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6008 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6009 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6010 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
6011 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00006012
Daniel Jasperc7345cc2013-01-07 07:13:20 +00006013 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00006014 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006015 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00006016 verifyFormat(
6017 "aaaaaaaaaaa->aaaaaaaaa(\n"
6018 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6019 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00006020
6021 verifyFormat(
6022 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6023 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00006024 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
6025 " aaaaaaaaa()->aaaaaa()->aaaaa());");
6026 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
6027 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006028
Daniel Jasper9b334242013-03-15 14:57:30 +00006029 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00006030 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6031 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00006032
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006033 FormatStyle NoBinPacking = getLLVMStyle();
6034 NoBinPacking.BinPackParameters = false;
6035 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
6036 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
6037 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
6038 " aaaaaaaaaaaaaaaaaaa,\n"
6039 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6040 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00006041
6042 // If there is a subsequent call, change to hanging indentation.
6043 verifyFormat(
6044 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6045 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
6046 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6047 verifyFormat(
6048 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6049 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00006050 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6051 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6052 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6053 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6054 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6055 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00006056}
6057
Daniel Jasperac5c1c22013-01-02 15:08:56 +00006058TEST_F(FormatTest, WrapsTemplateDeclarations) {
6059 verifyFormat("template <typename T>\n"
6060 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00006061 verifyFormat("template <typename T>\n"
6062 "// T should be one of {A, B}.\n"
6063 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00006064 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00006065 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00006066 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006067 verifyFormat("template <typename T>\n"
6068 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
6069 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00006070 verifyFormat(
6071 "template <typename T>\n"
6072 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
6073 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00006074 verifyFormat(
6075 "template <typename T>\n"
6076 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
6077 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
6078 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00006079 verifyFormat("template <typename T>\n"
6080 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00006081 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00006082 verifyFormat(
6083 "template <typename T1, typename T2 = char, typename T3 = char,\n"
6084 " typename T4 = char>\n"
6085 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00006086 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
6087 " template <typename> class cccccccccccccccccccccc,\n"
6088 " typename ddddddddddddd>\n"
6089 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00006090 verifyFormat(
6091 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
6092 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00006093
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006094 verifyFormat("void f() {\n"
6095 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
6096 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
6097 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00006098
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00006099 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00006100 verifyFormat("template <typename T> void f();");
6101 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006102 verifyFormat(
6103 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6104 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6105 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
6106 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6107 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6108 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
6109 " bbbbbbbbbbbbbbbbbbbbbbbb);",
6110 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00006111 EXPECT_EQ("static_cast<A< //\n"
6112 " B> *>(\n"
6113 "\n"
6114 " );",
6115 format("static_cast<A<//\n"
6116 " B>*>(\n"
6117 "\n"
6118 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00006119 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6120 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00006121
6122 FormatStyle AlwaysBreak = getLLVMStyle();
6123 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
6124 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
6125 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
6126 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
6127 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6128 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
6129 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
6130 verifyFormat("template <template <typename> class Fooooooo,\n"
6131 " template <typename> class Baaaaaaar>\n"
6132 "struct C {};",
6133 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00006134 verifyFormat("template <typename T> // T can be A, B or C.\n"
6135 "struct C {};",
6136 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00006137 verifyFormat("template <enum E> class A {\n"
6138 "public:\n"
6139 " E *f();\n"
6140 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00006141}
6142
Daniel Jasper45797022013-01-25 10:57:27 +00006143TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
6144 verifyFormat(
6145 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6146 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6147 verifyFormat(
6148 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6149 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6150 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
6151
Daniel Jasper0f0234e2013-05-08 10:00:18 +00006152 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00006153 verifyFormat(
6154 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6155 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00006156 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00006157
Daniel Jasper45797022013-01-25 10:57:27 +00006158 verifyFormat(
6159 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00006160 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00006161
6162 // Breaking at nested name specifiers is generally not desirable.
6163 verifyFormat(
6164 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6165 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00006166
6167 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00006168 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
6169 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6170 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00006171 " aaaaaaaaaaaaaaaaaaaaa);",
6172 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00006173
6174 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6175 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6176 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00006177}
6178
Daniel Jasperf7935112012-12-03 18:12:45 +00006179TEST_F(FormatTest, UnderstandsTemplateParameters) {
6180 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006181 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006182 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
6183 verifyFormat("bool x = a < 1 || 2 > a;");
6184 verifyFormat("bool x = 5 < f<int>();");
6185 verifyFormat("bool x = f<int>() > 5;");
6186 verifyFormat("bool x = 5 < a<int>::x;");
6187 verifyFormat("bool x = a < 4 ? a > 2 : false;");
6188 verifyFormat("bool x = f() ? a < 2 : a > 2;");
6189
6190 verifyGoogleFormat("A<A<int>> a;");
6191 verifyGoogleFormat("A<A<A<int>>> a;");
6192 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006193 verifyGoogleFormat("A<A<int> > a;");
6194 verifyGoogleFormat("A<A<A<int> > > a;");
6195 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00006196 verifyGoogleFormat("A<::A<int>> a;");
6197 verifyGoogleFormat("A<::A> a;");
6198 verifyGoogleFormat("A< ::A> a;");
6199 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006200 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
6201 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00006202 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
6203 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006204 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
6205 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006206
Nico Weber7533b4d2014-09-24 17:17:32 +00006207 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
6208
Daniel Jasperf7935112012-12-03 18:12:45 +00006209 verifyFormat("test >> a >> b;");
6210 verifyFormat("test << a >> b;");
6211
6212 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006213 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00006214 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00006215 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
6216 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00006217 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00006218 verifyFormat("f(a.operator()<A>());");
6219 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6220 " .template operator()<A>());",
6221 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00006222
6223 // Not template parameters.
6224 verifyFormat("return a < b && c > d;");
6225 verifyFormat("void f() {\n"
6226 " while (a < b && c > d) {\n"
6227 " }\n"
6228 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006229 verifyFormat("template <typename... Types>\n"
6230 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00006231
6232 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6233 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
6234 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00006235 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00006236 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00006237 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00006238}
6239
Malcolm Parsons6af3f142016-11-03 16:57:30 +00006240TEST_F(FormatTest, BitshiftOperatorWidth) {
6241 EXPECT_EQ("int a = 1 << 2; /* foo\n"
6242 " bar */",
6243 format("int a=1<<2; /* foo\n"
6244 " bar */"));
6245
6246 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
6247 " bar */",
6248 format("int b =256>>1 ; /* foo\n"
6249 " bar */"));
6250}
6251
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006252TEST_F(FormatTest, UnderstandsBinaryOperators) {
6253 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00006254 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00006255}
6256
6257TEST_F(FormatTest, UnderstandsPointersToMembers) {
6258 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006259 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006260 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006261 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006262 verifyFormat("void f() {\n"
6263 " (a->*f)();\n"
6264 " a->*x;\n"
6265 " (a.*f)();\n"
6266 " ((*a).*f)();\n"
6267 " a.*x;\n"
6268 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00006269 verifyFormat("void f() {\n"
6270 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
6271 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
6272 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00006273 verifyFormat(
6274 "(aaaaaaaaaa->*bbbbbbb)(\n"
6275 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006276 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006277 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006278 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006279}
6280
Daniel Jasper8dd40472012-12-21 09:41:31 +00006281TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00006282 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00006283 verifyFormat("f(-1, -2, -3);");
6284 verifyFormat("a[-1] = 5;");
6285 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006286 verifyFormat("if (i == -1) {\n}");
6287 verifyFormat("if (i != -1) {\n}");
6288 verifyFormat("if (i > -1) {\n}");
6289 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00006290 verifyFormat("++(a->f());");
6291 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00006292 verifyFormat("(a->f())++;");
6293 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006294 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00006295
6296 verifyFormat("a-- > b;");
6297 verifyFormat("b ? -a : c;");
6298 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006299 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00006300 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006301 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00006302
6303 verifyFormat("return -1;");
6304 verifyFormat("switch (a) {\n"
6305 "case -1:\n"
6306 " break;\n"
6307 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00006308 verifyFormat("#define X -1");
6309 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00006310
Chandler Carruthf8b72662014-03-02 12:37:31 +00006311 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
6312 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00006313
6314 verifyFormat("int a = /* confusing comment */ -1;");
6315 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
6316 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006317}
6318
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006319TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00006320 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006321 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00006322 "}");
6323 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00006324 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00006325 verifyFormat("*aaa = aaaaaaa( // break\n"
6326 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00006327}
6328
Daniel Jasper8863ada2013-08-26 08:10:17 +00006329TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00006330 verifyFormat("bool operator<();");
6331 verifyFormat("bool operator>();");
6332 verifyFormat("bool operator=();");
6333 verifyFormat("bool operator==();");
6334 verifyFormat("bool operator!=();");
6335 verifyFormat("int operator+();");
6336 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00006337 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006338 verifyFormat("bool operator();");
6339 verifyFormat("bool operator()();");
6340 verifyFormat("bool operator[]();");
6341 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006342 verifyFormat("operator int();");
6343 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006344 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006345 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006346 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006347 verifyFormat("void *operator new(std::size_t size);");
6348 verifyFormat("void *operator new[](std::size_t size);");
6349 verifyFormat("void operator delete(void *ptr);");
6350 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00006351 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
6352 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00006353 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00006354 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006355
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006356 verifyFormat(
6357 "ostream &operator<<(ostream &OutputStream,\n"
6358 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00006359 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
6360 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
6361 " return left.group < right.group;\n"
6362 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00006363 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00006364 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006365
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006366 verifyGoogleFormat("operator void*();");
6367 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00006368 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00006369
6370 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00006371 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
6372 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006373}
6374
Daniel Jasper1c220482015-02-25 10:30:06 +00006375TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00006376 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
6377 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
6378 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
6379 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
6380 verifyFormat("Deleted &operator=(const Deleted &) &;");
6381 verifyFormat("Deleted &operator=(const Deleted &) &&;");
6382 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
6383 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
6384 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
6385 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
6386 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00006387 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00006388 verifyFormat("template <typename T>\n"
6389 "void F(T) && = delete;",
6390 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00006391
Daniel Jasperaf642c62015-08-25 13:40:51 +00006392 FormatStyle AlignLeft = getLLVMStyle();
6393 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00006394 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00006395 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
6396 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
6397 AlignLeft);
6398 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
6399 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006400 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
6401 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
6402 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
6403 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00006404 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00006405
6406 FormatStyle Spaces = getLLVMStyle();
6407 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006408 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
6409 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
6410 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
6411 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006412
6413 Spaces.SpacesInCStyleCastParentheses = false;
6414 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006415 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
6416 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
6417 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
6418 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006419}
6420
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006421TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00006422 verifyFormat("void f() {\n"
6423 " A *a = new A;\n"
6424 " A *a = new (placement) A;\n"
6425 " delete a;\n"
6426 " delete (A *)a;\n"
6427 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00006428 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6429 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00006430 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6431 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6432 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00006433 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006434}
6435
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006436TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006437 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006438 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006439 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006440 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006441 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006442 verifyIndependentOfContext("int a = b * 10;");
6443 verifyIndependentOfContext("int a = 10 * b;");
6444 verifyIndependentOfContext("int a = b * c;");
6445 verifyIndependentOfContext("int a += b * c;");
6446 verifyIndependentOfContext("int a -= b * c;");
6447 verifyIndependentOfContext("int a *= b * c;");
6448 verifyIndependentOfContext("int a /= b * c;");
6449 verifyIndependentOfContext("int a = *b;");
6450 verifyIndependentOfContext("int a = *b * c;");
6451 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00006452 verifyIndependentOfContext("int a = b * (10);");
6453 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006454 verifyIndependentOfContext("return 10 * b;");
6455 verifyIndependentOfContext("return *b * *c;");
6456 verifyIndependentOfContext("return a & ~b;");
6457 verifyIndependentOfContext("f(b ? *c : *d);");
6458 verifyIndependentOfContext("int a = b ? *c : *d;");
6459 verifyIndependentOfContext("*b = a;");
6460 verifyIndependentOfContext("a * ~b;");
6461 verifyIndependentOfContext("a * !b;");
6462 verifyIndependentOfContext("a * +b;");
6463 verifyIndependentOfContext("a * -b;");
6464 verifyIndependentOfContext("a * ++b;");
6465 verifyIndependentOfContext("a * --b;");
6466 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00006467 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006468 verifyIndependentOfContext("f() * b;");
6469 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006470 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006471 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00006472 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006473 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00006474 verifyIndependentOfContext("return sizeof(int **);");
6475 verifyIndependentOfContext("return sizeof(int ******);");
6476 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00006477 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006478 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00006479 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00006480 verifyGoogleFormat("return sizeof(int**);");
6481 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
6482 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006483 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00006484 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00006485 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00006486 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00006487 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00006488 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00006489 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00006490 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00006491 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00006492 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00006493 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00006494 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00006495 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00006496 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00006497 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00006498 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00006499 verifyFormat("void f(const MyOverride &override);");
6500 verifyFormat("void f(const MyFinal &final);");
6501 verifyIndependentOfContext("bool a = f() && override.f();");
6502 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00006503
Daniel Jasper5b49f472013-01-23 12:10:53 +00006504 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00006505
Daniel Jasper5b49f472013-01-23 12:10:53 +00006506 verifyIndependentOfContext("A<int *> a;");
6507 verifyIndependentOfContext("A<int **> a;");
6508 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00006509 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006510 verifyIndependentOfContext(
6511 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006512 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00006513 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00006514 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00006515 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00006516 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00006517
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00006518 verifyFormat(
6519 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6520 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6521
Daniel Jasper1f5d6372016-06-13 14:45:12 +00006522 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00006523 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00006524 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006525 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00006526 verifyGoogleFormat("A<int*> a;");
6527 verifyGoogleFormat("A<int**> a;");
6528 verifyGoogleFormat("A<int*, int*> a;");
6529 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006530 verifyGoogleFormat("f(b ? *c : *d);");
6531 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00006532 verifyGoogleFormat("Type* t = **x;");
6533 verifyGoogleFormat("Type* t = *++*x;");
6534 verifyGoogleFormat("*++*x;");
6535 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
6536 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006537 verifyGoogleFormat(
6538 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00006539 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00006540 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
6541 verifyGoogleFormat("template <typename T>\n"
6542 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00006543
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006544 FormatStyle Left = getLLVMStyle();
6545 Left.PointerAlignment = FormatStyle::PAS_Left;
6546 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00006547 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00006548 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006549
Daniel Jasper5b49f472013-01-23 12:10:53 +00006550 verifyIndependentOfContext("a = *(x + y);");
6551 verifyIndependentOfContext("a = &(x + y);");
6552 verifyIndependentOfContext("*(x + y).call();");
6553 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006554 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00006555
Daniel Jasper5b49f472013-01-23 12:10:53 +00006556 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00006557 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00006558 "int *MyValues = {\n"
6559 " *A, // Operator detection might be confused by the '{'\n"
6560 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00006561 "};");
Nico Weber80a82762013-01-17 17:17:19 +00006562
Daniel Jasper5b49f472013-01-23 12:10:53 +00006563 verifyIndependentOfContext("if (int *a = &b)");
6564 verifyIndependentOfContext("if (int &a = *b)");
6565 verifyIndependentOfContext("if (a & b[i])");
6566 verifyIndependentOfContext("if (a::b::c::d & b[i])");
6567 verifyIndependentOfContext("if (*b[i])");
6568 verifyIndependentOfContext("if (int *a = (&b))");
6569 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00006570 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00006571 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00006572 verifyFormat("void f() {\n"
6573 " for (const int &v : Values) {\n"
6574 " }\n"
6575 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006576 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
6577 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00006578 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00006579
Daniel Jaspera98da3d2013-11-07 19:56:07 +00006580 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006581 verifyFormat("#define MACRO \\\n"
6582 " int *i = a * b; \\\n"
6583 " void f(a *b);",
6584 getLLVMStyleWithColumns(19));
6585
Daniel Jasper97b89482013-03-13 07:49:51 +00006586 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006587 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006588 verifyIndependentOfContext("T **t = new T *;");
6589 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00006590 verifyGoogleFormat("A = new SomeType*[Length]();");
6591 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006592 verifyGoogleFormat("T** t = new T*;");
6593 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006594
Daniel Jasper990ff972013-05-07 14:17:18 +00006595 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006596 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00006597 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00006598 verifyFormat("STATIC_ASSERT((a & b) == 0);");
6599 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006600 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006601 "typename t::if<x && y>::type f() {}");
6602 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006603 verifyFormat("vector<int *> v;");
6604 verifyFormat("vector<int *const> v;");
6605 verifyFormat("vector<int *const **const *> v;");
6606 verifyFormat("vector<int *volatile> v;");
6607 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006608 verifyFormat("foo<b && false>();");
6609 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00006610 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00006611 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006612 "template <class T, class = typename std::enable_if<\n"
6613 " std::is_integral<T>::value &&\n"
6614 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
6615 "void F();",
6616 getLLVMStyleWithColumns(70));
6617 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00006618 "template <class T,\n"
6619 " class = typename std::enable_if<\n"
6620 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006621 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
6622 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006623 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00006624 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006625 verifyFormat(
6626 "template <class T,\n"
6627 " class = typename ::std::enable_if<\n"
6628 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6629 "void F();",
6630 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006631
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006632 verifyIndependentOfContext("MACRO(int *i);");
6633 verifyIndependentOfContext("MACRO(auto *a);");
6634 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006635 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006636 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006637 // FIXME: Is there a way to make this work?
6638 // verifyIndependentOfContext("MACRO(A *a);");
6639
Daniel Jasper32ccb032014-06-23 07:36:18 +00006640 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006641 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006642
Daniel Jasper866468a2014-04-14 13:15:29 +00006643 EXPECT_EQ("#define OP(x) \\\n"
6644 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6645 " return s << a.DebugString(); \\\n"
6646 " }",
6647 format("#define OP(x) \\\n"
6648 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6649 " return s << a.DebugString(); \\\n"
6650 " }",
6651 getLLVMStyleWithColumns(50)));
6652
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006653 // FIXME: We cannot handle this case yet; we might be able to figure out that
6654 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006655 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006656
6657 FormatStyle PointerMiddle = getLLVMStyle();
6658 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6659 verifyFormat("delete *x;", PointerMiddle);
6660 verifyFormat("int * x;", PointerMiddle);
6661 verifyFormat("template <int * y> f() {}", PointerMiddle);
6662 verifyFormat("int * f(int * a) {}", PointerMiddle);
6663 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6664 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6665 verifyFormat("A<int *> a;", PointerMiddle);
6666 verifyFormat("A<int **> a;", PointerMiddle);
6667 verifyFormat("A<int *, int *> a;", PointerMiddle);
6668 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006669 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6670 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006671 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006672
6673 // Member function reference qualifiers aren't binary operators.
6674 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006675 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006676 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006677 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006678 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006679 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006680}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006681
Daniel Jasperee6d6502013-07-17 20:25:02 +00006682TEST_F(FormatTest, UnderstandsAttributes) {
6683 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006684 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6685 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006686 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006687 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006688 verifyFormat("__attribute__((nodebug)) void\n"
6689 "foo() {}\n",
6690 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006691}
6692
Daniel Jasper10cd5812013-05-06 06:35:44 +00006693TEST_F(FormatTest, UnderstandsEllipsis) {
6694 verifyFormat("int printf(const char *fmt, ...);");
6695 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006696 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6697
6698 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006699 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006700 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006701}
6702
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006703TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006704 EXPECT_EQ("int *a;\n"
6705 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006706 "int *a;",
6707 format("int *a;\n"
6708 "int* a;\n"
6709 "int *a;",
6710 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006711 EXPECT_EQ("int* a;\n"
6712 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006713 "int* a;",
6714 format("int* a;\n"
6715 "int* a;\n"
6716 "int *a;",
6717 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006718 EXPECT_EQ("int *a;\n"
6719 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006720 "int *a;",
6721 format("int *a;\n"
6722 "int * a;\n"
6723 "int * a;",
6724 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006725 EXPECT_EQ("auto x = [] {\n"
6726 " int *a;\n"
6727 " int *a;\n"
6728 " int *a;\n"
6729 "};",
6730 format("auto x=[]{int *a;\n"
6731 "int * a;\n"
6732 "int * a;};",
6733 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006734}
6735
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006736TEST_F(FormatTest, UnderstandsRvalueReferences) {
6737 verifyFormat("int f(int &&a) {}");
6738 verifyFormat("int f(int a, char &&b) {}");
6739 verifyFormat("void f() { int &&a = b; }");
6740 verifyGoogleFormat("int f(int a, char&& b) {}");
6741 verifyGoogleFormat("void f() { int&& a = b; }");
6742
Daniel Jasper1eff9082013-05-27 16:36:33 +00006743 verifyIndependentOfContext("A<int &&> a;");
6744 verifyIndependentOfContext("A<int &&, int &&> a;");
6745 verifyGoogleFormat("A<int&&> a;");
6746 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006747
6748 // Not rvalue references:
6749 verifyFormat("template <bool B, bool C> class A {\n"
6750 " static_assert(B && C, \"Something is wrong\");\n"
6751 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006752 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6753 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006754 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006755}
6756
Manuel Klimekc1237a82013-01-23 14:08:21 +00006757TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6758 verifyFormat("void f() {\n"
6759 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006760 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006761 "}",
6762 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006763}
6764
Daniel Jasperef906a92013-01-13 08:01:36 +00006765TEST_F(FormatTest, FormatsCasts) {
6766 verifyFormat("Type *A = static_cast<Type *>(P);");
6767 verifyFormat("Type *A = (Type *)P;");
6768 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6769 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006770 verifyFormat("int a = (int)2.0f;");
6771 verifyFormat("x[(int32)y];");
6772 verifyFormat("x = (int32)y;");
6773 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6774 verifyFormat("int a = (int)*b;");
6775 verifyFormat("int a = (int)2.0f;");
6776 verifyFormat("int a = (int)~0;");
6777 verifyFormat("int a = (int)++a;");
6778 verifyFormat("int a = (int)sizeof(int);");
6779 verifyFormat("int a = (int)+2;");
6780 verifyFormat("my_int a = (my_int)2.0f;");
6781 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006782 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006783 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006784 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006785 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006786 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006787
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006788 verifyFormat("void f() { my_int a = (my_int)*b; }");
6789 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6790 verifyFormat("my_int a = (my_int)~0;");
6791 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006792 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006793 verifyFormat("my_int a = (my_int)1;");
6794 verifyFormat("my_int a = (my_int *)1;");
6795 verifyFormat("my_int a = (const my_int)-1;");
6796 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006797 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006798 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006799 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006800 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006801
6802 // FIXME: single value wrapped with paren will be treated as cast.
6803 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006804
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006805 verifyFormat("{ (void)F; }");
6806
Daniel Jasper998cabc2013-07-18 14:46:07 +00006807 // Don't break after a cast's
6808 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6809 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6810 " bbbbbbbbbbbbbbbbbbbbbb);");
6811
Daniel Jasperef906a92013-01-13 08:01:36 +00006812 // These are not casts.
6813 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006814 verifyFormat("f(foo)->b;");
6815 verifyFormat("f(foo).b;");
6816 verifyFormat("f(foo)(b);");
6817 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006818 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006819 verifyFormat("(*funptr)(foo)[4];");
6820 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006821 verifyFormat("void f(int *);");
6822 verifyFormat("void f(int *) = 0;");
6823 verifyFormat("void f(SmallVector<int>) {}");
6824 verifyFormat("void f(SmallVector<int>);");
6825 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006826 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006827 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006828 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006829 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6830 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006831 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006832
Daniel Jasperba0bda92013-02-23 08:07:18 +00006833 // These are not casts, but at some point were confused with casts.
6834 verifyFormat("virtual void foo(int *) override;");
6835 verifyFormat("virtual void foo(char &) const;");
6836 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006837 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006838 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006839 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006840 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006841
6842 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6843 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006844 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006845 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006846 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6847 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6848 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006849}
6850
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006851TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006852 verifyFormat("A<bool()> a;");
6853 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006854 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006855 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006856 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006857 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006858 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006859 verifyFormat("template <class CallbackClass>\n"
6860 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006861
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006862 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6863 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006864 verifyGoogleFormat(
6865 "template <class CallbackClass>\n"
6866 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006867
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006868 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006869 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006870 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006871 verifyFormat("some_var = function(*some_pointer_var)[0];");
6872 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006873 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006874 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006875}
6876
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006877TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6878 verifyFormat("A (*foo_)[6];");
6879 verifyFormat("vector<int> (*foo_)[6];");
6880}
6881
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006882TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6883 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6884 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6885 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6886 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006887 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6888 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006889
6890 // Different ways of ()-initializiation.
6891 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6892 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6893 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6894 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6895 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6896 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006897 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6898 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006899}
6900
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006901TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006902 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006903 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006904 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006905 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006906 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006907 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006908 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6909 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006910 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6911 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006912 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6913 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006914 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6915 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006916 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6917 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006918 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6919 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6920 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6921 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006922 FormatStyle Indented = getLLVMStyle();
6923 Indented.IndentWrappedFunctionNames = true;
6924 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6925 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6926 Indented);
6927 verifyFormat(
6928 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6929 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6930 Indented);
6931 verifyFormat(
6932 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6933 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6934 Indented);
6935 verifyFormat(
6936 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6937 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6938 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006939
6940 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006941 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6942 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6943 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006944
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006945 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006946 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006947 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006948 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6949 " SourceLocation L, IdentifierIn *II,\n"
6950 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006951 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006952 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006953 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006954 " const SomeType<string, SomeOtherTemplateParameter>\n"
6955 " &ReallyReallyLongParameterName,\n"
6956 " const SomeType<string, SomeOtherTemplateParameter>\n"
6957 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006958 verifyFormat("template <typename A>\n"
6959 "SomeLoooooooooooooooooooooongType<\n"
6960 " typename some_namespace::SomeOtherType<A>::Type>\n"
6961 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006962
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006963 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006964 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6965 " aaaaaaaaaaaaaaaaaaaaaaa;");
6966 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006967 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6968 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006969 verifyGoogleFormat(
6970 "some_namespace::LongReturnType\n"
6971 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006972 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006973
6974 verifyGoogleFormat("template <typename T>\n"
6975 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006976 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006977 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6978 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006979
6980 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006981 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6982 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006983 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6984 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6985 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6986 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6987 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6988 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6989 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006990}
6991
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006992TEST_F(FormatTest, FormatsArrays) {
6993 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6994 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006995 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6996 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006997 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6998 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006999 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7000 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
7001 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7002 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
7003 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7004 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7005 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
7006 verifyFormat(
7007 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
7008 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7009 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00007010 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
7011 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00007012
7013 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
7014 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00007015 verifyFormat(
7016 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
7017 " .aaaaaaa[0]\n"
7018 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00007019 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00007020
7021 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00007022
7023 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
7024 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00007025}
7026
Daniel Jaspere9de2602012-12-06 09:56:08 +00007027TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
7028 verifyFormat("(a)->b();");
7029 verifyFormat("--a;");
7030}
7031
Daniel Jasper8b529712012-12-04 13:02:32 +00007032TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00007033 verifyFormat("#include <string>\n"
7034 "#include <a/b/c.h>\n"
7035 "#include \"a/b/string\"\n"
7036 "#include \"string.h\"\n"
7037 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007038 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00007039 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00007040 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00007041 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00007042 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00007043 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
7044 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00007045 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
7046 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00007047
Daniel Jasper5ef433f2013-01-13 08:12:18 +00007048 verifyFormat("#import <string>");
7049 verifyFormat("#import <a/b/c.h>");
7050 verifyFormat("#import \"a/b/string\"");
7051 verifyFormat("#import \"string.h\"");
7052 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00007053 verifyFormat("#if __has_include(<strstream>)\n"
7054 "#include <strstream>\n"
7055 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00007056
Daniel Jasper343643b2014-08-13 08:29:18 +00007057 verifyFormat("#define MY_IMPORT <a/b>");
7058
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00007059 // Protocol buffer definition or missing "#".
7060 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
7061 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00007062
7063 FormatStyle Style = getLLVMStyle();
7064 Style.AlwaysBreakBeforeMultilineStrings = true;
7065 Style.ColumnLimit = 0;
7066 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00007067
7068 // But 'import' might also be a regular C++ namespace.
7069 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7070 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00007071}
7072
Alexander Kornienko578fdd82012-12-06 18:03:27 +00007073//===----------------------------------------------------------------------===//
7074// Error recovery tests.
7075//===----------------------------------------------------------------------===//
7076
Daniel Jasper66e9dee2013-02-14 09:19:04 +00007077TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007078 FormatStyle NoBinPacking = getLLVMStyle();
7079 NoBinPacking.BinPackParameters = false;
7080 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
7081 " double *min_x,\n"
7082 " double *max_x,\n"
7083 " double *min_y,\n"
7084 " double *max_y,\n"
7085 " double *min_z,\n"
7086 " double *max_z, ) {}",
7087 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00007088}
7089
Daniel Jasper83a54d22013-01-10 09:26:47 +00007090TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00007091 verifyFormat("void f() { return; }\n42");
7092 verifyFormat("void f() {\n"
7093 " if (0)\n"
7094 " return;\n"
7095 "}\n"
7096 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00007097 verifyFormat("void f() { return }\n42");
7098 verifyFormat("void f() {\n"
7099 " if (0)\n"
7100 " return\n"
7101 "}\n"
7102 "42");
7103}
7104
7105TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
7106 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
7107 EXPECT_EQ("void f() {\n"
7108 " if (a)\n"
7109 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007110 "}",
7111 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00007112 EXPECT_EQ("namespace N {\n"
7113 "void f()\n"
7114 "}",
7115 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00007116 EXPECT_EQ("namespace N {\n"
7117 "void f() {}\n"
7118 "void g()\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007119 "}",
7120 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00007121}
7122
Daniel Jasper2df93312013-01-09 10:16:05 +00007123TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
7124 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00007125 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007126 " b;",
7127 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00007128 verifyFormat("function(\n"
7129 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007130 " LoooooooooooongArgument);\n",
7131 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00007132}
7133
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007134TEST_F(FormatTest, IncorrectAccessSpecifier) {
7135 verifyFormat("public:");
7136 verifyFormat("class A {\n"
7137 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007138 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007139 "};");
7140 verifyFormat("public\n"
7141 "int qwerty;");
7142 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007143 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007144 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007145 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007146 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007147 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007148}
Daniel Jasperf7935112012-12-03 18:12:45 +00007149
Daniel Jasper291f9362013-03-20 15:58:10 +00007150TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
7151 verifyFormat("{");
7152 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00007153 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00007154}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007155
7156TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007157 verifyFormat("do {\n}");
7158 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007159 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007160 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007161 "wheeee(fun);");
7162 verifyFormat("do {\n"
7163 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00007164 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007165}
7166
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007167TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00007168 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007169 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007170 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007171 verifyFormat("while {\n foo;\n foo();\n}");
7172 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00007173}
7174
Daniel Jasperc0880a92013-01-04 18:52:56 +00007175TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007176 verifyIncompleteFormat("namespace {\n"
7177 "class Foo { Foo (\n"
7178 "};\n"
7179 "} // comment");
Daniel Jasperc0880a92013-01-04 18:52:56 +00007180}
7181
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007182TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007183 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007184 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
7185 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007186 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007187
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007188 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007189 " {\n"
7190 " breakme(\n"
7191 " qwe);\n"
7192 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007193 format("{\n"
7194 " {\n"
7195 " breakme(qwe);\n"
7196 "}\n",
7197 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007198}
7199
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00007200TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007201 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007202 " avariable,\n"
7203 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007204 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00007205}
7206
Manuel Klimek762dd182013-01-21 10:07:49 +00007207TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007208 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00007209}
7210
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007211TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007212 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00007213 verifyFormat("vector<int> x{\n"
7214 " 1, 2, 3, 4,\n"
7215 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007216 verifyFormat("vector<T> x{{}, {}, {}, {}};");
7217 verifyFormat("f({1, 2});");
7218 verifyFormat("auto v = Foo{-1};");
7219 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
7220 verifyFormat("Class::Class : member{1, 2, 3} {}");
7221 verifyFormat("new vector<int>{1, 2, 3};");
7222 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00007223 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007224 verifyFormat("return {arg1, arg2};");
7225 verifyFormat("return {arg1, SomeType{parameter}};");
7226 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
7227 verifyFormat("new T{arg1, arg2};");
7228 verifyFormat("f(MyMap[{composite, key}]);");
7229 verifyFormat("class Class {\n"
7230 " T member = {arg1, arg2};\n"
7231 "};");
7232 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00007233 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
7234 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00007235
Daniel Jasper438059e2014-05-22 12:11:13 +00007236 verifyFormat("int foo(int i) { return fo1{}(i); }");
7237 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007238 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00007239 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00007240 verifyFormat("Node n{1, Node{1000}, //\n"
7241 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00007242 verifyFormat("Aaaa aaaaaaa{\n"
7243 " {\n"
7244 " aaaa,\n"
7245 " },\n"
7246 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00007247 verifyFormat("class C : public D {\n"
7248 " SomeClass SC{2};\n"
7249 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00007250 verifyFormat("class C : public A {\n"
7251 " class D : public B {\n"
7252 " void f() { int i{2}; }\n"
7253 " };\n"
7254 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00007255 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00007256
Daniel Jaspere4ada022016-12-13 10:05:03 +00007257 // Cases where distinguising braced lists and blocks is hard.
7258 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
7259 verifyFormat("void f() {\n"
7260 " return; // comment\n"
7261 "}\n"
7262 "SomeType t;");
7263 verifyFormat("void f() {\n"
7264 " if (a) {\n"
7265 " f();\n"
7266 " }\n"
7267 "}\n"
7268 "SomeType t;");
7269
Daniel Jasper08434342015-05-26 07:26:26 +00007270 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007271 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00007272 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007273 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
7274 " bbbbb,\n"
7275 " ccccc,\n"
7276 " ddddd,\n"
7277 " eeeee,\n"
7278 " ffffff,\n"
7279 " ggggg,\n"
7280 " hhhhhh,\n"
7281 " iiiiii,\n"
7282 " jjjjjj,\n"
7283 " kkkkkk};",
7284 NoBinPacking);
7285 verifyFormat("const Aaaaaa aaaaa = {\n"
7286 " aaaaa,\n"
7287 " bbbbb,\n"
7288 " ccccc,\n"
7289 " ddddd,\n"
7290 " eeeee,\n"
7291 " ffffff,\n"
7292 " ggggg,\n"
7293 " hhhhhh,\n"
7294 " iiiiii,\n"
7295 " jjjjjj,\n"
7296 " kkkkkk,\n"
7297 "};",
7298 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00007299 verifyFormat(
7300 "const Aaaaaa aaaaa = {\n"
7301 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
7302 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
7303 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
7304 "};",
7305 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007306
Chandler Carruthf8b72662014-03-02 12:37:31 +00007307 // FIXME: The alignment of these trailing comments might be bad. Then again,
7308 // this might be utterly useless in real code.
7309 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00007310 " : some_value{ //\n"
7311 " aaaaaaa, //\n"
7312 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00007313
Chandler Carruthf8b72662014-03-02 12:37:31 +00007314 // In braced lists, the first comment is always assumed to belong to the
7315 // first element. Thus, it can be moved to the next or previous line as
7316 // appropriate.
7317 EXPECT_EQ("function({// First element:\n"
7318 " 1,\n"
7319 " // Second element:\n"
7320 " 2});",
7321 format("function({\n"
7322 " // First element:\n"
7323 " 1,\n"
7324 " // Second element:\n"
7325 " 2});"));
7326 EXPECT_EQ("std::vector<int> MyNumbers{\n"
7327 " // First element:\n"
7328 " 1,\n"
7329 " // Second element:\n"
7330 " 2};",
7331 format("std::vector<int> MyNumbers{// First element:\n"
7332 " 1,\n"
7333 " // Second element:\n"
7334 " 2};",
7335 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00007336 // A trailing comma should still lead to an enforced line break.
7337 EXPECT_EQ("vector<int> SomeVector = {\n"
7338 " // aaa\n"
7339 " 1, 2,\n"
7340 "};",
7341 format("vector<int> SomeVector = { // aaa\n"
7342 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00007343
Chandler Carruthf8b72662014-03-02 12:37:31 +00007344 FormatStyle ExtraSpaces = getLLVMStyle();
7345 ExtraSpaces.Cpp11BracedListStyle = false;
7346 ExtraSpaces.ColumnLimit = 75;
7347 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
7348 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
7349 verifyFormat("f({ 1, 2 });", ExtraSpaces);
7350 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
7351 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
7352 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
7353 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
7354 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
7355 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
7356 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
7357 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
7358 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
7359 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
7360 verifyFormat("class Class {\n"
7361 " T member = { arg1, arg2 };\n"
7362 "};",
7363 ExtraSpaces);
7364 verifyFormat(
7365 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7366 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
7367 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
7368 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
7369 ExtraSpaces);
7370 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00007371 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007372 ExtraSpaces);
7373 verifyFormat(
7374 "someFunction(OtherParam,\n"
7375 " BracedList{ // comment 1 (Forcing interesting break)\n"
7376 " param1, param2,\n"
7377 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00007378 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007379 ExtraSpaces);
7380 verifyFormat(
7381 "std::this_thread::sleep_for(\n"
7382 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
7383 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00007384 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00007385 " aaaaaaa,\n"
7386 " aaaaaaaaaa,\n"
7387 " aaaaa,\n"
7388 " aaaaaaaaaaaaaaa,\n"
7389 " aaa,\n"
7390 " aaaaaaaaaa,\n"
7391 " a,\n"
7392 " aaaaaaaaaaaaaaaaaaaaa,\n"
7393 " aaaaaaaaaaaa,\n"
7394 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
7395 " aaaaaaa,\n"
7396 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007397 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00007398}
7399
Daniel Jasper33b909c2013-10-25 14:29:37 +00007400TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007401 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7402 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7403 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7404 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7405 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7406 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007407 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007408 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00007409 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007410 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7411 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007412 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007413 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7414 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7415 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
7416 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7417 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7418 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7419 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007420 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007421 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7422 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007423 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7424 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7425 " // Separating comment.\n"
7426 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
7427 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7428 " // Leading comment\n"
7429 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7430 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007431 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7432 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007433 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00007434 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7435 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007436 getLLVMStyleWithColumns(38));
7437 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007438 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
7439 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007440 verifyFormat(
7441 "static unsigned SomeValues[10][3] = {\n"
7442 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
7443 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
7444 verifyFormat("static auto fields = new vector<string>{\n"
7445 " \"aaaaaaaaaaaaa\",\n"
7446 " \"aaaaaaaaaaaaa\",\n"
7447 " \"aaaaaaaaaaaa\",\n"
7448 " \"aaaaaaaaaaaaaa\",\n"
7449 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7450 " \"aaaaaaaaaaaa\",\n"
7451 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7452 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00007453 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
7454 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
7455 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
7456 " 3, cccccccccccccccccccccc};",
7457 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00007458
7459 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00007460 verifyFormat("vector<int> x = {\n"
7461 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
7462 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00007463 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00007464 verifyFormat("vector<int> x = {\n"
7465 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00007466 "};",
7467 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00007468 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7469 " 1, 1, 1, 1,\n"
7470 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00007471 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007472
Daniel Jasper60c27072015-05-13 08:16:00 +00007473 // Trailing comment in the first line.
7474 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
7475 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
7476 " 111111111, 222222222, 3333333333, 444444444, //\n"
7477 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00007478 // Trailing comment in the last line.
7479 verifyFormat("int aaaaa[] = {\n"
7480 " 1, 2, 3, // comment\n"
7481 " 4, 5, 6 // comment\n"
7482 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00007483
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007484 // With nested lists, we should either format one item per line or all nested
7485 // lists one on line.
7486 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007487 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
7488 " {aaaaaaaaaaaaaaaaaaa},\n"
7489 " {aaaaaaaaaaaaaaaaaaaaa},\n"
7490 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00007491 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00007492 verifyFormat(
7493 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007494 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
7495 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
7496 " {aaa, aaa},\n"
7497 " {aaa, aaa},\n"
7498 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
7499 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7500 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00007501
7502 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007503 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
7504 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00007505
7506 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00007507
Daniel Jaspereb65e912015-12-21 18:31:15 +00007508 // No braced initializer here.
7509 verifyFormat("void f() {\n"
7510 " struct Dummy {};\n"
7511 " f(v);\n"
7512 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00007513
7514 // Long lists should be formatted in columns even if they are nested.
7515 verifyFormat(
7516 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7517 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7518 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7519 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7520 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7521 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00007522
7523 // Allow "single-column" layout even if that violates the column limit. There
7524 // isn't going to be a better way.
7525 verifyFormat("std::vector<int> a = {\n"
7526 " aaaaaaaa,\n"
7527 " aaaaaaaa,\n"
7528 " aaaaaaaa,\n"
7529 " aaaaaaaa,\n"
7530 " aaaaaaaaaa,\n"
7531 " aaaaaaaa,\n"
7532 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
7533 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00007534 verifyFormat("vector<int> aaaa = {\n"
7535 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7536 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7537 " aaaaaa.aaaaaaa,\n"
7538 " aaaaaa.aaaaaaa,\n"
7539 " aaaaaa.aaaaaaa,\n"
7540 " aaaaaa.aaaaaaa,\n"
7541 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007542
7543 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00007544 verifyFormat("someFunction(Param, {List1, List2,\n"
7545 " List3});",
7546 getLLVMStyleWithColumns(35));
7547 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007548 " {List1, List2,\n"
7549 " List3});",
7550 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00007551 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
7552 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007553}
7554
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007555TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007556 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00007557 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007558
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007559 verifyFormat("void f() { return 42; }");
7560 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007561 " return 42;\n"
7562 "}",
7563 DoNotMerge);
7564 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007565 " // Comment\n"
7566 "}");
7567 verifyFormat("{\n"
7568 "#error {\n"
7569 " int a;\n"
7570 "}");
7571 verifyFormat("{\n"
7572 " int a;\n"
7573 "#error {\n"
7574 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00007575 verifyFormat("void f() {} // comment");
7576 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00007577 verifyFormat("void f() {\n"
7578 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007579 DoNotMerge);
7580 verifyFormat("void f() {\n"
7581 " int a;\n"
7582 "} // comment",
7583 DoNotMerge);
7584 verifyFormat("void f() {\n"
7585 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00007586 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007587
7588 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7589 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7590
7591 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7592 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007593 verifyFormat("class C {\n"
7594 " C()\n"
7595 " : iiiiiiii(nullptr),\n"
7596 " kkkkkkk(nullptr),\n"
7597 " mmmmmmm(nullptr),\n"
7598 " nnnnnnn(nullptr) {}\n"
7599 "};",
7600 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007601
7602 FormatStyle NoColumnLimit = getLLVMStyle();
7603 NoColumnLimit.ColumnLimit = 0;
7604 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7605 EXPECT_EQ("class C {\n"
7606 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007607 "};",
7608 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007609 EXPECT_EQ("A()\n"
7610 " : b(0) {\n"
7611 "}",
7612 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7613
7614 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007615 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7616 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007617 EXPECT_EQ("A()\n"
7618 " : b(0) {\n"
7619 "}",
7620 format("A():b(0){}", DoNotMergeNoColumnLimit));
7621 EXPECT_EQ("A()\n"
7622 " : b(0) {\n"
7623 "}",
7624 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007625
7626 verifyFormat("#define A \\\n"
7627 " void f() { \\\n"
7628 " int i; \\\n"
7629 " }",
7630 getLLVMStyleWithColumns(20));
7631 verifyFormat("#define A \\\n"
7632 " void f() { int i; }",
7633 getLLVMStyleWithColumns(21));
7634 verifyFormat("#define A \\\n"
7635 " void f() { \\\n"
7636 " int i; \\\n"
7637 " } \\\n"
7638 " int j;",
7639 getLLVMStyleWithColumns(22));
7640 verifyFormat("#define A \\\n"
7641 " void f() { int i; } \\\n"
7642 " int j;",
7643 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007644}
7645
Daniel Jasperd74cf402014-04-08 12:46:38 +00007646TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7647 FormatStyle MergeInlineOnly = getLLVMStyle();
7648 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7649 verifyFormat("class C {\n"
7650 " int f() { return 42; }\n"
7651 "};",
7652 MergeInlineOnly);
7653 verifyFormat("int f() {\n"
7654 " return 42;\n"
7655 "}",
7656 MergeInlineOnly);
7657}
7658
Manuel Klimeke01bab52013-01-15 13:38:33 +00007659TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7660 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007661 verifyFormat("struct foo a = {bar};\nint n;");
7662 verifyFormat("class foo a = {bar};\nint n;");
7663 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007664
7665 // Elaborate types inside function definitions.
7666 verifyFormat("struct foo f() {}\nint n;");
7667 verifyFormat("class foo f() {}\nint n;");
7668 verifyFormat("union foo f() {}\nint n;");
7669
7670 // Templates.
7671 verifyFormat("template <class X> void f() {}\nint n;");
7672 verifyFormat("template <struct X> void f() {}\nint n;");
7673 verifyFormat("template <union X> void f() {}\nint n;");
7674
7675 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007676 verifyFormat("struct {\n} n;");
7677 verifyFormat(
7678 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007679 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007680 verifyFormat("class MACRO Z {\n} n;");
7681 verifyFormat("class MACRO(X) Z {\n} n;");
7682 verifyFormat("class __attribute__(X) Z {\n} n;");
7683 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007684 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007685 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007686 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7687 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007688
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007689 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007690 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007691
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007692 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007693 verifyFormat(
7694 "template <typename F>\n"
7695 "Matcher(const Matcher<F> &Other,\n"
7696 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7697 " !is_same<F, T>::value>::type * = 0)\n"
7698 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7699
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007700 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007701 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007702 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007703
7704 // FIXME:
7705 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007706 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007707
Manuel Klimeke01bab52013-01-15 13:38:33 +00007708 // Elaborate types where incorrectly parsing the structural element would
7709 // break the indent.
7710 verifyFormat("if (true)\n"
7711 " class X x;\n"
7712 "else\n"
7713 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007714
7715 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007716 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007717}
7718
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007719TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007720 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7721 format("#error Leave all white!!!!! space* alone!\n"));
7722 EXPECT_EQ(
7723 "#warning Leave all white!!!!! space* alone!\n",
7724 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007725 EXPECT_EQ("#error 1", format(" # error 1"));
7726 EXPECT_EQ("#warning 1", format(" # warning 1"));
7727}
7728
Daniel Jasper4431aa92013-04-23 13:54:04 +00007729TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007730 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007731 verifyFormat("#if (AAAA && BBBB)");
7732 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007733 // FIXME: Come up with a better indentation for #elif.
7734 verifyFormat(
7735 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7736 " defined(BBBBBBBB)\n"
7737 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7738 " defined(BBBBBBBB)\n"
7739 "#endif",
7740 getLLVMStyleWithColumns(65));
7741}
7742
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007743TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7744 FormatStyle AllowsMergedIf = getGoogleStyle();
7745 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7746 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7747 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007748 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7749 EXPECT_EQ("if (true) return 42;",
7750 format("if (true)\nreturn 42;", AllowsMergedIf));
7751 FormatStyle ShortMergedIf = AllowsMergedIf;
7752 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007753 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007754 " if (true) return 42;",
7755 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007756 verifyFormat("#define A \\\n"
7757 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007758 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007759 "#define B",
7760 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007761 verifyFormat("#define A \\\n"
7762 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007763 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007764 "g();",
7765 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007766 verifyFormat("{\n"
7767 "#ifdef A\n"
7768 " // Comment\n"
7769 " if (true) continue;\n"
7770 "#endif\n"
7771 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007772 " if (true) continue;\n"
7773 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007774 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007775 ShortMergedIf.ColumnLimit = 29;
7776 verifyFormat("#define A \\\n"
7777 " if (aaaaaaaaaa) return 1; \\\n"
7778 " return 2;",
7779 ShortMergedIf);
7780 ShortMergedIf.ColumnLimit = 28;
7781 verifyFormat("#define A \\\n"
7782 " if (aaaaaaaaaa) \\\n"
7783 " return 1; \\\n"
7784 " return 2;",
7785 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007786}
7787
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007788TEST_F(FormatTest, BlockCommentsInControlLoops) {
7789 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7790 " f();\n"
7791 "}");
7792 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7793 " f();\n"
7794 "} /* another comment */ else /* comment #3 */ {\n"
7795 " g();\n"
7796 "}");
7797 verifyFormat("while (0) /* a comment in a strange place */ {\n"
7798 " f();\n"
7799 "}");
7800 verifyFormat("for (;;) /* a comment in a strange place */ {\n"
7801 " f();\n"
7802 "}");
7803 verifyFormat("do /* a comment in a strange place */ {\n"
7804 " f();\n"
7805 "} /* another comment */ while (0);");
7806}
7807
7808TEST_F(FormatTest, BlockComments) {
7809 EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
7810 format("/* *//* */ /* */\n/* *//* */ /* */"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007811 EXPECT_EQ("/* */ a /* */ b;", format(" /* */ a/* */ b;"));
Daniel Jaspera49393f2013-08-28 09:07:32 +00007812 EXPECT_EQ("#define A /*123*/ \\\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007813 " b\n"
7814 "/* */\n"
7815 "someCall(\n"
7816 " parameter);",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00007817 format("#define A /*123*/ b\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007818 "/* */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007819 "someCall(parameter);",
7820 getLLVMStyleWithColumns(15)));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007821
7822 EXPECT_EQ("#define A\n"
7823 "/* */ someCall(\n"
7824 " parameter);",
7825 format("#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007826 "/* */someCall(parameter);",
7827 getLLVMStyleWithColumns(15)));
Daniel Jasper51fb2b22013-05-30 06:40:07 +00007828 EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007829 EXPECT_EQ("/*\n"
7830 "*\n"
7831 " * aaaaaa\n"
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00007832 " * aaaaaa\n"
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007833 "*/",
7834 format("/*\n"
7835 "*\n"
7836 " * aaaaaa aaaaaa\n"
7837 "*/",
7838 getLLVMStyleWithColumns(10)));
Daniel Jasperce257f22013-05-30 17:27:48 +00007839 EXPECT_EQ("/*\n"
7840 "**\n"
7841 "* aaaaaa\n"
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007842 "*aaaaaa\n"
Daniel Jasperce257f22013-05-30 17:27:48 +00007843 "*/",
7844 format("/*\n"
7845 "**\n"
7846 "* aaaaaa aaaaaa\n"
7847 "*/",
7848 getLLVMStyleWithColumns(10)));
Daniel Jasperacadc8e2016-06-08 09:45:08 +00007849 EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7850 " /* line 1\n"
7851 " bbbbbbbbbbbb */\n"
7852 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7853 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7854 " /* line 1\n"
7855 " bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7856 getLLVMStyleWithColumns(50)));
Daniel Jasper1f140982013-02-04 07:32:14 +00007857
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007858 FormatStyle NoBinPacking = getLLVMStyle();
7859 NoBinPacking.BinPackParameters = false;
Daniel Jasper1f140982013-02-04 07:32:14 +00007860 EXPECT_EQ("someFunction(1, /* comment 1 */\n"
7861 " 2, /* comment 2 */\n"
7862 " 3, /* comment 3 */\n"
Daniel Jasper14e40ec2013-02-04 08:34:57 +00007863 " aaaa,\n"
7864 " bbbb);",
Daniel Jasper1f140982013-02-04 07:32:14 +00007865 format("someFunction (1, /* comment 1 */\n"
7866 " 2, /* comment 2 */ \n"
7867 " 3, /* comment 3 */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007868 "aaaa, bbbb );",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007869 NoBinPacking));
Daniel Jasper38396592013-02-06 15:23:09 +00007870 verifyFormat(
7871 "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7872 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7873 EXPECT_EQ(
7874 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7875 " aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7876 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
7877 format(
7878 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7879 " aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7880 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
Daniel Jasper94f0e132013-02-06 20:07:35 +00007881 EXPECT_EQ(
7882 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7883 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7884 "int cccccccccccccccccccccccccccccc; /* comment */\n",
7885 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7886 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7887 "int cccccccccccccccccccccccccccccc; /* comment */\n"));
Daniel Jasper022612d2013-07-01 09:34:09 +00007888
7889 verifyFormat("void f(int * /* unused */) {}");
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007890
7891 EXPECT_EQ("/*\n"
7892 " **\n"
7893 " */",
7894 format("/*\n"
7895 " **\n"
7896 " */"));
7897 EXPECT_EQ("/*\n"
7898 " *q\n"
7899 " */",
7900 format("/*\n"
7901 " *q\n"
7902 " */"));
7903 EXPECT_EQ("/*\n"
7904 " * q\n"
7905 " */",
7906 format("/*\n"
7907 " * q\n"
7908 " */"));
7909 EXPECT_EQ("/*\n"
7910 " **/",
7911 format("/*\n"
7912 " **/"));
7913 EXPECT_EQ("/*\n"
7914 " ***/",
7915 format("/*\n"
7916 " ***/"));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007917}
7918
Manuel Klimek82b836a2013-02-06 16:40:56 +00007919TEST_F(FormatTest, BlockCommentsInMacros) {
7920 EXPECT_EQ("#define A \\\n"
7921 " { \\\n"
7922 " /* one line */ \\\n"
7923 " someCall();",
7924 format("#define A { \\\n"
7925 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007926 " someCall();",
7927 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007928 EXPECT_EQ("#define A \\\n"
7929 " { \\\n"
7930 " /* previous */ \\\n"
7931 " /* one line */ \\\n"
7932 " someCall();",
7933 format("#define A { \\\n"
7934 " /* previous */ \\\n"
7935 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007936 " someCall();",
7937 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007938}
7939
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007940TEST_F(FormatTest, BlockCommentsAtEndOfLine) {
7941 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007942 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007943 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007944 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007945 "};",
7946 getLLVMStyleWithColumns(15)));
7947 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007948 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007949 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007950 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007951 "};",
7952 getLLVMStyleWithColumns(15)));
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007953 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007954 " 1111 /* a\n"
Krasimir Georgiev91834222017-01-25 13:58:58 +00007955 " */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007956 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007957 format("a = {1111 /* a */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007958 "};",
7959 getLLVMStyleWithColumns(15)));
7960}
7961
Manuel Klimek82b836a2013-02-06 16:40:56 +00007962TEST_F(FormatTest, IndentLineCommentsInStartOfBlockAtEndOfFile) {
Manuel Klimek82b836a2013-02-06 16:40:56 +00007963 verifyFormat("{\n"
Marianne Mailhot-Sarrasin03137c62016-04-14 14:56:49 +00007964 " // a\n"
7965 " // b");
Manuel Klimek82b836a2013-02-06 16:40:56 +00007966}
7967
Manuel Klimekd33516e2013-01-23 10:09:28 +00007968TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007969 verifyFormat("void f(int *a);");
7970 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007971 verifyFormat("class A {\n void f(int *a);\n};");
7972 verifyFormat("class A {\n int *a;\n};");
7973 verifyFormat("namespace a {\n"
7974 "namespace b {\n"
7975 "class A {\n"
7976 " void f() {}\n"
7977 " int *a;\n"
7978 "};\n"
7979 "}\n"
7980 "}");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007981}
7982
Manuel Klimekd33516e2013-01-23 10:09:28 +00007983TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7984 verifyFormat("while");
7985 verifyFormat("operator");
7986}
7987
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007988TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7989 // This code would be painfully slow to format if we didn't skip it.
7990 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
7991 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7992 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7993 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7994 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7995 "A(1, 1)\n"
7996 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7997 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7998 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7999 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8000 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8001 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8002 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8003 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8004 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8005 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
8006 // Deeply nested part is untouched, rest is formatted.
8007 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
8008 format(std::string("int i;\n") + Code + "int j;\n",
8009 getLLVMStyle(), IC_ExpectIncomplete));
8010}
8011
Nico Weber7e6a7a12013-01-08 17:56:31 +00008012//===----------------------------------------------------------------------===//
8013// Objective-C tests.
8014//===----------------------------------------------------------------------===//
8015
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00008016TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
8017 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
8018 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
8019 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00008020 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00008021 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
8022 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
8023 format("-(NSInteger)Method3:(id)anObject;"));
8024 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
8025 format("-(NSInteger)Method4:(id)anObject;"));
8026 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
8027 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
8028 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
8029 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00008030 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
8031 "forAllCells:(BOOL)flag;",
8032 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
8033 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00008034
8035 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00008036 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
8037 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00008038 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
8039 " inRange:(NSRange)range\n"
8040 " outRange:(NSRange)out_range\n"
8041 " outRange1:(NSRange)out_range1\n"
8042 " outRange2:(NSRange)out_range2\n"
8043 " outRange3:(NSRange)out_range3\n"
8044 " outRange4:(NSRange)out_range4\n"
8045 " outRange5:(NSRange)out_range5\n"
8046 " outRange6:(NSRange)out_range6\n"
8047 " outRange7:(NSRange)out_range7\n"
8048 " outRange8:(NSRange)out_range8\n"
8049 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00008050
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008051 // When the function name has to be wrapped.
8052 FormatStyle Style = getLLVMStyle();
8053 Style.IndentWrappedFunctionNames = false;
8054 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
8055 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
8056 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
8057 "}",
8058 Style);
8059 Style.IndentWrappedFunctionNames = true;
8060 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
8061 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
8062 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
8063 "}",
8064 Style);
8065
Nico Weberd6f962f2013-01-10 20:18:33 +00008066 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00008067 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00008068 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
8069 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00008070 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00008071
Daniel Jasper37194282013-05-28 08:33:00 +00008072 verifyFormat("- (int (*)())foo:(int (*)())f;");
8073 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00008074
8075 // If there's no return type (very rare in practice!), LLVM and Google style
8076 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00008077 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00008078 verifyFormat("- foo:(int)f;");
8079 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00008080}
8081
Nico Weber0588b502013-02-07 00:19:29 +00008082
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008083TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00008084 EXPECT_EQ("\"some text \"\n"
8085 "\"other\";",
8086 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00008087 EXPECT_EQ("\"some text \"\n"
8088 "\"other\";",
8089 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008090 EXPECT_EQ(
8091 "#define A \\\n"
8092 " \"some \" \\\n"
8093 " \"text \" \\\n"
8094 " \"other\";",
8095 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
8096 EXPECT_EQ(
8097 "#define A \\\n"
8098 " \"so \" \\\n"
8099 " \"text \" \\\n"
8100 " \"other\";",
8101 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
8102
8103 EXPECT_EQ("\"some text\"",
8104 format("\"some text\"", getLLVMStyleWithColumns(1)));
8105 EXPECT_EQ("\"some text\"",
8106 format("\"some text\"", getLLVMStyleWithColumns(11)));
8107 EXPECT_EQ("\"some \"\n"
8108 "\"text\"",
8109 format("\"some text\"", getLLVMStyleWithColumns(10)));
8110 EXPECT_EQ("\"some \"\n"
8111 "\"text\"",
8112 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00008113 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008114 "\" tex\"\n"
8115 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008116 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00008117 EXPECT_EQ("\"some\"\n"
8118 "\" tex\"\n"
8119 "\" and\"",
8120 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
8121 EXPECT_EQ("\"some\"\n"
8122 "\"/tex\"\n"
8123 "\"/and\"",
8124 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008125
8126 EXPECT_EQ("variable =\n"
8127 " \"long string \"\n"
8128 " \"literal\";",
8129 format("variable = \"long string literal\";",
8130 getLLVMStyleWithColumns(20)));
8131
8132 EXPECT_EQ("variable = f(\n"
8133 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00008134 " \"literal\",\n"
8135 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00008136 " loooooooooooooooooooong);",
8137 format("variable = f(\"long string literal\", short, "
8138 "loooooooooooooooooooong);",
8139 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008140
Daniel Jaspera44991332015-04-29 13:06:49 +00008141 EXPECT_EQ(
8142 "f(g(\"long string \"\n"
8143 " \"literal\"),\n"
8144 " b);",
8145 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008146 EXPECT_EQ("f(g(\"long string \"\n"
8147 " \"literal\",\n"
8148 " a),\n"
8149 " b);",
8150 format("f(g(\"long string literal\", a), b);",
8151 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008152 EXPECT_EQ(
8153 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00008154 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008155 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
8156 EXPECT_EQ("f(\"one two three four five six \"\n"
8157 " \"seven\".split(\n"
8158 " really_looooong_variable));",
8159 format("f(\"one two three four five six seven\"."
8160 "split(really_looooong_variable));",
8161 getLLVMStyleWithColumns(33)));
8162
8163 EXPECT_EQ("f(\"some \"\n"
8164 " \"text\",\n"
8165 " other);",
8166 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00008167
8168 // Only break as a last resort.
8169 verifyFormat(
8170 "aaaaaaaaaaaaaaaaaaaa(\n"
8171 " aaaaaaaaaaaaaaaaaaaa,\n"
8172 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00008173
Daniel Jaspera44991332015-04-29 13:06:49 +00008174 EXPECT_EQ("\"splitmea\"\n"
8175 "\"trandomp\"\n"
8176 "\"oint\"",
8177 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00008178
Daniel Jaspera44991332015-04-29 13:06:49 +00008179 EXPECT_EQ("\"split/\"\n"
8180 "\"pathat/\"\n"
8181 "\"slashes\"",
8182 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008183
Daniel Jaspera44991332015-04-29 13:06:49 +00008184 EXPECT_EQ("\"split/\"\n"
8185 "\"pathat/\"\n"
8186 "\"slashes\"",
8187 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00008188 EXPECT_EQ("\"split at \"\n"
8189 "\"spaces/at/\"\n"
8190 "\"slashes.at.any$\"\n"
8191 "\"non-alphanumeric%\"\n"
8192 "\"1111111111characte\"\n"
8193 "\"rs\"",
8194 format("\"split at "
8195 "spaces/at/"
8196 "slashes.at."
8197 "any$non-"
8198 "alphanumeric%"
8199 "1111111111characte"
8200 "rs\"",
8201 getLLVMStyleWithColumns(20)));
8202
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008203 // Verify that splitting the strings understands
8204 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00008205 EXPECT_EQ(
8206 "aaaaaaaaaaaa(\n"
8207 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8208 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8209 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8210 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8211 "aaaaaaaaaaaaaaaaaaaaaa\");",
8212 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00008213 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8214 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8215 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8216 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8217 "aaaaaaaaaaaaaaaaaaaaaa\";",
8218 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00008219 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8220 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8221 format("llvm::outs() << "
8222 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8223 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00008224 EXPECT_EQ("ffff(\n"
8225 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8226 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8227 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8228 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8229 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008230
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008231 FormatStyle Style = getLLVMStyleWithColumns(12);
8232 Style.BreakStringLiterals = false;
8233 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8234
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008235 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
8236 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00008237 EXPECT_EQ("#define A \\\n"
8238 " \"some \" \\\n"
8239 " \"text \" \\\n"
8240 " \"other\";",
8241 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008242}
8243
Manuel Klimek9e321992015-07-28 15:50:24 +00008244TEST_F(FormatTest, FullyRemoveEmptyLines) {
8245 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8246 NoEmptyLines.MaxEmptyLinesToKeep = 0;
8247 EXPECT_EQ("int i = a(b());",
8248 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8249}
8250
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008251TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8252 EXPECT_EQ(
8253 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8254 "(\n"
8255 " \"x\t\");",
8256 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8257 "aaaaaaa("
8258 "\"x\t\");"));
8259}
8260
Daniel Jasper174b0122014-01-09 14:18:12 +00008261TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00008262 EXPECT_EQ(
8263 "u8\"utf8 string \"\n"
8264 "u8\"literal\";",
8265 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8266 EXPECT_EQ(
8267 "u\"utf16 string \"\n"
8268 "u\"literal\";",
8269 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8270 EXPECT_EQ(
8271 "U\"utf32 string \"\n"
8272 "U\"literal\";",
8273 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8274 EXPECT_EQ("L\"wide string \"\n"
8275 "L\"literal\";",
8276 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00008277 EXPECT_EQ("@\"NSString \"\n"
8278 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00008279 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00008280
8281 // This input makes clang-format try to split the incomplete unicode escape
8282 // sequence, which used to lead to a crasher.
8283 verifyNoCrash(
8284 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8285 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008286}
8287
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00008288TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8289 FormatStyle Style = getGoogleStyleWithColumns(15);
8290 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8291 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8292 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8293 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8294 EXPECT_EQ("u8R\"x(raw literal)x\";",
8295 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008296}
8297
8298TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8299 FormatStyle Style = getLLVMStyleWithColumns(20);
8300 EXPECT_EQ(
8301 "_T(\"aaaaaaaaaaaaaa\")\n"
8302 "_T(\"aaaaaaaaaaaaaa\")\n"
8303 "_T(\"aaaaaaaaaaaa\")",
8304 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
8305 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
8306 " _T(\"aaaaaa\"),\n"
8307 " z);",
8308 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8309
8310 // FIXME: Handle embedded spaces in one iteration.
8311 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8312 // "_T(\"aaaaaaaaaaaaa\")\n"
8313 // "_T(\"aaaaaaaaaaaaa\")\n"
8314 // "_T(\"a\")",
8315 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8316 // getLLVMStyleWithColumns(20)));
8317 EXPECT_EQ(
8318 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8319 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008320 EXPECT_EQ("f(\n"
8321 "#if !TEST\n"
8322 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8323 "#endif\n"
8324 " );",
8325 format("f(\n"
8326 "#if !TEST\n"
8327 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8328 "#endif\n"
8329 ");"));
8330 EXPECT_EQ("f(\n"
8331 "\n"
8332 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8333 format("f(\n"
8334 "\n"
8335 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008336}
8337
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008338TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008339 EXPECT_EQ(
8340 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8341 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8342 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8343 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8344 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8345 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8346}
8347
8348TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8349 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008350 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008351 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8352 "multiline raw string literal xxxxxxxxxxxxxx\n"
8353 ")x\",\n"
8354 " a),\n"
8355 " b);",
8356 format("fffffffffff(g(R\"x(\n"
8357 "multiline raw string literal xxxxxxxxxxxxxx\n"
8358 ")x\", a), b);",
8359 getGoogleStyleWithColumns(20)));
8360 EXPECT_EQ("fffffffffff(\n"
8361 " g(R\"x(qqq\n"
8362 "multiline raw string literal xxxxxxxxxxxxxx\n"
8363 ")x\",\n"
8364 " a),\n"
8365 " b);",
8366 format("fffffffffff(g(R\"x(qqq\n"
8367 "multiline raw string literal xxxxxxxxxxxxxx\n"
8368 ")x\", a), b);",
8369 getGoogleStyleWithColumns(20)));
8370
8371 EXPECT_EQ("fffffffffff(R\"x(\n"
8372 "multiline raw string literal xxxxxxxxxxxxxx\n"
8373 ")x\");",
8374 format("fffffffffff(R\"x(\n"
8375 "multiline raw string literal xxxxxxxxxxxxxx\n"
8376 ")x\");",
8377 getGoogleStyleWithColumns(20)));
8378 EXPECT_EQ("fffffffffff(R\"x(\n"
8379 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008380 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008381 format("fffffffffff(R\"x(\n"
8382 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008383 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008384 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008385 EXPECT_EQ("fffffffffff(\n"
8386 " R\"x(\n"
8387 "multiline raw string literal xxxxxxxxxxxxxx\n"
8388 ")x\" +\n"
8389 " bbbbbb);",
8390 format("fffffffffff(\n"
8391 " R\"x(\n"
8392 "multiline raw string literal xxxxxxxxxxxxxx\n"
8393 ")x\" + bbbbbb);",
8394 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008395}
8396
Alexander Kornienkobe633902013-06-14 11:46:10 +00008397TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008398 verifyFormat("string a = \"unterminated;");
8399 EXPECT_EQ("function(\"unterminated,\n"
8400 " OtherParameter);",
8401 format("function( \"unterminated,\n"
8402 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008403}
8404
8405TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008406 FormatStyle Style = getLLVMStyle();
8407 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008408 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008409 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008410}
8411
Daniel Jaspera44991332015-04-29 13:06:49 +00008412TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008413
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008414TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8415 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8416 " \"ddeeefff\");",
8417 format("someFunction(\"aaabbbcccdddeeefff\");",
8418 getLLVMStyleWithColumns(25)));
8419 EXPECT_EQ("someFunction1234567890(\n"
8420 " \"aaabbbcccdddeeefff\");",
8421 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8422 getLLVMStyleWithColumns(26)));
8423 EXPECT_EQ("someFunction1234567890(\n"
8424 " \"aaabbbcccdddeeeff\"\n"
8425 " \"f\");",
8426 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8427 getLLVMStyleWithColumns(25)));
8428 EXPECT_EQ("someFunction1234567890(\n"
8429 " \"aaabbbcccdddeeeff\"\n"
8430 " \"f\");",
8431 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8432 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008433 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8434 " \"ddde \"\n"
8435 " \"efff\");",
8436 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008437 getLLVMStyleWithColumns(25)));
8438 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8439 " \"ddeeefff\");",
8440 format("someFunction(\"aaabbbccc ddeeefff\");",
8441 getLLVMStyleWithColumns(25)));
8442 EXPECT_EQ("someFunction1234567890(\n"
8443 " \"aaabb \"\n"
8444 " \"cccdddeeefff\");",
8445 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8446 getLLVMStyleWithColumns(25)));
8447 EXPECT_EQ("#define A \\\n"
8448 " string s = \\\n"
8449 " \"123456789\" \\\n"
8450 " \"0\"; \\\n"
8451 " int i;",
8452 format("#define A string s = \"1234567890\"; int i;",
8453 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008454 // FIXME: Put additional penalties on breaking at non-whitespace locations.
8455 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8456 " \"dddeeeff\"\n"
8457 " \"f\");",
8458 format("someFunction(\"aaabbbcc dddeeefff\");",
8459 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008460}
8461
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008462TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008463 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8464 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008465 EXPECT_EQ("\"test\"\n"
8466 "\"\\n\"",
8467 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8468 EXPECT_EQ("\"tes\\\\\"\n"
8469 "\"n\"",
8470 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8471 EXPECT_EQ("\"\\\\\\\\\"\n"
8472 "\"\\n\"",
8473 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008474 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008475 EXPECT_EQ("\"\\uff01\"\n"
8476 "\"test\"",
8477 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8478 EXPECT_EQ("\"\\Uff01ff02\"",
8479 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8480 EXPECT_EQ("\"\\x000000000001\"\n"
8481 "\"next\"",
8482 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8483 EXPECT_EQ("\"\\x000000000001next\"",
8484 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8485 EXPECT_EQ("\"\\x000000000001\"",
8486 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8487 EXPECT_EQ("\"test\"\n"
8488 "\"\\000000\"\n"
8489 "\"000001\"",
8490 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8491 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008492 "\"00000000\"\n"
8493 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008494 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008495}
8496
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008497TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8498 verifyFormat("void f() {\n"
8499 " return g() {}\n"
8500 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008501 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008502 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008503 "}");
8504}
8505
Manuel Klimek421147e2014-01-24 09:25:23 +00008506TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8507 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008508 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008509}
8510
Manuel Klimek13b97d82013-05-13 08:42:42 +00008511TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8512 verifyFormat("class X {\n"
8513 " void f() {\n"
8514 " }\n"
8515 "};",
8516 getLLVMStyleWithColumns(12));
8517}
8518
8519TEST_F(FormatTest, ConfigurableIndentWidth) {
8520 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8521 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008522 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008523 verifyFormat("void f() {\n"
8524 " someFunction();\n"
8525 " if (true) {\n"
8526 " f();\n"
8527 " }\n"
8528 "}",
8529 EightIndent);
8530 verifyFormat("class X {\n"
8531 " void f() {\n"
8532 " }\n"
8533 "};",
8534 EightIndent);
8535 verifyFormat("int x[] = {\n"
8536 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008537 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008538 EightIndent);
8539}
8540
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008541TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008542 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008543 "f();",
8544 getLLVMStyleWithColumns(8));
8545}
8546
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008547TEST_F(FormatTest, ConfigurableUseOfTab) {
8548 FormatStyle Tab = getLLVMStyleWithColumns(42);
8549 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008550 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008551 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008552
8553 EXPECT_EQ("if (aaaaaaaa && // q\n"
8554 " bb)\t\t// w\n"
8555 "\t;",
8556 format("if (aaaaaaaa &&// q\n"
8557 "bb)// w\n"
8558 ";",
8559 Tab));
8560 EXPECT_EQ("if (aaa && bbb) // w\n"
8561 "\t;",
8562 format("if(aaa&&bbb)// w\n"
8563 ";",
8564 Tab));
8565
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008566 verifyFormat("class X {\n"
8567 "\tvoid f() {\n"
8568 "\t\tsomeFunction(parameter1,\n"
8569 "\t\t\t parameter2);\n"
8570 "\t}\n"
8571 "};",
8572 Tab);
8573 verifyFormat("#define A \\\n"
8574 "\tvoid f() { \\\n"
8575 "\t\tsomeFunction( \\\n"
8576 "\t\t parameter1, \\\n"
8577 "\t\t parameter2); \\\n"
8578 "\t}",
8579 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008580
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008581 Tab.TabWidth = 4;
8582 Tab.IndentWidth = 8;
8583 verifyFormat("class TabWidth4Indent8 {\n"
8584 "\t\tvoid f() {\n"
8585 "\t\t\t\tsomeFunction(parameter1,\n"
8586 "\t\t\t\t\t\t\t parameter2);\n"
8587 "\t\t}\n"
8588 "};",
8589 Tab);
8590
8591 Tab.TabWidth = 4;
8592 Tab.IndentWidth = 4;
8593 verifyFormat("class TabWidth4Indent4 {\n"
8594 "\tvoid f() {\n"
8595 "\t\tsomeFunction(parameter1,\n"
8596 "\t\t\t\t\t parameter2);\n"
8597 "\t}\n"
8598 "};",
8599 Tab);
8600
8601 Tab.TabWidth = 8;
8602 Tab.IndentWidth = 4;
8603 verifyFormat("class TabWidth8Indent4 {\n"
8604 " void f() {\n"
8605 "\tsomeFunction(parameter1,\n"
8606 "\t\t parameter2);\n"
8607 " }\n"
8608 "};",
8609 Tab);
8610
Alexander Kornienko39856b72013-09-10 09:38:25 +00008611 Tab.TabWidth = 8;
8612 Tab.IndentWidth = 8;
8613 EXPECT_EQ("/*\n"
8614 "\t a\t\tcomment\n"
8615 "\t in multiple lines\n"
8616 " */",
8617 format(" /*\t \t \n"
8618 " \t \t a\t\tcomment\t \t\n"
8619 " \t \t in multiple lines\t\n"
8620 " \t */",
8621 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008622
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008623 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008624 verifyFormat("{\n"
8625 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8626 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8627 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8628 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8629 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8630 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008631 "};",
8632 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008633 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008634 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008635 "\ta2,\n"
8636 "\ta3\n"
8637 "};",
8638 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008639 EXPECT_EQ("if (aaaaaaaa && // q\n"
8640 " bb) // w\n"
8641 "\t;",
8642 format("if (aaaaaaaa &&// q\n"
8643 "bb)// w\n"
8644 ";",
8645 Tab));
8646 verifyFormat("class X {\n"
8647 "\tvoid f() {\n"
8648 "\t\tsomeFunction(parameter1,\n"
8649 "\t\t parameter2);\n"
8650 "\t}\n"
8651 "};",
8652 Tab);
8653 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008654 "\tQ(\n"
8655 "\t {\n"
8656 "\t\t int a;\n"
8657 "\t\t someFunction(aaaaaaaa,\n"
8658 "\t\t bbbbbbb);\n"
8659 "\t },\n"
8660 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008661 "}",
8662 Tab);
8663 EXPECT_EQ("{\n"
8664 "\t/* aaaa\n"
8665 "\t bbbb */\n"
8666 "}",
8667 format("{\n"
8668 "/* aaaa\n"
8669 " bbbb */\n"
8670 "}",
8671 Tab));
8672 EXPECT_EQ("{\n"
8673 "\t/*\n"
8674 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8675 "\t bbbbbbbbbbbbb\n"
8676 "\t*/\n"
8677 "}",
8678 format("{\n"
8679 "/*\n"
8680 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8681 "*/\n"
8682 "}",
8683 Tab));
8684 EXPECT_EQ("{\n"
8685 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8686 "\t// bbbbbbbbbbbbb\n"
8687 "}",
8688 format("{\n"
8689 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8690 "}",
8691 Tab));
8692 EXPECT_EQ("{\n"
8693 "\t/*\n"
8694 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8695 "\t bbbbbbbbbbbbb\n"
8696 "\t*/\n"
8697 "}",
8698 format("{\n"
8699 "\t/*\n"
8700 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8701 "\t*/\n"
8702 "}",
8703 Tab));
8704 EXPECT_EQ("{\n"
8705 "\t/*\n"
8706 "\n"
8707 "\t*/\n"
8708 "}",
8709 format("{\n"
8710 "\t/*\n"
8711 "\n"
8712 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008713 "}",
8714 Tab));
8715 EXPECT_EQ("{\n"
8716 "\t/*\n"
8717 " asdf\n"
8718 "\t*/\n"
8719 "}",
8720 format("{\n"
8721 "\t/*\n"
8722 " asdf\n"
8723 "\t*/\n"
8724 "}",
8725 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008726
8727 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008728 EXPECT_EQ("/*\n"
8729 " a\t\tcomment\n"
8730 " in multiple lines\n"
8731 " */",
8732 format(" /*\t \t \n"
8733 " \t \t a\t\tcomment\t \t\n"
8734 " \t \t in multiple lines\t\n"
8735 " \t */",
8736 Tab));
8737 EXPECT_EQ("/* some\n"
8738 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008739 format(" \t \t /* some\n"
8740 " \t \t comment */",
8741 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008742 EXPECT_EQ("int a; /* some\n"
8743 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008744 format(" \t \t int a; /* some\n"
8745 " \t \t comment */",
8746 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008747
Alexander Kornienko39856b72013-09-10 09:38:25 +00008748 EXPECT_EQ("int a; /* some\n"
8749 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008750 format(" \t \t int\ta; /* some\n"
8751 " \t \t comment */",
8752 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008753 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8754 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008755 format(" \t \t f(\"\t\t\"); /* some\n"
8756 " \t \t comment */",
8757 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008758 EXPECT_EQ("{\n"
8759 " /*\n"
8760 " * Comment\n"
8761 " */\n"
8762 " int i;\n"
8763 "}",
8764 format("{\n"
8765 "\t/*\n"
8766 "\t * Comment\n"
8767 "\t */\n"
8768 "\t int i;\n"
8769 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008770
8771 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8772 Tab.TabWidth = 8;
8773 Tab.IndentWidth = 8;
8774 EXPECT_EQ("if (aaaaaaaa && // q\n"
8775 " bb) // w\n"
8776 "\t;",
8777 format("if (aaaaaaaa &&// q\n"
8778 "bb)// w\n"
8779 ";",
8780 Tab));
8781 EXPECT_EQ("if (aaa && bbb) // w\n"
8782 "\t;",
8783 format("if(aaa&&bbb)// w\n"
8784 ";",
8785 Tab));
8786 verifyFormat("class X {\n"
8787 "\tvoid f() {\n"
8788 "\t\tsomeFunction(parameter1,\n"
8789 "\t\t\t parameter2);\n"
8790 "\t}\n"
8791 "};",
8792 Tab);
8793 verifyFormat("#define A \\\n"
8794 "\tvoid f() { \\\n"
8795 "\t\tsomeFunction( \\\n"
8796 "\t\t parameter1, \\\n"
8797 "\t\t parameter2); \\\n"
8798 "\t}",
8799 Tab);
8800 Tab.TabWidth = 4;
8801 Tab.IndentWidth = 8;
8802 verifyFormat("class TabWidth4Indent8 {\n"
8803 "\t\tvoid f() {\n"
8804 "\t\t\t\tsomeFunction(parameter1,\n"
8805 "\t\t\t\t\t\t\t parameter2);\n"
8806 "\t\t}\n"
8807 "};",
8808 Tab);
8809 Tab.TabWidth = 4;
8810 Tab.IndentWidth = 4;
8811 verifyFormat("class TabWidth4Indent4 {\n"
8812 "\tvoid f() {\n"
8813 "\t\tsomeFunction(parameter1,\n"
8814 "\t\t\t\t\t parameter2);\n"
8815 "\t}\n"
8816 "};",
8817 Tab);
8818 Tab.TabWidth = 8;
8819 Tab.IndentWidth = 4;
8820 verifyFormat("class TabWidth8Indent4 {\n"
8821 " void f() {\n"
8822 "\tsomeFunction(parameter1,\n"
8823 "\t\t parameter2);\n"
8824 " }\n"
8825 "};",
8826 Tab);
8827 Tab.TabWidth = 8;
8828 Tab.IndentWidth = 8;
8829 EXPECT_EQ("/*\n"
8830 "\t a\t\tcomment\n"
8831 "\t in multiple lines\n"
8832 " */",
8833 format(" /*\t \t \n"
8834 " \t \t a\t\tcomment\t \t\n"
8835 " \t \t in multiple lines\t\n"
8836 " \t */",
8837 Tab));
8838 verifyFormat("{\n"
8839 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8840 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8841 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8842 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8843 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8844 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8845 "};",
8846 Tab);
8847 verifyFormat("enum AA {\n"
8848 "\ta1, // Force multiple lines\n"
8849 "\ta2,\n"
8850 "\ta3\n"
8851 "};",
8852 Tab);
8853 EXPECT_EQ("if (aaaaaaaa && // q\n"
8854 " bb) // w\n"
8855 "\t;",
8856 format("if (aaaaaaaa &&// q\n"
8857 "bb)// w\n"
8858 ";",
8859 Tab));
8860 verifyFormat("class X {\n"
8861 "\tvoid f() {\n"
8862 "\t\tsomeFunction(parameter1,\n"
8863 "\t\t\t parameter2);\n"
8864 "\t}\n"
8865 "};",
8866 Tab);
8867 verifyFormat("{\n"
8868 "\tQ(\n"
8869 "\t {\n"
8870 "\t\t int a;\n"
8871 "\t\t someFunction(aaaaaaaa,\n"
8872 "\t\t\t\t bbbbbbb);\n"
8873 "\t },\n"
8874 "\t p);\n"
8875 "}",
8876 Tab);
8877 EXPECT_EQ("{\n"
8878 "\t/* aaaa\n"
8879 "\t bbbb */\n"
8880 "}",
8881 format("{\n"
8882 "/* aaaa\n"
8883 " bbbb */\n"
8884 "}",
8885 Tab));
8886 EXPECT_EQ("{\n"
8887 "\t/*\n"
8888 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8889 "\t bbbbbbbbbbbbb\n"
8890 "\t*/\n"
8891 "}",
8892 format("{\n"
8893 "/*\n"
8894 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8895 "*/\n"
8896 "}",
8897 Tab));
8898 EXPECT_EQ("{\n"
8899 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8900 "\t// bbbbbbbbbbbbb\n"
8901 "}",
8902 format("{\n"
8903 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8904 "}",
8905 Tab));
8906 EXPECT_EQ("{\n"
8907 "\t/*\n"
8908 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8909 "\t bbbbbbbbbbbbb\n"
8910 "\t*/\n"
8911 "}",
8912 format("{\n"
8913 "\t/*\n"
8914 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8915 "\t*/\n"
8916 "}",
8917 Tab));
8918 EXPECT_EQ("{\n"
8919 "\t/*\n"
8920 "\n"
8921 "\t*/\n"
8922 "}",
8923 format("{\n"
8924 "\t/*\n"
8925 "\n"
8926 "\t*/\n"
8927 "}",
8928 Tab));
8929 EXPECT_EQ("{\n"
8930 "\t/*\n"
8931 " asdf\n"
8932 "\t*/\n"
8933 "}",
8934 format("{\n"
8935 "\t/*\n"
8936 " asdf\n"
8937 "\t*/\n"
8938 "}",
8939 Tab));
8940 EXPECT_EQ("/*\n"
8941 "\t a\t\tcomment\n"
8942 "\t in multiple lines\n"
8943 " */",
8944 format(" /*\t \t \n"
8945 " \t \t a\t\tcomment\t \t\n"
8946 " \t \t in multiple lines\t\n"
8947 " \t */",
8948 Tab));
8949 EXPECT_EQ("/* some\n"
8950 " comment */",
8951 format(" \t \t /* some\n"
8952 " \t \t comment */",
8953 Tab));
8954 EXPECT_EQ("int a; /* some\n"
8955 " comment */",
8956 format(" \t \t int a; /* some\n"
8957 " \t \t comment */",
8958 Tab));
8959 EXPECT_EQ("int a; /* some\n"
8960 "comment */",
8961 format(" \t \t int\ta; /* some\n"
8962 " \t \t comment */",
8963 Tab));
8964 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8965 " comment */",
8966 format(" \t \t f(\"\t\t\"); /* some\n"
8967 " \t \t comment */",
8968 Tab));
8969 EXPECT_EQ("{\n"
8970 " /*\n"
8971 " * Comment\n"
8972 " */\n"
8973 " int i;\n"
8974 "}",
8975 format("{\n"
8976 "\t/*\n"
8977 "\t * Comment\n"
8978 "\t */\n"
8979 "\t int i;\n"
8980 "}"));
8981 Tab.AlignConsecutiveAssignments = true;
8982 Tab.AlignConsecutiveDeclarations = true;
8983 Tab.TabWidth = 4;
8984 Tab.IndentWidth = 4;
8985 verifyFormat("class Assign {\n"
8986 "\tvoid f() {\n"
8987 "\t\tint x = 123;\n"
8988 "\t\tint random = 4;\n"
8989 "\t\tstd::string alphabet =\n"
8990 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8991 "\t}\n"
8992 "};",
8993 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008994}
8995
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008996TEST_F(FormatTest, CalculatesOriginalColumn) {
8997 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8998 "q\"; /* some\n"
8999 " comment */",
9000 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9001 "q\"; /* some\n"
9002 " comment */",
9003 getLLVMStyle()));
9004 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
9005 "/* some\n"
9006 " comment */",
9007 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
9008 " /* some\n"
9009 " comment */",
9010 getLLVMStyle()));
9011 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9012 "qqq\n"
9013 "/* some\n"
9014 " comment */",
9015 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9016 "qqq\n"
9017 " /* some\n"
9018 " comment */",
9019 getLLVMStyle()));
9020 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9021 "wwww; /* some\n"
9022 " comment */",
9023 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9024 "wwww; /* some\n"
9025 " comment */",
9026 getLLVMStyle()));
9027}
9028
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009029TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00009030 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009031 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009032
9033 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009034 " continue;",
9035 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009036 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009037 " continue;",
9038 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009039 verifyFormat("if(true)\n"
9040 " f();\n"
9041 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009042 " f();",
9043 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009044 verifyFormat("do {\n"
9045 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009046 "} while(something());",
9047 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009048 verifyFormat("switch(x) {\n"
9049 "default:\n"
9050 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009051 "}",
9052 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00009053 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00009054 verifyFormat("size_t x = sizeof(x);", NoSpace);
9055 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
9056 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
9057 verifyFormat("alignas(128) char a[128];", NoSpace);
9058 verifyFormat("size_t x = alignof(MyType);", NoSpace);
9059 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
9060 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009061 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009062 verifyFormat("T A::operator()();", NoSpace);
9063 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009064
9065 FormatStyle Space = getLLVMStyle();
9066 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
9067
9068 verifyFormat("int f ();", Space);
9069 verifyFormat("void f (int a, T b) {\n"
9070 " while (true)\n"
9071 " continue;\n"
9072 "}",
9073 Space);
9074 verifyFormat("if (true)\n"
9075 " f ();\n"
9076 "else if (true)\n"
9077 " f ();",
9078 Space);
9079 verifyFormat("do {\n"
9080 " do_something ();\n"
9081 "} while (something ());",
9082 Space);
9083 verifyFormat("switch (x) {\n"
9084 "default:\n"
9085 " break;\n"
9086 "}",
9087 Space);
9088 verifyFormat("A::A () : a (1) {}", Space);
9089 verifyFormat("void f () __attribute__ ((asdf));", Space);
9090 verifyFormat("*(&a + 1);\n"
9091 "&((&a)[1]);\n"
9092 "a[(b + c) * d];\n"
9093 "(((a + 1) * 2) + 3) * 4;",
9094 Space);
9095 verifyFormat("#define A(x) x", Space);
9096 verifyFormat("#define A (x) x", Space);
9097 verifyFormat("#if defined(x)\n"
9098 "#endif",
9099 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00009100 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00009101 verifyFormat("size_t x = sizeof (x);", Space);
9102 verifyFormat("auto f (int x) -> decltype (x);", Space);
9103 verifyFormat("int f (T x) noexcept (x.create ());", Space);
9104 verifyFormat("alignas (128) char a[128];", Space);
9105 verifyFormat("size_t x = alignof (MyType);", Space);
9106 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
9107 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009108 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009109 verifyFormat("T A::operator() ();", Space);
9110 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009111}
9112
9113TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
9114 FormatStyle Spaces = getLLVMStyle();
9115
9116 Spaces.SpacesInParentheses = true;
9117 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009118 verifyFormat("call();", Spaces);
9119 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00009120 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
9121 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009122 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009123 " continue;",
9124 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009125 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009126 " continue;",
9127 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009128 verifyFormat("if ( true )\n"
9129 " f();\n"
9130 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009131 " f();",
9132 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009133 verifyFormat("do {\n"
9134 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009135 "} while ( something() );",
9136 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009137 verifyFormat("switch ( x ) {\n"
9138 "default:\n"
9139 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009140 "}",
9141 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009142
9143 Spaces.SpacesInParentheses = false;
9144 Spaces.SpacesInCStyleCastParentheses = true;
9145 verifyFormat("Type *A = ( Type * )P;", Spaces);
9146 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
9147 verifyFormat("x = ( int32 )y;", Spaces);
9148 verifyFormat("int a = ( int )(2.0f);", Spaces);
9149 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
9150 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
9151 verifyFormat("#define x (( int )-1)", Spaces);
9152
Daniel Jasper92e09822015-03-18 12:59:19 +00009153 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00009154 Spaces.SpacesInParentheses = false;
9155 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009156 Spaces.SpacesInCStyleCastParentheses = true;
9157 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009158 verifyFormat("call( );", Spaces);
9159 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009160 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009161 " continue;",
9162 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009163 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009164 " continue;",
9165 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009166 verifyFormat("if (true)\n"
9167 " f( );\n"
9168 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009169 " f( );",
9170 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009171 verifyFormat("do {\n"
9172 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009173 "} while (something( ));",
9174 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009175 verifyFormat("switch (x) {\n"
9176 "default:\n"
9177 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009178 "}",
9179 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009180
Daniel Jasper92e09822015-03-18 12:59:19 +00009181 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009182 Spaces.SpaceAfterCStyleCast = true;
9183 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009184 verifyFormat("call( );", Spaces);
9185 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009186 verifyFormat("while (( bool ) 1)\n"
9187 " continue;",
9188 Spaces);
9189 verifyFormat("for (;;)\n"
9190 " continue;",
9191 Spaces);
9192 verifyFormat("if (true)\n"
9193 " f( );\n"
9194 "else if (true)\n"
9195 " f( );",
9196 Spaces);
9197 verifyFormat("do {\n"
9198 " do_something(( int ) i);\n"
9199 "} while (something( ));",
9200 Spaces);
9201 verifyFormat("switch (x) {\n"
9202 "default:\n"
9203 " break;\n"
9204 "}",
9205 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009206
9207 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009208 Spaces.SpacesInCStyleCastParentheses = false;
9209 Spaces.SpaceAfterCStyleCast = true;
9210 verifyFormat("while ((bool) 1)\n"
9211 " continue;",
9212 Spaces);
9213 verifyFormat("do {\n"
9214 " do_something((int) i);\n"
9215 "} while (something( ));",
9216 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009217}
9218
Daniel Jasperad981f82014-08-26 11:41:14 +00009219TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9220 verifyFormat("int a[5];");
9221 verifyFormat("a[3] += 42;");
9222
9223 FormatStyle Spaces = getLLVMStyle();
9224 Spaces.SpacesInSquareBrackets = true;
9225 // Lambdas unchanged.
9226 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9227 verifyFormat("return [i, args...] {};", Spaces);
9228
9229 // Not lambdas.
9230 verifyFormat("int a[ 5 ];", Spaces);
9231 verifyFormat("a[ 3 ] += 42;", Spaces);
9232 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9233 verifyFormat("double &operator[](int i) { return 0; }\n"
9234 "int i;",
9235 Spaces);
9236 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9237 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9238 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9239}
9240
Daniel Jasperd94bff32013-09-25 15:15:02 +00009241TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9242 verifyFormat("int a = 5;");
9243 verifyFormat("a += 42;");
9244 verifyFormat("a or_eq 8;");
9245
9246 FormatStyle Spaces = getLLVMStyle();
9247 Spaces.SpaceBeforeAssignmentOperators = false;
9248 verifyFormat("int a= 5;", Spaces);
9249 verifyFormat("a+= 42;", Spaces);
9250 verifyFormat("a or_eq 8;", Spaces);
9251}
9252
Daniel Jaspera44991332015-04-29 13:06:49 +00009253TEST_F(FormatTest, AlignConsecutiveAssignments) {
9254 FormatStyle Alignment = getLLVMStyle();
9255 Alignment.AlignConsecutiveAssignments = false;
9256 verifyFormat("int a = 5;\n"
9257 "int oneTwoThree = 123;",
9258 Alignment);
9259 verifyFormat("int a = 5;\n"
9260 "int oneTwoThree = 123;",
9261 Alignment);
9262
9263 Alignment.AlignConsecutiveAssignments = true;
9264 verifyFormat("int a = 5;\n"
9265 "int oneTwoThree = 123;",
9266 Alignment);
9267 verifyFormat("int a = method();\n"
9268 "int oneTwoThree = 133;",
9269 Alignment);
9270 verifyFormat("a &= 5;\n"
9271 "bcd *= 5;\n"
9272 "ghtyf += 5;\n"
9273 "dvfvdb -= 5;\n"
9274 "a /= 5;\n"
9275 "vdsvsv %= 5;\n"
9276 "sfdbddfbdfbb ^= 5;\n"
9277 "dvsdsv |= 5;\n"
9278 "int dsvvdvsdvvv = 123;",
9279 Alignment);
9280 verifyFormat("int i = 1, j = 10;\n"
9281 "something = 2000;",
9282 Alignment);
9283 verifyFormat("something = 2000;\n"
9284 "int i = 1, j = 10;\n",
9285 Alignment);
9286 verifyFormat("something = 2000;\n"
9287 "another = 911;\n"
9288 "int i = 1, j = 10;\n"
9289 "oneMore = 1;\n"
9290 "i = 2;",
9291 Alignment);
9292 verifyFormat("int a = 5;\n"
9293 "int one = 1;\n"
9294 "method();\n"
9295 "int oneTwoThree = 123;\n"
9296 "int oneTwo = 12;",
9297 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009298 verifyFormat("int oneTwoThree = 123;\n"
9299 "int oneTwo = 12;\n"
9300 "method();\n",
9301 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009302 verifyFormat("int oneTwoThree = 123; // comment\n"
9303 "int oneTwo = 12; // comment",
9304 Alignment);
9305 EXPECT_EQ("int a = 5;\n"
9306 "\n"
9307 "int oneTwoThree = 123;",
9308 format("int a = 5;\n"
9309 "\n"
9310 "int oneTwoThree= 123;",
9311 Alignment));
9312 EXPECT_EQ("int a = 5;\n"
9313 "int one = 1;\n"
9314 "\n"
9315 "int oneTwoThree = 123;",
9316 format("int a = 5;\n"
9317 "int one = 1;\n"
9318 "\n"
9319 "int oneTwoThree = 123;",
9320 Alignment));
9321 EXPECT_EQ("int a = 5;\n"
9322 "int one = 1;\n"
9323 "\n"
9324 "int oneTwoThree = 123;\n"
9325 "int oneTwo = 12;",
9326 format("int a = 5;\n"
9327 "int one = 1;\n"
9328 "\n"
9329 "int oneTwoThree = 123;\n"
9330 "int oneTwo = 12;",
9331 Alignment));
9332 Alignment.AlignEscapedNewlinesLeft = true;
9333 verifyFormat("#define A \\\n"
9334 " int aaaa = 12; \\\n"
9335 " int b = 23; \\\n"
9336 " int ccc = 234; \\\n"
9337 " int dddddddddd = 2345;",
9338 Alignment);
9339 Alignment.AlignEscapedNewlinesLeft = false;
9340 verifyFormat("#define A "
9341 " \\\n"
9342 " int aaaa = 12; "
9343 " \\\n"
9344 " int b = 23; "
9345 " \\\n"
9346 " int ccc = 234; "
9347 " \\\n"
9348 " int dddddddddd = 2345;",
9349 Alignment);
9350 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9351 "k = 4, int l = 5,\n"
9352 " int m = 6) {\n"
9353 " int j = 10;\n"
9354 " otherThing = 1;\n"
9355 "}",
9356 Alignment);
9357 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9358 " int i = 1;\n"
9359 " int j = 2;\n"
9360 " int big = 10000;\n"
9361 "}",
9362 Alignment);
9363 verifyFormat("class C {\n"
9364 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009365 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009366 " virtual void f() = 0;\n"
9367 "};",
9368 Alignment);
9369 verifyFormat("int i = 1;\n"
9370 "if (SomeType t = getSomething()) {\n"
9371 "}\n"
9372 "int j = 2;\n"
9373 "int big = 10000;",
9374 Alignment);
9375 verifyFormat("int j = 7;\n"
9376 "for (int k = 0; k < N; ++k) {\n"
9377 "}\n"
9378 "int j = 2;\n"
9379 "int big = 10000;\n"
9380 "}",
9381 Alignment);
9382 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9383 verifyFormat("int i = 1;\n"
9384 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9385 " = someLooooooooooooooooongFunction();\n"
9386 "int j = 2;",
9387 Alignment);
9388 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9389 verifyFormat("int i = 1;\n"
9390 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9391 " someLooooooooooooooooongFunction();\n"
9392 "int j = 2;",
9393 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009394
9395 verifyFormat("auto lambda = []() {\n"
9396 " auto i = 0;\n"
9397 " return 0;\n"
9398 "};\n"
9399 "int i = 0;\n"
9400 "auto v = type{\n"
9401 " i = 1, //\n"
9402 " (i = 2), //\n"
9403 " i = 3 //\n"
9404 "};",
9405 Alignment);
9406
Daniel Jaspera44991332015-04-29 13:06:49 +00009407 // FIXME: Should align all three assignments
9408 verifyFormat(
9409 "int i = 1;\n"
9410 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9411 " loooooooooooooooooooooongParameterB);\n"
9412 "int j = 2;",
9413 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009414
9415 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9416 " typename B = very_long_type_name_1,\n"
9417 " typename T_2 = very_long_type_name_2>\n"
9418 "auto foo() {}\n",
9419 Alignment);
9420 verifyFormat("int a, b = 1;\n"
9421 "int c = 2;\n"
9422 "int dd = 3;\n",
9423 Alignment);
9424 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9425 "float b[1][] = {{3.f}};\n",
9426 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009427}
9428
Daniel Jaspere12597c2015-10-01 10:06:54 +00009429TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9430 FormatStyle Alignment = getLLVMStyle();
9431 Alignment.AlignConsecutiveDeclarations = false;
9432 verifyFormat("float const a = 5;\n"
9433 "int oneTwoThree = 123;",
9434 Alignment);
9435 verifyFormat("int a = 5;\n"
9436 "float const oneTwoThree = 123;",
9437 Alignment);
9438
9439 Alignment.AlignConsecutiveDeclarations = true;
9440 verifyFormat("float const a = 5;\n"
9441 "int oneTwoThree = 123;",
9442 Alignment);
9443 verifyFormat("int a = method();\n"
9444 "float const oneTwoThree = 133;",
9445 Alignment);
9446 verifyFormat("int i = 1, j = 10;\n"
9447 "something = 2000;",
9448 Alignment);
9449 verifyFormat("something = 2000;\n"
9450 "int i = 1, j = 10;\n",
9451 Alignment);
9452 verifyFormat("float something = 2000;\n"
9453 "double another = 911;\n"
9454 "int i = 1, j = 10;\n"
9455 "const int *oneMore = 1;\n"
9456 "unsigned i = 2;",
9457 Alignment);
9458 verifyFormat("float a = 5;\n"
9459 "int one = 1;\n"
9460 "method();\n"
9461 "const double oneTwoThree = 123;\n"
9462 "const unsigned int oneTwo = 12;",
9463 Alignment);
9464 verifyFormat("int oneTwoThree{0}; // comment\n"
9465 "unsigned oneTwo; // comment",
9466 Alignment);
9467 EXPECT_EQ("float const a = 5;\n"
9468 "\n"
9469 "int oneTwoThree = 123;",
9470 format("float const a = 5;\n"
9471 "\n"
9472 "int oneTwoThree= 123;",
9473 Alignment));
9474 EXPECT_EQ("float a = 5;\n"
9475 "int one = 1;\n"
9476 "\n"
9477 "unsigned oneTwoThree = 123;",
9478 format("float a = 5;\n"
9479 "int one = 1;\n"
9480 "\n"
9481 "unsigned oneTwoThree = 123;",
9482 Alignment));
9483 EXPECT_EQ("float a = 5;\n"
9484 "int one = 1;\n"
9485 "\n"
9486 "unsigned oneTwoThree = 123;\n"
9487 "int oneTwo = 12;",
9488 format("float a = 5;\n"
9489 "int one = 1;\n"
9490 "\n"
9491 "unsigned oneTwoThree = 123;\n"
9492 "int oneTwo = 12;",
9493 Alignment));
9494 Alignment.AlignConsecutiveAssignments = true;
9495 verifyFormat("float something = 2000;\n"
9496 "double another = 911;\n"
9497 "int i = 1, j = 10;\n"
9498 "const int *oneMore = 1;\n"
9499 "unsigned i = 2;",
9500 Alignment);
9501 verifyFormat("int oneTwoThree = {0}; // comment\n"
9502 "unsigned oneTwo = 0; // comment",
9503 Alignment);
9504 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9505 " int const i = 1;\n"
9506 " int * j = 2;\n"
9507 " int big = 10000;\n"
9508 "\n"
9509 " unsigned oneTwoThree = 123;\n"
9510 " int oneTwo = 12;\n"
9511 " method();\n"
9512 " float k = 2;\n"
9513 " int ll = 10000;\n"
9514 "}",
9515 format("void SomeFunction(int parameter= 0) {\n"
9516 " int const i= 1;\n"
9517 " int *j=2;\n"
9518 " int big = 10000;\n"
9519 "\n"
9520 "unsigned oneTwoThree =123;\n"
9521 "int oneTwo = 12;\n"
9522 " method();\n"
9523 "float k= 2;\n"
9524 "int ll=10000;\n"
9525 "}",
9526 Alignment));
9527 Alignment.AlignConsecutiveAssignments = false;
9528 Alignment.AlignEscapedNewlinesLeft = true;
9529 verifyFormat("#define A \\\n"
9530 " int aaaa = 12; \\\n"
9531 " float b = 23; \\\n"
9532 " const int ccc = 234; \\\n"
9533 " unsigned dddddddddd = 2345;",
9534 Alignment);
9535 Alignment.AlignEscapedNewlinesLeft = false;
9536 Alignment.ColumnLimit = 30;
9537 verifyFormat("#define A \\\n"
9538 " int aaaa = 12; \\\n"
9539 " float b = 23; \\\n"
9540 " const int ccc = 234; \\\n"
9541 " int dddddddddd = 2345;",
9542 Alignment);
9543 Alignment.ColumnLimit = 80;
9544 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9545 "k = 4, int l = 5,\n"
9546 " int m = 6) {\n"
9547 " const int j = 10;\n"
9548 " otherThing = 1;\n"
9549 "}",
9550 Alignment);
9551 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9552 " int const i = 1;\n"
9553 " int * j = 2;\n"
9554 " int big = 10000;\n"
9555 "}",
9556 Alignment);
9557 verifyFormat("class C {\n"
9558 "public:\n"
9559 " int i = 1;\n"
9560 " virtual void f() = 0;\n"
9561 "};",
9562 Alignment);
9563 verifyFormat("float i = 1;\n"
9564 "if (SomeType t = getSomething()) {\n"
9565 "}\n"
9566 "const unsigned j = 2;\n"
9567 "int big = 10000;",
9568 Alignment);
9569 verifyFormat("float j = 7;\n"
9570 "for (int k = 0; k < N; ++k) {\n"
9571 "}\n"
9572 "unsigned j = 2;\n"
9573 "int big = 10000;\n"
9574 "}",
9575 Alignment);
9576 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9577 verifyFormat("float i = 1;\n"
9578 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9579 " = someLooooooooooooooooongFunction();\n"
9580 "int j = 2;",
9581 Alignment);
9582 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9583 verifyFormat("int i = 1;\n"
9584 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9585 " someLooooooooooooooooongFunction();\n"
9586 "int j = 2;",
9587 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009588
9589 Alignment.AlignConsecutiveAssignments = true;
9590 verifyFormat("auto lambda = []() {\n"
9591 " auto ii = 0;\n"
9592 " float j = 0;\n"
9593 " return 0;\n"
9594 "};\n"
9595 "int i = 0;\n"
9596 "float i2 = 0;\n"
9597 "auto v = type{\n"
9598 " i = 1, //\n"
9599 " (i = 2), //\n"
9600 " i = 3 //\n"
9601 "};",
9602 Alignment);
9603 Alignment.AlignConsecutiveAssignments = false;
9604
Daniel Jaspere12597c2015-10-01 10:06:54 +00009605 // FIXME: Should align all three declarations
9606 verifyFormat(
9607 "int i = 1;\n"
9608 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9609 " loooooooooooooooooooooongParameterB);\n"
9610 "int j = 2;",
9611 Alignment);
9612
9613 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9614 // We expect declarations and assignments to align, as long as it doesn't
9615 // exceed the column limit, starting a new alignemnt sequence whenever it
9616 // happens.
9617 Alignment.AlignConsecutiveAssignments = true;
9618 Alignment.ColumnLimit = 30;
9619 verifyFormat("float ii = 1;\n"
9620 "unsigned j = 2;\n"
9621 "int someVerylongVariable = 1;\n"
9622 "AnotherLongType ll = 123456;\n"
9623 "VeryVeryLongType k = 2;\n"
9624 "int myvar = 1;",
9625 Alignment);
9626 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009627 Alignment.AlignConsecutiveAssignments = false;
9628
9629 verifyFormat(
9630 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9631 " typename LongType, typename B>\n"
9632 "auto foo() {}\n",
9633 Alignment);
9634 verifyFormat("float a, b = 1;\n"
9635 "int c = 2;\n"
9636 "int dd = 3;\n",
9637 Alignment);
9638 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9639 "float b[1][] = {{3.f}};\n",
9640 Alignment);
9641 Alignment.AlignConsecutiveAssignments = true;
9642 verifyFormat("float a, b = 1;\n"
9643 "int c = 2;\n"
9644 "int dd = 3;\n",
9645 Alignment);
9646 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9647 "float b[1][] = {{3.f}};\n",
9648 Alignment);
9649 Alignment.AlignConsecutiveAssignments = false;
9650
9651 Alignment.ColumnLimit = 30;
9652 Alignment.BinPackParameters = false;
9653 verifyFormat("void foo(float a,\n"
9654 " float b,\n"
9655 " int c,\n"
9656 " uint32_t *d) {\n"
9657 " int * e = 0;\n"
9658 " float f = 0;\n"
9659 " double g = 0;\n"
9660 "}\n"
9661 "void bar(ino_t a,\n"
9662 " int b,\n"
9663 " uint32_t *c,\n"
9664 " bool d) {}\n",
9665 Alignment);
9666 Alignment.BinPackParameters = true;
9667 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009668}
9669
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009670TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009671 FormatStyle LinuxBraceStyle = getLLVMStyle();
9672 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009673 verifyFormat("namespace a\n"
9674 "{\n"
9675 "class A\n"
9676 "{\n"
9677 " void f()\n"
9678 " {\n"
9679 " if (true) {\n"
9680 " a();\n"
9681 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009682 " } else {\n"
9683 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009684 " }\n"
9685 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009686 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009687 "};\n"
9688 "struct B {\n"
9689 " int x;\n"
9690 "};\n"
9691 "}\n",
9692 LinuxBraceStyle);
9693 verifyFormat("enum X {\n"
9694 " Y = 0,\n"
9695 "}\n",
9696 LinuxBraceStyle);
9697 verifyFormat("struct S {\n"
9698 " int Type;\n"
9699 " union {\n"
9700 " int x;\n"
9701 " double y;\n"
9702 " } Value;\n"
9703 " class C\n"
9704 " {\n"
9705 " MyFavoriteType Value;\n"
9706 " } Class;\n"
9707 "}\n",
9708 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009709}
9710
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009711TEST_F(FormatTest, MozillaBraceBreaking) {
9712 FormatStyle MozillaBraceStyle = getLLVMStyle();
9713 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
9714 verifyFormat("namespace a {\n"
9715 "class A\n"
9716 "{\n"
9717 " void f()\n"
9718 " {\n"
9719 " if (true) {\n"
9720 " a();\n"
9721 " b();\n"
9722 " }\n"
9723 " }\n"
9724 " void g() { return; }\n"
9725 "};\n"
9726 "enum E\n"
9727 "{\n"
9728 " A,\n"
9729 " // foo\n"
9730 " B,\n"
9731 " C\n"
9732 "};\n"
9733 "struct B\n"
9734 "{\n"
9735 " int x;\n"
9736 "};\n"
9737 "}\n",
9738 MozillaBraceStyle);
9739 verifyFormat("struct S\n"
9740 "{\n"
9741 " int Type;\n"
9742 " union\n"
9743 " {\n"
9744 " int x;\n"
9745 " double y;\n"
9746 " } Value;\n"
9747 " class C\n"
9748 " {\n"
9749 " MyFavoriteType Value;\n"
9750 " } Class;\n"
9751 "}\n",
9752 MozillaBraceStyle);
9753}
9754
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009755TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009756 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9757 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009758 verifyFormat("namespace a {\n"
9759 "class A {\n"
9760 " void f()\n"
9761 " {\n"
9762 " if (true) {\n"
9763 " a();\n"
9764 " b();\n"
9765 " }\n"
9766 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009767 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009768 "};\n"
9769 "struct B {\n"
9770 " int x;\n"
9771 "};\n"
9772 "}\n",
9773 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009774
Daniel Jasperd9670872014-08-05 12:06:20 +00009775 verifyFormat("void foo()\n"
9776 "{\n"
9777 " if (a) {\n"
9778 " a();\n"
9779 " }\n"
9780 " else {\n"
9781 " b();\n"
9782 " }\n"
9783 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009784 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009785
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009786 verifyFormat("#ifdef _DEBUG\n"
9787 "int foo(int i = 0)\n"
9788 "#else\n"
9789 "int foo(int i = 5)\n"
9790 "#endif\n"
9791 "{\n"
9792 " return i;\n"
9793 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009794 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009795
9796 verifyFormat("void foo() {}\n"
9797 "void bar()\n"
9798 "#ifdef _DEBUG\n"
9799 "{\n"
9800 " foo();\n"
9801 "}\n"
9802 "#else\n"
9803 "{\n"
9804 "}\n"
9805 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009806 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009807
9808 verifyFormat("void foobar() { int i = 5; }\n"
9809 "#ifdef _DEBUG\n"
9810 "void bar() {}\n"
9811 "#else\n"
9812 "void bar() { foobar(); }\n"
9813 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009814 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009815}
9816
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009817TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009818 FormatStyle AllmanBraceStyle = getLLVMStyle();
9819 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009820 verifyFormat("namespace a\n"
9821 "{\n"
9822 "class A\n"
9823 "{\n"
9824 " void f()\n"
9825 " {\n"
9826 " if (true)\n"
9827 " {\n"
9828 " a();\n"
9829 " b();\n"
9830 " }\n"
9831 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009832 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009833 "};\n"
9834 "struct B\n"
9835 "{\n"
9836 " int x;\n"
9837 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009838 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009839 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009840
9841 verifyFormat("void f()\n"
9842 "{\n"
9843 " if (true)\n"
9844 " {\n"
9845 " a();\n"
9846 " }\n"
9847 " else if (false)\n"
9848 " {\n"
9849 " b();\n"
9850 " }\n"
9851 " else\n"
9852 " {\n"
9853 " c();\n"
9854 " }\n"
9855 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009856 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009857
9858 verifyFormat("void f()\n"
9859 "{\n"
9860 " for (int i = 0; i < 10; ++i)\n"
9861 " {\n"
9862 " a();\n"
9863 " }\n"
9864 " while (false)\n"
9865 " {\n"
9866 " b();\n"
9867 " }\n"
9868 " do\n"
9869 " {\n"
9870 " c();\n"
9871 " } while (false)\n"
9872 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009873 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009874
9875 verifyFormat("void f(int a)\n"
9876 "{\n"
9877 " switch (a)\n"
9878 " {\n"
9879 " case 0:\n"
9880 " break;\n"
9881 " case 1:\n"
9882 " {\n"
9883 " break;\n"
9884 " }\n"
9885 " case 2:\n"
9886 " {\n"
9887 " }\n"
9888 " break;\n"
9889 " default:\n"
9890 " break;\n"
9891 " }\n"
9892 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009893 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009894
9895 verifyFormat("enum X\n"
9896 "{\n"
9897 " Y = 0,\n"
9898 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009899 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009900 verifyFormat("enum X\n"
9901 "{\n"
9902 " Y = 0\n"
9903 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009904 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009905
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009906 verifyFormat("@interface BSApplicationController ()\n"
9907 "{\n"
9908 "@private\n"
9909 " id _extraIvar;\n"
9910 "}\n"
9911 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009912 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009913
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009914 verifyFormat("#ifdef _DEBUG\n"
9915 "int foo(int i = 0)\n"
9916 "#else\n"
9917 "int foo(int i = 5)\n"
9918 "#endif\n"
9919 "{\n"
9920 " return i;\n"
9921 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009922 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009923
9924 verifyFormat("void foo() {}\n"
9925 "void bar()\n"
9926 "#ifdef _DEBUG\n"
9927 "{\n"
9928 " foo();\n"
9929 "}\n"
9930 "#else\n"
9931 "{\n"
9932 "}\n"
9933 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009934 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009935
9936 verifyFormat("void foobar() { int i = 5; }\n"
9937 "#ifdef _DEBUG\n"
9938 "void bar() {}\n"
9939 "#else\n"
9940 "void bar() { foobar(); }\n"
9941 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009942 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009943
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009944 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009945 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009946 " // ...\n"
9947 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009948 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009949 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009950 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009951 " // ...\n"
9952 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009953 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009954 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009955 // .. or dict literals.
9956 verifyFormat("void f()\n"
9957 "{\n"
9958 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
9959 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009960 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009961 verifyFormat("int f()\n"
9962 "{ // comment\n"
9963 " return 42;\n"
9964 "}",
9965 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009966
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009967 AllmanBraceStyle.ColumnLimit = 19;
9968 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9969 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009970 verifyFormat("void f()\n"
9971 "{\n"
9972 " int i;\n"
9973 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009974 AllmanBraceStyle);
9975 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009976
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009977 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009978 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9979 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9980 verifyFormat("void f(bool b)\n"
9981 "{\n"
9982 " if (b)\n"
9983 " {\n"
9984 " return;\n"
9985 " }\n"
9986 "}\n",
9987 BreakBeforeBraceShortIfs);
9988 verifyFormat("void f(bool b)\n"
9989 "{\n"
9990 " if (b) return;\n"
9991 "}\n",
9992 BreakBeforeBraceShortIfs);
9993 verifyFormat("void f(bool b)\n"
9994 "{\n"
9995 " while (b)\n"
9996 " {\n"
9997 " return;\n"
9998 " }\n"
9999 "}\n",
10000 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +000010001}
10002
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010003TEST_F(FormatTest, GNUBraceBreaking) {
10004 FormatStyle GNUBraceStyle = getLLVMStyle();
10005 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
10006 verifyFormat("namespace a\n"
10007 "{\n"
10008 "class A\n"
10009 "{\n"
10010 " void f()\n"
10011 " {\n"
10012 " int a;\n"
10013 " {\n"
10014 " int b;\n"
10015 " }\n"
10016 " if (true)\n"
10017 " {\n"
10018 " a();\n"
10019 " b();\n"
10020 " }\n"
10021 " }\n"
10022 " void g() { return; }\n"
10023 "}\n"
10024 "}",
10025 GNUBraceStyle);
10026
10027 verifyFormat("void f()\n"
10028 "{\n"
10029 " if (true)\n"
10030 " {\n"
10031 " a();\n"
10032 " }\n"
10033 " else if (false)\n"
10034 " {\n"
10035 " b();\n"
10036 " }\n"
10037 " else\n"
10038 " {\n"
10039 " c();\n"
10040 " }\n"
10041 "}\n",
10042 GNUBraceStyle);
10043
10044 verifyFormat("void f()\n"
10045 "{\n"
10046 " for (int i = 0; i < 10; ++i)\n"
10047 " {\n"
10048 " a();\n"
10049 " }\n"
10050 " while (false)\n"
10051 " {\n"
10052 " b();\n"
10053 " }\n"
10054 " do\n"
10055 " {\n"
10056 " c();\n"
10057 " }\n"
10058 " while (false);\n"
10059 "}\n",
10060 GNUBraceStyle);
10061
10062 verifyFormat("void f(int a)\n"
10063 "{\n"
10064 " switch (a)\n"
10065 " {\n"
10066 " case 0:\n"
10067 " break;\n"
10068 " case 1:\n"
10069 " {\n"
10070 " break;\n"
10071 " }\n"
10072 " case 2:\n"
10073 " {\n"
10074 " }\n"
10075 " break;\n"
10076 " default:\n"
10077 " break;\n"
10078 " }\n"
10079 "}\n",
10080 GNUBraceStyle);
10081
10082 verifyFormat("enum X\n"
10083 "{\n"
10084 " Y = 0,\n"
10085 "}\n",
10086 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010087
10088 verifyFormat("@interface BSApplicationController ()\n"
10089 "{\n"
10090 "@private\n"
10091 " id _extraIvar;\n"
10092 "}\n"
10093 "@end\n",
10094 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010095
10096 verifyFormat("#ifdef _DEBUG\n"
10097 "int foo(int i = 0)\n"
10098 "#else\n"
10099 "int foo(int i = 5)\n"
10100 "#endif\n"
10101 "{\n"
10102 " return i;\n"
10103 "}",
10104 GNUBraceStyle);
10105
10106 verifyFormat("void foo() {}\n"
10107 "void bar()\n"
10108 "#ifdef _DEBUG\n"
10109 "{\n"
10110 " foo();\n"
10111 "}\n"
10112 "#else\n"
10113 "{\n"
10114 "}\n"
10115 "#endif",
10116 GNUBraceStyle);
10117
10118 verifyFormat("void foobar() { int i = 5; }\n"
10119 "#ifdef _DEBUG\n"
10120 "void bar() {}\n"
10121 "#else\n"
10122 "void bar() { foobar(); }\n"
10123 "#endif",
10124 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010125}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010126
10127TEST_F(FormatTest, WebKitBraceBreaking) {
10128 FormatStyle WebKitBraceStyle = getLLVMStyle();
10129 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
10130 verifyFormat("namespace a {\n"
10131 "class A {\n"
10132 " void f()\n"
10133 " {\n"
10134 " if (true) {\n"
10135 " a();\n"
10136 " b();\n"
10137 " }\n"
10138 " }\n"
10139 " void g() { return; }\n"
10140 "};\n"
10141 "enum E {\n"
10142 " A,\n"
10143 " // foo\n"
10144 " B,\n"
10145 " C\n"
10146 "};\n"
10147 "struct B {\n"
10148 " int x;\n"
10149 "};\n"
10150 "}\n",
10151 WebKitBraceStyle);
10152 verifyFormat("struct S {\n"
10153 " int Type;\n"
10154 " union {\n"
10155 " int x;\n"
10156 " double y;\n"
10157 " } Value;\n"
10158 " class C {\n"
10159 " MyFavoriteType Value;\n"
10160 " } Class;\n"
10161 "};\n",
10162 WebKitBraceStyle);
10163}
10164
Manuel Klimekd5735502013-08-12 03:51:17 +000010165TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10166 verifyFormat("void f() {\n"
10167 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010168 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010169 " }\n"
10170 "}\n",
10171 getLLVMStyle());
10172}
10173
Daniel Jasper9613c812013-08-07 16:29:23 +000010174TEST_F(FormatTest, UnderstandsPragmas) {
10175 verifyFormat("#pragma omp reduction(| : var)");
10176 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010177
10178 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10179 "(including parentheses).",
10180 format("#pragma mark Any non-hyphenated or hyphenated string "
10181 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010182}
10183
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010184TEST_F(FormatTest, UnderstandPragmaOption) {
10185 verifyFormat("#pragma option -C -A");
10186
10187 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10188}
10189
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010190#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10191 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010192 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10193 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010194
10195TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010196 SmallVector<FormatStyle, 3> Styles;
10197 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010198
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010199 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010200 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10201 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10202 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010203
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010204 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010205 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10206 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10207 EXPECT_ALL_STYLES_EQUAL(Styles);
10208
Nico Weber514ecc82014-02-02 20:50:45 +000010209 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010210 EXPECT_TRUE(
10211 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10212 EXPECT_TRUE(
10213 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10214 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010215
Nico Weber514ecc82014-02-02 20:50:45 +000010216 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010217 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10218 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10219 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010220
10221 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010222 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10223 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10224 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010225
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010226 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010227 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10228 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10229 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010230
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010231 Styles[0] = getGNUStyle();
10232 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10233 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10234 EXPECT_ALL_STYLES_EQUAL(Styles);
10235
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010236 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10237}
10238
10239TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10240 SmallVector<FormatStyle, 8> Styles;
10241 Styles.resize(2);
10242
10243 Styles[0] = getGoogleStyle();
10244 Styles[1] = getLLVMStyle();
10245 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10246 EXPECT_ALL_STYLES_EQUAL(Styles);
10247
10248 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010249 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010250 Styles[1] = getLLVMStyle();
10251 Styles[1].Language = FormatStyle::LK_JavaScript;
10252 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10253
10254 Styles[2] = getLLVMStyle();
10255 Styles[2].Language = FormatStyle::LK_JavaScript;
10256 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10257 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010258 &Styles[2])
10259 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010260
10261 Styles[3] = getLLVMStyle();
10262 Styles[3].Language = FormatStyle::LK_JavaScript;
10263 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10264 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010265 &Styles[3])
10266 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010267
10268 Styles[4] = getLLVMStyle();
10269 Styles[4].Language = FormatStyle::LK_JavaScript;
10270 EXPECT_EQ(0, parseConfiguration("---\n"
10271 "BasedOnStyle: LLVM\n"
10272 "IndentWidth: 123\n"
10273 "---\n"
10274 "BasedOnStyle: Google\n"
10275 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010276 &Styles[4])
10277 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010278 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010279}
10280
Daniel Jasper91881d92014-09-29 08:07:46 +000010281#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010282 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010283 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010284 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010285 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010286 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010287
Daniel Jasper91881d92014-09-29 08:07:46 +000010288#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10289
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010290#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10291 Style.STRUCT.FIELD = false; \
10292 EXPECT_EQ(0, \
10293 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10294 .value()); \
10295 EXPECT_TRUE(Style.STRUCT.FIELD); \
10296 EXPECT_EQ(0, \
10297 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10298 .value()); \
10299 EXPECT_FALSE(Style.STRUCT.FIELD);
10300
10301#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10302 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10303
Daniel Jasper00853002014-09-16 16:22:30 +000010304#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10305 EXPECT_NE(VALUE, Style.FIELD); \
10306 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10307 EXPECT_EQ(VALUE, Style.FIELD)
10308
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010309TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010310 FormatStyle Style = {};
10311 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010312 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +000010313 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010314 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010315 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010316 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010317 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010318 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010319 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010320 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010321 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010322 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010323 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010324 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010325 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010326 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +000010327 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010328 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010329 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010330 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010331 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010332 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010333 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010334 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010335 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010336 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010337 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010338 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010339 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010340 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010341 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010342 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010343 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010344 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010345 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010346 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010347 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010348 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010349 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010350
10351 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10352 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10353 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10354 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10355 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10356 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10357 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10358 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
10359 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10360 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10361 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010362}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010363
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010364#undef CHECK_PARSE_BOOL
10365
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010366TEST_F(FormatTest, ParsesConfiguration) {
10367 FormatStyle Style = {};
10368 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010369 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010370 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10371 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010372 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010373 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10374 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010375 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10376 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010377 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10378 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10379 PenaltyReturnTypeOnItsOwnLine, 1234u);
10380 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10381 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010382 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010383 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010384 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010385
Daniel Jasper553d4872014-06-17 12:40:34 +000010386 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010387 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10388 FormatStyle::PAS_Left);
10389 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10390 FormatStyle::PAS_Right);
10391 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10392 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010393 // For backward compatibility:
10394 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10395 FormatStyle::PAS_Left);
10396 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10397 FormatStyle::PAS_Right);
10398 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10399 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010400
Alexander Kornienkod6538332013-05-07 15:32:14 +000010401 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010402 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10403 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010404 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10405 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10406 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10407
Daniel Jasperac043c92014-09-15 11:11:00 +000010408 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010409 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10410 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010411 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10412 FormatStyle::BOS_None);
10413 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10414 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010415 // For backward compatibility:
10416 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10417 FormatStyle::BOS_None);
10418 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10419 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010420
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010421 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10422 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10423 FormatStyle::BAS_Align);
10424 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10425 FormatStyle::BAS_DontAlign);
10426 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10427 FormatStyle::BAS_AlwaysBreak);
10428 // For backward compatibility:
10429 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10430 FormatStyle::BAS_DontAlign);
10431 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10432 FormatStyle::BAS_Align);
10433
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010434 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010435 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10436 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10437 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010438 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10439 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010440 // For backward compatibility:
10441 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10442 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010443
Daniel Jasperd74cf402014-04-08 12:46:38 +000010444 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010445 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10446 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10447 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10448 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010449 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10450 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010451 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10452 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010453 // For backward compatibility:
10454 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10455 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10456 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10457 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010458
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010459 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10460 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10461 FormatStyle::SBPO_Never);
10462 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10463 FormatStyle::SBPO_Always);
10464 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10465 FormatStyle::SBPO_ControlStatements);
10466 // For backward compatibility:
10467 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10468 FormatStyle::SBPO_Never);
10469 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10470 FormatStyle::SBPO_ControlStatements);
10471
Alexander Kornienkod6538332013-05-07 15:32:14 +000010472 Style.ColumnLimit = 123;
10473 FormatStyle BaseStyle = getLLVMStyle();
10474 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10475 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10476
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010477 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10478 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10479 FormatStyle::BS_Attach);
10480 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10481 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010482 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10483 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010484 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10485 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010486 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10487 FormatStyle::BS_Allman);
10488 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010489 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10490 FormatStyle::BS_WebKit);
10491 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10492 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010493
Zachary Turner448592e2015-12-18 22:20:15 +000010494 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10495 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10496 FormatStyle::RTBS_None);
10497 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10498 FormatStyle::RTBS_All);
10499 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010500 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010501 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10502 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10503 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10504 AlwaysBreakAfterReturnType,
10505 FormatStyle::RTBS_TopLevelDefinitions);
10506
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010507 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10508 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10509 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10510 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10511 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10512 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10513 AlwaysBreakAfterDefinitionReturnType,
10514 FormatStyle::DRTBS_TopLevel);
10515
Daniel Jasper65ee3472013-07-31 23:16:02 +000010516 Style.NamespaceIndentation = FormatStyle::NI_All;
10517 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10518 FormatStyle::NI_None);
10519 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10520 FormatStyle::NI_Inner);
10521 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10522 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010523
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010524 // FIXME: This is required because parsing a configuration simply overwrites
10525 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010526 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010527 std::vector<std::string> BoostForeach;
10528 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010529 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010530 std::vector<std::string> BoostAndQForeach;
10531 BoostAndQForeach.push_back("BOOST_FOREACH");
10532 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010533 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10534 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010535
10536 Style.IncludeCategories.clear();
10537 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10538 {".*", 1}};
10539 CHECK_PARSE("IncludeCategories:\n"
10540 " - Regex: abc/.*\n"
10541 " Priority: 2\n"
10542 " - Regex: .*\n"
10543 " Priority: 1",
10544 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010545 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010546}
10547
10548TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10549 FormatStyle Style = {};
10550 Style.Language = FormatStyle::LK_Cpp;
10551 CHECK_PARSE("Language: Cpp\n"
10552 "IndentWidth: 12",
10553 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010554 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10555 "IndentWidth: 34",
10556 &Style),
10557 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010558 EXPECT_EQ(12u, Style.IndentWidth);
10559 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10560 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10561
10562 Style.Language = FormatStyle::LK_JavaScript;
10563 CHECK_PARSE("Language: JavaScript\n"
10564 "IndentWidth: 12",
10565 IndentWidth, 12u);
10566 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010567 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10568 "IndentWidth: 34",
10569 &Style),
10570 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010571 EXPECT_EQ(23u, Style.IndentWidth);
10572 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10573 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10574
10575 CHECK_PARSE("BasedOnStyle: LLVM\n"
10576 "IndentWidth: 67",
10577 IndentWidth, 67u);
10578
10579 CHECK_PARSE("---\n"
10580 "Language: JavaScript\n"
10581 "IndentWidth: 12\n"
10582 "---\n"
10583 "Language: Cpp\n"
10584 "IndentWidth: 34\n"
10585 "...\n",
10586 IndentWidth, 12u);
10587
10588 Style.Language = FormatStyle::LK_Cpp;
10589 CHECK_PARSE("---\n"
10590 "Language: JavaScript\n"
10591 "IndentWidth: 12\n"
10592 "---\n"
10593 "Language: Cpp\n"
10594 "IndentWidth: 34\n"
10595 "...\n",
10596 IndentWidth, 34u);
10597 CHECK_PARSE("---\n"
10598 "IndentWidth: 78\n"
10599 "---\n"
10600 "Language: JavaScript\n"
10601 "IndentWidth: 56\n"
10602 "...\n",
10603 IndentWidth, 78u);
10604
10605 Style.ColumnLimit = 123;
10606 Style.IndentWidth = 234;
10607 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10608 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010609 EXPECT_FALSE(parseConfiguration("---\n"
10610 "IndentWidth: 456\n"
10611 "BreakBeforeBraces: Allman\n"
10612 "---\n"
10613 "Language: JavaScript\n"
10614 "IndentWidth: 111\n"
10615 "TabWidth: 111\n"
10616 "---\n"
10617 "Language: Cpp\n"
10618 "BreakBeforeBraces: Stroustrup\n"
10619 "TabWidth: 789\n"
10620 "...\n",
10621 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010622 EXPECT_EQ(123u, Style.ColumnLimit);
10623 EXPECT_EQ(456u, Style.IndentWidth);
10624 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10625 EXPECT_EQ(789u, Style.TabWidth);
10626
Rafael Espindola1f243172014-06-12 11:35:17 +000010627 EXPECT_EQ(parseConfiguration("---\n"
10628 "Language: JavaScript\n"
10629 "IndentWidth: 56\n"
10630 "---\n"
10631 "IndentWidth: 78\n"
10632 "...\n",
10633 &Style),
10634 ParseError::Error);
10635 EXPECT_EQ(parseConfiguration("---\n"
10636 "Language: JavaScript\n"
10637 "IndentWidth: 56\n"
10638 "---\n"
10639 "Language: JavaScript\n"
10640 "IndentWidth: 78\n"
10641 "...\n",
10642 &Style),
10643 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010644
10645 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10646}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010647
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010648#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010649
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010650TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10651 FormatStyle Style = {};
10652 Style.Language = FormatStyle::LK_JavaScript;
10653 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010654 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010655 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010656
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010657 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010658 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010659 "BasedOnStyle: Google\n"
10660 "---\n"
10661 "Language: JavaScript\n"
10662 "IndentWidth: 76\n"
10663 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010664 &Style)
10665 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010666 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010667 EXPECT_EQ(76u, Style.IndentWidth);
10668 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10669}
10670
Alexander Kornienkod6538332013-05-07 15:32:14 +000010671TEST_F(FormatTest, ConfigurationRoundTripTest) {
10672 FormatStyle Style = getLLVMStyle();
10673 std::string YAML = configurationAsText(Style);
10674 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010675 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010676 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10677 EXPECT_EQ(Style, ParsedStyle);
10678}
10679
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010680TEST_F(FormatTest, WorksFor8bitEncodings) {
10681 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10682 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10683 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10684 "\"\xef\xee\xf0\xf3...\"",
10685 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10686 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10687 "\xef\xee\xf0\xf3...\"",
10688 getLLVMStyleWithColumns(12)));
10689}
10690
Alexander Kornienko393e3082013-11-13 14:04:17 +000010691TEST_F(FormatTest, HandlesUTF8BOM) {
10692 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10693 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10694 format("\xef\xbb\xbf#include <iostream>"));
10695 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10696 format("\xef\xbb\xbf\n#include <iostream>"));
10697}
10698
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010699// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10700#if !defined(_MSC_VER)
10701
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010702TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10703 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10704 getLLVMStyleWithColumns(35));
10705 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010706 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010707 verifyFormat("// Однажды в студёную зимнюю пору...",
10708 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010709 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010710 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10711 getLLVMStyleWithColumns(39));
10712 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010713 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010714}
10715
10716TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010717 // Non-printable characters' width is currently considered to be the length in
10718 // bytes in UTF8. The characters can be displayed in very different manner
10719 // (zero-width, single width with a substitution glyph, expanded to their code
10720 // (e.g. "<8d>"), so there's no single correct way to handle them.
10721 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010722 "\"\xc2\x8d\";",
10723 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010724 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010725 "\"\xc2\x8d\";",
10726 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010727 EXPECT_EQ("\"Однажды, в \"\n"
10728 "\"студёную \"\n"
10729 "\"зимнюю \"\n"
10730 "\"пору,\"",
10731 format("\"Однажды, в студёную зимнюю пору,\"",
10732 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010733 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010734 "\"一 二 三 \"\n"
10735 "\"四 五六 \"\n"
10736 "\"七 八 九 \"\n"
10737 "\"十\"",
10738 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010739 EXPECT_EQ("\"一\t二 \"\n"
10740 "\"\t三 \"\n"
10741 "\"四 五\t六 \"\n"
10742 "\"\t七 \"\n"
10743 "\"八九十\tqq\"",
10744 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10745 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010746
10747 // UTF8 character in an escape sequence.
10748 EXPECT_EQ("\"aaaaaa\"\n"
10749 "\"\\\xC2\x8D\"",
10750 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010751}
10752
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010753TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10754 EXPECT_EQ("const char *sssss =\n"
10755 " \"一二三四五六七八\\\n"
10756 " 九 十\";",
10757 format("const char *sssss = \"一二三四五六七八\\\n"
10758 " 九 十\";",
10759 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010760}
10761
10762TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010763 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10764 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010765 EXPECT_EQ("// Я из лесу\n"
10766 "// вышел; был\n"
10767 "// сильный\n"
10768 "// мороз.",
10769 format("// Я из лесу вышел; был сильный мороз.",
10770 getLLVMStyleWithColumns(13)));
10771 EXPECT_EQ("// 一二三\n"
10772 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010773 "// 八 九\n"
10774 "// 十",
10775 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010776}
10777
10778TEST_F(FormatTest, SplitsUTF8BlockComments) {
10779 EXPECT_EQ("/* Гляжу,\n"
10780 " * поднимается\n"
10781 " * медленно в\n"
10782 " * гору\n"
10783 " * Лошадка,\n"
10784 " * везущая\n"
10785 " * хворосту\n"
10786 " * воз. */",
10787 format("/* Гляжу, поднимается медленно в гору\n"
10788 " * Лошадка, везущая хворосту воз. */",
10789 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010790 EXPECT_EQ(
10791 "/* 一二三\n"
10792 " * 四五六七\n"
10793 " * 八 九\n"
10794 " * 十 */",
10795 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010796 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10797 " * 𝕓𝕪𝕥𝕖\n"
10798 " * 𝖀𝕿𝕱-𝟠 */",
10799 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010800}
10801
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010802#endif // _MSC_VER
10803
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010804TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10805 FormatStyle Style = getLLVMStyle();
10806
10807 Style.ConstructorInitializerIndentWidth = 4;
10808 verifyFormat(
10809 "SomeClass::Constructor()\n"
10810 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10811 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10812 Style);
10813
10814 Style.ConstructorInitializerIndentWidth = 2;
10815 verifyFormat(
10816 "SomeClass::Constructor()\n"
10817 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10818 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10819 Style);
10820
10821 Style.ConstructorInitializerIndentWidth = 0;
10822 verifyFormat(
10823 "SomeClass::Constructor()\n"
10824 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10825 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10826 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010827 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10828 verifyFormat(
10829 "SomeLongTemplateVariableName<\n"
10830 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10831 Style);
10832 verifyFormat(
10833 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10834 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10835 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010836}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010837
Daniel Jasper00853002014-09-16 16:22:30 +000010838TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10839 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010840 Style.BreakConstructorInitializersBeforeComma = true;
10841 Style.ConstructorInitializerIndentWidth = 4;
10842 verifyFormat("SomeClass::Constructor()\n"
10843 " : a(a)\n"
10844 " , b(b)\n"
10845 " , c(c) {}",
10846 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010847 verifyFormat("SomeClass::Constructor()\n"
10848 " : a(a) {}",
10849 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010850
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010851 Style.ColumnLimit = 0;
10852 verifyFormat("SomeClass::Constructor()\n"
10853 " : a(a) {}",
10854 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010855 verifyFormat("SomeClass::Constructor() noexcept\n"
10856 " : a(a) {}",
10857 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010858 verifyFormat("SomeClass::Constructor()\n"
10859 " : a(a)\n"
10860 " , b(b)\n"
10861 " , c(c) {}",
10862 Style);
10863 verifyFormat("SomeClass::Constructor()\n"
10864 " : a(a) {\n"
10865 " foo();\n"
10866 " bar();\n"
10867 "}",
10868 Style);
10869
Daniel Jasperd74cf402014-04-08 12:46:38 +000010870 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010871 verifyFormat("SomeClass::Constructor()\n"
10872 " : a(a)\n"
10873 " , b(b)\n"
10874 " , c(c) {\n}",
10875 Style);
10876 verifyFormat("SomeClass::Constructor()\n"
10877 " : a(a) {\n}",
10878 Style);
10879
10880 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010881 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010882 Style.ConstructorInitializerIndentWidth = 2;
10883 verifyFormat("SomeClass::Constructor()\n"
10884 " : a(a)\n"
10885 " , b(b)\n"
10886 " , c(c) {}",
10887 Style);
10888
10889 Style.ConstructorInitializerIndentWidth = 0;
10890 verifyFormat("SomeClass::Constructor()\n"
10891 ": a(a)\n"
10892 ", b(b)\n"
10893 ", c(c) {}",
10894 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010895
10896 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10897 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010898 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10899 verifyFormat(
10900 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10901 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010902 verifyFormat(
10903 "SomeClass::Constructor()\n"
10904 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10905 Style);
10906 Style.ConstructorInitializerIndentWidth = 4;
10907 Style.ColumnLimit = 60;
10908 verifyFormat("SomeClass::Constructor()\n"
10909 " : aaaaaaaa(aaaaaaaa)\n"
10910 " , aaaaaaaa(aaaaaaaa)\n"
10911 " , aaaaaaaa(aaaaaaaa) {}",
10912 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010913}
10914
Daniel Jasper38efc132014-10-21 07:51:54 +000010915TEST_F(FormatTest, Destructors) {
10916 verifyFormat("void F(int &i) { i.~int(); }");
10917 verifyFormat("void F(int &i) { i->~int(); }");
10918}
10919
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010920TEST_F(FormatTest, FormatsWithWebKitStyle) {
10921 FormatStyle Style = getWebKitStyle();
10922
10923 // Don't indent in outer namespaces.
10924 verifyFormat("namespace outer {\n"
10925 "int i;\n"
10926 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010927 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010928 "} // namespace inner\n"
10929 "} // namespace outer\n"
10930 "namespace other_outer {\n"
10931 "int i;\n"
10932 "}",
10933 Style);
10934
10935 // Don't indent case labels.
10936 verifyFormat("switch (variable) {\n"
10937 "case 1:\n"
10938 "case 2:\n"
10939 " doSomething();\n"
10940 " break;\n"
10941 "default:\n"
10942 " ++variable;\n"
10943 "}",
10944 Style);
10945
10946 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010947 EXPECT_EQ("void f()\n"
10948 "{\n"
10949 " if (aaaaaaaaaaaaaaaa\n"
10950 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10951 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10952 " return;\n"
10953 "}",
10954 format("void f() {\n"
10955 "if (aaaaaaaaaaaaaaaa\n"
10956 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10957 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10958 "return;\n"
10959 "}",
10960 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010961
Daniel Jasper35995672014-04-29 14:05:20 +000010962 // Allow functions on a single line.
10963 verifyFormat("void f() { return; }", Style);
10964
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010965 // Constructor initializers are formatted one per line with the "," on the
10966 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010967 verifyFormat("Constructor()\n"
10968 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10969 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010970 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010971 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10972 "{\n"
10973 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010974 Style);
10975 verifyFormat("SomeClass::Constructor()\n"
10976 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010977 "{\n"
10978 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010979 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010980 EXPECT_EQ("SomeClass::Constructor()\n"
10981 " : a(a)\n"
10982 "{\n"
10983 "}",
10984 format("SomeClass::Constructor():a(a){}", Style));
10985 verifyFormat("SomeClass::Constructor()\n"
10986 " : a(a)\n"
10987 " , b(b)\n"
10988 " , c(c)\n"
10989 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010990 "}",
10991 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010992 verifyFormat("SomeClass::Constructor()\n"
10993 " : a(a)\n"
10994 "{\n"
10995 " foo();\n"
10996 " bar();\n"
10997 "}",
10998 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010999
Daniel Jasper65ee3472013-07-31 23:16:02 +000011000 // Access specifiers should be aligned left.
11001 verifyFormat("class C {\n"
11002 "public:\n"
11003 " int i;\n"
11004 "};",
11005 Style);
11006
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011007 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000011008 verifyFormat("int a; // Do not\n"
11009 "double b; // align comments.",
11010 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011011
Daniel Jasper3219e432014-12-02 13:24:51 +000011012 // Do not align operands.
11013 EXPECT_EQ("ASSERT(aaaa\n"
11014 " || bbbb);",
11015 format("ASSERT ( aaaa\n||bbbb);", Style));
11016
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011017 // Accept input's line breaks.
11018 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
11019 " || bbbbbbbbbbbbbbb) {\n"
11020 " i++;\n"
11021 "}",
11022 format("if (aaaaaaaaaaaaaaa\n"
11023 "|| bbbbbbbbbbbbbbb) { i++; }",
11024 Style));
11025 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
11026 " i++;\n"
11027 "}",
11028 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000011029
11030 // Don't automatically break all macro definitions (llvm.org/PR17842).
11031 verifyFormat("#define aNumber 10", Style);
11032 // However, generally keep the line breaks that the user authored.
11033 EXPECT_EQ("#define aNumber \\\n"
11034 " 10",
11035 format("#define aNumber \\\n"
11036 " 10",
11037 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000011038
11039 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011040 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
11041 " copyItems:YES];",
11042 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
11043 "copyItems:YES];",
11044 Style));
11045 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
11046 " copyItems:YES];",
11047 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
11048 " copyItems:YES];",
11049 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000011050 // FIXME: This does not seem right, there should be more indentation before
11051 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011052 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000011053 " @\"a\",\n"
11054 " @\"a\"\n"
11055 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011056 " copyItems:YES];",
11057 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
11058 " @\"a\",\n"
11059 " @\"a\"\n"
11060 " ]\n"
11061 " copyItems:YES];",
11062 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011063 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011064 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11065 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011066 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11067 " copyItems:YES];",
11068 Style));
11069
11070 verifyFormat("[self.a b:c c:d];", Style);
11071 EXPECT_EQ("[self.a b:c\n"
11072 " c:d];",
11073 format("[self.a b:c\n"
11074 "c:d];",
11075 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011076}
11077
Manuel Klimekffdeb592013-09-03 15:10:01 +000011078TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011079 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
11080 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
11081 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
11082 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
11083 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000011084 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000011085 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011086 verifyFormat("void f() {\n"
11087 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
11088 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011089 verifyFormat("void f() {\n"
11090 " other(x.begin(), //\n"
11091 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000011092 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011093 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000011094 verifyFormat("SomeFunction([]() { // A cool function...\n"
11095 " return 43;\n"
11096 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000011097 EXPECT_EQ("SomeFunction([]() {\n"
11098 "#define A a\n"
11099 " return 43;\n"
11100 "});",
11101 format("SomeFunction([](){\n"
11102 "#define A a\n"
11103 "return 43;\n"
11104 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000011105 verifyFormat("void f() {\n"
11106 " SomeFunction([](decltype(x), A *a) {});\n"
11107 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011108 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11109 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000011110 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
11111 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11112 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011113 verifyFormat("Constructor()\n"
11114 " : Field([] { // comment\n"
11115 " int i;\n"
11116 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011117 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11118 " return some_parameter.size();\n"
11119 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011120 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11121 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011122 verifyFormat("int i = aaaaaa ? 1 //\n"
11123 " : [] {\n"
11124 " return 2; //\n"
11125 " }();");
11126 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11127 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11128 " return x == 2; // force break\n"
11129 " });");
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011130 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n"
11131 " int iiiiiiiiiiii) {\n"
11132 " return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n"
11133 "});",
11134 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011135 verifyFormat("SomeFunction({[&] {\n"
11136 " // comment\n"
11137 " },\n"
11138 " [&] {\n"
11139 " // comment\n"
11140 " }});");
11141 verifyFormat("SomeFunction({[&] {\n"
11142 " // comment\n"
11143 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011144 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11145 " [&]() { return true; },\n"
11146 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011147
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011148 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011149 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011150 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011151 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11152 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011153 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011154 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011155 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11156 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011157 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011158 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11159 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011160 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011161 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011162 verifyFormat(
11163 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11164 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11165 " return aaaaaaaaaaaaaaaaa;\n"
11166 " });",
11167 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011168 verifyFormat("[]() //\n"
11169 " -> int {\n"
11170 " return 1; //\n"
11171 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011172
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011173 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011174 verifyFormat("SomeFunction(\n"
11175 " []() {\n"
11176 " int i = 42;\n"
11177 " return i;\n"
11178 " },\n"
11179 " []() {\n"
11180 " int j = 43;\n"
11181 " return j;\n"
11182 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011183
Daniel Jasperda18fd82014-06-10 06:39:03 +000011184 // More complex introducers.
11185 verifyFormat("return [i, args...] {};");
11186
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011187 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011188 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011189 verifyFormat("double &operator[](int i) { return 0; }\n"
11190 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011191 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011192 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011193 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011194
11195 // Other corner cases.
11196 verifyFormat("void f() {\n"
11197 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
11198 " );\n"
11199 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011200
11201 // Lambdas created through weird macros.
11202 verifyFormat("void f() {\n"
11203 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011204 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011205 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011206
11207 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11208 " doo_dah();\n"
11209 " doo_dah();\n"
11210 " })) {\n"
11211 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011212 verifyFormat("auto lambda = []() {\n"
11213 " int a = 2\n"
11214 "#if A\n"
11215 " + 2\n"
11216 "#endif\n"
11217 " ;\n"
11218 "};");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011219}
11220
Manuel Klimek516e0542013-09-04 13:25:30 +000011221TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011222 FormatStyle ShortBlocks = getLLVMStyle();
11223 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11224 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11225 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11226 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11227 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11228 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11229 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011230
Daniel Jasper76284682014-10-22 09:12:44 +000011231 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11232 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11233 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011234
Daniel Jasper76284682014-10-22 09:12:44 +000011235 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011236 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011237 "}];");
11238 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011239 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011240 "}]};");
11241 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011242 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011243 "}];");
11244 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011245 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011246 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011247 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011248 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011249 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011250 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011251 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011252
11253 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011254 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011255 "}];",
11256 getLLVMStyleWithColumns(60));
11257 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011258 " NSString *path = [self sessionFilePath];\n"
11259 " if (path) {\n"
11260 " // ...\n"
11261 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011262 "});");
11263 verifyFormat("[[SessionService sharedService]\n"
11264 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011265 " if (window) {\n"
11266 " [self windowDidLoad:window];\n"
11267 " } else {\n"
11268 " [self errorLoadingWindow];\n"
11269 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011270 " }];");
11271 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011272 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011273 "};\n",
11274 getLLVMStyleWithColumns(40));
11275 verifyFormat("[[SessionService sharedService]\n"
11276 " loadWindowWithCompletionBlock: //\n"
11277 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011278 " if (window) {\n"
11279 " [self windowDidLoad:window];\n"
11280 " } else {\n"
11281 " [self errorLoadingWindow];\n"
11282 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011283 " }];",
11284 getLLVMStyleWithColumns(60));
11285 verifyFormat("[myObject doSomethingWith:arg1\n"
11286 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011287 " // ...\n"
11288 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011289 " }\n"
11290 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011291 " // ...\n"
11292 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011293 " }\n"
11294 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011295 " // ...\n"
11296 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011297 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011298 verifyFormat("[myObject doSomethingWith:arg1\n"
11299 " firstBlock:-1\n"
11300 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011301 " // ...\n"
11302 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011303 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011304
11305 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011306 " @autoreleasepool {\n"
11307 " if (a) {\n"
11308 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011309 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011310 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011311 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011312 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011313 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11314 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011315
11316 FormatStyle FourIndent = getLLVMStyle();
11317 FourIndent.ObjCBlockIndentWidth = 4;
11318 verifyFormat("[operation setCompletionBlock:^{\n"
11319 " [self onOperationDone];\n"
11320 "}];",
11321 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011322}
11323
Daniel Jasper289afc02015-04-23 09:23:17 +000011324TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11325 FormatStyle ZeroColumn = getLLVMStyle();
11326 ZeroColumn.ColumnLimit = 0;
11327
11328 verifyFormat("[[SessionService sharedService] "
11329 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11330 " if (window) {\n"
11331 " [self windowDidLoad:window];\n"
11332 " } else {\n"
11333 " [self errorLoadingWindow];\n"
11334 " }\n"
11335 "}];",
11336 ZeroColumn);
11337 EXPECT_EQ("[[SessionService sharedService]\n"
11338 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11339 " if (window) {\n"
11340 " [self windowDidLoad:window];\n"
11341 " } else {\n"
11342 " [self errorLoadingWindow];\n"
11343 " }\n"
11344 " }];",
11345 format("[[SessionService sharedService]\n"
11346 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11347 " if (window) {\n"
11348 " [self windowDidLoad:window];\n"
11349 " } else {\n"
11350 " [self errorLoadingWindow];\n"
11351 " }\n"
11352 "}];",
11353 ZeroColumn));
11354 verifyFormat("[myObject doSomethingWith:arg1\n"
11355 " firstBlock:^(Foo *a) {\n"
11356 " // ...\n"
11357 " int i;\n"
11358 " }\n"
11359 " secondBlock:^(Bar *b) {\n"
11360 " // ...\n"
11361 " int i;\n"
11362 " }\n"
11363 " thirdBlock:^Foo(Bar *b) {\n"
11364 " // ...\n"
11365 " int i;\n"
11366 " }];",
11367 ZeroColumn);
11368 verifyFormat("f(^{\n"
11369 " @autoreleasepool {\n"
11370 " if (a) {\n"
11371 " g();\n"
11372 " }\n"
11373 " }\n"
11374 "});",
11375 ZeroColumn);
11376 verifyFormat("void (^largeBlock)(void) = ^{\n"
11377 " // ...\n"
11378 "};",
11379 ZeroColumn);
11380
11381 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11382 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011383 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011384 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11385 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11386 " int i;\n"
11387 "};",
11388 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11389}
11390
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011391TEST_F(FormatTest, SupportsCRLF) {
11392 EXPECT_EQ("int a;\r\n"
11393 "int b;\r\n"
11394 "int c;\r\n",
11395 format("int a;\r\n"
11396 " int b;\r\n"
11397 " int c;\r\n",
11398 getLLVMStyle()));
11399 EXPECT_EQ("int a;\r\n"
11400 "int b;\r\n"
11401 "int c;\r\n",
11402 format("int a;\r\n"
11403 " int b;\n"
11404 " int c;\r\n",
11405 getLLVMStyle()));
11406 EXPECT_EQ("int a;\n"
11407 "int b;\n"
11408 "int c;\n",
11409 format("int a;\r\n"
11410 " int b;\n"
11411 " int c;\n",
11412 getLLVMStyle()));
11413 EXPECT_EQ("\"aaaaaaa \"\r\n"
11414 "\"bbbbbbb\";\r\n",
11415 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11416 EXPECT_EQ("#define A \\\r\n"
11417 " b; \\\r\n"
11418 " c; \\\r\n"
11419 " d;\r\n",
11420 format("#define A \\\r\n"
11421 " b; \\\r\n"
11422 " c; d; \r\n",
11423 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011424
11425 EXPECT_EQ("/*\r\n"
11426 "multi line block comments\r\n"
11427 "should not introduce\r\n"
11428 "an extra carriage return\r\n"
11429 "*/\r\n",
11430 format("/*\r\n"
11431 "multi line block comments\r\n"
11432 "should not introduce\r\n"
11433 "an extra carriage return\r\n"
11434 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011435}
11436
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011437TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11438 verifyFormat("MY_CLASS(C) {\n"
11439 " int i;\n"
11440 " int j;\n"
11441 "};");
11442}
11443
Daniel Jasper6633ab82013-10-18 10:38:14 +000011444TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11445 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11446 TwoIndent.ContinuationIndentWidth = 2;
11447
11448 EXPECT_EQ("int i =\n"
11449 " longFunction(\n"
11450 " arg);",
11451 format("int i = longFunction(arg);", TwoIndent));
11452
11453 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11454 SixIndent.ContinuationIndentWidth = 6;
11455
11456 EXPECT_EQ("int i =\n"
11457 " longFunction(\n"
11458 " arg);",
11459 format("int i = longFunction(arg);", SixIndent));
11460}
11461
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011462TEST_F(FormatTest, SpacesInAngles) {
11463 FormatStyle Spaces = getLLVMStyle();
11464 Spaces.SpacesInAngles = true;
11465
11466 verifyFormat("static_cast< int >(arg);", Spaces);
11467 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11468 verifyFormat("f< int, float >();", Spaces);
11469 verifyFormat("template <> g() {}", Spaces);
11470 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011471 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11472 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11473 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011474
11475 Spaces.Standard = FormatStyle::LS_Cpp03;
11476 Spaces.SpacesInAngles = true;
11477 verifyFormat("A< A< int > >();", Spaces);
11478
11479 Spaces.SpacesInAngles = false;
11480 verifyFormat("A<A<int> >();", Spaces);
11481
11482 Spaces.Standard = FormatStyle::LS_Cpp11;
11483 Spaces.SpacesInAngles = true;
11484 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011485
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011486 Spaces.SpacesInAngles = false;
11487 verifyFormat("A<A<int>>();", Spaces);
11488}
11489
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011490TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11491 FormatStyle Style = getLLVMStyle();
11492 Style.SpaceAfterTemplateKeyword = false;
11493 verifyFormat("template<int> void foo();", Style);
11494}
11495
Jacques Pienaarfc275112015-02-18 23:48:37 +000011496TEST_F(FormatTest, TripleAngleBrackets) {
11497 verifyFormat("f<<<1, 1>>>();");
11498 verifyFormat("f<<<1, 1, 1, s>>>();");
11499 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011500 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011501 verifyFormat("f<param><<<1, 1>>>();");
11502 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011503 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011504 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11505 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011506 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11507 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011508}
11509
11510TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011511 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011512 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011513 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11514 "aaallvm::outs() <<");
11515 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11516 "aaaallvm::outs()\n <<");
11517}
11518
Manuel Klimek819788d2014-03-18 11:22:45 +000011519TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11520 std::string code = "#if A\n"
11521 "#if B\n"
11522 "a.\n"
11523 "#endif\n"
11524 " a = 1;\n"
11525 "#else\n"
11526 "#endif\n"
11527 "#if C\n"
11528 "#else\n"
11529 "#endif\n";
11530 EXPECT_EQ(code, format(code));
11531}
11532
Manuel Klimek68b03042014-04-14 09:14:11 +000011533TEST_F(FormatTest, HandleConflictMarkers) {
11534 // Git/SVN conflict markers.
11535 EXPECT_EQ("int a;\n"
11536 "void f() {\n"
11537 " callme(some(parameter1,\n"
11538 "<<<<<<< text by the vcs\n"
11539 " parameter2),\n"
11540 "||||||| text by the vcs\n"
11541 " parameter2),\n"
11542 " parameter3,\n"
11543 "======= text by the vcs\n"
11544 " parameter2, parameter3),\n"
11545 ">>>>>>> text by the vcs\n"
11546 " otherparameter);\n",
11547 format("int a;\n"
11548 "void f() {\n"
11549 " callme(some(parameter1,\n"
11550 "<<<<<<< text by the vcs\n"
11551 " parameter2),\n"
11552 "||||||| text by the vcs\n"
11553 " parameter2),\n"
11554 " parameter3,\n"
11555 "======= text by the vcs\n"
11556 " parameter2,\n"
11557 " parameter3),\n"
11558 ">>>>>>> text by the vcs\n"
11559 " otherparameter);\n"));
11560
11561 // Perforce markers.
11562 EXPECT_EQ("void f() {\n"
11563 " function(\n"
11564 ">>>> text by the vcs\n"
11565 " parameter,\n"
11566 "==== text by the vcs\n"
11567 " parameter,\n"
11568 "==== text by the vcs\n"
11569 " parameter,\n"
11570 "<<<< text by the vcs\n"
11571 " parameter);\n",
11572 format("void f() {\n"
11573 " function(\n"
11574 ">>>> text by the vcs\n"
11575 " parameter,\n"
11576 "==== text by the vcs\n"
11577 " parameter,\n"
11578 "==== text by the vcs\n"
11579 " parameter,\n"
11580 "<<<< text by the vcs\n"
11581 " parameter);\n"));
11582
11583 EXPECT_EQ("<<<<<<<\n"
11584 "|||||||\n"
11585 "=======\n"
11586 ">>>>>>>",
11587 format("<<<<<<<\n"
11588 "|||||||\n"
11589 "=======\n"
11590 ">>>>>>>"));
11591
11592 EXPECT_EQ("<<<<<<<\n"
11593 "|||||||\n"
11594 "int i;\n"
11595 "=======\n"
11596 ">>>>>>>",
11597 format("<<<<<<<\n"
11598 "|||||||\n"
11599 "int i;\n"
11600 "=======\n"
11601 ">>>>>>>"));
11602
11603 // FIXME: Handle parsing of macros around conflict markers correctly:
11604 EXPECT_EQ("#define Macro \\\n"
11605 "<<<<<<<\n"
11606 "Something \\\n"
11607 "|||||||\n"
11608 "Else \\\n"
11609 "=======\n"
11610 "Other \\\n"
11611 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011612 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011613 format("#define Macro \\\n"
11614 "<<<<<<<\n"
11615 " Something \\\n"
11616 "|||||||\n"
11617 " Else \\\n"
11618 "=======\n"
11619 " Other \\\n"
11620 ">>>>>>>\n"
11621 " End\n"
11622 "int i;\n"));
11623}
11624
Daniel Jasper471894432014-08-06 13:40:26 +000011625TEST_F(FormatTest, DisableRegions) {
11626 EXPECT_EQ("int i;\n"
11627 "// clang-format off\n"
11628 " int j;\n"
11629 "// clang-format on\n"
11630 "int k;",
11631 format(" int i;\n"
11632 " // clang-format off\n"
11633 " int j;\n"
11634 " // clang-format on\n"
11635 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011636 EXPECT_EQ("int i;\n"
11637 "/* clang-format off */\n"
11638 " int j;\n"
11639 "/* clang-format on */\n"
11640 "int k;",
11641 format(" int i;\n"
11642 " /* clang-format off */\n"
11643 " int j;\n"
11644 " /* clang-format on */\n"
11645 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011646
11647 // Don't reflow comments within disabled regions.
11648 EXPECT_EQ(
11649 "// clang-format off\n"
11650 "// long long long long long long line\n"
11651 "/* clang-format on */\n"
11652 "/* long long long\n"
11653 " * long long long\n"
11654 " * line */\n"
11655 "int i;\n"
11656 "/* clang-format off */\n"
11657 "/* long long long long long long line */\n",
11658 format("// clang-format off\n"
11659 "// long long long long long long line\n"
11660 "/* clang-format on */\n"
11661 "/* long long long long long long line */\n"
11662 "int i;\n"
11663 "/* clang-format off */\n"
11664 "/* long long long long long long line */\n",
11665 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011666}
11667
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011668TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11669 format("? ) =");
11670 verifyNoCrash("#define a\\\n /**/}");
11671}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011672
Daniel Jasper498f5582015-12-25 08:53:31 +000011673TEST_F(FormatTest, FormatsTableGenCode) {
11674 FormatStyle Style = getLLVMStyle();
11675 Style.Language = FormatStyle::LK_TableGen;
11676 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11677}
11678
Nico Weberb2673a12016-11-10 21:49:25 +000011679TEST_F(FormatTest, ArrayOfTemplates) {
11680 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11681 format("auto a = new unique_ptr<int > [ 10];"));
11682
11683 FormatStyle Spaces = getLLVMStyle();
11684 Spaces.SpacesInSquareBrackets = true;
11685 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11686 format("auto a = new unique_ptr<int > [10];", Spaces));
11687}
11688
11689TEST_F(FormatTest, ArrayAsTemplateType) {
11690 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11691 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11692
11693 FormatStyle Spaces = getLLVMStyle();
11694 Spaces.SpacesInSquareBrackets = true;
11695 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11696 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11697}
11698
Eric Liu547d8792016-03-24 13:22:42 +000011699TEST(FormatStyle, GetStyleOfFile) {
11700 vfs::InMemoryFileSystem FS;
11701 // Test 1: format file in the same directory.
11702 ASSERT_TRUE(
11703 FS.addFile("/a/.clang-format", 0,
11704 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11705 ASSERT_TRUE(
11706 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011707 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011708 ASSERT_TRUE((bool)Style1);
11709 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011710
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011711 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011712 ASSERT_TRUE(
11713 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011714 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011715 ASSERT_TRUE((bool)Style2);
11716 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011717
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011718 // Test 2.2: no format on 'none' fallback style.
11719 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11720 ASSERT_TRUE((bool)Style2);
11721 ASSERT_EQ(*Style2, getNoStyle());
11722
11723 // Test 2.3: format if config is found with no based style while fallback is
11724 // 'none'.
11725 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11726 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11727 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11728 ASSERT_TRUE((bool)Style2);
11729 ASSERT_EQ(*Style2, getLLVMStyle());
11730
11731 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11732 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11733 ASSERT_TRUE((bool)Style2);
11734 ASSERT_EQ(*Style2, getLLVMStyle());
11735
Eric Liu547d8792016-03-24 13:22:42 +000011736 // Test 3: format file in parent directory.
11737 ASSERT_TRUE(
11738 FS.addFile("/c/.clang-format", 0,
11739 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11740 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11741 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011742 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011743 ASSERT_TRUE((bool)Style3);
11744 ASSERT_EQ(*Style3, getGoogleStyle());
11745
11746 // Test 4: error on invalid fallback style
11747 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11748 ASSERT_FALSE((bool)Style4);
11749 llvm::consumeError(Style4.takeError());
11750
11751 // Test 5: error on invalid yaml on command line
11752 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11753 ASSERT_FALSE((bool)Style5);
11754 llvm::consumeError(Style5.takeError());
11755
11756 // Test 6: error on invalid style
11757 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11758 ASSERT_FALSE((bool)Style6);
11759 llvm::consumeError(Style6.takeError());
11760
11761 // Test 7: found config file, error on parsing it
11762 ASSERT_TRUE(
11763 FS.addFile("/d/.clang-format", 0,
11764 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11765 "InvalidKey: InvalidValue")));
11766 ASSERT_TRUE(
11767 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11768 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11769 ASSERT_FALSE((bool)Style7);
11770 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011771}
11772
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011773TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11774 // Column limit is 20.
11775 std::string Code = "Type *a =\n"
11776 " new Type();\n"
11777 "g(iiiii, 0, jjjjj,\n"
11778 " 0, kkkkk, 0, mm);\n"
11779 "int bad = format ;";
11780 std::string Expected = "auto a = new Type();\n"
11781 "g(iiiii, nullptr,\n"
11782 " jjjjj, nullptr,\n"
11783 " kkkkk, nullptr,\n"
11784 " mm);\n"
11785 "int bad = format ;";
11786 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011787 tooling::Replacements Replaces = toReplacements(
11788 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11789 "auto "),
11790 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11791 "nullptr"),
11792 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11793 "nullptr"),
11794 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11795 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011796
11797 format::FormatStyle Style = format::getLLVMStyle();
11798 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011799 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11800 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11801 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11802 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11803 EXPECT_TRUE(static_cast<bool>(Result));
11804 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011805}
11806
Eric Liubaf58c22016-05-18 13:43:48 +000011807TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11808 std::string Code = "#include \"a.h\"\n"
11809 "#include \"c.h\"\n"
11810 "\n"
11811 "int main() {\n"
11812 " return 0;\n"
11813 "}";
11814 std::string Expected = "#include \"a.h\"\n"
11815 "#include \"b.h\"\n"
11816 "#include \"c.h\"\n"
11817 "\n"
11818 "int main() {\n"
11819 " return 0;\n"
11820 "}";
11821 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011822 tooling::Replacements Replaces = toReplacements(
11823 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11824 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011825
11826 format::FormatStyle Style = format::getLLVMStyle();
11827 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011828 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11829 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11830 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11831 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11832 EXPECT_TRUE(static_cast<bool>(Result));
11833 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011834}
11835
Krasimir Georgiev13dbaa02017-02-01 10:10:04 +000011836TEST_F(FormatTest, AlignTrailingComments) {
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011837 EXPECT_EQ("#define MACRO(V) \\\n"
11838 " V(Rt2) /* one more char */ \\\n"
11839 " V(Rs) /* than here */ \\\n"
11840 "/* comment 3 */\n",
11841 format("#define MACRO(V)\\\n"
11842 "V(Rt2) /* one more char */ \\\n"
11843 "V(Rs) /* than here */ \\\n"
11844 "/* comment 3 */ \\\n",
11845 getLLVMStyleWithColumns(40)));
Krasimir Georgiev13dbaa02017-02-01 10:10:04 +000011846 EXPECT_EQ("int i = f(abc, // line 1\n"
11847 " d, // line 2\n"
11848 " // line 3\n"
11849 " b);",
11850 format("int i = f(abc, // line 1\n"
11851 " d, // line 2\n"
11852 " // line 3\n"
11853 " b);",
11854 getLLVMStyleWithColumns(40)));
Krasimir Georgievd105b722017-02-03 10:18:25 +000011855
11856 // Align newly broken trailing comments.
11857 EXPECT_EQ("int ab; // line\n"
11858 "int a; // long\n"
11859 " // long\n",
11860 format("int ab; // line\n"
11861 "int a; // long long\n",
11862 getLLVMStyleWithColumns(15)));
11863 EXPECT_EQ("int ab; // line\n"
11864 "int a; // long\n"
11865 " // long\n"
11866 " // long",
11867 format("int ab; // line\n"
11868 "int a; // long long\n"
11869 " // long",
11870 getLLVMStyleWithColumns(15)));
11871 EXPECT_EQ("int ab; // line\n"
11872 "int a; // long\n"
11873 " // long\n"
11874 "pt c; // long",
11875 format("int ab; // line\n"
11876 "int a; // long long\n"
11877 "pt c; // long",
11878 getLLVMStyleWithColumns(15)));
11879 EXPECT_EQ("int ab; // line\n"
11880 "int a; // long\n"
11881 " // long\n"
11882 "\n"
11883 "// long",
11884 format("int ab; // line\n"
11885 "int a; // long long\n"
11886 "\n"
11887 "// long",
11888 getLLVMStyleWithColumns(15)));
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011889}
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011890} // end namespace
11891} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011892} // end namespace clang