blob: 1f81f5fbd2f086880ab1fe5acd53a907b50580e1 [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 Georgiev91834222017-01-25 13:58:58 +00002373 // Reflow lines that have a non-punctuation character among their first 2
2374 // characters.
2375 EXPECT_EQ("// long long long\n"
2376 "// long 'long'",
2377 format(
2378 "// long long long long\n"
2379 "// 'long'",
2380 getLLVMStyleWithColumns(20)));
2381
2382 // Don't reflow between separate blocks of comments.
2383 EXPECT_EQ("/* First comment\n"
2384 " * block will */\n"
2385 "/* Snd\n"
2386 " */\n",
2387 format("/* First comment block\n"
2388 " * will */\n"
2389 "/* Snd\n"
2390 " */\n",
2391 getLLVMStyleWithColumns(20)));
2392
2393 // Don't reflow lines having different indentation.
2394 EXPECT_EQ("// long long long\n"
2395 "// long\n"
2396 "// long",
2397 format("// long long long long\n"
2398 "// long",
2399 getLLVMStyleWithColumns(20)));
2400
2401 // Don't break or reflow after implicit string literals.
2402 verifyFormat("#include <t> // l l l\n"
2403 " // l",
2404 getLLVMStyleWithColumns(20));
2405
2406 // Don't break or reflow comments on import lines.
2407 EXPECT_EQ("#include \"t\" /* l l l\n"
2408 " * l */",
2409 format("#include \"t\" /* l l l\n"
2410 " * l */",
2411 getLLVMStyleWithColumns(20)));
2412
2413 // Don't reflow between different trailing comment sections.
2414 EXPECT_EQ("int i; // long long\n"
2415 " // long\n"
2416 "int j; // long long\n"
2417 " // long\n",
2418 format("int i; // long long long\n"
2419 "int j; // long long long\n",
2420 getLLVMStyleWithColumns(20)));
2421
2422 // Don't reflow if the first word on the next line is longer than the
2423 // available space at current line.
2424 EXPECT_EQ("int i; // trigger\n"
2425 " // reflow\n"
2426 " // longsec\n",
2427 format("int i; // trigger reflow\n"
2428 " // longsec\n",
2429 getLLVMStyleWithColumns(20)));
2430
2431 // Keep empty comment lines.
2432 EXPECT_EQ("/**/", format(" /**/", getLLVMStyleWithColumns(20)));
2433 EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
2434 EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
2435 EXPECT_EQ("//", format(" // ", getLLVMStyleWithColumns(20)));
2436 EXPECT_EQ("///", format(" /// ", getLLVMStyleWithColumns(20)));
2437}
2438
Alexander Kornienkof2e02122013-05-24 18:24:24 +00002439TEST_F(FormatTest, IgnoresIf0Contents) {
2440 EXPECT_EQ("#if 0\n"
2441 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
2442 "#endif\n"
2443 "void f() {}",
2444 format("#if 0\n"
2445 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
2446 "#endif\n"
2447 "void f( ) { }"));
2448 EXPECT_EQ("#if false\n"
2449 "void f( ) { }\n"
2450 "#endif\n"
2451 "void g() {}\n",
2452 format("#if false\n"
2453 "void f( ) { }\n"
2454 "#endif\n"
2455 "void g( ) { }\n"));
2456 EXPECT_EQ("enum E {\n"
2457 " One,\n"
2458 " Two,\n"
2459 "#if 0\n"
2460 "Three,\n"
2461 " Four,\n"
2462 "#endif\n"
2463 " Five\n"
2464 "};",
2465 format("enum E {\n"
2466 " One,Two,\n"
2467 "#if 0\n"
2468 "Three,\n"
2469 " Four,\n"
2470 "#endif\n"
2471 " Five};"));
2472 EXPECT_EQ("enum F {\n"
2473 " One,\n"
2474 "#if 1\n"
2475 " Two,\n"
2476 "#if 0\n"
2477 "Three,\n"
2478 " Four,\n"
2479 "#endif\n"
2480 " Five\n"
2481 "#endif\n"
2482 "};",
2483 format("enum F {\n"
2484 "One,\n"
2485 "#if 1\n"
2486 "Two,\n"
2487 "#if 0\n"
2488 "Three,\n"
2489 " Four,\n"
2490 "#endif\n"
2491 "Five\n"
2492 "#endif\n"
2493 "};"));
2494 EXPECT_EQ("enum G {\n"
2495 " One,\n"
2496 "#if 0\n"
2497 "Two,\n"
2498 "#else\n"
2499 " Three,\n"
2500 "#endif\n"
2501 " Four\n"
2502 "};",
2503 format("enum G {\n"
2504 "One,\n"
2505 "#if 0\n"
2506 "Two,\n"
2507 "#else\n"
2508 "Three,\n"
2509 "#endif\n"
2510 "Four\n"
2511 "};"));
2512 EXPECT_EQ("enum H {\n"
2513 " One,\n"
2514 "#if 0\n"
2515 "#ifdef Q\n"
2516 "Two,\n"
2517 "#else\n"
2518 "Three,\n"
2519 "#endif\n"
2520 "#endif\n"
2521 " Four\n"
2522 "};",
2523 format("enum H {\n"
2524 "One,\n"
2525 "#if 0\n"
2526 "#ifdef Q\n"
2527 "Two,\n"
2528 "#else\n"
2529 "Three,\n"
2530 "#endif\n"
2531 "#endif\n"
2532 "Four\n"
2533 "};"));
2534 EXPECT_EQ("enum I {\n"
2535 " One,\n"
2536 "#if /* test */ 0 || 1\n"
2537 "Two,\n"
2538 "Three,\n"
2539 "#endif\n"
2540 " Four\n"
2541 "};",
2542 format("enum I {\n"
2543 "One,\n"
2544 "#if /* test */ 0 || 1\n"
2545 "Two,\n"
2546 "Three,\n"
2547 "#endif\n"
2548 "Four\n"
2549 "};"));
2550 EXPECT_EQ("enum J {\n"
2551 " One,\n"
2552 "#if 0\n"
2553 "#if 0\n"
2554 "Two,\n"
2555 "#else\n"
2556 "Three,\n"
2557 "#endif\n"
2558 "Four,\n"
2559 "#endif\n"
2560 " Five\n"
2561 "};",
2562 format("enum J {\n"
2563 "One,\n"
2564 "#if 0\n"
2565 "#if 0\n"
2566 "Two,\n"
2567 "#else\n"
2568 "Three,\n"
2569 "#endif\n"
2570 "Four,\n"
2571 "#endif\n"
2572 "Five\n"
2573 "};"));
Alexander Kornienkof2e02122013-05-24 18:24:24 +00002574}
2575
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002576//===----------------------------------------------------------------------===//
2577// Tests for classes, namespaces, etc.
2578//===----------------------------------------------------------------------===//
2579
2580TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002581 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002582}
2583
2584TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
2585 verifyFormat("class A {\n"
2586 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00002587 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002588 "protected:\n"
2589 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002590 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002591 "};");
2592 verifyGoogleFormat("class A {\n"
2593 " public:\n"
2594 " protected:\n"
2595 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002596 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002597 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00002598 verifyFormat("class A {\n"
2599 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002600 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00002601 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002602 " void f2() {}\n"
2603 "protected slots:\n"
2604 " void f3() {}\n"
2605 "protected Q_SLOTS:\n"
2606 " void f4() {}\n"
2607 "private slots:\n"
2608 " void f5() {}\n"
2609 "private Q_SLOTS:\n"
2610 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00002611 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002612 " void g1();\n"
2613 "Q_SIGNALS:\n"
2614 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00002615 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00002616
2617 // Don't interpret 'signals' the wrong way.
2618 verifyFormat("signals.set();");
2619 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00002620 verifyFormat("{\n"
2621 " signals.set(); // This needs indentation.\n"
2622 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00002623 verifyFormat("void f() {\n"
2624 "label:\n"
2625 " signals.baz();\n"
2626 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002627}
2628
Alexander Kornienkofd433362013-03-27 17:08:02 +00002629TEST_F(FormatTest, SeparatesLogicalBlocks) {
2630 EXPECT_EQ("class A {\n"
2631 "public:\n"
2632 " void f();\n"
2633 "\n"
2634 "private:\n"
2635 " void g() {}\n"
2636 " // test\n"
2637 "protected:\n"
2638 " int h;\n"
2639 "};",
2640 format("class A {\n"
2641 "public:\n"
2642 "void f();\n"
2643 "private:\n"
2644 "void g() {}\n"
2645 "// test\n"
2646 "protected:\n"
2647 "int h;\n"
2648 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00002649 EXPECT_EQ("class A {\n"
2650 "protected:\n"
2651 "public:\n"
2652 " void f();\n"
2653 "};",
2654 format("class A {\n"
2655 "protected:\n"
2656 "\n"
2657 "public:\n"
2658 "\n"
2659 " void f();\n"
2660 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00002661
2662 // Even ensure proper spacing inside macros.
2663 EXPECT_EQ("#define B \\\n"
2664 " class A { \\\n"
2665 " protected: \\\n"
2666 " public: \\\n"
2667 " void f(); \\\n"
2668 " };",
2669 format("#define B \\\n"
2670 " class A { \\\n"
2671 " protected: \\\n"
2672 " \\\n"
2673 " public: \\\n"
2674 " \\\n"
2675 " void f(); \\\n"
2676 " };",
2677 getGoogleStyle()));
2678 // But don't remove empty lines after macros ending in access specifiers.
2679 EXPECT_EQ("#define A private:\n"
2680 "\n"
2681 "int i;",
2682 format("#define A private:\n"
2683 "\n"
2684 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00002685}
2686
Daniel Jasper83193602013-04-05 17:22:09 +00002687TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002688 verifyFormat("class A : public B {};");
2689 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002690
2691 verifyFormat(
2692 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002693 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00002694 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
2695 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002696 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002697 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002698 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002699 verifyFormat("class AAAAAAAAAAAA : public B,\n"
2700 " public C,\n"
2701 " public D,\n"
2702 " public E,\n"
2703 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002704 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00002705
2706 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002707 " ReallyReallyLongClassName {\n"
2708 " int i;\n"
2709 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00002710 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00002711 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
2712 " aaaaaaaaaaaaaaaa> {};");
2713 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
2714 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
2715 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00002716 verifyFormat("template <class R, class C>\n"
2717 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
2718 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00002719 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00002720}
2721
Manuel Klimek28cacc72013-01-07 18:10:23 +00002722TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002723 verifyFormat("class A {\n} a, b;");
2724 verifyFormat("struct A {\n} a, b;");
2725 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00002726}
2727
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002728TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002729 verifyFormat("enum {\n"
2730 " Zero,\n"
2731 " One = 1,\n"
2732 " Two = One + 1,\n"
2733 " Three = (One + Two),\n"
2734 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2735 " Five = (One, Two, Three, Four, 5)\n"
2736 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002737 verifyGoogleFormat("enum {\n"
2738 " Zero,\n"
2739 " One = 1,\n"
2740 " Two = One + 1,\n"
2741 " Three = (One + Two),\n"
2742 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2743 " Five = (One, Two, Three, Four, 5)\n"
2744 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002745 verifyFormat("enum Enum {};");
2746 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002747 verifyFormat("enum X E {} d;");
2748 verifyFormat("enum __attribute__((...)) E {} d;");
2749 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00002750 verifyFormat("enum {\n"
2751 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002752 "};",
2753 getLLVMStyleWithColumns(30));
2754
2755 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00002756 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002757
2758 EXPECT_EQ("enum KeepEmptyLines {\n"
2759 " ONE,\n"
2760 "\n"
2761 " TWO,\n"
2762 "\n"
2763 " THREE\n"
2764 "}",
2765 format("enum KeepEmptyLines {\n"
2766 " ONE,\n"
2767 "\n"
2768 " TWO,\n"
2769 "\n"
2770 "\n"
2771 " THREE\n"
2772 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00002773 verifyFormat("enum E { // comment\n"
2774 " ONE,\n"
2775 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00002776 "};\n"
2777 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002778 // Not enums.
2779 verifyFormat("enum X f() {\n"
2780 " a();\n"
2781 " return 42;\n"
2782 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00002783 verifyFormat("enum X Type::f() {\n"
2784 " a();\n"
2785 " return 42;\n"
2786 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002787 verifyFormat("enum ::X f() {\n"
2788 " a();\n"
2789 " return 42;\n"
2790 "}");
2791 verifyFormat("enum ns::X f() {\n"
2792 " a();\n"
2793 " return 42;\n"
2794 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002795}
2796
Daniel Jasperb7150872013-08-30 10:10:19 +00002797TEST_F(FormatTest, FormatsEnumsWithErrors) {
2798 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002799 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002800 " Two = 1;\n"
2801 "};");
2802 verifyFormat("namespace n {\n"
2803 "enum Type {\n"
2804 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002805 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002806 " int i;\n"
2807 "}\n"
2808 "void g() {}");
2809}
2810
Daniel Jasper2b41a822013-08-20 12:42:50 +00002811TEST_F(FormatTest, FormatsEnumStruct) {
2812 verifyFormat("enum struct {\n"
2813 " Zero,\n"
2814 " One = 1,\n"
2815 " Two = One + 1,\n"
2816 " Three = (One + Two),\n"
2817 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2818 " Five = (One, Two, Three, Four, 5)\n"
2819 "};");
2820 verifyFormat("enum struct Enum {};");
2821 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002822 verifyFormat("enum struct X E {} d;");
2823 verifyFormat("enum struct __attribute__((...)) E {} d;");
2824 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002825 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
2826}
2827
2828TEST_F(FormatTest, FormatsEnumClass) {
2829 verifyFormat("enum class {\n"
2830 " Zero,\n"
2831 " One = 1,\n"
2832 " Two = One + 1,\n"
2833 " Three = (One + Two),\n"
2834 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2835 " Five = (One, Two, Three, Four, 5)\n"
2836 "};");
2837 verifyFormat("enum class Enum {};");
2838 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002839 verifyFormat("enum class X E {} d;");
2840 verifyFormat("enum class __attribute__((...)) E {} d;");
2841 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002842 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
2843}
2844
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002845TEST_F(FormatTest, FormatsEnumTypes) {
2846 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002847 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002848 " B\n"
2849 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00002850 verifyFormat("enum X : int { A, B };");
2851 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002852}
2853
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002854TEST_F(FormatTest, FormatsNSEnums) {
2855 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
2856 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
2857 " // Information about someDecentlyLongValue.\n"
2858 " someDecentlyLongValue,\n"
2859 " // Information about anotherDecentlyLongValue.\n"
2860 " anotherDecentlyLongValue,\n"
2861 " // Information about aThirdDecentlyLongValue.\n"
2862 " aThirdDecentlyLongValue\n"
2863 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00002864 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
2865 " a = 1,\n"
2866 " b = 2,\n"
2867 " c = 3,\n"
2868 "};");
2869 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
2870 " a = 1,\n"
2871 " b = 2,\n"
2872 " c = 3,\n"
2873 "};");
2874 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
2875 " a = 1,\n"
2876 " b = 2,\n"
2877 " c = 3,\n"
2878 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002879}
2880
Nico Weber7769a902013-01-14 05:49:49 +00002881TEST_F(FormatTest, FormatsBitfields) {
2882 verifyFormat("struct Bitfields {\n"
2883 " unsigned sClass : 8;\n"
2884 " unsigned ValueKind : 2;\n"
2885 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00002886 verifyFormat("struct A {\n"
2887 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
2888 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
2889 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00002890 verifyFormat("struct MyStruct {\n"
2891 " uchar data;\n"
2892 " uchar : 8;\n"
2893 " uchar : 8;\n"
2894 " uchar other;\n"
2895 "};");
Nico Weber7769a902013-01-14 05:49:49 +00002896}
2897
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002898TEST_F(FormatTest, FormatsNamespaces) {
2899 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002900 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002901 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002902 "}");
2903 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002904 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002905 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002906 "}");
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002907 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002908 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002909 "void f() { f(); }\n"
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002910 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002911 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002912 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002913 "void f() { f(); }");
Manuel Klimek046b9302013-02-06 16:08:09 +00002914
2915 // This code is more common than we thought; if we
2916 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002917 // its own line, which is undesirable.
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002918 verifyFormat("namespace {};");
Manuel Klimek046b9302013-02-06 16:08:09 +00002919 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002920 "class A {};\n"
Manuel Klimek046b9302013-02-06 16:08:09 +00002921 "};");
Daniel Jasper251b3c92013-07-01 11:22:57 +00002922
2923 verifyFormat("namespace {\n"
2924 "int SomeVariable = 0; // comment\n"
2925 "} // namespace");
2926 EXPECT_EQ("#ifndef HEADER_GUARD\n"
2927 "#define HEADER_GUARD\n"
2928 "namespace my_namespace {\n"
2929 "int i;\n"
2930 "} // my_namespace\n"
2931 "#endif // HEADER_GUARD",
2932 format("#ifndef HEADER_GUARD\n"
2933 " #define HEADER_GUARD\n"
2934 " namespace my_namespace {\n"
2935 "int i;\n"
2936 "} // my_namespace\n"
2937 "#endif // HEADER_GUARD"));
Daniel Jasper65ee3472013-07-31 23:16:02 +00002938
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00002939 EXPECT_EQ("namespace A::B {\n"
2940 "class C {};\n"
2941 "}",
2942 format("namespace A::B {\n"
2943 "class C {};\n"
2944 "}"));
2945
Daniel Jasper65ee3472013-07-31 23:16:02 +00002946 FormatStyle Style = getLLVMStyle();
2947 Style.NamespaceIndentation = FormatStyle::NI_All;
2948 EXPECT_EQ("namespace out {\n"
2949 " int i;\n"
2950 " namespace in {\n"
2951 " int i;\n"
2952 " } // namespace\n"
2953 "} // namespace",
2954 format("namespace out {\n"
2955 "int i;\n"
2956 "namespace in {\n"
2957 "int i;\n"
2958 "} // namespace\n"
2959 "} // namespace",
2960 Style));
2961
2962 Style.NamespaceIndentation = FormatStyle::NI_Inner;
2963 EXPECT_EQ("namespace out {\n"
2964 "int i;\n"
2965 "namespace in {\n"
2966 " int i;\n"
2967 "} // namespace\n"
2968 "} // namespace",
2969 format("namespace out {\n"
2970 "int i;\n"
2971 "namespace in {\n"
2972 "int i;\n"
2973 "} // namespace\n"
2974 "} // namespace",
2975 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002976}
2977
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002978TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00002979
Daniel Jasper40aacf42013-03-14 13:45:21 +00002980TEST_F(FormatTest, FormatsInlineASM) {
2981 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00002982 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00002983 verifyFormat(
2984 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2985 " \"cpuid\\n\\t\"\n"
2986 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00002987 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00002988 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00002989 EXPECT_EQ(
2990 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002991 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002992 " mov edx,[that] // vtable in edx\n"
2993 " mov eax,methodIndex\n"
2994 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002995 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002996 "}",
2997 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2998 " __asm {\n"
2999 " mov edx,[that] // vtable in edx\n"
3000 " mov eax,methodIndex\n"
3001 " call [edx][eax*4] // stdcall\n"
3002 " }\n"
3003 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00003004 EXPECT_EQ("_asm {\n"
3005 " xor eax, eax;\n"
3006 " cpuid;\n"
3007 "}",
3008 format("_asm {\n"
3009 " xor eax, eax;\n"
3010 " cpuid;\n"
3011 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00003012 verifyFormat("void function() {\n"
3013 " // comment\n"
3014 " asm(\"\");\n"
3015 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00003016 EXPECT_EQ("__asm {\n"
3017 "}\n"
3018 "int i;",
3019 format("__asm {\n"
3020 "}\n"
3021 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00003022}
3023
Nico Weberd5650bd2013-01-07 16:36:17 +00003024TEST_F(FormatTest, FormatTryCatch) {
3025 verifyFormat("try {\n"
3026 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003027 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00003028 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003029 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00003030 " exit(42);\n"
3031 "}");
3032
3033 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00003034 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00003035 " return 5;\n"
3036 "}");
3037 verifyFormat("class A {\n"
3038 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003039 " A() try : a(0) {\n"
3040 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00003041 " throw;\n"
3042 " }\n"
3043 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00003044
3045 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003046 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00003047}
3048
Nico Weberfac23712015-02-04 15:26:27 +00003049TEST_F(FormatTest, FormatSEHTryCatch) {
3050 verifyFormat("__try {\n"
3051 " int a = b * c;\n"
3052 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
3053 " // Do nothing.\n"
3054 "}");
3055
3056 verifyFormat("__try {\n"
3057 " int a = b * c;\n"
3058 "} __finally {\n"
3059 " // Do nothing.\n"
3060 "}");
3061
3062 verifyFormat("DEBUG({\n"
3063 " __try {\n"
3064 " } __finally {\n"
3065 " }\n"
3066 "});\n");
3067}
3068
Daniel Jasper04a71a42014-05-08 11:58:24 +00003069TEST_F(FormatTest, IncompleteTryCatchBlocks) {
3070 verifyFormat("try {\n"
3071 " f();\n"
3072 "} catch {\n"
3073 " g();\n"
3074 "}");
3075 verifyFormat("try {\n"
3076 " f();\n"
3077 "} catch (A a) MACRO(x) {\n"
3078 " g();\n"
3079 "} catch (B b) MACRO(x) {\n"
3080 " g();\n"
3081 "}");
3082}
3083
3084TEST_F(FormatTest, FormatTryCatchBraceStyles) {
3085 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00003086 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
3087 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00003088 Style.BreakBeforeBraces = BraceStyle;
3089 verifyFormat("try {\n"
3090 " // something\n"
3091 "} catch (...) {\n"
3092 " // something\n"
3093 "}",
3094 Style);
3095 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00003096 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
3097 verifyFormat("try {\n"
3098 " // something\n"
3099 "}\n"
3100 "catch (...) {\n"
3101 " // something\n"
3102 "}",
3103 Style);
Nico Weberfac23712015-02-04 15:26:27 +00003104 verifyFormat("__try {\n"
3105 " // something\n"
3106 "}\n"
3107 "__finally {\n"
3108 " // something\n"
3109 "}",
3110 Style);
Nico Weber33381f52015-02-07 01:57:32 +00003111 verifyFormat("@try {\n"
3112 " // something\n"
3113 "}\n"
3114 "@finally {\n"
3115 " // something\n"
3116 "}",
3117 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00003118 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3119 verifyFormat("try\n"
3120 "{\n"
3121 " // something\n"
3122 "}\n"
3123 "catch (...)\n"
3124 "{\n"
3125 " // something\n"
3126 "}",
3127 Style);
3128 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
3129 verifyFormat("try\n"
3130 " {\n"
3131 " // something\n"
3132 " }\n"
3133 "catch (...)\n"
3134 " {\n"
3135 " // something\n"
3136 " }",
3137 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00003138 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
3139 Style.BraceWrapping.BeforeCatch = true;
3140 verifyFormat("try {\n"
3141 " // something\n"
3142 "}\n"
3143 "catch (...) {\n"
3144 " // something\n"
3145 "}",
3146 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00003147}
3148
Daniel Jaspere25509f2012-12-17 11:29:41 +00003149TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003150 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00003151
Daniel Jaspera44991332015-04-29 13:06:49 +00003152 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
3153 " 100000000, "
3154 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00003155
Daniel Jasper473c62c2013-05-17 09:35:01 +00003156 // Here, everything other than the "}" would fit on a line.
3157 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003158 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00003159 EXPECT_EQ("S s = {a,\n"
3160 "\n"
3161 " b};",
3162 format("S s = {\n"
3163 " a,\n"
3164 "\n"
3165 " b\n"
3166 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00003167
3168 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
3169 // line. However, the formatting looks a bit off and this probably doesn't
3170 // happen often in practice.
3171 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003172 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00003173 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00003174}
3175
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003176TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003177 verifyFormat("const struct A a = {.a = 1, .b = 2};");
3178 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
3179 " .bbbbbbbbbb = 2,\n"
3180 " .cccccccccc = 3,\n"
3181 " .dddddddddd = 4,\n"
3182 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003183 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003184 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
3185 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
3186 " .ccccccccccccccccccccccccccc = 3,\n"
3187 " .ddddddddddddddddddddddddddd = 4,\n"
3188 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003189
3190 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
3191}
3192
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003193TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003194 verifyFormat("static A x = {{{}}};\n");
3195 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
3196 " {init1, init2, init3, init4}}};",
3197 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00003198
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003199 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003200 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
3201 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
3202 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
3203 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00003204 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00003205 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
3206 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
3207 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00003208 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
3209 " {rect.fRight - rect.fLeft, rect.fBottom - "
3210 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003211
Daniel Jasper8a8ce242013-01-31 14:59:26 +00003212 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00003213 "SomeArrayOfSomeType a = {\n"
3214 " {{1, 2, 3},\n"
3215 " {1, 2, 3},\n"
3216 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
3217 " 333333333333333333333333333333},\n"
3218 " {1, 2, 3},\n"
3219 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00003220 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00003221 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00003222 " {{1, 2, 3}},\n"
3223 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00003224 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
3225 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00003226 " {{1, 2, 3}},\n"
3227 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00003228
Daniel Jaspera44991332015-04-29 13:06:49 +00003229 verifyFormat("struct {\n"
3230 " unsigned bit;\n"
3231 " const char *const name;\n"
3232 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
3233 " {kOsWin, \"Windows\"},\n"
3234 " {kOsLinux, \"Linux\"},\n"
3235 " {kOsCrOS, \"Chrome OS\"}};");
3236 verifyFormat("struct {\n"
3237 " unsigned bit;\n"
3238 " const char *const name;\n"
3239 "} kBitsToOs[] = {\n"
3240 " {kOsMac, \"Mac\"},\n"
3241 " {kOsWin, \"Windows\"},\n"
3242 " {kOsLinux, \"Linux\"},\n"
3243 " {kOsCrOS, \"Chrome OS\"},\n"
3244 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003245}
3246
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003247TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
3248 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3249 " \\\n"
3250 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
3251}
3252
Daniel Jasperda16db32013-01-07 10:48:50 +00003253TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00003254 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
3255 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00003256
3257 // Do break defaulted and deleted functions.
3258 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
3259 " default;",
3260 getLLVMStyleWithColumns(40));
3261 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
3262 " delete;",
3263 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00003264}
3265
3266TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
3267 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
3268 getLLVMStyleWithColumns(40));
3269 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
3270 getLLVMStyleWithColumns(40));
3271 EXPECT_EQ("#define Q \\\n"
3272 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
3273 " \"aaaaaaaa.cpp\"",
3274 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
3275 getLLVMStyleWithColumns(40)));
3276}
3277
3278TEST_F(FormatTest, UnderstandsLinePPDirective) {
3279 EXPECT_EQ("# 123 \"A string literal\"",
3280 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00003281}
3282
Manuel Klimek591b5802013-01-31 15:58:48 +00003283TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00003284 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00003285 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003286}
3287
3288TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
3289 EXPECT_EQ("#line 42 \"test\"\n",
3290 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003291 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
3292 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003293}
3294
3295TEST_F(FormatTest, EndOfFileEndsPPDirective) {
3296 EXPECT_EQ("#line 42 \"test\"",
3297 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003298 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003299}
3300
Daniel Jasper877615c2013-10-11 19:45:02 +00003301TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
3302 verifyFormat("#define A \\x20");
3303 verifyFormat("#define A \\ x20");
3304 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
3305 verifyFormat("#define A ''");
3306 verifyFormat("#define A ''qqq");
3307 verifyFormat("#define A `qqq");
3308 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00003309 EXPECT_EQ("const char *c = STRINGIFY(\n"
3310 "\\na : b);",
3311 format("const char * c = STRINGIFY(\n"
3312 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00003313
3314 verifyFormat("a\r\\");
3315 verifyFormat("a\v\\");
3316 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00003317}
3318
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003319TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003320 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
3321 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003322 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003323 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00003324 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00003325
3326 verifyFormat("#define A A\n#define A A");
3327 verifyFormat("#define A(X) A\n#define A A");
3328
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003329 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
3330 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003331}
3332
3333TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00003334 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003335 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003336 "#define A( \\\n"
3337 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003338 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00003339 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00003340 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003341 " #include \"a.h\"\n"
3342 "#define A(A,\\\n"
3343 " B)\n"
3344 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00003345 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003346 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003347}
3348
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003349TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00003350
3351TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
3352 EXPECT_EQ("#define A \\\n"
3353 " c; \\\n"
3354 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003355 "f;",
3356 format("#define A c; e;\n"
3357 "f;",
3358 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00003359}
3360
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003361TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00003362
Manuel Klimek1abf7892013-01-04 23:34:14 +00003363TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00003364 EXPECT_EQ("int x,\n"
3365 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003366 " y;",
3367 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00003368}
3369
Manuel Klimek09e07972013-01-05 21:34:55 +00003370TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00003371 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00003372 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00003373 verifyFormat("#define A \\\n"
3374 " { \\\n"
3375 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003376 " }",
3377 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00003378
3379 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003380 " void function##X()",
3381 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00003382
3383 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003384 " void a##b##c()",
3385 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00003386
Daniel Jasper39825ea2013-01-14 15:40:57 +00003387 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00003388}
3389
Manuel Klimekd053c5b2013-01-23 14:37:36 +00003390TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00003391 EXPECT_EQ("#define A (x)", format("#define A (x)"));
3392 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00003393}
3394
Manuel Klimek0c137952013-02-11 12:33:24 +00003395TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
3396 EXPECT_EQ("#define A b;", format("#define A \\\n"
3397 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003398 " b;",
3399 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003400 EXPECT_EQ("#define A \\\n"
3401 " \\\n"
3402 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003403 " b;",
3404 format("#define A \\\n"
3405 " \\\n"
3406 " a; \\\n"
3407 " b;",
3408 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003409 EXPECT_EQ("#define A \\\n"
3410 " a; \\\n"
3411 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003412 " b;",
3413 format("#define A \\\n"
3414 " a; \\\n"
3415 " \\\n"
3416 " b;",
3417 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003418}
3419
Daniel Jasper00475962013-02-19 17:14:38 +00003420TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003421 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00003422 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00003423 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00003424 " case 2\n",
3425 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00003426 verifyFormat("#define MACRO(a) \\\n"
3427 " if (a) \\\n"
3428 " f(); \\\n"
3429 " else \\\n"
3430 " g()",
3431 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00003432 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003433 verifyIncompleteFormat("#define STR(x) #x\n"
3434 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00003435 verifyFormat("#pragma omp threadprivate( \\\n"
3436 " y)), // expected-warning",
3437 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00003438 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00003439 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003440 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00003441 "#define b \\\n"
3442 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003443 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003444 "a",
3445 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00003446 verifyFormat("#define A \\\n"
3447 " { \\\n"
3448 " {\n"
3449 "#define B \\\n"
3450 " } \\\n"
3451 " }",
3452 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00003453 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00003454 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00003455 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00003456 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00003457}
3458
Daniel Jasper40e19212013-05-29 13:16:10 +00003459TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
3460 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
3461 EXPECT_EQ("class A : public QObject {\n"
3462 " Q_OBJECT\n"
3463 "\n"
3464 " A() {}\n"
3465 "};",
3466 format("class A : public QObject {\n"
3467 " Q_OBJECT\n"
3468 "\n"
3469 " A() {\n}\n"
3470 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00003471 EXPECT_EQ("MACRO\n"
3472 "/*static*/ int i;",
3473 format("MACRO\n"
3474 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00003475 EXPECT_EQ("SOME_MACRO\n"
3476 "namespace {\n"
3477 "void f();\n"
3478 "}",
3479 format("SOME_MACRO\n"
3480 " namespace {\n"
3481 "void f( );\n"
3482 "}"));
Daniel Jasper40e19212013-05-29 13:16:10 +00003483 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00003484 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
3485 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00003486 // Only if everything is upper case.
3487 EXPECT_EQ("class A : public QObject {\n"
3488 " Q_Object A() {}\n"
3489 "};",
3490 format("class A : public QObject {\n"
3491 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00003492 " A() {\n}\n"
3493 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00003494
3495 // Only if the next line can actually start an unwrapped line.
3496 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
3497 format("SOME_WEIRD_LOG_MACRO\n"
3498 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00003499
3500 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00003501 "(n, buffers))\n",
3502 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00003503}
3504
Alexander Kornienkode644272013-04-08 22:16:06 +00003505TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
3506 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3507 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3508 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003509 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00003510 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3511 "int *createScopDetectionPass() { return 0; }",
3512 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3513 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3514 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
3515 " class X {};\n"
3516 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3517 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003518 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
3519 // braces, so that inner block is indented one level more.
3520 EXPECT_EQ("int q() {\n"
3521 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3522 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3523 " IPC_END_MESSAGE_MAP()\n"
3524 "}",
3525 format("int q() {\n"
3526 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3527 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3528 " IPC_END_MESSAGE_MAP()\n"
3529 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00003530
Daniel Jasper352dae12014-01-03 11:50:46 +00003531 // Same inside macros.
3532 EXPECT_EQ("#define LIST(L) \\\n"
3533 " L(A) \\\n"
3534 " L(B) \\\n"
3535 " L(C)",
3536 format("#define LIST(L) \\\n"
3537 " L(A) \\\n"
3538 " L(B) \\\n"
3539 " L(C)",
3540 getGoogleStyle()));
3541
Daniel Jasper545c6522013-09-17 09:26:07 +00003542 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003543 EXPECT_EQ("int q() {\n"
3544 " f(x);\n"
3545 " f(x) {}\n"
3546 " f(x)->g();\n"
3547 " f(x)->*g();\n"
3548 " f(x).g();\n"
3549 " f(x) = x;\n"
3550 " f(x) += x;\n"
3551 " f(x) -= x;\n"
3552 " f(x) *= x;\n"
3553 " f(x) /= x;\n"
3554 " f(x) %= x;\n"
3555 " f(x) &= x;\n"
3556 " f(x) |= x;\n"
3557 " f(x) ^= x;\n"
3558 " f(x) >>= x;\n"
3559 " f(x) <<= x;\n"
3560 " f(x)[y].z();\n"
3561 " LOG(INFO) << x;\n"
3562 " ifstream(x) >> x;\n"
3563 "}\n",
3564 format("int q() {\n"
3565 " f(x)\n;\n"
3566 " f(x)\n {}\n"
3567 " f(x)\n->g();\n"
3568 " f(x)\n->*g();\n"
3569 " f(x)\n.g();\n"
3570 " f(x)\n = x;\n"
3571 " f(x)\n += x;\n"
3572 " f(x)\n -= x;\n"
3573 " f(x)\n *= x;\n"
3574 " f(x)\n /= x;\n"
3575 " f(x)\n %= x;\n"
3576 " f(x)\n &= x;\n"
3577 " f(x)\n |= x;\n"
3578 " f(x)\n ^= x;\n"
3579 " f(x)\n >>= x;\n"
3580 " f(x)\n <<= x;\n"
3581 " f(x)\n[y].z();\n"
3582 " LOG(INFO)\n << x;\n"
3583 " ifstream(x)\n >> x;\n"
3584 "}\n"));
3585 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003586 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003587 " if (1) {\n"
3588 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003589 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003590 " while (1) {\n"
3591 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003592 " F(x)\n"
3593 " G(x);\n"
3594 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003595 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003596 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003597 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003598 " }\n"
3599 "}\n",
3600 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003601 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003602 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003603 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003604 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003605 "F(x)\n"
3606 "G(x);\n"
3607 "F(x)\n"
3608 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003609 "}\n"));
3610 EXPECT_EQ("class A {\n"
3611 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00003612 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003613 " A(X x)\n" // FIXME: function-level try blocks are broken.
3614 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003615 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003616 " }\n"
3617 "};",
3618 format("class A {\n"
3619 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00003620 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003621 " A(X x)\n"
3622 " try : t(0) {} catch (...) {}\n"
3623 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00003624 EXPECT_EQ("class SomeClass {\n"
3625 "public:\n"
3626 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3627 "};",
3628 format("class SomeClass {\n"
3629 "public:\n"
3630 " SomeClass()\n"
3631 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3632 "};"));
3633 EXPECT_EQ("class SomeClass {\n"
3634 "public:\n"
3635 " SomeClass()\n"
3636 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3637 "};",
3638 format("class SomeClass {\n"
3639 "public:\n"
3640 " SomeClass()\n"
3641 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3642 "};",
3643 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00003644
3645 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00003646}
3647
Manuel Klimek4fe43002013-05-22 12:51:29 +00003648TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
3649 verifyFormat("#define A \\\n"
3650 " f({ \\\n"
3651 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003652 " });",
3653 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00003654}
3655
Manuel Klimekef2cfb12013-01-05 22:14:16 +00003656TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
3657 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
3658}
3659
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003660TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003661 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003662}
3663
Manuel Klimek1058d982013-01-06 20:07:31 +00003664TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3665 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
3666 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3667 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
3668 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3669}
Manuel Klimek1abf7892013-01-04 23:34:14 +00003670
Daniel Jaspere2408e32015-05-06 11:16:43 +00003671TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003672 EXPECT_EQ(
3673 "#define A \\\n int i; \\\n int j;",
3674 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003675 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00003676 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003677 EXPECT_EQ("/* \\ \\ \\\n*/", format("\\\n/* \\ \\ \\\n*/"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00003678 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003679}
3680
Alexander Kornienko00691cf2015-01-12 13:11:12 +00003681TEST_F(FormatTest, DontCrashOnBlockComments) {
3682 EXPECT_EQ(
3683 "int xxxxxxxxx; /* "
3684 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\n"
3685 "zzzzzz\n"
3686 "0*/",
3687 format("int xxxxxxxxx; /* "
3688 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzz\n"
3689 "0*/"));
3690}
3691
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003692TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3693 verifyFormat("#define A \\\n"
3694 " int v( \\\n"
3695 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003696 " int i;",
3697 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003698}
3699
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003700TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00003701 EXPECT_EQ(
3702 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3703 " \\\n"
3704 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3705 "\n"
3706 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3707 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3708 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
3709 "\\\n"
3710 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3711 " \n"
3712 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3713 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003714}
3715
Manuel Klimek52b15152013-01-09 15:25:02 +00003716TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3717 EXPECT_EQ("int\n"
3718 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003719 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003720 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003721 verifyFormat("functionCallTo(\n"
3722 " someOtherFunction(\n"
3723 " withSomeParameters, whichInSequence,\n"
3724 " areLongerThanALine(andAnotherCall,\n"
3725 "#define A B\n"
3726 " withMoreParamters,\n"
3727 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003728 " andMoreParameters),\n"
3729 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003730 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00003731 verifyFormat("Foo::Foo()\n"
3732 "#ifdef BAR\n"
3733 " : baz(0)\n"
3734 "#endif\n"
3735 "{\n"
3736 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00003737 verifyFormat("void f() {\n"
3738 " if (true)\n"
3739 "#ifdef A\n"
3740 " f(42);\n"
3741 " x();\n"
3742 "#else\n"
3743 " g();\n"
3744 " x();\n"
3745 "#endif\n"
3746 "}");
3747 verifyFormat("void f(param1, param2,\n"
3748 " param3,\n"
3749 "#ifdef A\n"
3750 " param4(param5,\n"
3751 "#ifdef A1\n"
3752 " param6,\n"
3753 "#ifdef A2\n"
3754 " param7),\n"
3755 "#else\n"
3756 " param8),\n"
3757 " param9,\n"
3758 "#endif\n"
3759 " param10,\n"
3760 "#endif\n"
3761 " param11)\n"
3762 "#else\n"
3763 " param12)\n"
3764 "#endif\n"
3765 "{\n"
3766 " x();\n"
3767 "}",
3768 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00003769 verifyFormat("#if 1\n"
3770 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003771 verifyFormat("#if 1\n"
3772 "#endif\n"
3773 "#if 1\n"
3774 "#else\n"
3775 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00003776 verifyFormat("DEBUG({\n"
3777 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3778 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3779 "});\n"
3780 "#if a\n"
3781 "#else\n"
3782 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00003783
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003784 verifyIncompleteFormat("void f(\n"
3785 "#if A\n"
3786 " );\n"
3787 "#else\n"
3788 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00003789}
3790
Manuel Klimek14bd9172014-01-29 08:49:02 +00003791TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3792 verifyFormat("#endif\n"
3793 "#if B");
3794}
3795
Manuel Klimek88033d72013-10-21 08:11:15 +00003796TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3797 FormatStyle SingleLine = getLLVMStyle();
3798 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00003799 verifyFormat("#if 0\n"
3800 "#elif 1\n"
3801 "#endif\n"
3802 "void foo() {\n"
3803 " if (test) foo2();\n"
3804 "}",
3805 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00003806}
3807
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003808TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00003809 verifyFormat("functionCall({ int i; });");
3810 verifyFormat("functionCall({\n"
3811 " int i;\n"
3812 " int j;\n"
3813 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00003814 verifyFormat("functionCall(\n"
3815 " {\n"
3816 " int i;\n"
3817 " int j;\n"
3818 " },\n"
3819 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00003820 verifyFormat("functionA(functionB({\n"
3821 " int i;\n"
3822 " int j;\n"
3823 " }),\n"
3824 " aaaa, bbbb, cccc);");
3825 verifyFormat("functionCall(\n"
3826 " {\n"
3827 " int i;\n"
3828 " int j;\n"
3829 " },\n"
3830 " aaaa, bbbb, // comment\n"
3831 " cccc);");
3832 verifyFormat("functionA(functionB({\n"
3833 " int i;\n"
3834 " int j;\n"
3835 " }),\n"
3836 " aaaa, bbbb, // comment\n"
3837 " cccc);");
3838 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3839 verifyFormat("functionCall(aaaa, bbbb, {\n"
3840 " int i;\n"
3841 " int j;\n"
3842 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00003843 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00003844 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00003845 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003846 " int i; // break\n"
3847 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00003848 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3849 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003850 verifyFormat("DEBUG({\n"
3851 " if (a)\n"
3852 " f();\n"
3853 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003854}
3855
3856TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003857 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003858 "int i;",
3859 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003860}
3861
3862TEST_F(FormatTest, LayoutNestedBlocks) {
3863 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3864 " struct s {\n"
3865 " int i;\n"
3866 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003867 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003868 " for (int i = 0; i < 10; ++i)\n"
3869 " return;\n"
3870 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003871 verifyFormat("call(parameter, {\n"
3872 " something();\n"
3873 " // Comment using all columns.\n"
3874 " somethingelse();\n"
3875 "});",
3876 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00003877 verifyFormat("DEBUG( //\n"
3878 " { f(); }, a);");
3879 verifyFormat("DEBUG( //\n"
3880 " {\n"
3881 " f(); //\n"
3882 " },\n"
3883 " a);");
3884
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003885 EXPECT_EQ("call(parameter, {\n"
3886 " something();\n"
3887 " // Comment too\n"
3888 " // looooooooooong.\n"
3889 " somethingElse();\n"
3890 "});",
3891 format("call(parameter, {\n"
3892 " something();\n"
3893 " // Comment too looooooooooong.\n"
3894 " somethingElse();\n"
3895 "});",
3896 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003897 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003898 EXPECT_EQ("DEBUG({ // comment\n"
3899 " int i;\n"
3900 "});",
3901 format("DEBUG({ // comment\n"
3902 "int i;\n"
3903 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003904 EXPECT_EQ("DEBUG({\n"
3905 " int i;\n"
3906 "\n"
3907 " // comment\n"
3908 " int j;\n"
3909 "});",
3910 format("DEBUG({\n"
3911 " int i;\n"
3912 "\n"
3913 " // comment\n"
3914 " int j;\n"
3915 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003916
3917 verifyFormat("DEBUG({\n"
3918 " if (a)\n"
3919 " return;\n"
3920 "});");
3921 verifyGoogleFormat("DEBUG({\n"
3922 " if (a) return;\n"
3923 "});");
3924 FormatStyle Style = getGoogleStyle();
3925 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003926 verifyFormat("Debug(aaaaa,\n"
3927 " {\n"
3928 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3929 " },\n"
3930 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003931 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003932
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003933 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3934
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003935 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003936}
3937
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003938TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3939 EXPECT_EQ("#define MACRO() \\\n"
3940 " Debug(aaa, /* force line break */ \\\n"
3941 " { \\\n"
3942 " int i; \\\n"
3943 " int j; \\\n"
3944 " })",
3945 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3946 " { int i; int j; })",
3947 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003948
3949 EXPECT_EQ("#define A \\\n"
3950 " [] { \\\n"
3951 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3952 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3953 " }",
3954 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3955 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3956 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003957}
3958
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003959TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3960 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003961 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003962 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003963}
3964
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003965TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3966 FormatStyle Style = getLLVMStyle();
3967 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3968 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3969 verifyFormat("FOO_BEGIN\n"
3970 " FOO_ENTRY\n"
3971 "FOO_END", Style);
3972 verifyFormat("FOO_BEGIN\n"
3973 " NESTED_FOO_BEGIN\n"
3974 " NESTED_FOO_ENTRY\n"
3975 " NESTED_FOO_END\n"
3976 "FOO_END", Style);
3977 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3978 " int x;\n"
3979 " x = 1;\n"
3980 "FOO_END(Baz)", Style);
3981}
3982
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003983//===----------------------------------------------------------------------===//
3984// Line break tests.
3985//===----------------------------------------------------------------------===//
3986
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003987TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003988 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003989 "void f() {\n"
3990 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3991 " parameter, parameter, parameter)),\n"
3992 " SecondLongCall(parameter));\n"
3993 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003994 verifyFormat(
3995 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3996 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3997 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3998 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3999 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00004000 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4001 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
4002 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
4003 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00004004 verifyFormat(
4005 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
4006 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
4007 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
4008 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00004009 verifyFormat("int a = bbbb && ccc &&\n"
4010 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00004011 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00004012 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00004013}
4014
Daniel Jasperd69fc772013-05-08 14:12:04 +00004015TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
4016 verifyFormat(
4017 "bool aaaaaaa =\n"
4018 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
4019 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004020 verifyFormat(
4021 "bool aaaaaaa =\n"
4022 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
4023 " bbbbbbbb();");
4024
Daniel Jasperd69fc772013-05-08 14:12:04 +00004025 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
4026 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
4027 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004028 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
4029 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
4030 " ccccccccc == ddddddddddd;");
4031 verifyFormat(
4032 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
4033 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
4034 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00004035
4036 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
4037 " aaaaaa) &&\n"
4038 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00004039 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
4040 " aaaaaa) >>\n"
4041 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00004042 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00004043 " SourceMgr.getSpellingColumnNumber(\n"
4044 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
4045 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00004046
Daniel Jasper68d888c2013-06-03 08:42:05 +00004047 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4048 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
4049 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00004050 verifyFormat("b = a &&\n"
4051 " // Comment\n"
4052 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00004053
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00004054 // If the LHS of a comparison is not a binary expression itself, the
4055 // additional linebreak confuses many people.
4056 verifyFormat(
4057 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4058 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
4059 "}");
4060 verifyFormat(
4061 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4062 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4063 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00004064 verifyFormat(
4065 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
4066 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4067 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00004068 // Even explicit parentheses stress the precedence enough to make the
4069 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00004070 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4071 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4072 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00004073 // This cases is borderline, but with the indentation it is still readable.
4074 verifyFormat(
4075 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4076 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4077 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
4078 "}",
4079 getLLVMStyleWithColumns(75));
4080
4081 // If the LHS is a binary expression, we should still use the additional break
4082 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00004083 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4084 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4085 " 5) {\n"
4086 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00004087
Daniel Jasper571f1af2013-05-14 20:39:56 +00004088 FormatStyle OnePerLine = getLLVMStyle();
4089 OnePerLine.BinPackParameters = false;
4090 verifyFormat(
4091 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4092 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4093 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
4094 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00004095
4096 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
4097 " .aaa(aaaaaaaaaaaaa) *\n"
4098 " aaaaaaa +\n"
4099 " aaaaaaa;",
4100 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00004101}
4102
Daniel Jasper6bee6822013-04-08 20:33:42 +00004103TEST_F(FormatTest, ExpressionIndentation) {
4104 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4105 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4106 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4107 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4108 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4109 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
4110 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4111 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
4112 " ccccccccccccccccccccccccccccccccccccccccc;");
4113 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4114 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4115 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4116 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4117 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4118 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4119 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4120 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4121 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4122 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4123 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4124 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00004125 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004126 "} else if (aaaaa && bbbbb > // break\n"
4127 " ccccc) {\n"
4128 "}");
4129 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00004130 "} else if (aaaaa &&\n"
4131 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004132 " ccccc &&\n"
4133 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00004134 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00004135
4136 // Presence of a trailing comment used to change indentation of b.
4137 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
4138 " b;\n"
4139 "return aaaaaaaaaaaaaaaaaaa +\n"
4140 " b; //",
4141 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00004142}
4143
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004144TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
4145 // Not sure what the best system is here. Like this, the LHS can be found
4146 // immediately above an operator (everything with the same or a higher
4147 // indent). The RHS is aligned right of the operator and so compasses
4148 // everything until something with the same indent as the operator is found.
4149 // FIXME: Is this a good system?
4150 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00004151 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004152 verifyFormat(
4153 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004154 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4155 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4156 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4157 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4158 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004159 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004160 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4161 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004162 Style);
4163 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004164 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4165 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004166 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4167 Style);
4168 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004169 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4170 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004171 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4172 Style);
4173 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4174 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004175 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4176 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004177 Style);
4178 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004179 "} else if (aaaaa\n"
4180 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004181 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004182 "}",
4183 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00004184 verifyFormat("return (a)\n"
4185 " // comment\n"
4186 " + b;",
4187 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004188 verifyFormat(
4189 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4190 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4191 " + cc;",
4192 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00004193
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00004194 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4195 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4196 Style);
4197
Daniel Jasper9e5ede02013-11-08 19:56:28 +00004198 // Forced by comments.
4199 verifyFormat(
4200 "unsigned ContentSize =\n"
4201 " sizeof(int16_t) // DWARF ARange version number\n"
4202 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4203 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
4204 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00004205
4206 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
4207 " == boost::fusion::at_c<1>(iiii).second;",
4208 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00004209
4210 Style.ColumnLimit = 60;
4211 verifyFormat("zzzzzzzzzz\n"
4212 " = bbbbbbbbbbbbbbbbb\n"
4213 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
4214 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004215}
4216
Daniel Jasperb1270392017-02-01 23:27:37 +00004217TEST_F(FormatTest, EnforcedOperatorWraps) {
4218 // Here we'd like to wrap after the || operators, but a comment is forcing an
4219 // earlier wrap.
4220 verifyFormat("bool x = aaaaa //\n"
4221 " || bbbbb\n"
4222 " //\n"
4223 " || cccc;");
4224}
4225
Daniel Jasper3219e432014-12-02 13:24:51 +00004226TEST_F(FormatTest, NoOperandAlignment) {
4227 FormatStyle Style = getLLVMStyle();
4228 Style.AlignOperands = false;
Daniel Jasperc3aa05c2017-02-02 08:30:21 +00004229 verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
4230 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4231 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4232 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004233 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00004234 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4235 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4236 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4237 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4238 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4239 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4240 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4241 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4242 " > ccccccccccccccccccccccccccccccccccccccccc;",
4243 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004244
4245 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4246 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4247 " + cc;",
4248 Style);
4249 verifyFormat("int a = aa\n"
4250 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004251 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00004252 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00004253
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004254 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00004255 verifyFormat("return (a > b\n"
4256 " // comment1\n"
4257 " // comment2\n"
4258 " || c);",
4259 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004260}
4261
Daniel Jasperac043c92014-09-15 11:11:00 +00004262TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
4263 FormatStyle Style = getLLVMStyle();
4264 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4265 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4266 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00004267 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4268 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00004269}
4270
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004271TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004272 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004273 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
4274 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004275 verifyFormat("Constructor()\n"
4276 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004277 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004278 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004279 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004280 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004281
Daniel Jasper7b259cd2015-08-27 11:59:31 +00004282 verifyFormat("template <typename T>\n"
4283 "Constructor() : Initializer(FitsOnTheLine) {}",
4284 getLLVMStyleWithColumns(45));
4285
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004286 verifyFormat(
4287 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004288 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004289
4290 verifyFormat(
4291 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004292 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004293 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004294 verifyFormat(
4295 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004296 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004297 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00004298 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4299 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4300 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004301
4302 verifyFormat("Constructor()\n"
4303 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4304 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4305 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004306 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004307
Daniel Jasper65585ed2013-01-28 13:31:35 +00004308 verifyFormat("Constructor()\n"
4309 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004310 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00004311
Daniel Jasper62e68172013-02-25 15:59:54 +00004312 verifyFormat("Constructor(int Parameter = 0)\n"
4313 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4314 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00004315 verifyFormat("Constructor()\n"
4316 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4317 "}",
4318 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00004319 verifyFormat("Constructor()\n"
4320 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4321 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00004322
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004323 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00004324 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004325 verifyFormat("Constructor()\n"
4326 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4327 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
4328 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004329
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004330 FormatStyle OnePerLine = getLLVMStyle();
4331 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00004332 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004333 verifyFormat("SomeClass::Constructor()\n"
4334 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4335 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004336 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004337 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004338 verifyFormat("SomeClass::Constructor()\n"
4339 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4340 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004341 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004342 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004343 verifyFormat("MyClass::MyClass(int var)\n"
4344 " : some_var_(var), // 4 space indent\n"
4345 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004346 "}",
4347 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00004348 verifyFormat("Constructor()\n"
4349 " : aaaaa(aaaaaa),\n"
4350 " aaaaa(aaaaaa),\n"
4351 " aaaaa(aaaaaa),\n"
4352 " aaaaa(aaaaaa),\n"
4353 " aaaaa(aaaaaa) {}",
4354 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00004355 verifyFormat("Constructor()\n"
4356 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4357 " aaaaaaaaaaaaaaaaaaaaaa) {}",
4358 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00004359 OnePerLine.BinPackParameters = false;
4360 verifyFormat(
4361 "Constructor()\n"
4362 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4363 " aaaaaaaaaaa().aaa(),\n"
4364 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4365 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00004366 OnePerLine.ColumnLimit = 60;
4367 verifyFormat("Constructor()\n"
4368 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
4369 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4370 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00004371
4372 EXPECT_EQ("Constructor()\n"
4373 " : // Comment forcing unwanted break.\n"
4374 " aaaa(aaaa) {}",
4375 format("Constructor() :\n"
4376 " // Comment forcing unwanted break.\n"
4377 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004378}
4379
4380TEST_F(FormatTest, MemoizationTests) {
4381 // This breaks if the memoization lookup does not take \c Indent and
4382 // \c LastSpace into account.
4383 verifyFormat(
4384 "extern CFRunLoopTimerRef\n"
4385 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
4386 " CFTimeInterval interval, CFOptionFlags flags,\n"
4387 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00004388 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004389
4390 // Deep nesting somewhat works around our memoization.
4391 verifyFormat(
4392 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4393 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4394 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4395 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4396 " aaaaa())))))))))))))))))))))))))))))))))))))));",
4397 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00004398 verifyFormat(
4399 "aaaaa(\n"
4400 " aaaaa,\n"
4401 " aaaaa(\n"
4402 " aaaaa,\n"
4403 " aaaaa(\n"
4404 " aaaaa,\n"
4405 " aaaaa(\n"
4406 " aaaaa,\n"
4407 " aaaaa(\n"
4408 " aaaaa,\n"
4409 " aaaaa(\n"
4410 " aaaaa,\n"
4411 " aaaaa(\n"
4412 " aaaaa,\n"
4413 " aaaaa(\n"
4414 " aaaaa,\n"
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))))))))))));",
4424 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00004425 verifyFormat(
4426 "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"
4427 " a),\n"
4428 " a),\n"
4429 " a),\n"
4430 " a),\n"
4431 " a),\n"
4432 " a),\n"
4433 " a),\n"
4434 " a),\n"
4435 " a),\n"
4436 " a),\n"
4437 " a),\n"
4438 " a),\n"
4439 " a),\n"
4440 " a),\n"
4441 " a),\n"
4442 " a),\n"
4443 " a)",
4444 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00004445
4446 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004447 FormatStyle OnePerLine = getLLVMStyle();
4448 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004449 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00004450 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00004451 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00004452 for (unsigned i = 0, e = 80; i != e; ++i) {
4453 input += " a,\n";
4454 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004455 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004456 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004457}
4458
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004459TEST_F(FormatTest, BreaksAsHighAsPossible) {
4460 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004461 "void f() {\n"
4462 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
4463 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
4464 " f();\n"
4465 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00004466 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004467 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004468}
4469
Daniel Jasper6728fc12013-04-11 14:29:13 +00004470TEST_F(FormatTest, BreaksFunctionDeclarations) {
4471 // Principially, we break function declarations in a certain order:
4472 // 1) break amongst arguments.
4473 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
4474 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004475 verifyFormat("template <class TemplateIt>\n"
4476 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
4477 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00004478
4479 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00004480 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004481 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004482 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004483 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004484
4485 // 3) break after (.
4486 verifyFormat(
4487 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00004488 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
4489 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004490
4491 // 4) break before after nested name specifiers.
4492 verifyFormat(
4493 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004494 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
4495 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004496 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004497
4498 // However, there are exceptions, if a sufficient amount of lines can be
4499 // saved.
4500 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
4501 // more adjusting.
4502 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4503 " Cccccccccccccc cccccccccc,\n"
4504 " Cccccccccccccc cccccccccc,\n"
4505 " Cccccccccccccc cccccccccc,\n"
4506 " Cccccccccccccc cccccccccc);");
4507 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004508 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004509 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4510 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4511 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004512 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004513 verifyFormat(
4514 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4515 " Cccccccccccccc cccccccccc,\n"
4516 " Cccccccccccccc cccccccccc,\n"
4517 " Cccccccccccccc cccccccccc,\n"
4518 " Cccccccccccccc cccccccccc,\n"
4519 " Cccccccccccccc cccccccccc,\n"
4520 " Cccccccccccccc cccccccccc);");
4521 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4522 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4523 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4524 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4525 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00004526
4527 // Break after multi-line parameters.
4528 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4529 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4530 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4531 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00004532 verifyFormat("void SomeLoooooooooooongFunction(\n"
4533 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
4534 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4535 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004536
4537 // Treat overloaded operators like other functions.
4538 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4539 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00004540 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4541 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00004542 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4543 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
4544 verifyGoogleFormat(
4545 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
4546 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004547 verifyGoogleFormat(
4548 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
4549 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00004550 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4551 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4552 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
4553 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00004554 verifyGoogleFormat(
4555 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
4556 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4557 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00004558 verifyGoogleFormat(
4559 "template <typename T>\n"
4560 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4561 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
4562 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00004563
4564 FormatStyle Style = getLLVMStyle();
4565 Style.PointerAlignment = FormatStyle::PAS_Left;
4566 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4567 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
4568 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004569 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
4570 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4571 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00004572}
4573
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004574TEST_F(FormatTest, TrailingReturnType) {
4575 verifyFormat("auto foo() -> int;\n");
4576 verifyFormat("struct S {\n"
4577 " auto bar() const -> int;\n"
4578 "};");
4579 verifyFormat("template <size_t Order, typename T>\n"
4580 "auto load_img(const std::string &filename)\n"
4581 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00004582 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
4583 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00004584 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00004585 verifyFormat("template <typename T>\n"
4586 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
4587 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00004588
4589 // Not trailing return types.
4590 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004591}
4592
Daniel Jasper5be31f72013-05-21 09:16:31 +00004593TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004594 // Avoid breaking before trailing 'const' or other trailing annotations, if
4595 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00004596 FormatStyle Style = getGoogleStyle();
4597 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00004598 verifyFormat("void someLongFunction(\n"
4599 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00004600 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00004601 verifyFormat("LoooooongReturnType\n"
4602 "someLoooooooongFunction() const {}",
4603 getLLVMStyleWithColumns(47));
4604 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
4605 " const {}",
4606 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004607 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4608 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
4609 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4610 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
4611 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4612 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00004613 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
4614 " aaaaaaaaaaa aaaaa) const override;");
4615 verifyGoogleFormat(
4616 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4617 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004618
Daniel Jasper5550de62014-02-17 07:57:46 +00004619 // Even if the first parameter has to be wrapped.
4620 verifyFormat("void someLongFunction(\n"
4621 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004622 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00004623 verifyFormat("void someLongFunction(\n"
4624 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004625 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00004626 verifyFormat("void someLongFunction(\n"
4627 " int someLongParameter) override {}",
4628 Style);
4629 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004630 " int someLongParameter) OVERRIDE {}",
4631 Style);
4632 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004633 " int someLongParameter) final {}",
4634 Style);
4635 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004636 " int someLongParameter) FINAL {}",
4637 Style);
4638 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004639 " int parameter) const override {}",
4640 Style);
4641
Daniel Jaspere3f907f2014-06-02 09:52:08 +00004642 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
4643 verifyFormat("void someLongFunction(\n"
4644 " int someLongParameter) const\n"
4645 "{\n"
4646 "}",
4647 Style);
4648
Daniel Jasper5550de62014-02-17 07:57:46 +00004649 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004650 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
4651 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4652 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00004653
4654 // Breaking before function-like trailing annotations is fine to keep them
4655 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00004656 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4657 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4658 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4659 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4660 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4661 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00004662 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4663 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00004664 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004665
4666 verifyFormat(
4667 "void aaaaaaaaaaaaaaaaaa()\n"
4668 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4669 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
4670 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4671 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004672 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004673 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004674 " GUARDED_BY(aaaaaaaaaaaa);");
4675 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004676 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004677 " GUARDED_BY(aaaaaaaaaaaa);");
4678 verifyGoogleFormat(
4679 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4680 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004681 verifyGoogleFormat(
4682 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4683 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004684}
4685
Daniel Jasperf090f032015-05-18 09:47:22 +00004686TEST_F(FormatTest, FunctionAnnotations) {
4687 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004688 "int OldFunction(const string &parameter) {}");
4689 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004690 "string OldFunction(const string &parameter) {}");
4691 verifyFormat("template <typename T>\n"
4692 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4693 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004694
4695 // Not function annotations.
4696 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4697 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004698 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4699 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004700 verifyFormat("MACRO(abc).function() // wrap\n"
4701 " << abc;");
4702 verifyFormat("MACRO(abc)->function() // wrap\n"
4703 " << abc;");
4704 verifyFormat("MACRO(abc)::function() // wrap\n"
4705 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004706}
4707
Daniel Jasperf7935112012-12-03 18:12:45 +00004708TEST_F(FormatTest, BreaksDesireably) {
4709 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4710 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004711 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004712 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4713 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4714 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004715
4716 verifyFormat(
4717 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004718 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004719
4720 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4721 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4722 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004723
4724 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004725 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4726 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4727 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004728 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4729 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004730
4731 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4732 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4733
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004734 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004735 "void f() {\n"
4736 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4737 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4738 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004739 verifyFormat(
4740 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4741 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4742 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004743 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4744 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4745 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004746 "aaaaaa(aaa,\n"
4747 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004748 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4749 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004750 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4751 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4752 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004753
Daniel Jasper739b85f2015-06-29 10:42:59 +00004754 // Indent consistently independent of call expression and unary operator.
4755 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4756 " dddddddddddddddddddddddddddddd));");
4757 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4758 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004759 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004760 " dddddddddddddddddddddddddddddd));");
4761
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004762 // This test case breaks on an incorrect memoization, i.e. an optimization not
4763 // taking into account the StopAt value.
4764 verifyFormat(
4765 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004766 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4767 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4768 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004769
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004770 verifyFormat("{\n {\n {\n"
4771 " Annotation.SpaceRequiredBefore =\n"
4772 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4773 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4774 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004775
4776 // Break on an outer level if there was a break on an inner level.
4777 EXPECT_EQ("f(g(h(a, // comment\n"
4778 " b, c),\n"
4779 " d, e),\n"
4780 " x, y);",
4781 format("f(g(h(a, // comment\n"
4782 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004783
4784 // Prefer breaking similar line breaks.
4785 verifyFormat(
4786 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4787 " NSTrackingMouseEnteredAndExited |\n"
4788 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004789}
4790
Daniel Jasper18210d72014-10-09 09:52:05 +00004791TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4792 FormatStyle NoBinPacking = getGoogleStyle();
4793 NoBinPacking.BinPackParameters = false;
4794 NoBinPacking.BinPackArguments = true;
4795 verifyFormat("void f() {\n"
4796 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4797 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4798 "}",
4799 NoBinPacking);
4800 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4801 " int aaaaaaaaaaaaaaaaaaaa,\n"
4802 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4803 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004804
Daniel Jasper00693b082016-01-09 15:56:47 +00004805 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4806 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4807 " vector<int> bbbbbbbbbbbbbbb);",
4808 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004809 // FIXME: This behavior difference is probably not wanted. However, currently
4810 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4811 // template arguments from BreakBeforeParameter being set because of the
4812 // one-per-line formatting.
4813 verifyFormat(
4814 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4815 " aaaaaaaaaa> aaaaaaaaaa);",
4816 NoBinPacking);
4817 verifyFormat(
4818 "void fffffffffff(\n"
4819 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4820 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004821}
4822
Daniel Jasper9278eb92013-01-16 14:59:02 +00004823TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004824 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004825 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004826 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004827 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4828 " aaaaaaaaaaaaaaaaaaaa,\n"
4829 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4830 NoBinPacking);
4831 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4832 " aaaaaaaaaaaaa,\n"
4833 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4834 NoBinPacking);
4835 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004836 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4837 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4838 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4839 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004840 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4841 NoBinPacking);
4842 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4843 " .aaaaaaaaaaaaaaaaaa();",
4844 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004845 verifyFormat("void f() {\n"
4846 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4847 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4848 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004849 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004850
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004851 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004852 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4853 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004854 " aaaaaaaaaaaa);",
4855 NoBinPacking);
4856 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004857 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4858 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004859 " test);",
4860 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004861
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004862 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4863 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004864 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4865 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004866 NoBinPacking);
4867 verifyFormat("a(\"a\"\n"
4868 " \"a\",\n"
4869 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004870
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004871 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004872 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004873 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004874 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004875 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004876 verifyFormat(
4877 "void f() {\n"
4878 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4879 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004880 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004881 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004882 verifyFormat(
4883 "template <class SomeType, class SomeOtherType>\n"
4884 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4885 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004886}
4887
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004888TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4889 FormatStyle Style = getLLVMStyleWithColumns(15);
4890 Style.ExperimentalAutoDetectBinPacking = true;
4891 EXPECT_EQ("aaa(aaaa,\n"
4892 " aaaa,\n"
4893 " aaaa);\n"
4894 "aaa(aaaa,\n"
4895 " aaaa,\n"
4896 " aaaa);",
4897 format("aaa(aaaa,\n" // one-per-line
4898 " aaaa,\n"
4899 " aaaa );\n"
4900 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4901 Style));
4902 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4903 " aaaa);\n"
4904 "aaa(aaaa, aaaa,\n"
4905 " aaaa);",
4906 format("aaa(aaaa, aaaa,\n" // bin-packed
4907 " aaaa );\n"
4908 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4909 Style));
4910}
4911
Daniel Jasper04468962013-01-18 10:56:38 +00004912TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004913 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4914 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4915 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4916 " .StartsWith(\".init\", ORDER_INIT)\n"
4917 " .StartsWith(\".fini\", ORDER_FINI)\n"
4918 " .StartsWith(\".hash\", ORDER_HASH)\n"
4919 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004920
Daniel Jaspereb50c672013-02-15 20:33:06 +00004921 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004922 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004923 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004924 "aaaaaaa->aaaaaaa\n"
4925 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4926 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004927 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004928 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004929 "aaaaaaa->aaaaaaa\n"
4930 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4931 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4932 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004933 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004934 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004935 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004936 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4937 " aaaaaa->aaaaaaaaaaaa()\n"
4938 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004939 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004940 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004941 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004942 "void f() {\n"
4943 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004944 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004945 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004946 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004947 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004948 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004949 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004950 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004951 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004952 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004953 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004954 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004955
4956 verifyFormat(
4957 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4958 verifyFormat("aaaaaaaaaaaaaaa()\n"
4959 " .aaaaaaaaaaaaaaa()\n"
4960 " .aaaaaaaaaaaaaaa()\n"
4961 " .aaaaaaaaaaaaaaa()\n"
4962 " .aaaaaaaaaaaaaaa();");
4963 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4964 " .aaaaaaaaaaaaaaa()\n"
4965 " .aaaaaaaaaaaaaaa()\n"
4966 " .aaaaaaaaaaaaaaa();");
4967 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4968 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4969 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004970 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4971 " ->aaaaaaaaaaaaaae(0)\n"
4972 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004973
Daniel Jasper775954b2015-04-24 10:08:09 +00004974 // Don't linewrap after very short segments.
4975 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4976 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4977 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4978 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4979 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4980 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4981 verifyFormat("aaa()\n"
4982 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4983 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4984 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4985
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004986 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4987 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4988 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4989 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4990 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004991 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004992
Daniel Jaspera41aa532014-09-19 08:01:25 +00004993 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004994 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4995 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004996
4997 // Prefer not to create "hanging" indents.
4998 verifyFormat(
4999 "return !soooooooooooooome_map\n"
5000 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5001 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00005002 verifyFormat(
5003 "return aaaaaaaaaaaaaaaa\n"
5004 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
5005 " .aaaa(aaaaaaaaaaaaaa);");
5006 // No hanging indent here.
5007 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
5008 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5009 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
5010 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00005011 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5012 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5013 getLLVMStyleWithColumns(60));
5014 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
5015 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5016 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5017 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00005018 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5019 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5020 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00005021}
5022
Daniel Jasperde5c2072012-12-24 00:13:23 +00005023TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
5024 verifyFormat(
5025 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005026 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00005027 verifyFormat(
5028 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
5029 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
5030
Daniel Jasper8d1832e2013-01-07 13:26:07 +00005031 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005032 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00005033 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
5034 " ccccccccccccccccccccccccc) {\n}");
5035
Daniel Jasper8d1832e2013-01-07 13:26:07 +00005036 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005037 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00005038 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
5039 " ccccccccccccccccccccccccc) {\n}");
5040
Daniel Jasperde5c2072012-12-24 00:13:23 +00005041 verifyFormat(
5042 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005043 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00005044 verifyFormat(
5045 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
5046 " ccccccccccccccccccccccccc) {\n}");
5047
Daniel Jasper400adc62013-02-08 15:28:42 +00005048 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
5049 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
5050 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
5051 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00005052 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
5053 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
5054 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
5055 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5056
Daniel Jasper400adc62013-02-08 15:28:42 +00005057 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
5058 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
5059 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00005060 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
5061 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
5062 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00005063}
5064
Daniel Jasper43b65482013-01-23 12:27:43 +00005065TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00005066 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00005067 "unsigned Cost =\n"
5068 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
5069 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00005070 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00005071 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
5072 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00005073
5074 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00005075 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
5076 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00005077 verifyFormat("unsigned OriginalStartColumn =\n"
5078 " SourceMgr.getSpellingColumnNumber(\n"
5079 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
5080 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00005081}
5082
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005083TEST_F(FormatTest, AlignsAfterAssignments) {
5084 verifyFormat(
5085 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00005086 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005087 verifyFormat(
5088 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00005089 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005090 verifyFormat(
5091 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00005092 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005093 verifyFormat(
5094 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00005095 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00005096 verifyFormat(
5097 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5098 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5099 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005100}
5101
5102TEST_F(FormatTest, AlignsAfterReturn) {
5103 verifyFormat(
5104 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5105 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
5106 verifyFormat(
5107 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5108 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00005109 verifyFormat(
5110 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005111 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00005112 verifyFormat(
5113 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005114 " aaaaaaaaaaaaaaaaaaaaaa());");
5115 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5116 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5117 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5118 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
5119 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00005120 verifyFormat("return\n"
5121 " // true if code is one of a or b.\n"
5122 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005123}
5124
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005125TEST_F(FormatTest, AlignsAfterOpenBracket) {
5126 verifyFormat(
5127 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5128 " aaaaaaaaa aaaaaaa) {}");
5129 verifyFormat(
5130 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5131 " aaaaaaaaaaa aaaaaaaaa);");
5132 verifyFormat(
5133 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5134 " aaaaaaaaaaaaaaaaaaaaa));");
5135 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005136 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00005137 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5138 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
5139 Style);
5140 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5141 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
5142 Style);
5143 verifyFormat("SomeLongVariableName->someFunction(\n"
5144 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
5145 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005146 verifyFormat(
5147 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5148 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5149 Style);
5150 verifyFormat(
5151 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5152 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5153 Style);
5154 verifyFormat(
5155 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5156 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5157 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005158
Daniel Jasper2a9f7202016-02-08 09:52:54 +00005159 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
5160 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
5161 " b));",
5162 Style);
5163
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005164 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5165 Style.BinPackArguments = false;
5166 Style.BinPackParameters = false;
5167 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5168 " aaaaaaaaaaa aaaaaaaa,\n"
5169 " aaaaaaaaa aaaaaaa,\n"
5170 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5171 Style);
5172 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5173 " aaaaaaaaaaa aaaaaaaaa,\n"
5174 " aaaaaaaaaaa aaaaaaaaa,\n"
5175 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5176 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00005177 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
5178 " aaaaaaaaaaaaaaa,\n"
5179 " aaaaaaaaaaaaaaaaaaaaa,\n"
5180 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005181 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00005182 verifyFormat(
5183 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
5184 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5185 Style);
5186 verifyFormat(
5187 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
5188 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5189 Style);
5190 verifyFormat(
5191 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5192 " aaaaaaaaaaaaaaaaaaaaa(\n"
5193 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
5194 " aaaaaaaaaaaaaaaa);",
5195 Style);
5196 verifyFormat(
5197 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5198 " aaaaaaaaaaaaaaaaaaaaa(\n"
5199 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
5200 " aaaaaaaaaaaaaaaa);",
5201 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005202}
5203
Daniel Jasper3219e432014-12-02 13:24:51 +00005204TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
5205 FormatStyle Style = getLLVMStyleWithColumns(40);
5206 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5207 " bbbbbbbbbbbbbbbbbbbbbb);",
5208 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005209 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00005210 Style.AlignOperands = false;
5211 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5212 " bbbbbbbbbbbbbbbbbbbbbb);",
5213 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005214 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00005215 Style.AlignOperands = true;
5216 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5217 " bbbbbbbbbbbbbbbbbbbbbb);",
5218 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005219 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00005220 Style.AlignOperands = false;
5221 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5222 " bbbbbbbbbbbbbbbbbbbbbb);",
5223 Style);
5224}
5225
Daniel Jasper399d24b2013-01-09 07:06:56 +00005226TEST_F(FormatTest, BreaksConditionalExpressions) {
5227 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005228 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5229 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5230 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5231 verifyFormat(
5232 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005233 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5234 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00005235 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005236 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5237 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5238 verifyFormat(
5239 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005240 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5241 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005242 verifyFormat(
5243 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
5244 " : aaaaaaaaaaaaa);");
5245 verifyFormat(
5246 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00005247 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005248 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5249 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005250 verifyFormat(
5251 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5252 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5253 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005254 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5255 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5256 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5257 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5258 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5259 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5260 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5261 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5262 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5263 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5264 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5265 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005266 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5267 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5268 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5269 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5270 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00005271 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5272 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5273 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005274 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5275 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5276 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5277 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00005278 verifyFormat(
5279 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5280 " ? aaaaaaaaaaaaaaa\n"
5281 " : aaaaaaaaaaaaaaa;");
5282 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005283 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00005284 " ? b\n"
5285 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00005286 verifyFormat("return aaaa == bbbb\n"
5287 " // comment\n"
5288 " ? aaaa\n"
5289 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005290 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005291 " format(TheLine.First,\n"
5292 " IndentForLevel[TheLine.Level] >= 0\n"
5293 " ? IndentForLevel[TheLine.Level]\n"
5294 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005295 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005296 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00005297 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5298 " ? aaaaaaaaaaaaaaa\n"
5299 " : bbbbbbbbbbbbbbb //\n"
5300 " ? ccccccccccccccc\n"
5301 " : ddddddddddddddd;");
5302 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5303 " ? aaaaaaaaaaaaaaa\n"
5304 " : (bbbbbbbbbbbbbbb //\n"
5305 " ? ccccccccccccccc\n"
5306 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005307 verifyFormat(
5308 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5309 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5310 " aaaaaaaaaaaaaaaaaaaaa +\n"
5311 " aaaaaaaaaaaaaaaaaaaaa\n"
5312 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00005313 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005314 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5315 " : aaaaaaaaaaaaaaaaaaaaaa\n"
5316 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00005317
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005318 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00005319 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005320 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00005321 "void f() {\n"
5322 " g(aaa,\n"
5323 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5324 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5325 " ? aaaaaaaaaaaaaaa\n"
5326 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005327 "}",
5328 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005329 verifyFormat(
5330 "void f() {\n"
5331 " g(aaa,\n"
5332 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5333 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5334 " ?: aaaaaaaaaaaaaaa);\n"
5335 "}",
5336 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00005337
5338 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
5339 " // comment.\n"
5340 " ccccccccccccccccccccccccccccccccccccccc\n"
5341 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5342 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00005343
5344 // Assignments in conditional expressions. Apparently not uncommon :-(.
5345 verifyFormat("return a != b\n"
5346 " // comment\n"
5347 " ? a = b\n"
5348 " : a = b;");
5349 verifyFormat("return a != b\n"
5350 " // comment\n"
5351 " ? a = a != b\n"
5352 " // comment\n"
5353 " ? a = b\n"
5354 " : a\n"
5355 " : a;\n");
5356 verifyFormat("return a != b\n"
5357 " // comment\n"
5358 " ? a\n"
5359 " : a = a != b\n"
5360 " // comment\n"
5361 " ? a = b\n"
5362 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00005363}
5364
Daniel Jasper165b29e2013-11-08 00:57:11 +00005365TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
5366 FormatStyle Style = getLLVMStyle();
5367 Style.BreakBeforeTernaryOperators = false;
5368 Style.ColumnLimit = 70;
5369 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005370 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5371 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5372 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5373 Style);
5374 verifyFormat(
5375 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005376 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5377 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005378 Style);
5379 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005380 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5381 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5382 Style);
5383 verifyFormat(
5384 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005385 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5386 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005387 Style);
5388 verifyFormat(
5389 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
5390 " aaaaaaaaaaaaa);",
5391 Style);
5392 verifyFormat(
5393 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5394 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5395 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5396 " aaaaaaaaaaaaa);",
5397 Style);
5398 verifyFormat(
5399 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5400 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5401 " aaaaaaaaaaaaa);",
5402 Style);
5403 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5404 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5405 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5406 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5407 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5408 Style);
5409 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5410 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5411 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5412 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5413 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5414 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5415 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5416 Style);
5417 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5418 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
5419 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5420 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5421 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5422 Style);
5423 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5424 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5425 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5426 Style);
5427 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00005428 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00005429 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5430 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5431 Style);
5432 verifyFormat(
5433 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5434 " aaaaaaaaaaaaaaa :\n"
5435 " aaaaaaaaaaaaaaa;",
5436 Style);
5437 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5438 " aaaaaaaaa ?\n"
5439 " b :\n"
5440 " c);",
5441 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00005442 verifyFormat("unsigned Indent =\n"
5443 " format(TheLine.First,\n"
5444 " IndentForLevel[TheLine.Level] >= 0 ?\n"
5445 " IndentForLevel[TheLine.Level] :\n"
5446 " TheLine * 2,\n"
5447 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
5448 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005449 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5450 " aaaaaaaaaaaaaaa :\n"
5451 " bbbbbbbbbbbbbbb ? //\n"
5452 " ccccccccccccccc :\n"
5453 " ddddddddddddddd;",
5454 Style);
5455 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5456 " aaaaaaaaaaaaaaa :\n"
5457 " (bbbbbbbbbbbbbbb ? //\n"
5458 " ccccccccccccccc :\n"
5459 " ddddddddddddddd);",
5460 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00005461 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5462 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
5463 " ccccccccccccccccccccccccccc;",
5464 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00005465 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5466 " aaaaa :\n"
5467 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
5468 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005469}
5470
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005471TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
5472 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
5473 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
5474 verifyFormat("bool a = true, b = false;");
5475
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005476 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005477 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005478 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00005479 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005480 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00005481 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005482 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00005483 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00005484 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
5485 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
5486 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5487 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
5488 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
5489 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005490
Daniel Jasperbea1ab42015-03-01 18:55:26 +00005491 FormatStyle Style = getGoogleStyle();
5492 Style.PointerAlignment = FormatStyle::PAS_Left;
5493 Style.DerivePointerAlignment = false;
5494 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5495 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
5496 " *b = bbbbbbbbbbbbbbbbbbb;",
5497 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00005498 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5499 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
5500 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00005501 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00005502 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005503}
5504
Nico Weber4a5030c2013-01-12 01:28:06 +00005505TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
5506 verifyFormat("arr[foo ? bar : baz];");
5507 verifyFormat("f()[foo ? bar : baz];");
5508 verifyFormat("(a + b)[foo ? bar : baz];");
5509 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
5510}
5511
Daniel Jasperf7935112012-12-03 18:12:45 +00005512TEST_F(FormatTest, AlignsStringLiterals) {
5513 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
5514 " \"short literal\");");
5515 verifyFormat(
5516 "looooooooooooooooooooooooongFunction(\n"
5517 " \"short literal\"\n"
5518 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005519 verifyFormat("someFunction(\"Always break between multi-line\"\n"
5520 " \" string literals\",\n"
5521 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005522 EXPECT_EQ("fun + \"1243\" /* comment */\n"
5523 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005524 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00005525 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005526 getLLVMStyleWithColumns(28)));
5527 EXPECT_EQ(
5528 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5529 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
5530 " \"aaaaaaaaaaaaaaaa\";",
5531 format("aaaaaa ="
5532 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
5533 "aaaaaaaaaaaaaaaaaaaaa\" "
5534 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005535 verifyFormat("a = a + \"a\"\n"
5536 " \"a\"\n"
5537 " \"a\";");
5538 verifyFormat("f(\"a\", \"b\"\n"
5539 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005540
5541 verifyFormat(
5542 "#define LL_FORMAT \"ll\"\n"
5543 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
5544 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00005545
5546 verifyFormat("#define A(X) \\\n"
5547 " \"aaaaa\" #X \"bbbbbb\" \\\n"
5548 " \"ccccc\"",
5549 getLLVMStyleWithColumns(23));
5550 verifyFormat("#define A \"def\"\n"
5551 "f(\"abc\" A \"ghi\"\n"
5552 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005553
5554 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005555 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005556 verifyFormat("#define A(X) \\\n"
5557 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
5558 " L\"ccccc\"",
5559 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00005560
5561 verifyFormat("f(@\"a\"\n"
5562 " @\"b\");");
5563 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00005564 " @\"b\"\n"
5565 " @\"c\";");
5566 verifyFormat("NSString s = @\"a\"\n"
5567 " \"b\"\n"
5568 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00005569}
5570
Zachary Turner448592e2015-12-18 22:20:15 +00005571TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005572 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005573 // No declarations or definitions should be moved to own line.
5574 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
5575 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005576 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005577 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005578 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005579 "int f() { return 1; }\n"
5580 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005581 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00005582
5583 // All declarations and definitions should have the return type moved to its
5584 // own
5585 // line.
5586 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
5587 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005588 " int\n"
5589 " f() {\n"
5590 " return 1;\n"
5591 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005592 " int\n"
5593 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005594 "};\n"
5595 "int\n"
5596 "f() {\n"
5597 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005598 "}\n"
5599 "int\n"
5600 "g();\n",
5601 Style);
5602
5603 // Top-level definitions, and no kinds of declarations should have the
5604 // return type moved to its own line.
5605 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
5606 verifyFormat("class B {\n"
5607 " int f() { return 1; }\n"
5608 " int g();\n"
5609 "};\n"
5610 "int\n"
5611 "f() {\n"
5612 " return 1;\n"
5613 "}\n"
5614 "int g();\n",
5615 Style);
5616
5617 // Top-level definitions and declarations should have the return type moved
5618 // to its own line.
5619 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
5620 verifyFormat("class C {\n"
5621 " int f() { return 1; }\n"
5622 " int g();\n"
5623 "};\n"
5624 "int\n"
5625 "f() {\n"
5626 " return 1;\n"
5627 "}\n"
5628 "int\n"
5629 "g();\n",
5630 Style);
5631
5632 // All definitions should have the return type moved to its own line, but no
5633 // kinds of declarations.
5634 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5635 verifyFormat("class D {\n"
5636 " int\n"
5637 " f() {\n"
5638 " return 1;\n"
5639 " }\n"
5640 " int g();\n"
5641 "};\n"
5642 "int\n"
5643 "f() {\n"
5644 " return 1;\n"
5645 "}\n"
5646 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005647 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005648 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005649 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005650 " return \"\";\n"
5651 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005652 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005653 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005654 verifyFormat("template <class T>\n"
5655 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005656 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005657 " return NULL;\n"
5658 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005659 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005660 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00005661 verifyFormat("class C {\n"
5662 " int\n"
5663 " operator+() {\n"
5664 " return 1;\n"
5665 " }\n"
5666 " int\n"
5667 " operator()() {\n"
5668 " return 1;\n"
5669 " }\n"
5670 "};\n",
5671 Style);
5672 verifyFormat("void\n"
5673 "A::operator()() {}\n"
5674 "void\n"
5675 "A::operator>>() {}\n"
5676 "void\n"
5677 "A::operator+() {}\n",
5678 Style);
5679 verifyFormat("void *operator new(std::size_t s);", // No break here.
5680 Style);
5681 verifyFormat("void *\n"
5682 "operator new(std::size_t s) {}",
5683 Style);
5684 verifyFormat("void *\n"
5685 "operator delete[](void *ptr) {}",
5686 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005687 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005688 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005689 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005690 "{\n"
5691 " return \"\";\n"
5692 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005693 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005694 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005695 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005696 "T *\n" // Problem here: no line break
5697 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005698 "{\n"
5699 " return NULL;\n"
5700 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005701 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005702 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005703}
5704
Alexander Kornienko58611712013-07-04 12:02:44 +00005705TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5706 FormatStyle NoBreak = getLLVMStyle();
5707 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5708 FormatStyle Break = getLLVMStyle();
5709 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005710 verifyFormat("aaaa = \"bbbb\"\n"
5711 " \"cccc\";",
5712 NoBreak);
5713 verifyFormat("aaaa =\n"
5714 " \"bbbb\"\n"
5715 " \"cccc\";",
5716 Break);
5717 verifyFormat("aaaa(\"bbbb\"\n"
5718 " \"cccc\");",
5719 NoBreak);
5720 verifyFormat("aaaa(\n"
5721 " \"bbbb\"\n"
5722 " \"cccc\");",
5723 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005724 verifyFormat("aaaa(qqq, \"bbbb\"\n"
5725 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005726 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005727 verifyFormat("aaaa(qqq,\n"
5728 " \"bbbb\"\n"
5729 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005730 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005731 verifyFormat("aaaa(qqq,\n"
5732 " L\"bbbb\"\n"
5733 " L\"cccc\");",
5734 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005735 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5736 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005737 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005738 verifyFormat("string s = someFunction(\n"
5739 " \"abc\"\n"
5740 " \"abc\");",
5741 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005742
Daniel Jasper3251fff2014-06-10 06:27:23 +00005743 // As we break before unary operators, breaking right after them is bad.
5744 verifyFormat("string foo = abc ? \"x\"\n"
5745 " \"blah blah blah blah blah blah\"\n"
5746 " : \"y\";",
5747 Break);
5748
Daniel Jasperc834c702013-07-17 15:38:19 +00005749 // Don't break if there is no column gain.
5750 verifyFormat("f(\"aaaa\"\n"
5751 " \"bbbb\");",
5752 Break);
5753
5754 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005755 EXPECT_EQ("x = \"a\\\n"
5756 "b\\\n"
5757 "c\";",
5758 format("x = \"a\\\n"
5759 "b\\\n"
5760 "c\";",
5761 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005762 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005763 " \"a\\\n"
5764 "b\\\n"
5765 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005766 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005767 "b\\\n"
5768 "c\";",
5769 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005770
5771 // Exempt ObjC strings for now.
5772 EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005773 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005774 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005775 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005776 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005777
5778 Break.ColumnLimit = 0;
5779 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005780}
5781
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005782TEST_F(FormatTest, AlignsPipes) {
5783 verifyFormat(
5784 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5785 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5786 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5787 verifyFormat(
5788 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5789 " << aaaaaaaaaaaaaaaaaaaa;");
5790 verifyFormat(
5791 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5792 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5793 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005794 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5795 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5796 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005797 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5798 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5799 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5800 verifyFormat(
5801 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5802 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5803 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005804 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5805 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5806 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5807 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005808 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5809 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005810 verifyFormat(
5811 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5812 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005813
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005814 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5815 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005816 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5817 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5818 " aaaaaaaaaaaaaaaaaaaaa)\n"
5819 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005820 verifyFormat("LOG_IF(aaa == //\n"
5821 " bbb)\n"
5822 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005823
Daniel Jasper467ddb12013-08-12 12:58:05 +00005824 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005825 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5826 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005827 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5828 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5829 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005830 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5831 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005832 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5833 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5834 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5835 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5836 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5837 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5838 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005839
Daniel Jasperc238c872013-04-02 14:33:13 +00005840 verifyFormat(
5841 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5842 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005843
5844 // Incomplete string literal.
5845 EXPECT_EQ("llvm::errs() << \"\n"
5846 " << a;",
5847 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005848
5849 verifyFormat("void f() {\n"
5850 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5851 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5852 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005853
5854 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005855 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5856 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5857 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005858
5859 // Handle '\n'.
5860 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5861 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5862 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5863 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5864 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5865 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5866 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005867}
5868
Daniel Jasper7209bb92016-12-13 11:16:42 +00005869TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5870 verifyFormat("return out << \"somepacket = {\\n\"\n"
5871 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5872 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5873 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5874 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5875 " << \"}\";");
5876
5877 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5878 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5879 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5880 verifyFormat(
5881 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5882 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5883 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5884 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5885 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5886 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5887 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5888 verifyFormat(
5889 "void f() {\n"
5890 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5891 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5892 "}");
5893
5894 // Breaking before the first "<<" is generally not desirable.
5895 verifyFormat(
5896 "llvm::errs()\n"
5897 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5898 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5899 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5900 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5901 getLLVMStyleWithColumns(70));
5902 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5903 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5904 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5905 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5906 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5907 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5908 getLLVMStyleWithColumns(70));
5909
5910 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5911 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5912 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5913 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5914 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5915 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005916 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5917 " (aaaa + aaaa);",
5918 getLLVMStyleWithColumns(40));
5919 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5920 " (aaaaaaa + aaaaa));",
5921 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005922 verifyFormat(
5923 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5924 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5925 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005926}
5927
Daniel Jasperf7935112012-12-03 18:12:45 +00005928TEST_F(FormatTest, UnderstandsEquals) {
5929 verifyFormat(
5930 "aaaaaaaaaaaaaaaaa =\n"
5931 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5932 verifyFormat(
5933 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005934 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005935 verifyFormat(
5936 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005937 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005938 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005939 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5940 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005941
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005942 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5943 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005944}
5945
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005946TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005947 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5948 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005949
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005950 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5951 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005952
5953 verifyFormat(
5954 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5955 " Parameter2);");
5956
5957 verifyFormat(
5958 "ShortObject->shortFunction(\n"
5959 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5960 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5961
5962 verifyFormat("loooooooooooooongFunction(\n"
5963 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5964
5965 verifyFormat(
5966 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5967 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5968
Daniel Jasper687af3b2013-02-14 14:26:07 +00005969 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5970 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005971 verifyFormat("void f() {\n"
5972 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5973 " .Times(2)\n"
5974 " .WillRepeatedly(Return(SomeValue));\n"
5975 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005976 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5977 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005978 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005979 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5980 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005981 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005982 verifyFormat("void f() {\n"
5983 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5984 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5985 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005986 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5987 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5988 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5989 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5990 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005991 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5992 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5993 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5994 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5995 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005996
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005997 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005998 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005999 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00006000 verifyFormat(
6001 "aaaaaaaaaaa->aaaaaaaaa(\n"
6002 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6003 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00006004
6005 verifyFormat(
6006 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6007 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00006008 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
6009 " aaaaaaaaa()->aaaaaa()->aaaaa());");
6010 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
6011 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006012
Daniel Jasper9b334242013-03-15 14:57:30 +00006013 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00006014 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6015 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00006016
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006017 FormatStyle NoBinPacking = getLLVMStyle();
6018 NoBinPacking.BinPackParameters = false;
6019 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
6020 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
6021 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
6022 " aaaaaaaaaaaaaaaaaaa,\n"
6023 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6024 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00006025
6026 // If there is a subsequent call, change to hanging indentation.
6027 verifyFormat(
6028 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6029 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
6030 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6031 verifyFormat(
6032 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6033 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00006034 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6035 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6036 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6037 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6038 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6039 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00006040}
6041
Daniel Jasperac5c1c22013-01-02 15:08:56 +00006042TEST_F(FormatTest, WrapsTemplateDeclarations) {
6043 verifyFormat("template <typename T>\n"
6044 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00006045 verifyFormat("template <typename T>\n"
6046 "// T should be one of {A, B}.\n"
6047 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00006048 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00006049 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00006050 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006051 verifyFormat("template <typename T>\n"
6052 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
6053 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00006054 verifyFormat(
6055 "template <typename T>\n"
6056 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
6057 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00006058 verifyFormat(
6059 "template <typename T>\n"
6060 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
6061 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
6062 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00006063 verifyFormat("template <typename T>\n"
6064 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00006065 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00006066 verifyFormat(
6067 "template <typename T1, typename T2 = char, typename T3 = char,\n"
6068 " typename T4 = char>\n"
6069 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00006070 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
6071 " template <typename> class cccccccccccccccccccccc,\n"
6072 " typename ddddddddddddd>\n"
6073 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00006074 verifyFormat(
6075 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
6076 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00006077
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006078 verifyFormat("void f() {\n"
6079 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
6080 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
6081 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00006082
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00006083 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00006084 verifyFormat("template <typename T> void f();");
6085 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006086 verifyFormat(
6087 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6088 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6089 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
6090 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6091 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6092 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
6093 " bbbbbbbbbbbbbbbbbbbbbbbb);",
6094 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00006095 EXPECT_EQ("static_cast<A< //\n"
6096 " B> *>(\n"
6097 "\n"
6098 " );",
6099 format("static_cast<A<//\n"
6100 " B>*>(\n"
6101 "\n"
6102 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00006103 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6104 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00006105
6106 FormatStyle AlwaysBreak = getLLVMStyle();
6107 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
6108 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
6109 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
6110 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
6111 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6112 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
6113 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
6114 verifyFormat("template <template <typename> class Fooooooo,\n"
6115 " template <typename> class Baaaaaaar>\n"
6116 "struct C {};",
6117 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00006118 verifyFormat("template <typename T> // T can be A, B or C.\n"
6119 "struct C {};",
6120 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00006121 verifyFormat("template <enum E> class A {\n"
6122 "public:\n"
6123 " E *f();\n"
6124 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00006125}
6126
Daniel Jasper45797022013-01-25 10:57:27 +00006127TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
6128 verifyFormat(
6129 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6130 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6131 verifyFormat(
6132 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6133 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6134 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
6135
Daniel Jasper0f0234e2013-05-08 10:00:18 +00006136 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00006137 verifyFormat(
6138 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6139 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00006140 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00006141
Daniel Jasper45797022013-01-25 10:57:27 +00006142 verifyFormat(
6143 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00006144 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00006145
6146 // Breaking at nested name specifiers is generally not desirable.
6147 verifyFormat(
6148 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6149 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00006150
6151 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00006152 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
6153 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6154 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00006155 " aaaaaaaaaaaaaaaaaaaaa);",
6156 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00006157
6158 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6159 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6160 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00006161}
6162
Daniel Jasperf7935112012-12-03 18:12:45 +00006163TEST_F(FormatTest, UnderstandsTemplateParameters) {
6164 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006165 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006166 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
6167 verifyFormat("bool x = a < 1 || 2 > a;");
6168 verifyFormat("bool x = 5 < f<int>();");
6169 verifyFormat("bool x = f<int>() > 5;");
6170 verifyFormat("bool x = 5 < a<int>::x;");
6171 verifyFormat("bool x = a < 4 ? a > 2 : false;");
6172 verifyFormat("bool x = f() ? a < 2 : a > 2;");
6173
6174 verifyGoogleFormat("A<A<int>> a;");
6175 verifyGoogleFormat("A<A<A<int>>> a;");
6176 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006177 verifyGoogleFormat("A<A<int> > a;");
6178 verifyGoogleFormat("A<A<A<int> > > a;");
6179 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00006180 verifyGoogleFormat("A<::A<int>> a;");
6181 verifyGoogleFormat("A<::A> a;");
6182 verifyGoogleFormat("A< ::A> a;");
6183 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006184 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
6185 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00006186 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
6187 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006188 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
6189 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006190
Nico Weber7533b4d2014-09-24 17:17:32 +00006191 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
6192
Daniel Jasperf7935112012-12-03 18:12:45 +00006193 verifyFormat("test >> a >> b;");
6194 verifyFormat("test << a >> b;");
6195
6196 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006197 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00006198 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00006199 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
6200 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00006201 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00006202 verifyFormat("f(a.operator()<A>());");
6203 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6204 " .template operator()<A>());",
6205 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00006206
6207 // Not template parameters.
6208 verifyFormat("return a < b && c > d;");
6209 verifyFormat("void f() {\n"
6210 " while (a < b && c > d) {\n"
6211 " }\n"
6212 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006213 verifyFormat("template <typename... Types>\n"
6214 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00006215
6216 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6217 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
6218 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00006219 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00006220 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00006221 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00006222}
6223
Malcolm Parsons6af3f142016-11-03 16:57:30 +00006224TEST_F(FormatTest, BitshiftOperatorWidth) {
6225 EXPECT_EQ("int a = 1 << 2; /* foo\n"
6226 " bar */",
6227 format("int a=1<<2; /* foo\n"
6228 " bar */"));
6229
6230 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
6231 " bar */",
6232 format("int b =256>>1 ; /* foo\n"
6233 " bar */"));
6234}
6235
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006236TEST_F(FormatTest, UnderstandsBinaryOperators) {
6237 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00006238 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00006239}
6240
6241TEST_F(FormatTest, UnderstandsPointersToMembers) {
6242 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006243 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006244 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006245 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006246 verifyFormat("void f() {\n"
6247 " (a->*f)();\n"
6248 " a->*x;\n"
6249 " (a.*f)();\n"
6250 " ((*a).*f)();\n"
6251 " a.*x;\n"
6252 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00006253 verifyFormat("void f() {\n"
6254 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
6255 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
6256 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00006257 verifyFormat(
6258 "(aaaaaaaaaa->*bbbbbbb)(\n"
6259 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006260 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006261 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006262 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006263}
6264
Daniel Jasper8dd40472012-12-21 09:41:31 +00006265TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00006266 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00006267 verifyFormat("f(-1, -2, -3);");
6268 verifyFormat("a[-1] = 5;");
6269 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006270 verifyFormat("if (i == -1) {\n}");
6271 verifyFormat("if (i != -1) {\n}");
6272 verifyFormat("if (i > -1) {\n}");
6273 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00006274 verifyFormat("++(a->f());");
6275 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00006276 verifyFormat("(a->f())++;");
6277 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006278 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00006279
6280 verifyFormat("a-- > b;");
6281 verifyFormat("b ? -a : c;");
6282 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006283 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00006284 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006285 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00006286
6287 verifyFormat("return -1;");
6288 verifyFormat("switch (a) {\n"
6289 "case -1:\n"
6290 " break;\n"
6291 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00006292 verifyFormat("#define X -1");
6293 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00006294
Chandler Carruthf8b72662014-03-02 12:37:31 +00006295 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
6296 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00006297
6298 verifyFormat("int a = /* confusing comment */ -1;");
6299 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
6300 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006301}
6302
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006303TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00006304 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006305 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00006306 "}");
6307 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00006308 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00006309 verifyFormat("*aaa = aaaaaaa( // break\n"
6310 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00006311}
6312
Daniel Jasper8863ada2013-08-26 08:10:17 +00006313TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00006314 verifyFormat("bool operator<();");
6315 verifyFormat("bool operator>();");
6316 verifyFormat("bool operator=();");
6317 verifyFormat("bool operator==();");
6318 verifyFormat("bool operator!=();");
6319 verifyFormat("int operator+();");
6320 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00006321 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006322 verifyFormat("bool operator();");
6323 verifyFormat("bool operator()();");
6324 verifyFormat("bool operator[]();");
6325 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006326 verifyFormat("operator int();");
6327 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006328 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006329 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006330 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006331 verifyFormat("void *operator new(std::size_t size);");
6332 verifyFormat("void *operator new[](std::size_t size);");
6333 verifyFormat("void operator delete(void *ptr);");
6334 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00006335 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
6336 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00006337 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00006338 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006339
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006340 verifyFormat(
6341 "ostream &operator<<(ostream &OutputStream,\n"
6342 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00006343 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
6344 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
6345 " return left.group < right.group;\n"
6346 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00006347 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00006348 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006349
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006350 verifyGoogleFormat("operator void*();");
6351 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00006352 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00006353
6354 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00006355 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
6356 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006357}
6358
Daniel Jasper1c220482015-02-25 10:30:06 +00006359TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00006360 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
6361 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
6362 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
6363 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
6364 verifyFormat("Deleted &operator=(const Deleted &) &;");
6365 verifyFormat("Deleted &operator=(const Deleted &) &&;");
6366 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
6367 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
6368 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
6369 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
6370 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00006371 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00006372 verifyFormat("template <typename T>\n"
6373 "void F(T) && = delete;",
6374 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00006375
Daniel Jasperaf642c62015-08-25 13:40:51 +00006376 FormatStyle AlignLeft = getLLVMStyle();
6377 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00006378 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00006379 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
6380 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
6381 AlignLeft);
6382 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
6383 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006384 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
6385 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
6386 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
6387 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00006388 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00006389
6390 FormatStyle Spaces = getLLVMStyle();
6391 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006392 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
6393 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
6394 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
6395 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006396
6397 Spaces.SpacesInCStyleCastParentheses = false;
6398 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006399 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
6400 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
6401 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
6402 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006403}
6404
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006405TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00006406 verifyFormat("void f() {\n"
6407 " A *a = new A;\n"
6408 " A *a = new (placement) A;\n"
6409 " delete a;\n"
6410 " delete (A *)a;\n"
6411 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00006412 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6413 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00006414 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6415 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6416 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00006417 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006418}
6419
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006420TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006421 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006422 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006423 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006424 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006425 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006426 verifyIndependentOfContext("int a = b * 10;");
6427 verifyIndependentOfContext("int a = 10 * b;");
6428 verifyIndependentOfContext("int a = b * c;");
6429 verifyIndependentOfContext("int a += b * c;");
6430 verifyIndependentOfContext("int a -= b * c;");
6431 verifyIndependentOfContext("int a *= b * c;");
6432 verifyIndependentOfContext("int a /= b * c;");
6433 verifyIndependentOfContext("int a = *b;");
6434 verifyIndependentOfContext("int a = *b * c;");
6435 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00006436 verifyIndependentOfContext("int a = b * (10);");
6437 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006438 verifyIndependentOfContext("return 10 * b;");
6439 verifyIndependentOfContext("return *b * *c;");
6440 verifyIndependentOfContext("return a & ~b;");
6441 verifyIndependentOfContext("f(b ? *c : *d);");
6442 verifyIndependentOfContext("int a = b ? *c : *d;");
6443 verifyIndependentOfContext("*b = a;");
6444 verifyIndependentOfContext("a * ~b;");
6445 verifyIndependentOfContext("a * !b;");
6446 verifyIndependentOfContext("a * +b;");
6447 verifyIndependentOfContext("a * -b;");
6448 verifyIndependentOfContext("a * ++b;");
6449 verifyIndependentOfContext("a * --b;");
6450 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00006451 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006452 verifyIndependentOfContext("f() * b;");
6453 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006454 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006455 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00006456 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006457 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00006458 verifyIndependentOfContext("return sizeof(int **);");
6459 verifyIndependentOfContext("return sizeof(int ******);");
6460 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00006461 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006462 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00006463 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00006464 verifyGoogleFormat("return sizeof(int**);");
6465 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
6466 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006467 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00006468 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00006469 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00006470 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00006471 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00006472 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00006473 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00006474 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00006475 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00006476 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00006477 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00006478 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00006479 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00006480 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00006481 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00006482 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00006483 verifyFormat("void f(const MyOverride &override);");
6484 verifyFormat("void f(const MyFinal &final);");
6485 verifyIndependentOfContext("bool a = f() && override.f();");
6486 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00006487
Daniel Jasper5b49f472013-01-23 12:10:53 +00006488 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00006489
Daniel Jasper5b49f472013-01-23 12:10:53 +00006490 verifyIndependentOfContext("A<int *> a;");
6491 verifyIndependentOfContext("A<int **> a;");
6492 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00006493 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006494 verifyIndependentOfContext(
6495 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006496 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00006497 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00006498 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00006499 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00006500 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00006501
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00006502 verifyFormat(
6503 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6504 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6505
Daniel Jasper1f5d6372016-06-13 14:45:12 +00006506 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00006507 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00006508 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006509 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00006510 verifyGoogleFormat("A<int*> a;");
6511 verifyGoogleFormat("A<int**> a;");
6512 verifyGoogleFormat("A<int*, int*> a;");
6513 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006514 verifyGoogleFormat("f(b ? *c : *d);");
6515 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00006516 verifyGoogleFormat("Type* t = **x;");
6517 verifyGoogleFormat("Type* t = *++*x;");
6518 verifyGoogleFormat("*++*x;");
6519 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
6520 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006521 verifyGoogleFormat(
6522 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00006523 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00006524 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
6525 verifyGoogleFormat("template <typename T>\n"
6526 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00006527
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006528 FormatStyle Left = getLLVMStyle();
6529 Left.PointerAlignment = FormatStyle::PAS_Left;
6530 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00006531 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00006532 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006533
Daniel Jasper5b49f472013-01-23 12:10:53 +00006534 verifyIndependentOfContext("a = *(x + y);");
6535 verifyIndependentOfContext("a = &(x + y);");
6536 verifyIndependentOfContext("*(x + y).call();");
6537 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006538 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00006539
Daniel Jasper5b49f472013-01-23 12:10:53 +00006540 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00006541 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00006542 "int *MyValues = {\n"
6543 " *A, // Operator detection might be confused by the '{'\n"
6544 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00006545 "};");
Nico Weber80a82762013-01-17 17:17:19 +00006546
Daniel Jasper5b49f472013-01-23 12:10:53 +00006547 verifyIndependentOfContext("if (int *a = &b)");
6548 verifyIndependentOfContext("if (int &a = *b)");
6549 verifyIndependentOfContext("if (a & b[i])");
6550 verifyIndependentOfContext("if (a::b::c::d & b[i])");
6551 verifyIndependentOfContext("if (*b[i])");
6552 verifyIndependentOfContext("if (int *a = (&b))");
6553 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00006554 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00006555 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00006556 verifyFormat("void f() {\n"
6557 " for (const int &v : Values) {\n"
6558 " }\n"
6559 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006560 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
6561 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00006562 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00006563
Daniel Jaspera98da3d2013-11-07 19:56:07 +00006564 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006565 verifyFormat("#define MACRO \\\n"
6566 " int *i = a * b; \\\n"
6567 " void f(a *b);",
6568 getLLVMStyleWithColumns(19));
6569
Daniel Jasper97b89482013-03-13 07:49:51 +00006570 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006571 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006572 verifyIndependentOfContext("T **t = new T *;");
6573 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00006574 verifyGoogleFormat("A = new SomeType*[Length]();");
6575 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006576 verifyGoogleFormat("T** t = new T*;");
6577 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006578
Daniel Jasper990ff972013-05-07 14:17:18 +00006579 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006580 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00006581 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00006582 verifyFormat("STATIC_ASSERT((a & b) == 0);");
6583 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006584 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006585 "typename t::if<x && y>::type f() {}");
6586 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006587 verifyFormat("vector<int *> v;");
6588 verifyFormat("vector<int *const> v;");
6589 verifyFormat("vector<int *const **const *> v;");
6590 verifyFormat("vector<int *volatile> v;");
6591 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006592 verifyFormat("foo<b && false>();");
6593 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00006594 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00006595 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006596 "template <class T, class = typename std::enable_if<\n"
6597 " std::is_integral<T>::value &&\n"
6598 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
6599 "void F();",
6600 getLLVMStyleWithColumns(70));
6601 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00006602 "template <class T,\n"
6603 " class = typename std::enable_if<\n"
6604 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006605 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
6606 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006607 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00006608 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006609 verifyFormat(
6610 "template <class T,\n"
6611 " class = typename ::std::enable_if<\n"
6612 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6613 "void F();",
6614 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006615
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006616 verifyIndependentOfContext("MACRO(int *i);");
6617 verifyIndependentOfContext("MACRO(auto *a);");
6618 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006619 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006620 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006621 // FIXME: Is there a way to make this work?
6622 // verifyIndependentOfContext("MACRO(A *a);");
6623
Daniel Jasper32ccb032014-06-23 07:36:18 +00006624 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006625 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006626
Daniel Jasper866468a2014-04-14 13:15:29 +00006627 EXPECT_EQ("#define OP(x) \\\n"
6628 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6629 " return s << a.DebugString(); \\\n"
6630 " }",
6631 format("#define OP(x) \\\n"
6632 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6633 " return s << a.DebugString(); \\\n"
6634 " }",
6635 getLLVMStyleWithColumns(50)));
6636
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006637 // FIXME: We cannot handle this case yet; we might be able to figure out that
6638 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006639 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006640
6641 FormatStyle PointerMiddle = getLLVMStyle();
6642 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6643 verifyFormat("delete *x;", PointerMiddle);
6644 verifyFormat("int * x;", PointerMiddle);
6645 verifyFormat("template <int * y> f() {}", PointerMiddle);
6646 verifyFormat("int * f(int * a) {}", PointerMiddle);
6647 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6648 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6649 verifyFormat("A<int *> a;", PointerMiddle);
6650 verifyFormat("A<int **> a;", PointerMiddle);
6651 verifyFormat("A<int *, int *> a;", PointerMiddle);
6652 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006653 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6654 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006655 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006656
6657 // Member function reference qualifiers aren't binary operators.
6658 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006659 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006660 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006661 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006662 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006663 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006664}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006665
Daniel Jasperee6d6502013-07-17 20:25:02 +00006666TEST_F(FormatTest, UnderstandsAttributes) {
6667 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006668 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6669 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006670 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006671 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006672 verifyFormat("__attribute__((nodebug)) void\n"
6673 "foo() {}\n",
6674 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006675}
6676
Daniel Jasper10cd5812013-05-06 06:35:44 +00006677TEST_F(FormatTest, UnderstandsEllipsis) {
6678 verifyFormat("int printf(const char *fmt, ...);");
6679 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006680 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6681
6682 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006683 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006684 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006685}
6686
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006687TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006688 EXPECT_EQ("int *a;\n"
6689 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006690 "int *a;",
6691 format("int *a;\n"
6692 "int* a;\n"
6693 "int *a;",
6694 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006695 EXPECT_EQ("int* a;\n"
6696 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006697 "int* a;",
6698 format("int* a;\n"
6699 "int* a;\n"
6700 "int *a;",
6701 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006702 EXPECT_EQ("int *a;\n"
6703 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006704 "int *a;",
6705 format("int *a;\n"
6706 "int * a;\n"
6707 "int * a;",
6708 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006709 EXPECT_EQ("auto x = [] {\n"
6710 " int *a;\n"
6711 " int *a;\n"
6712 " int *a;\n"
6713 "};",
6714 format("auto x=[]{int *a;\n"
6715 "int * a;\n"
6716 "int * a;};",
6717 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006718}
6719
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006720TEST_F(FormatTest, UnderstandsRvalueReferences) {
6721 verifyFormat("int f(int &&a) {}");
6722 verifyFormat("int f(int a, char &&b) {}");
6723 verifyFormat("void f() { int &&a = b; }");
6724 verifyGoogleFormat("int f(int a, char&& b) {}");
6725 verifyGoogleFormat("void f() { int&& a = b; }");
6726
Daniel Jasper1eff9082013-05-27 16:36:33 +00006727 verifyIndependentOfContext("A<int &&> a;");
6728 verifyIndependentOfContext("A<int &&, int &&> a;");
6729 verifyGoogleFormat("A<int&&> a;");
6730 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006731
6732 // Not rvalue references:
6733 verifyFormat("template <bool B, bool C> class A {\n"
6734 " static_assert(B && C, \"Something is wrong\");\n"
6735 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006736 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6737 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006738 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006739}
6740
Manuel Klimekc1237a82013-01-23 14:08:21 +00006741TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6742 verifyFormat("void f() {\n"
6743 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006744 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006745 "}",
6746 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006747}
6748
Daniel Jasperef906a92013-01-13 08:01:36 +00006749TEST_F(FormatTest, FormatsCasts) {
6750 verifyFormat("Type *A = static_cast<Type *>(P);");
6751 verifyFormat("Type *A = (Type *)P;");
6752 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6753 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006754 verifyFormat("int a = (int)2.0f;");
6755 verifyFormat("x[(int32)y];");
6756 verifyFormat("x = (int32)y;");
6757 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6758 verifyFormat("int a = (int)*b;");
6759 verifyFormat("int a = (int)2.0f;");
6760 verifyFormat("int a = (int)~0;");
6761 verifyFormat("int a = (int)++a;");
6762 verifyFormat("int a = (int)sizeof(int);");
6763 verifyFormat("int a = (int)+2;");
6764 verifyFormat("my_int a = (my_int)2.0f;");
6765 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006766 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006767 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006768 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006769 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006770 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006771
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006772 verifyFormat("void f() { my_int a = (my_int)*b; }");
6773 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6774 verifyFormat("my_int a = (my_int)~0;");
6775 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006776 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006777 verifyFormat("my_int a = (my_int)1;");
6778 verifyFormat("my_int a = (my_int *)1;");
6779 verifyFormat("my_int a = (const my_int)-1;");
6780 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006781 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006782 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006783 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006784 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006785
6786 // FIXME: single value wrapped with paren will be treated as cast.
6787 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006788
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006789 verifyFormat("{ (void)F; }");
6790
Daniel Jasper998cabc2013-07-18 14:46:07 +00006791 // Don't break after a cast's
6792 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6793 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6794 " bbbbbbbbbbbbbbbbbbbbbb);");
6795
Daniel Jasperef906a92013-01-13 08:01:36 +00006796 // These are not casts.
6797 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006798 verifyFormat("f(foo)->b;");
6799 verifyFormat("f(foo).b;");
6800 verifyFormat("f(foo)(b);");
6801 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006802 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006803 verifyFormat("(*funptr)(foo)[4];");
6804 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006805 verifyFormat("void f(int *);");
6806 verifyFormat("void f(int *) = 0;");
6807 verifyFormat("void f(SmallVector<int>) {}");
6808 verifyFormat("void f(SmallVector<int>);");
6809 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006810 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006811 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006812 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006813 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6814 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006815 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006816
Daniel Jasperba0bda92013-02-23 08:07:18 +00006817 // These are not casts, but at some point were confused with casts.
6818 verifyFormat("virtual void foo(int *) override;");
6819 verifyFormat("virtual void foo(char &) const;");
6820 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006821 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006822 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006823 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006824 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006825
6826 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6827 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006828 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006829 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006830 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6831 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6832 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006833}
6834
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006835TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006836 verifyFormat("A<bool()> a;");
6837 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006838 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006839 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006840 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006841 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006842 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006843 verifyFormat("template <class CallbackClass>\n"
6844 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006845
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006846 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6847 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006848 verifyGoogleFormat(
6849 "template <class CallbackClass>\n"
6850 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006851
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006852 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006853 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006854 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006855 verifyFormat("some_var = function(*some_pointer_var)[0];");
6856 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006857 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006858 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006859}
6860
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006861TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6862 verifyFormat("A (*foo_)[6];");
6863 verifyFormat("vector<int> (*foo_)[6];");
6864}
6865
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006866TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6867 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6868 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6869 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6870 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006871 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6872 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006873
6874 // Different ways of ()-initializiation.
6875 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6876 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6877 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6878 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6879 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6880 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006881 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6882 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006883}
6884
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006885TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006886 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006887 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006888 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006889 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006890 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006891 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006892 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6893 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006894 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6895 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006896 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6897 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006898 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6899 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006900 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6901 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006902 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6903 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6904 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6905 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006906 FormatStyle Indented = getLLVMStyle();
6907 Indented.IndentWrappedFunctionNames = true;
6908 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6909 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6910 Indented);
6911 verifyFormat(
6912 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6913 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6914 Indented);
6915 verifyFormat(
6916 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6917 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6918 Indented);
6919 verifyFormat(
6920 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6921 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6922 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006923
6924 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006925 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6926 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6927 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006928
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006929 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006930 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006931 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006932 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6933 " SourceLocation L, IdentifierIn *II,\n"
6934 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006935 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006936 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006937 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006938 " const SomeType<string, SomeOtherTemplateParameter>\n"
6939 " &ReallyReallyLongParameterName,\n"
6940 " const SomeType<string, SomeOtherTemplateParameter>\n"
6941 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006942 verifyFormat("template <typename A>\n"
6943 "SomeLoooooooooooooooooooooongType<\n"
6944 " typename some_namespace::SomeOtherType<A>::Type>\n"
6945 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006946
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006947 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006948 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6949 " aaaaaaaaaaaaaaaaaaaaaaa;");
6950 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006951 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6952 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006953 verifyGoogleFormat(
6954 "some_namespace::LongReturnType\n"
6955 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006956 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006957
6958 verifyGoogleFormat("template <typename T>\n"
6959 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006960 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006961 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6962 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006963
6964 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006965 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6966 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006967 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6968 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6969 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6970 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6971 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6972 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6973 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006974}
6975
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006976TEST_F(FormatTest, FormatsArrays) {
6977 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6978 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006979 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6980 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006981 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6982 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006983 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6984 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6985 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6986 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6987 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6988 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6989 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6990 verifyFormat(
6991 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6992 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6993 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006994 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6995 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006996
6997 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6998 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006999 verifyFormat(
7000 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
7001 " .aaaaaaa[0]\n"
7002 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00007003 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00007004
7005 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00007006
7007 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
7008 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00007009}
7010
Daniel Jaspere9de2602012-12-06 09:56:08 +00007011TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
7012 verifyFormat("(a)->b();");
7013 verifyFormat("--a;");
7014}
7015
Daniel Jasper8b529712012-12-04 13:02:32 +00007016TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00007017 verifyFormat("#include <string>\n"
7018 "#include <a/b/c.h>\n"
7019 "#include \"a/b/string\"\n"
7020 "#include \"string.h\"\n"
7021 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007022 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00007023 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00007024 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00007025 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00007026 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00007027 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
7028 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00007029 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
7030 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00007031
Daniel Jasper5ef433f2013-01-13 08:12:18 +00007032 verifyFormat("#import <string>");
7033 verifyFormat("#import <a/b/c.h>");
7034 verifyFormat("#import \"a/b/string\"");
7035 verifyFormat("#import \"string.h\"");
7036 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00007037 verifyFormat("#if __has_include(<strstream>)\n"
7038 "#include <strstream>\n"
7039 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00007040
Daniel Jasper343643b2014-08-13 08:29:18 +00007041 verifyFormat("#define MY_IMPORT <a/b>");
7042
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00007043 // Protocol buffer definition or missing "#".
7044 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
7045 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00007046
7047 FormatStyle Style = getLLVMStyle();
7048 Style.AlwaysBreakBeforeMultilineStrings = true;
7049 Style.ColumnLimit = 0;
7050 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00007051
7052 // But 'import' might also be a regular C++ namespace.
7053 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7054 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00007055}
7056
Alexander Kornienko578fdd82012-12-06 18:03:27 +00007057//===----------------------------------------------------------------------===//
7058// Error recovery tests.
7059//===----------------------------------------------------------------------===//
7060
Daniel Jasper66e9dee2013-02-14 09:19:04 +00007061TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007062 FormatStyle NoBinPacking = getLLVMStyle();
7063 NoBinPacking.BinPackParameters = false;
7064 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
7065 " double *min_x,\n"
7066 " double *max_x,\n"
7067 " double *min_y,\n"
7068 " double *max_y,\n"
7069 " double *min_z,\n"
7070 " double *max_z, ) {}",
7071 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00007072}
7073
Daniel Jasper83a54d22013-01-10 09:26:47 +00007074TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00007075 verifyFormat("void f() { return; }\n42");
7076 verifyFormat("void f() {\n"
7077 " if (0)\n"
7078 " return;\n"
7079 "}\n"
7080 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00007081 verifyFormat("void f() { return }\n42");
7082 verifyFormat("void f() {\n"
7083 " if (0)\n"
7084 " return\n"
7085 "}\n"
7086 "42");
7087}
7088
7089TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
7090 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
7091 EXPECT_EQ("void f() {\n"
7092 " if (a)\n"
7093 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007094 "}",
7095 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00007096 EXPECT_EQ("namespace N {\n"
7097 "void f()\n"
7098 "}",
7099 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00007100 EXPECT_EQ("namespace N {\n"
7101 "void f() {}\n"
7102 "void g()\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007103 "}",
7104 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00007105}
7106
Daniel Jasper2df93312013-01-09 10:16:05 +00007107TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
7108 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00007109 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007110 " b;",
7111 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00007112 verifyFormat("function(\n"
7113 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007114 " LoooooooooooongArgument);\n",
7115 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00007116}
7117
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007118TEST_F(FormatTest, IncorrectAccessSpecifier) {
7119 verifyFormat("public:");
7120 verifyFormat("class A {\n"
7121 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007122 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007123 "};");
7124 verifyFormat("public\n"
7125 "int qwerty;");
7126 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007127 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007128 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007129 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007130 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007131 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007132}
Daniel Jasperf7935112012-12-03 18:12:45 +00007133
Daniel Jasper291f9362013-03-20 15:58:10 +00007134TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
7135 verifyFormat("{");
7136 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00007137 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00007138}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007139
7140TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007141 verifyFormat("do {\n}");
7142 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007143 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007144 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007145 "wheeee(fun);");
7146 verifyFormat("do {\n"
7147 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00007148 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007149}
7150
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007151TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00007152 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007153 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007154 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007155 verifyFormat("while {\n foo;\n foo();\n}");
7156 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00007157}
7158
Daniel Jasperc0880a92013-01-04 18:52:56 +00007159TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007160 verifyIncompleteFormat("namespace {\n"
7161 "class Foo { Foo (\n"
7162 "};\n"
7163 "} // comment");
Daniel Jasperc0880a92013-01-04 18:52:56 +00007164}
7165
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007166TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007167 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007168 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
7169 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007170 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007171
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007172 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007173 " {\n"
7174 " breakme(\n"
7175 " qwe);\n"
7176 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007177 format("{\n"
7178 " {\n"
7179 " breakme(qwe);\n"
7180 "}\n",
7181 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007182}
7183
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00007184TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007185 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007186 " avariable,\n"
7187 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007188 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00007189}
7190
Manuel Klimek762dd182013-01-21 10:07:49 +00007191TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007192 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00007193}
7194
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007195TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007196 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00007197 verifyFormat("vector<int> x{\n"
7198 " 1, 2, 3, 4,\n"
7199 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007200 verifyFormat("vector<T> x{{}, {}, {}, {}};");
7201 verifyFormat("f({1, 2});");
7202 verifyFormat("auto v = Foo{-1};");
7203 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
7204 verifyFormat("Class::Class : member{1, 2, 3} {}");
7205 verifyFormat("new vector<int>{1, 2, 3};");
7206 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00007207 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007208 verifyFormat("return {arg1, arg2};");
7209 verifyFormat("return {arg1, SomeType{parameter}};");
7210 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
7211 verifyFormat("new T{arg1, arg2};");
7212 verifyFormat("f(MyMap[{composite, key}]);");
7213 verifyFormat("class Class {\n"
7214 " T member = {arg1, arg2};\n"
7215 "};");
7216 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00007217 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
7218 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00007219
Daniel Jasper438059e2014-05-22 12:11:13 +00007220 verifyFormat("int foo(int i) { return fo1{}(i); }");
7221 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007222 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00007223 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00007224 verifyFormat("Node n{1, Node{1000}, //\n"
7225 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00007226 verifyFormat("Aaaa aaaaaaa{\n"
7227 " {\n"
7228 " aaaa,\n"
7229 " },\n"
7230 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00007231 verifyFormat("class C : public D {\n"
7232 " SomeClass SC{2};\n"
7233 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00007234 verifyFormat("class C : public A {\n"
7235 " class D : public B {\n"
7236 " void f() { int i{2}; }\n"
7237 " };\n"
7238 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00007239 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00007240
Daniel Jaspere4ada022016-12-13 10:05:03 +00007241 // Cases where distinguising braced lists and blocks is hard.
7242 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
7243 verifyFormat("void f() {\n"
7244 " return; // comment\n"
7245 "}\n"
7246 "SomeType t;");
7247 verifyFormat("void f() {\n"
7248 " if (a) {\n"
7249 " f();\n"
7250 " }\n"
7251 "}\n"
7252 "SomeType t;");
7253
Daniel Jasper08434342015-05-26 07:26:26 +00007254 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007255 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00007256 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007257 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
7258 " bbbbb,\n"
7259 " ccccc,\n"
7260 " ddddd,\n"
7261 " eeeee,\n"
7262 " ffffff,\n"
7263 " ggggg,\n"
7264 " hhhhhh,\n"
7265 " iiiiii,\n"
7266 " jjjjjj,\n"
7267 " kkkkkk};",
7268 NoBinPacking);
7269 verifyFormat("const Aaaaaa aaaaa = {\n"
7270 " aaaaa,\n"
7271 " bbbbb,\n"
7272 " ccccc,\n"
7273 " ddddd,\n"
7274 " eeeee,\n"
7275 " ffffff,\n"
7276 " ggggg,\n"
7277 " hhhhhh,\n"
7278 " iiiiii,\n"
7279 " jjjjjj,\n"
7280 " kkkkkk,\n"
7281 "};",
7282 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00007283 verifyFormat(
7284 "const Aaaaaa aaaaa = {\n"
7285 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
7286 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
7287 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
7288 "};",
7289 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007290
Chandler Carruthf8b72662014-03-02 12:37:31 +00007291 // FIXME: The alignment of these trailing comments might be bad. Then again,
7292 // this might be utterly useless in real code.
7293 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00007294 " : some_value{ //\n"
7295 " aaaaaaa, //\n"
7296 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00007297
Chandler Carruthf8b72662014-03-02 12:37:31 +00007298 // In braced lists, the first comment is always assumed to belong to the
7299 // first element. Thus, it can be moved to the next or previous line as
7300 // appropriate.
7301 EXPECT_EQ("function({// First element:\n"
7302 " 1,\n"
7303 " // Second element:\n"
7304 " 2});",
7305 format("function({\n"
7306 " // First element:\n"
7307 " 1,\n"
7308 " // Second element:\n"
7309 " 2});"));
7310 EXPECT_EQ("std::vector<int> MyNumbers{\n"
7311 " // First element:\n"
7312 " 1,\n"
7313 " // Second element:\n"
7314 " 2};",
7315 format("std::vector<int> MyNumbers{// First element:\n"
7316 " 1,\n"
7317 " // Second element:\n"
7318 " 2};",
7319 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00007320 // A trailing comma should still lead to an enforced line break.
7321 EXPECT_EQ("vector<int> SomeVector = {\n"
7322 " // aaa\n"
7323 " 1, 2,\n"
7324 "};",
7325 format("vector<int> SomeVector = { // aaa\n"
7326 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00007327
Chandler Carruthf8b72662014-03-02 12:37:31 +00007328 FormatStyle ExtraSpaces = getLLVMStyle();
7329 ExtraSpaces.Cpp11BracedListStyle = false;
7330 ExtraSpaces.ColumnLimit = 75;
7331 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
7332 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
7333 verifyFormat("f({ 1, 2 });", ExtraSpaces);
7334 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
7335 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
7336 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
7337 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
7338 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
7339 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
7340 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
7341 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
7342 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
7343 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
7344 verifyFormat("class Class {\n"
7345 " T member = { arg1, arg2 };\n"
7346 "};",
7347 ExtraSpaces);
7348 verifyFormat(
7349 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7350 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
7351 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
7352 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
7353 ExtraSpaces);
7354 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00007355 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007356 ExtraSpaces);
7357 verifyFormat(
7358 "someFunction(OtherParam,\n"
7359 " BracedList{ // comment 1 (Forcing interesting break)\n"
7360 " param1, param2,\n"
7361 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00007362 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007363 ExtraSpaces);
7364 verifyFormat(
7365 "std::this_thread::sleep_for(\n"
7366 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
7367 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00007368 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00007369 " aaaaaaa,\n"
7370 " aaaaaaaaaa,\n"
7371 " aaaaa,\n"
7372 " aaaaaaaaaaaaaaa,\n"
7373 " aaa,\n"
7374 " aaaaaaaaaa,\n"
7375 " a,\n"
7376 " aaaaaaaaaaaaaaaaaaaaa,\n"
7377 " aaaaaaaaaaaa,\n"
7378 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
7379 " aaaaaaa,\n"
7380 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007381 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00007382}
7383
Daniel Jasper33b909c2013-10-25 14:29:37 +00007384TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007385 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7386 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7387 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7388 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7389 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7390 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007391 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007392 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00007393 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007394 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7395 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007396 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007397 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7398 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7399 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
7400 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7401 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7402 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7403 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007404 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007405 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7406 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007407 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7408 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7409 " // Separating comment.\n"
7410 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
7411 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7412 " // Leading comment\n"
7413 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7414 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007415 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7416 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007417 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00007418 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7419 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007420 getLLVMStyleWithColumns(38));
7421 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007422 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
7423 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007424 verifyFormat(
7425 "static unsigned SomeValues[10][3] = {\n"
7426 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
7427 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
7428 verifyFormat("static auto fields = new vector<string>{\n"
7429 " \"aaaaaaaaaaaaa\",\n"
7430 " \"aaaaaaaaaaaaa\",\n"
7431 " \"aaaaaaaaaaaa\",\n"
7432 " \"aaaaaaaaaaaaaa\",\n"
7433 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7434 " \"aaaaaaaaaaaa\",\n"
7435 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7436 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00007437 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
7438 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
7439 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
7440 " 3, cccccccccccccccccccccc};",
7441 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00007442
7443 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00007444 verifyFormat("vector<int> x = {\n"
7445 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
7446 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00007447 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00007448 verifyFormat("vector<int> x = {\n"
7449 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00007450 "};",
7451 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00007452 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7453 " 1, 1, 1, 1,\n"
7454 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00007455 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007456
Daniel Jasper60c27072015-05-13 08:16:00 +00007457 // Trailing comment in the first line.
7458 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
7459 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
7460 " 111111111, 222222222, 3333333333, 444444444, //\n"
7461 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00007462 // Trailing comment in the last line.
7463 verifyFormat("int aaaaa[] = {\n"
7464 " 1, 2, 3, // comment\n"
7465 " 4, 5, 6 // comment\n"
7466 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00007467
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007468 // With nested lists, we should either format one item per line or all nested
7469 // lists one on line.
7470 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007471 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
7472 " {aaaaaaaaaaaaaaaaaaa},\n"
7473 " {aaaaaaaaaaaaaaaaaaaaa},\n"
7474 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00007475 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00007476 verifyFormat(
7477 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007478 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
7479 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
7480 " {aaa, aaa},\n"
7481 " {aaa, aaa},\n"
7482 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
7483 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7484 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00007485
7486 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007487 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
7488 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00007489
7490 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00007491
Daniel Jaspereb65e912015-12-21 18:31:15 +00007492 // No braced initializer here.
7493 verifyFormat("void f() {\n"
7494 " struct Dummy {};\n"
7495 " f(v);\n"
7496 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00007497
7498 // Long lists should be formatted in columns even if they are nested.
7499 verifyFormat(
7500 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7501 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7502 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7503 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7504 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7505 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00007506
7507 // Allow "single-column" layout even if that violates the column limit. There
7508 // isn't going to be a better way.
7509 verifyFormat("std::vector<int> a = {\n"
7510 " aaaaaaaa,\n"
7511 " aaaaaaaa,\n"
7512 " aaaaaaaa,\n"
7513 " aaaaaaaa,\n"
7514 " aaaaaaaaaa,\n"
7515 " aaaaaaaa,\n"
7516 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
7517 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00007518 verifyFormat("vector<int> aaaa = {\n"
7519 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7520 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7521 " aaaaaa.aaaaaaa,\n"
7522 " aaaaaa.aaaaaaa,\n"
7523 " aaaaaa.aaaaaaa,\n"
7524 " aaaaaa.aaaaaaa,\n"
7525 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007526
7527 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00007528 verifyFormat("someFunction(Param, {List1, List2,\n"
7529 " List3});",
7530 getLLVMStyleWithColumns(35));
7531 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007532 " {List1, List2,\n"
7533 " List3});",
7534 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00007535 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
7536 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007537}
7538
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007539TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007540 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00007541 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007542
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007543 verifyFormat("void f() { return 42; }");
7544 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007545 " return 42;\n"
7546 "}",
7547 DoNotMerge);
7548 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007549 " // Comment\n"
7550 "}");
7551 verifyFormat("{\n"
7552 "#error {\n"
7553 " int a;\n"
7554 "}");
7555 verifyFormat("{\n"
7556 " int a;\n"
7557 "#error {\n"
7558 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00007559 verifyFormat("void f() {} // comment");
7560 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00007561 verifyFormat("void f() {\n"
7562 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007563 DoNotMerge);
7564 verifyFormat("void f() {\n"
7565 " int a;\n"
7566 "} // comment",
7567 DoNotMerge);
7568 verifyFormat("void f() {\n"
7569 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00007570 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007571
7572 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7573 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7574
7575 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7576 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007577 verifyFormat("class C {\n"
7578 " C()\n"
7579 " : iiiiiiii(nullptr),\n"
7580 " kkkkkkk(nullptr),\n"
7581 " mmmmmmm(nullptr),\n"
7582 " nnnnnnn(nullptr) {}\n"
7583 "};",
7584 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007585
7586 FormatStyle NoColumnLimit = getLLVMStyle();
7587 NoColumnLimit.ColumnLimit = 0;
7588 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7589 EXPECT_EQ("class C {\n"
7590 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007591 "};",
7592 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007593 EXPECT_EQ("A()\n"
7594 " : b(0) {\n"
7595 "}",
7596 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7597
7598 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007599 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7600 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007601 EXPECT_EQ("A()\n"
7602 " : b(0) {\n"
7603 "}",
7604 format("A():b(0){}", DoNotMergeNoColumnLimit));
7605 EXPECT_EQ("A()\n"
7606 " : b(0) {\n"
7607 "}",
7608 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007609
7610 verifyFormat("#define A \\\n"
7611 " void f() { \\\n"
7612 " int i; \\\n"
7613 " }",
7614 getLLVMStyleWithColumns(20));
7615 verifyFormat("#define A \\\n"
7616 " void f() { int i; }",
7617 getLLVMStyleWithColumns(21));
7618 verifyFormat("#define A \\\n"
7619 " void f() { \\\n"
7620 " int i; \\\n"
7621 " } \\\n"
7622 " int j;",
7623 getLLVMStyleWithColumns(22));
7624 verifyFormat("#define A \\\n"
7625 " void f() { int i; } \\\n"
7626 " int j;",
7627 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007628}
7629
Daniel Jasperd74cf402014-04-08 12:46:38 +00007630TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7631 FormatStyle MergeInlineOnly = getLLVMStyle();
7632 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7633 verifyFormat("class C {\n"
7634 " int f() { return 42; }\n"
7635 "};",
7636 MergeInlineOnly);
7637 verifyFormat("int f() {\n"
7638 " return 42;\n"
7639 "}",
7640 MergeInlineOnly);
7641}
7642
Manuel Klimeke01bab52013-01-15 13:38:33 +00007643TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7644 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007645 verifyFormat("struct foo a = {bar};\nint n;");
7646 verifyFormat("class foo a = {bar};\nint n;");
7647 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007648
7649 // Elaborate types inside function definitions.
7650 verifyFormat("struct foo f() {}\nint n;");
7651 verifyFormat("class foo f() {}\nint n;");
7652 verifyFormat("union foo f() {}\nint n;");
7653
7654 // Templates.
7655 verifyFormat("template <class X> void f() {}\nint n;");
7656 verifyFormat("template <struct X> void f() {}\nint n;");
7657 verifyFormat("template <union X> void f() {}\nint n;");
7658
7659 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007660 verifyFormat("struct {\n} n;");
7661 verifyFormat(
7662 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007663 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007664 verifyFormat("class MACRO Z {\n} n;");
7665 verifyFormat("class MACRO(X) Z {\n} n;");
7666 verifyFormat("class __attribute__(X) Z {\n} n;");
7667 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007668 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007669 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007670 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7671 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007672
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007673 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007674 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007675
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007676 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007677 verifyFormat(
7678 "template <typename F>\n"
7679 "Matcher(const Matcher<F> &Other,\n"
7680 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7681 " !is_same<F, T>::value>::type * = 0)\n"
7682 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7683
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007684 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007685 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007686 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007687
7688 // FIXME:
7689 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007690 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007691
Manuel Klimeke01bab52013-01-15 13:38:33 +00007692 // Elaborate types where incorrectly parsing the structural element would
7693 // break the indent.
7694 verifyFormat("if (true)\n"
7695 " class X x;\n"
7696 "else\n"
7697 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007698
7699 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007700 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007701}
7702
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007703TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007704 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7705 format("#error Leave all white!!!!! space* alone!\n"));
7706 EXPECT_EQ(
7707 "#warning Leave all white!!!!! space* alone!\n",
7708 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007709 EXPECT_EQ("#error 1", format(" # error 1"));
7710 EXPECT_EQ("#warning 1", format(" # warning 1"));
7711}
7712
Daniel Jasper4431aa92013-04-23 13:54:04 +00007713TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007714 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007715 verifyFormat("#if (AAAA && BBBB)");
7716 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007717 // FIXME: Come up with a better indentation for #elif.
7718 verifyFormat(
7719 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7720 " defined(BBBBBBBB)\n"
7721 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7722 " defined(BBBBBBBB)\n"
7723 "#endif",
7724 getLLVMStyleWithColumns(65));
7725}
7726
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007727TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7728 FormatStyle AllowsMergedIf = getGoogleStyle();
7729 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7730 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7731 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007732 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7733 EXPECT_EQ("if (true) return 42;",
7734 format("if (true)\nreturn 42;", AllowsMergedIf));
7735 FormatStyle ShortMergedIf = AllowsMergedIf;
7736 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007737 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007738 " if (true) return 42;",
7739 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007740 verifyFormat("#define A \\\n"
7741 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007742 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007743 "#define B",
7744 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007745 verifyFormat("#define A \\\n"
7746 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007747 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007748 "g();",
7749 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007750 verifyFormat("{\n"
7751 "#ifdef A\n"
7752 " // Comment\n"
7753 " if (true) continue;\n"
7754 "#endif\n"
7755 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007756 " if (true) continue;\n"
7757 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007758 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007759 ShortMergedIf.ColumnLimit = 29;
7760 verifyFormat("#define A \\\n"
7761 " if (aaaaaaaaaa) return 1; \\\n"
7762 " return 2;",
7763 ShortMergedIf);
7764 ShortMergedIf.ColumnLimit = 28;
7765 verifyFormat("#define A \\\n"
7766 " if (aaaaaaaaaa) \\\n"
7767 " return 1; \\\n"
7768 " return 2;",
7769 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007770}
7771
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007772TEST_F(FormatTest, BlockCommentsInControlLoops) {
7773 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7774 " f();\n"
7775 "}");
7776 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7777 " f();\n"
7778 "} /* another comment */ else /* comment #3 */ {\n"
7779 " g();\n"
7780 "}");
7781 verifyFormat("while (0) /* a comment in a strange place */ {\n"
7782 " f();\n"
7783 "}");
7784 verifyFormat("for (;;) /* a comment in a strange place */ {\n"
7785 " f();\n"
7786 "}");
7787 verifyFormat("do /* a comment in a strange place */ {\n"
7788 " f();\n"
7789 "} /* another comment */ while (0);");
7790}
7791
7792TEST_F(FormatTest, BlockComments) {
7793 EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
7794 format("/* *//* */ /* */\n/* *//* */ /* */"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007795 EXPECT_EQ("/* */ a /* */ b;", format(" /* */ a/* */ b;"));
Daniel Jaspera49393f2013-08-28 09:07:32 +00007796 EXPECT_EQ("#define A /*123*/ \\\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007797 " b\n"
7798 "/* */\n"
7799 "someCall(\n"
7800 " parameter);",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00007801 format("#define A /*123*/ b\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007802 "/* */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007803 "someCall(parameter);",
7804 getLLVMStyleWithColumns(15)));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007805
7806 EXPECT_EQ("#define A\n"
7807 "/* */ someCall(\n"
7808 " parameter);",
7809 format("#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007810 "/* */someCall(parameter);",
7811 getLLVMStyleWithColumns(15)));
Daniel Jasper51fb2b22013-05-30 06:40:07 +00007812 EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007813 EXPECT_EQ("/*\n"
7814 "*\n"
7815 " * aaaaaa\n"
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00007816 " * aaaaaa\n"
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007817 "*/",
7818 format("/*\n"
7819 "*\n"
7820 " * aaaaaa aaaaaa\n"
7821 "*/",
7822 getLLVMStyleWithColumns(10)));
Daniel Jasperce257f22013-05-30 17:27:48 +00007823 EXPECT_EQ("/*\n"
7824 "**\n"
7825 "* aaaaaa\n"
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007826 "*aaaaaa\n"
Daniel Jasperce257f22013-05-30 17:27:48 +00007827 "*/",
7828 format("/*\n"
7829 "**\n"
7830 "* aaaaaa aaaaaa\n"
7831 "*/",
7832 getLLVMStyleWithColumns(10)));
Daniel Jasperacadc8e2016-06-08 09:45:08 +00007833 EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7834 " /* line 1\n"
7835 " bbbbbbbbbbbb */\n"
7836 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7837 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7838 " /* line 1\n"
7839 " bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7840 getLLVMStyleWithColumns(50)));
Daniel Jasper1f140982013-02-04 07:32:14 +00007841
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007842 FormatStyle NoBinPacking = getLLVMStyle();
7843 NoBinPacking.BinPackParameters = false;
Daniel Jasper1f140982013-02-04 07:32:14 +00007844 EXPECT_EQ("someFunction(1, /* comment 1 */\n"
7845 " 2, /* comment 2 */\n"
7846 " 3, /* comment 3 */\n"
Daniel Jasper14e40ec2013-02-04 08:34:57 +00007847 " aaaa,\n"
7848 " bbbb);",
Daniel Jasper1f140982013-02-04 07:32:14 +00007849 format("someFunction (1, /* comment 1 */\n"
7850 " 2, /* comment 2 */ \n"
7851 " 3, /* comment 3 */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007852 "aaaa, bbbb );",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007853 NoBinPacking));
Daniel Jasper38396592013-02-06 15:23:09 +00007854 verifyFormat(
7855 "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7856 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7857 EXPECT_EQ(
7858 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7859 " aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7860 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
7861 format(
7862 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7863 " aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7864 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
Daniel Jasper94f0e132013-02-06 20:07:35 +00007865 EXPECT_EQ(
7866 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7867 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7868 "int cccccccccccccccccccccccccccccc; /* comment */\n",
7869 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7870 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7871 "int cccccccccccccccccccccccccccccc; /* comment */\n"));
Daniel Jasper022612d2013-07-01 09:34:09 +00007872
7873 verifyFormat("void f(int * /* unused */) {}");
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007874
7875 EXPECT_EQ("/*\n"
7876 " **\n"
7877 " */",
7878 format("/*\n"
7879 " **\n"
7880 " */"));
7881 EXPECT_EQ("/*\n"
7882 " *q\n"
7883 " */",
7884 format("/*\n"
7885 " *q\n"
7886 " */"));
7887 EXPECT_EQ("/*\n"
7888 " * q\n"
7889 " */",
7890 format("/*\n"
7891 " * q\n"
7892 " */"));
7893 EXPECT_EQ("/*\n"
7894 " **/",
7895 format("/*\n"
7896 " **/"));
7897 EXPECT_EQ("/*\n"
7898 " ***/",
7899 format("/*\n"
7900 " ***/"));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007901}
7902
Manuel Klimek82b836a2013-02-06 16:40:56 +00007903TEST_F(FormatTest, BlockCommentsInMacros) {
7904 EXPECT_EQ("#define A \\\n"
7905 " { \\\n"
7906 " /* one line */ \\\n"
7907 " someCall();",
7908 format("#define A { \\\n"
7909 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007910 " someCall();",
7911 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007912 EXPECT_EQ("#define A \\\n"
7913 " { \\\n"
7914 " /* previous */ \\\n"
7915 " /* one line */ \\\n"
7916 " someCall();",
7917 format("#define A { \\\n"
7918 " /* previous */ \\\n"
7919 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007920 " someCall();",
7921 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007922}
7923
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007924TEST_F(FormatTest, BlockCommentsAtEndOfLine) {
7925 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007926 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007927 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007928 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007929 "};",
7930 getLLVMStyleWithColumns(15)));
7931 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007932 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007933 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007934 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007935 "};",
7936 getLLVMStyleWithColumns(15)));
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007937 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007938 " 1111 /* a\n"
Krasimir Georgiev91834222017-01-25 13:58:58 +00007939 " */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007940 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007941 format("a = {1111 /* a */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007942 "};",
7943 getLLVMStyleWithColumns(15)));
7944}
7945
Manuel Klimek82b836a2013-02-06 16:40:56 +00007946TEST_F(FormatTest, IndentLineCommentsInStartOfBlockAtEndOfFile) {
Manuel Klimek82b836a2013-02-06 16:40:56 +00007947 verifyFormat("{\n"
Marianne Mailhot-Sarrasin03137c62016-04-14 14:56:49 +00007948 " // a\n"
7949 " // b");
Manuel Klimek82b836a2013-02-06 16:40:56 +00007950}
7951
Manuel Klimekd33516e2013-01-23 10:09:28 +00007952TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007953 verifyFormat("void f(int *a);");
7954 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007955 verifyFormat("class A {\n void f(int *a);\n};");
7956 verifyFormat("class A {\n int *a;\n};");
7957 verifyFormat("namespace a {\n"
7958 "namespace b {\n"
7959 "class A {\n"
7960 " void f() {}\n"
7961 " int *a;\n"
7962 "};\n"
7963 "}\n"
7964 "}");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007965}
7966
Manuel Klimekd33516e2013-01-23 10:09:28 +00007967TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7968 verifyFormat("while");
7969 verifyFormat("operator");
7970}
7971
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007972TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7973 // This code would be painfully slow to format if we didn't skip it.
7974 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
7975 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7976 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7977 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7978 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7979 "A(1, 1)\n"
7980 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7981 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7982 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7983 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7984 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7985 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7986 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7987 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7988 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7989 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7990 // Deeply nested part is untouched, rest is formatted.
7991 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7992 format(std::string("int i;\n") + Code + "int j;\n",
7993 getLLVMStyle(), IC_ExpectIncomplete));
7994}
7995
Nico Weber7e6a7a12013-01-08 17:56:31 +00007996//===----------------------------------------------------------------------===//
7997// Objective-C tests.
7998//===----------------------------------------------------------------------===//
7999
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00008000TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
8001 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
8002 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
8003 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00008004 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00008005 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
8006 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
8007 format("-(NSInteger)Method3:(id)anObject;"));
8008 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
8009 format("-(NSInteger)Method4:(id)anObject;"));
8010 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
8011 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
8012 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
8013 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00008014 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
8015 "forAllCells:(BOOL)flag;",
8016 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
8017 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00008018
8019 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00008020 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
8021 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00008022 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
8023 " inRange:(NSRange)range\n"
8024 " outRange:(NSRange)out_range\n"
8025 " outRange1:(NSRange)out_range1\n"
8026 " outRange2:(NSRange)out_range2\n"
8027 " outRange3:(NSRange)out_range3\n"
8028 " outRange4:(NSRange)out_range4\n"
8029 " outRange5:(NSRange)out_range5\n"
8030 " outRange6:(NSRange)out_range6\n"
8031 " outRange7:(NSRange)out_range7\n"
8032 " outRange8:(NSRange)out_range8\n"
8033 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00008034
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00008035 // When the function name has to be wrapped.
8036 FormatStyle Style = getLLVMStyle();
8037 Style.IndentWrappedFunctionNames = false;
8038 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
8039 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
8040 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
8041 "}",
8042 Style);
8043 Style.IndentWrappedFunctionNames = true;
8044 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
8045 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
8046 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
8047 "}",
8048 Style);
8049
Nico Weberd6f962f2013-01-10 20:18:33 +00008050 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00008051 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00008052 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
8053 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00008054 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00008055
Daniel Jasper37194282013-05-28 08:33:00 +00008056 verifyFormat("- (int (*)())foo:(int (*)())f;");
8057 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00008058
8059 // If there's no return type (very rare in practice!), LLVM and Google style
8060 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00008061 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00008062 verifyFormat("- foo:(int)f;");
8063 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00008064}
8065
Nico Weber0588b502013-02-07 00:19:29 +00008066
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008067TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00008068 EXPECT_EQ("\"some text \"\n"
8069 "\"other\";",
8070 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00008071 EXPECT_EQ("\"some text \"\n"
8072 "\"other\";",
8073 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008074 EXPECT_EQ(
8075 "#define A \\\n"
8076 " \"some \" \\\n"
8077 " \"text \" \\\n"
8078 " \"other\";",
8079 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
8080 EXPECT_EQ(
8081 "#define A \\\n"
8082 " \"so \" \\\n"
8083 " \"text \" \\\n"
8084 " \"other\";",
8085 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
8086
8087 EXPECT_EQ("\"some text\"",
8088 format("\"some text\"", getLLVMStyleWithColumns(1)));
8089 EXPECT_EQ("\"some text\"",
8090 format("\"some text\"", getLLVMStyleWithColumns(11)));
8091 EXPECT_EQ("\"some \"\n"
8092 "\"text\"",
8093 format("\"some text\"", getLLVMStyleWithColumns(10)));
8094 EXPECT_EQ("\"some \"\n"
8095 "\"text\"",
8096 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00008097 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008098 "\" tex\"\n"
8099 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008100 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00008101 EXPECT_EQ("\"some\"\n"
8102 "\" tex\"\n"
8103 "\" and\"",
8104 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
8105 EXPECT_EQ("\"some\"\n"
8106 "\"/tex\"\n"
8107 "\"/and\"",
8108 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008109
8110 EXPECT_EQ("variable =\n"
8111 " \"long string \"\n"
8112 " \"literal\";",
8113 format("variable = \"long string literal\";",
8114 getLLVMStyleWithColumns(20)));
8115
8116 EXPECT_EQ("variable = f(\n"
8117 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00008118 " \"literal\",\n"
8119 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00008120 " loooooooooooooooooooong);",
8121 format("variable = f(\"long string literal\", short, "
8122 "loooooooooooooooooooong);",
8123 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008124
Daniel Jaspera44991332015-04-29 13:06:49 +00008125 EXPECT_EQ(
8126 "f(g(\"long string \"\n"
8127 " \"literal\"),\n"
8128 " b);",
8129 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008130 EXPECT_EQ("f(g(\"long string \"\n"
8131 " \"literal\",\n"
8132 " a),\n"
8133 " b);",
8134 format("f(g(\"long string literal\", a), b);",
8135 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008136 EXPECT_EQ(
8137 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00008138 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008139 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
8140 EXPECT_EQ("f(\"one two three four five six \"\n"
8141 " \"seven\".split(\n"
8142 " really_looooong_variable));",
8143 format("f(\"one two three four five six seven\"."
8144 "split(really_looooong_variable));",
8145 getLLVMStyleWithColumns(33)));
8146
8147 EXPECT_EQ("f(\"some \"\n"
8148 " \"text\",\n"
8149 " other);",
8150 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00008151
8152 // Only break as a last resort.
8153 verifyFormat(
8154 "aaaaaaaaaaaaaaaaaaaa(\n"
8155 " aaaaaaaaaaaaaaaaaaaa,\n"
8156 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00008157
Daniel Jaspera44991332015-04-29 13:06:49 +00008158 EXPECT_EQ("\"splitmea\"\n"
8159 "\"trandomp\"\n"
8160 "\"oint\"",
8161 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00008162
Daniel Jaspera44991332015-04-29 13:06:49 +00008163 EXPECT_EQ("\"split/\"\n"
8164 "\"pathat/\"\n"
8165 "\"slashes\"",
8166 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008167
Daniel Jaspera44991332015-04-29 13:06:49 +00008168 EXPECT_EQ("\"split/\"\n"
8169 "\"pathat/\"\n"
8170 "\"slashes\"",
8171 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00008172 EXPECT_EQ("\"split at \"\n"
8173 "\"spaces/at/\"\n"
8174 "\"slashes.at.any$\"\n"
8175 "\"non-alphanumeric%\"\n"
8176 "\"1111111111characte\"\n"
8177 "\"rs\"",
8178 format("\"split at "
8179 "spaces/at/"
8180 "slashes.at."
8181 "any$non-"
8182 "alphanumeric%"
8183 "1111111111characte"
8184 "rs\"",
8185 getLLVMStyleWithColumns(20)));
8186
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008187 // Verify that splitting the strings understands
8188 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00008189 EXPECT_EQ(
8190 "aaaaaaaaaaaa(\n"
8191 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8192 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8193 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8194 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8195 "aaaaaaaaaaaaaaaaaaaaaa\");",
8196 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00008197 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8198 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8199 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8200 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8201 "aaaaaaaaaaaaaaaaaaaaaa\";",
8202 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00008203 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8204 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8205 format("llvm::outs() << "
8206 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8207 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00008208 EXPECT_EQ("ffff(\n"
8209 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8210 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8211 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8212 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8213 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008214
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008215 FormatStyle Style = getLLVMStyleWithColumns(12);
8216 Style.BreakStringLiterals = false;
8217 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8218
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008219 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
8220 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00008221 EXPECT_EQ("#define A \\\n"
8222 " \"some \" \\\n"
8223 " \"text \" \\\n"
8224 " \"other\";",
8225 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008226}
8227
Manuel Klimek9e321992015-07-28 15:50:24 +00008228TEST_F(FormatTest, FullyRemoveEmptyLines) {
8229 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8230 NoEmptyLines.MaxEmptyLinesToKeep = 0;
8231 EXPECT_EQ("int i = a(b());",
8232 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8233}
8234
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008235TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8236 EXPECT_EQ(
8237 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8238 "(\n"
8239 " \"x\t\");",
8240 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8241 "aaaaaaa("
8242 "\"x\t\");"));
8243}
8244
Daniel Jasper174b0122014-01-09 14:18:12 +00008245TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00008246 EXPECT_EQ(
8247 "u8\"utf8 string \"\n"
8248 "u8\"literal\";",
8249 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8250 EXPECT_EQ(
8251 "u\"utf16 string \"\n"
8252 "u\"literal\";",
8253 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8254 EXPECT_EQ(
8255 "U\"utf32 string \"\n"
8256 "U\"literal\";",
8257 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8258 EXPECT_EQ("L\"wide string \"\n"
8259 "L\"literal\";",
8260 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00008261 EXPECT_EQ("@\"NSString \"\n"
8262 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00008263 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00008264
8265 // This input makes clang-format try to split the incomplete unicode escape
8266 // sequence, which used to lead to a crasher.
8267 verifyNoCrash(
8268 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8269 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008270}
8271
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00008272TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8273 FormatStyle Style = getGoogleStyleWithColumns(15);
8274 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8275 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8276 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8277 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8278 EXPECT_EQ("u8R\"x(raw literal)x\";",
8279 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008280}
8281
8282TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8283 FormatStyle Style = getLLVMStyleWithColumns(20);
8284 EXPECT_EQ(
8285 "_T(\"aaaaaaaaaaaaaa\")\n"
8286 "_T(\"aaaaaaaaaaaaaa\")\n"
8287 "_T(\"aaaaaaaaaaaa\")",
8288 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
8289 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
8290 " _T(\"aaaaaa\"),\n"
8291 " z);",
8292 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8293
8294 // FIXME: Handle embedded spaces in one iteration.
8295 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8296 // "_T(\"aaaaaaaaaaaaa\")\n"
8297 // "_T(\"aaaaaaaaaaaaa\")\n"
8298 // "_T(\"a\")",
8299 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8300 // getLLVMStyleWithColumns(20)));
8301 EXPECT_EQ(
8302 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8303 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008304 EXPECT_EQ("f(\n"
8305 "#if !TEST\n"
8306 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8307 "#endif\n"
8308 " );",
8309 format("f(\n"
8310 "#if !TEST\n"
8311 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8312 "#endif\n"
8313 ");"));
8314 EXPECT_EQ("f(\n"
8315 "\n"
8316 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8317 format("f(\n"
8318 "\n"
8319 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008320}
8321
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008322TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008323 EXPECT_EQ(
8324 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8325 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8326 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8327 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8328 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8329 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8330}
8331
8332TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8333 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008334 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008335 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8336 "multiline raw string literal xxxxxxxxxxxxxx\n"
8337 ")x\",\n"
8338 " a),\n"
8339 " b);",
8340 format("fffffffffff(g(R\"x(\n"
8341 "multiline raw string literal xxxxxxxxxxxxxx\n"
8342 ")x\", a), b);",
8343 getGoogleStyleWithColumns(20)));
8344 EXPECT_EQ("fffffffffff(\n"
8345 " g(R\"x(qqq\n"
8346 "multiline raw string literal xxxxxxxxxxxxxx\n"
8347 ")x\",\n"
8348 " a),\n"
8349 " b);",
8350 format("fffffffffff(g(R\"x(qqq\n"
8351 "multiline raw string literal xxxxxxxxxxxxxx\n"
8352 ")x\", a), b);",
8353 getGoogleStyleWithColumns(20)));
8354
8355 EXPECT_EQ("fffffffffff(R\"x(\n"
8356 "multiline raw string literal xxxxxxxxxxxxxx\n"
8357 ")x\");",
8358 format("fffffffffff(R\"x(\n"
8359 "multiline raw string literal xxxxxxxxxxxxxx\n"
8360 ")x\");",
8361 getGoogleStyleWithColumns(20)));
8362 EXPECT_EQ("fffffffffff(R\"x(\n"
8363 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008364 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008365 format("fffffffffff(R\"x(\n"
8366 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008367 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008368 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008369 EXPECT_EQ("fffffffffff(\n"
8370 " R\"x(\n"
8371 "multiline raw string literal xxxxxxxxxxxxxx\n"
8372 ")x\" +\n"
8373 " bbbbbb);",
8374 format("fffffffffff(\n"
8375 " R\"x(\n"
8376 "multiline raw string literal xxxxxxxxxxxxxx\n"
8377 ")x\" + bbbbbb);",
8378 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008379}
8380
Alexander Kornienkobe633902013-06-14 11:46:10 +00008381TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008382 verifyFormat("string a = \"unterminated;");
8383 EXPECT_EQ("function(\"unterminated,\n"
8384 " OtherParameter);",
8385 format("function( \"unterminated,\n"
8386 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008387}
8388
8389TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008390 FormatStyle Style = getLLVMStyle();
8391 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008392 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008393 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008394}
8395
Daniel Jaspera44991332015-04-29 13:06:49 +00008396TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008397
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008398TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8399 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8400 " \"ddeeefff\");",
8401 format("someFunction(\"aaabbbcccdddeeefff\");",
8402 getLLVMStyleWithColumns(25)));
8403 EXPECT_EQ("someFunction1234567890(\n"
8404 " \"aaabbbcccdddeeefff\");",
8405 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8406 getLLVMStyleWithColumns(26)));
8407 EXPECT_EQ("someFunction1234567890(\n"
8408 " \"aaabbbcccdddeeeff\"\n"
8409 " \"f\");",
8410 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8411 getLLVMStyleWithColumns(25)));
8412 EXPECT_EQ("someFunction1234567890(\n"
8413 " \"aaabbbcccdddeeeff\"\n"
8414 " \"f\");",
8415 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8416 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008417 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8418 " \"ddde \"\n"
8419 " \"efff\");",
8420 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008421 getLLVMStyleWithColumns(25)));
8422 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8423 " \"ddeeefff\");",
8424 format("someFunction(\"aaabbbccc ddeeefff\");",
8425 getLLVMStyleWithColumns(25)));
8426 EXPECT_EQ("someFunction1234567890(\n"
8427 " \"aaabb \"\n"
8428 " \"cccdddeeefff\");",
8429 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8430 getLLVMStyleWithColumns(25)));
8431 EXPECT_EQ("#define A \\\n"
8432 " string s = \\\n"
8433 " \"123456789\" \\\n"
8434 " \"0\"; \\\n"
8435 " int i;",
8436 format("#define A string s = \"1234567890\"; int i;",
8437 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008438 // FIXME: Put additional penalties on breaking at non-whitespace locations.
8439 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8440 " \"dddeeeff\"\n"
8441 " \"f\");",
8442 format("someFunction(\"aaabbbcc dddeeefff\");",
8443 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008444}
8445
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008446TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008447 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8448 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008449 EXPECT_EQ("\"test\"\n"
8450 "\"\\n\"",
8451 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8452 EXPECT_EQ("\"tes\\\\\"\n"
8453 "\"n\"",
8454 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8455 EXPECT_EQ("\"\\\\\\\\\"\n"
8456 "\"\\n\"",
8457 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008458 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008459 EXPECT_EQ("\"\\uff01\"\n"
8460 "\"test\"",
8461 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8462 EXPECT_EQ("\"\\Uff01ff02\"",
8463 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8464 EXPECT_EQ("\"\\x000000000001\"\n"
8465 "\"next\"",
8466 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8467 EXPECT_EQ("\"\\x000000000001next\"",
8468 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8469 EXPECT_EQ("\"\\x000000000001\"",
8470 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8471 EXPECT_EQ("\"test\"\n"
8472 "\"\\000000\"\n"
8473 "\"000001\"",
8474 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8475 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008476 "\"00000000\"\n"
8477 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008478 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008479}
8480
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008481TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8482 verifyFormat("void f() {\n"
8483 " return g() {}\n"
8484 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008485 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008486 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008487 "}");
8488}
8489
Manuel Klimek421147e2014-01-24 09:25:23 +00008490TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8491 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008492 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008493}
8494
Manuel Klimek13b97d82013-05-13 08:42:42 +00008495TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8496 verifyFormat("class X {\n"
8497 " void f() {\n"
8498 " }\n"
8499 "};",
8500 getLLVMStyleWithColumns(12));
8501}
8502
8503TEST_F(FormatTest, ConfigurableIndentWidth) {
8504 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8505 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008506 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008507 verifyFormat("void f() {\n"
8508 " someFunction();\n"
8509 " if (true) {\n"
8510 " f();\n"
8511 " }\n"
8512 "}",
8513 EightIndent);
8514 verifyFormat("class X {\n"
8515 " void f() {\n"
8516 " }\n"
8517 "};",
8518 EightIndent);
8519 verifyFormat("int x[] = {\n"
8520 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008521 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008522 EightIndent);
8523}
8524
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008525TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008526 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008527 "f();",
8528 getLLVMStyleWithColumns(8));
8529}
8530
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008531TEST_F(FormatTest, ConfigurableUseOfTab) {
8532 FormatStyle Tab = getLLVMStyleWithColumns(42);
8533 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008534 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008535 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008536
8537 EXPECT_EQ("if (aaaaaaaa && // q\n"
8538 " bb)\t\t// w\n"
8539 "\t;",
8540 format("if (aaaaaaaa &&// q\n"
8541 "bb)// w\n"
8542 ";",
8543 Tab));
8544 EXPECT_EQ("if (aaa && bbb) // w\n"
8545 "\t;",
8546 format("if(aaa&&bbb)// w\n"
8547 ";",
8548 Tab));
8549
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008550 verifyFormat("class X {\n"
8551 "\tvoid f() {\n"
8552 "\t\tsomeFunction(parameter1,\n"
8553 "\t\t\t parameter2);\n"
8554 "\t}\n"
8555 "};",
8556 Tab);
8557 verifyFormat("#define A \\\n"
8558 "\tvoid f() { \\\n"
8559 "\t\tsomeFunction( \\\n"
8560 "\t\t parameter1, \\\n"
8561 "\t\t parameter2); \\\n"
8562 "\t}",
8563 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008564
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008565 Tab.TabWidth = 4;
8566 Tab.IndentWidth = 8;
8567 verifyFormat("class TabWidth4Indent8 {\n"
8568 "\t\tvoid f() {\n"
8569 "\t\t\t\tsomeFunction(parameter1,\n"
8570 "\t\t\t\t\t\t\t parameter2);\n"
8571 "\t\t}\n"
8572 "};",
8573 Tab);
8574
8575 Tab.TabWidth = 4;
8576 Tab.IndentWidth = 4;
8577 verifyFormat("class TabWidth4Indent4 {\n"
8578 "\tvoid f() {\n"
8579 "\t\tsomeFunction(parameter1,\n"
8580 "\t\t\t\t\t parameter2);\n"
8581 "\t}\n"
8582 "};",
8583 Tab);
8584
8585 Tab.TabWidth = 8;
8586 Tab.IndentWidth = 4;
8587 verifyFormat("class TabWidth8Indent4 {\n"
8588 " void f() {\n"
8589 "\tsomeFunction(parameter1,\n"
8590 "\t\t parameter2);\n"
8591 " }\n"
8592 "};",
8593 Tab);
8594
Alexander Kornienko39856b72013-09-10 09:38:25 +00008595 Tab.TabWidth = 8;
8596 Tab.IndentWidth = 8;
8597 EXPECT_EQ("/*\n"
8598 "\t a\t\tcomment\n"
8599 "\t in multiple lines\n"
8600 " */",
8601 format(" /*\t \t \n"
8602 " \t \t a\t\tcomment\t \t\n"
8603 " \t \t in multiple lines\t\n"
8604 " \t */",
8605 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008606
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008607 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008608 verifyFormat("{\n"
8609 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8610 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8611 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8612 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8613 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8614 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008615 "};",
8616 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008617 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008618 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008619 "\ta2,\n"
8620 "\ta3\n"
8621 "};",
8622 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008623 EXPECT_EQ("if (aaaaaaaa && // q\n"
8624 " bb) // w\n"
8625 "\t;",
8626 format("if (aaaaaaaa &&// q\n"
8627 "bb)// w\n"
8628 ";",
8629 Tab));
8630 verifyFormat("class X {\n"
8631 "\tvoid f() {\n"
8632 "\t\tsomeFunction(parameter1,\n"
8633 "\t\t parameter2);\n"
8634 "\t}\n"
8635 "};",
8636 Tab);
8637 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008638 "\tQ(\n"
8639 "\t {\n"
8640 "\t\t int a;\n"
8641 "\t\t someFunction(aaaaaaaa,\n"
8642 "\t\t bbbbbbb);\n"
8643 "\t },\n"
8644 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008645 "}",
8646 Tab);
8647 EXPECT_EQ("{\n"
8648 "\t/* aaaa\n"
8649 "\t bbbb */\n"
8650 "}",
8651 format("{\n"
8652 "/* aaaa\n"
8653 " bbbb */\n"
8654 "}",
8655 Tab));
8656 EXPECT_EQ("{\n"
8657 "\t/*\n"
8658 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8659 "\t bbbbbbbbbbbbb\n"
8660 "\t*/\n"
8661 "}",
8662 format("{\n"
8663 "/*\n"
8664 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8665 "*/\n"
8666 "}",
8667 Tab));
8668 EXPECT_EQ("{\n"
8669 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8670 "\t// bbbbbbbbbbbbb\n"
8671 "}",
8672 format("{\n"
8673 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8674 "}",
8675 Tab));
8676 EXPECT_EQ("{\n"
8677 "\t/*\n"
8678 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8679 "\t bbbbbbbbbbbbb\n"
8680 "\t*/\n"
8681 "}",
8682 format("{\n"
8683 "\t/*\n"
8684 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8685 "\t*/\n"
8686 "}",
8687 Tab));
8688 EXPECT_EQ("{\n"
8689 "\t/*\n"
8690 "\n"
8691 "\t*/\n"
8692 "}",
8693 format("{\n"
8694 "\t/*\n"
8695 "\n"
8696 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008697 "}",
8698 Tab));
8699 EXPECT_EQ("{\n"
8700 "\t/*\n"
8701 " asdf\n"
8702 "\t*/\n"
8703 "}",
8704 format("{\n"
8705 "\t/*\n"
8706 " asdf\n"
8707 "\t*/\n"
8708 "}",
8709 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008710
8711 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008712 EXPECT_EQ("/*\n"
8713 " a\t\tcomment\n"
8714 " in multiple lines\n"
8715 " */",
8716 format(" /*\t \t \n"
8717 " \t \t a\t\tcomment\t \t\n"
8718 " \t \t in multiple lines\t\n"
8719 " \t */",
8720 Tab));
8721 EXPECT_EQ("/* some\n"
8722 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008723 format(" \t \t /* some\n"
8724 " \t \t comment */",
8725 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008726 EXPECT_EQ("int a; /* some\n"
8727 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008728 format(" \t \t int a; /* some\n"
8729 " \t \t comment */",
8730 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008731
Alexander Kornienko39856b72013-09-10 09:38:25 +00008732 EXPECT_EQ("int a; /* some\n"
8733 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008734 format(" \t \t int\ta; /* some\n"
8735 " \t \t comment */",
8736 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008737 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8738 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008739 format(" \t \t f(\"\t\t\"); /* some\n"
8740 " \t \t comment */",
8741 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008742 EXPECT_EQ("{\n"
8743 " /*\n"
8744 " * Comment\n"
8745 " */\n"
8746 " int i;\n"
8747 "}",
8748 format("{\n"
8749 "\t/*\n"
8750 "\t * Comment\n"
8751 "\t */\n"
8752 "\t int i;\n"
8753 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008754
8755 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8756 Tab.TabWidth = 8;
8757 Tab.IndentWidth = 8;
8758 EXPECT_EQ("if (aaaaaaaa && // q\n"
8759 " bb) // w\n"
8760 "\t;",
8761 format("if (aaaaaaaa &&// q\n"
8762 "bb)// w\n"
8763 ";",
8764 Tab));
8765 EXPECT_EQ("if (aaa && bbb) // w\n"
8766 "\t;",
8767 format("if(aaa&&bbb)// w\n"
8768 ";",
8769 Tab));
8770 verifyFormat("class X {\n"
8771 "\tvoid f() {\n"
8772 "\t\tsomeFunction(parameter1,\n"
8773 "\t\t\t parameter2);\n"
8774 "\t}\n"
8775 "};",
8776 Tab);
8777 verifyFormat("#define A \\\n"
8778 "\tvoid f() { \\\n"
8779 "\t\tsomeFunction( \\\n"
8780 "\t\t parameter1, \\\n"
8781 "\t\t parameter2); \\\n"
8782 "\t}",
8783 Tab);
8784 Tab.TabWidth = 4;
8785 Tab.IndentWidth = 8;
8786 verifyFormat("class TabWidth4Indent8 {\n"
8787 "\t\tvoid f() {\n"
8788 "\t\t\t\tsomeFunction(parameter1,\n"
8789 "\t\t\t\t\t\t\t parameter2);\n"
8790 "\t\t}\n"
8791 "};",
8792 Tab);
8793 Tab.TabWidth = 4;
8794 Tab.IndentWidth = 4;
8795 verifyFormat("class TabWidth4Indent4 {\n"
8796 "\tvoid f() {\n"
8797 "\t\tsomeFunction(parameter1,\n"
8798 "\t\t\t\t\t parameter2);\n"
8799 "\t}\n"
8800 "};",
8801 Tab);
8802 Tab.TabWidth = 8;
8803 Tab.IndentWidth = 4;
8804 verifyFormat("class TabWidth8Indent4 {\n"
8805 " void f() {\n"
8806 "\tsomeFunction(parameter1,\n"
8807 "\t\t parameter2);\n"
8808 " }\n"
8809 "};",
8810 Tab);
8811 Tab.TabWidth = 8;
8812 Tab.IndentWidth = 8;
8813 EXPECT_EQ("/*\n"
8814 "\t a\t\tcomment\n"
8815 "\t in multiple lines\n"
8816 " */",
8817 format(" /*\t \t \n"
8818 " \t \t a\t\tcomment\t \t\n"
8819 " \t \t in multiple lines\t\n"
8820 " \t */",
8821 Tab));
8822 verifyFormat("{\n"
8823 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8824 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8825 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8826 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8827 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8828 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8829 "};",
8830 Tab);
8831 verifyFormat("enum AA {\n"
8832 "\ta1, // Force multiple lines\n"
8833 "\ta2,\n"
8834 "\ta3\n"
8835 "};",
8836 Tab);
8837 EXPECT_EQ("if (aaaaaaaa && // q\n"
8838 " bb) // w\n"
8839 "\t;",
8840 format("if (aaaaaaaa &&// q\n"
8841 "bb)// w\n"
8842 ";",
8843 Tab));
8844 verifyFormat("class X {\n"
8845 "\tvoid f() {\n"
8846 "\t\tsomeFunction(parameter1,\n"
8847 "\t\t\t parameter2);\n"
8848 "\t}\n"
8849 "};",
8850 Tab);
8851 verifyFormat("{\n"
8852 "\tQ(\n"
8853 "\t {\n"
8854 "\t\t int a;\n"
8855 "\t\t someFunction(aaaaaaaa,\n"
8856 "\t\t\t\t bbbbbbb);\n"
8857 "\t },\n"
8858 "\t p);\n"
8859 "}",
8860 Tab);
8861 EXPECT_EQ("{\n"
8862 "\t/* aaaa\n"
8863 "\t bbbb */\n"
8864 "}",
8865 format("{\n"
8866 "/* aaaa\n"
8867 " bbbb */\n"
8868 "}",
8869 Tab));
8870 EXPECT_EQ("{\n"
8871 "\t/*\n"
8872 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8873 "\t bbbbbbbbbbbbb\n"
8874 "\t*/\n"
8875 "}",
8876 format("{\n"
8877 "/*\n"
8878 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8879 "*/\n"
8880 "}",
8881 Tab));
8882 EXPECT_EQ("{\n"
8883 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8884 "\t// bbbbbbbbbbbbb\n"
8885 "}",
8886 format("{\n"
8887 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8888 "}",
8889 Tab));
8890 EXPECT_EQ("{\n"
8891 "\t/*\n"
8892 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8893 "\t bbbbbbbbbbbbb\n"
8894 "\t*/\n"
8895 "}",
8896 format("{\n"
8897 "\t/*\n"
8898 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8899 "\t*/\n"
8900 "}",
8901 Tab));
8902 EXPECT_EQ("{\n"
8903 "\t/*\n"
8904 "\n"
8905 "\t*/\n"
8906 "}",
8907 format("{\n"
8908 "\t/*\n"
8909 "\n"
8910 "\t*/\n"
8911 "}",
8912 Tab));
8913 EXPECT_EQ("{\n"
8914 "\t/*\n"
8915 " asdf\n"
8916 "\t*/\n"
8917 "}",
8918 format("{\n"
8919 "\t/*\n"
8920 " asdf\n"
8921 "\t*/\n"
8922 "}",
8923 Tab));
8924 EXPECT_EQ("/*\n"
8925 "\t a\t\tcomment\n"
8926 "\t in multiple lines\n"
8927 " */",
8928 format(" /*\t \t \n"
8929 " \t \t a\t\tcomment\t \t\n"
8930 " \t \t in multiple lines\t\n"
8931 " \t */",
8932 Tab));
8933 EXPECT_EQ("/* some\n"
8934 " comment */",
8935 format(" \t \t /* some\n"
8936 " \t \t comment */",
8937 Tab));
8938 EXPECT_EQ("int a; /* some\n"
8939 " comment */",
8940 format(" \t \t int a; /* some\n"
8941 " \t \t comment */",
8942 Tab));
8943 EXPECT_EQ("int a; /* some\n"
8944 "comment */",
8945 format(" \t \t int\ta; /* some\n"
8946 " \t \t comment */",
8947 Tab));
8948 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8949 " comment */",
8950 format(" \t \t f(\"\t\t\"); /* some\n"
8951 " \t \t comment */",
8952 Tab));
8953 EXPECT_EQ("{\n"
8954 " /*\n"
8955 " * Comment\n"
8956 " */\n"
8957 " int i;\n"
8958 "}",
8959 format("{\n"
8960 "\t/*\n"
8961 "\t * Comment\n"
8962 "\t */\n"
8963 "\t int i;\n"
8964 "}"));
8965 Tab.AlignConsecutiveAssignments = true;
8966 Tab.AlignConsecutiveDeclarations = true;
8967 Tab.TabWidth = 4;
8968 Tab.IndentWidth = 4;
8969 verifyFormat("class Assign {\n"
8970 "\tvoid f() {\n"
8971 "\t\tint x = 123;\n"
8972 "\t\tint random = 4;\n"
8973 "\t\tstd::string alphabet =\n"
8974 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8975 "\t}\n"
8976 "};",
8977 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008978}
8979
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008980TEST_F(FormatTest, CalculatesOriginalColumn) {
8981 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8982 "q\"; /* some\n"
8983 " comment */",
8984 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8985 "q\"; /* some\n"
8986 " comment */",
8987 getLLVMStyle()));
8988 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8989 "/* some\n"
8990 " comment */",
8991 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8992 " /* some\n"
8993 " comment */",
8994 getLLVMStyle()));
8995 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8996 "qqq\n"
8997 "/* some\n"
8998 " comment */",
8999 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9000 "qqq\n"
9001 " /* some\n"
9002 " comment */",
9003 getLLVMStyle()));
9004 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9005 "wwww; /* some\n"
9006 " comment */",
9007 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9008 "wwww; /* some\n"
9009 " comment */",
9010 getLLVMStyle()));
9011}
9012
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009013TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00009014 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009015 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009016
9017 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009018 " continue;",
9019 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009020 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009021 " continue;",
9022 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009023 verifyFormat("if(true)\n"
9024 " f();\n"
9025 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009026 " f();",
9027 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009028 verifyFormat("do {\n"
9029 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009030 "} while(something());",
9031 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009032 verifyFormat("switch(x) {\n"
9033 "default:\n"
9034 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009035 "}",
9036 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00009037 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00009038 verifyFormat("size_t x = sizeof(x);", NoSpace);
9039 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
9040 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
9041 verifyFormat("alignas(128) char a[128];", NoSpace);
9042 verifyFormat("size_t x = alignof(MyType);", NoSpace);
9043 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
9044 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009045 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009046 verifyFormat("T A::operator()();", NoSpace);
9047 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009048
9049 FormatStyle Space = getLLVMStyle();
9050 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
9051
9052 verifyFormat("int f ();", Space);
9053 verifyFormat("void f (int a, T b) {\n"
9054 " while (true)\n"
9055 " continue;\n"
9056 "}",
9057 Space);
9058 verifyFormat("if (true)\n"
9059 " f ();\n"
9060 "else if (true)\n"
9061 " f ();",
9062 Space);
9063 verifyFormat("do {\n"
9064 " do_something ();\n"
9065 "} while (something ());",
9066 Space);
9067 verifyFormat("switch (x) {\n"
9068 "default:\n"
9069 " break;\n"
9070 "}",
9071 Space);
9072 verifyFormat("A::A () : a (1) {}", Space);
9073 verifyFormat("void f () __attribute__ ((asdf));", Space);
9074 verifyFormat("*(&a + 1);\n"
9075 "&((&a)[1]);\n"
9076 "a[(b + c) * d];\n"
9077 "(((a + 1) * 2) + 3) * 4;",
9078 Space);
9079 verifyFormat("#define A(x) x", Space);
9080 verifyFormat("#define A (x) x", Space);
9081 verifyFormat("#if defined(x)\n"
9082 "#endif",
9083 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00009084 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00009085 verifyFormat("size_t x = sizeof (x);", Space);
9086 verifyFormat("auto f (int x) -> decltype (x);", Space);
9087 verifyFormat("int f (T x) noexcept (x.create ());", Space);
9088 verifyFormat("alignas (128) char a[128];", Space);
9089 verifyFormat("size_t x = alignof (MyType);", Space);
9090 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
9091 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009092 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009093 verifyFormat("T A::operator() ();", Space);
9094 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009095}
9096
9097TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
9098 FormatStyle Spaces = getLLVMStyle();
9099
9100 Spaces.SpacesInParentheses = true;
9101 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009102 verifyFormat("call();", Spaces);
9103 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00009104 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
9105 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009106 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009107 " continue;",
9108 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009109 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009110 " continue;",
9111 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009112 verifyFormat("if ( true )\n"
9113 " f();\n"
9114 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009115 " f();",
9116 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009117 verifyFormat("do {\n"
9118 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009119 "} while ( something() );",
9120 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009121 verifyFormat("switch ( x ) {\n"
9122 "default:\n"
9123 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009124 "}",
9125 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009126
9127 Spaces.SpacesInParentheses = false;
9128 Spaces.SpacesInCStyleCastParentheses = true;
9129 verifyFormat("Type *A = ( Type * )P;", Spaces);
9130 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
9131 verifyFormat("x = ( int32 )y;", Spaces);
9132 verifyFormat("int a = ( int )(2.0f);", Spaces);
9133 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
9134 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
9135 verifyFormat("#define x (( int )-1)", Spaces);
9136
Daniel Jasper92e09822015-03-18 12:59:19 +00009137 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00009138 Spaces.SpacesInParentheses = false;
9139 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009140 Spaces.SpacesInCStyleCastParentheses = true;
9141 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009142 verifyFormat("call( );", Spaces);
9143 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009144 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009145 " continue;",
9146 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009147 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009148 " continue;",
9149 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009150 verifyFormat("if (true)\n"
9151 " f( );\n"
9152 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009153 " f( );",
9154 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009155 verifyFormat("do {\n"
9156 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009157 "} while (something( ));",
9158 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009159 verifyFormat("switch (x) {\n"
9160 "default:\n"
9161 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009162 "}",
9163 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009164
Daniel Jasper92e09822015-03-18 12:59:19 +00009165 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009166 Spaces.SpaceAfterCStyleCast = true;
9167 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009168 verifyFormat("call( );", Spaces);
9169 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009170 verifyFormat("while (( bool ) 1)\n"
9171 " continue;",
9172 Spaces);
9173 verifyFormat("for (;;)\n"
9174 " continue;",
9175 Spaces);
9176 verifyFormat("if (true)\n"
9177 " f( );\n"
9178 "else if (true)\n"
9179 " f( );",
9180 Spaces);
9181 verifyFormat("do {\n"
9182 " do_something(( int ) i);\n"
9183 "} while (something( ));",
9184 Spaces);
9185 verifyFormat("switch (x) {\n"
9186 "default:\n"
9187 " break;\n"
9188 "}",
9189 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009190
9191 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009192 Spaces.SpacesInCStyleCastParentheses = false;
9193 Spaces.SpaceAfterCStyleCast = true;
9194 verifyFormat("while ((bool) 1)\n"
9195 " continue;",
9196 Spaces);
9197 verifyFormat("do {\n"
9198 " do_something((int) i);\n"
9199 "} while (something( ));",
9200 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009201}
9202
Daniel Jasperad981f82014-08-26 11:41:14 +00009203TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9204 verifyFormat("int a[5];");
9205 verifyFormat("a[3] += 42;");
9206
9207 FormatStyle Spaces = getLLVMStyle();
9208 Spaces.SpacesInSquareBrackets = true;
9209 // Lambdas unchanged.
9210 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9211 verifyFormat("return [i, args...] {};", Spaces);
9212
9213 // Not lambdas.
9214 verifyFormat("int a[ 5 ];", Spaces);
9215 verifyFormat("a[ 3 ] += 42;", Spaces);
9216 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9217 verifyFormat("double &operator[](int i) { return 0; }\n"
9218 "int i;",
9219 Spaces);
9220 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9221 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9222 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9223}
9224
Daniel Jasperd94bff32013-09-25 15:15:02 +00009225TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9226 verifyFormat("int a = 5;");
9227 verifyFormat("a += 42;");
9228 verifyFormat("a or_eq 8;");
9229
9230 FormatStyle Spaces = getLLVMStyle();
9231 Spaces.SpaceBeforeAssignmentOperators = false;
9232 verifyFormat("int a= 5;", Spaces);
9233 verifyFormat("a+= 42;", Spaces);
9234 verifyFormat("a or_eq 8;", Spaces);
9235}
9236
Daniel Jaspera44991332015-04-29 13:06:49 +00009237TEST_F(FormatTest, AlignConsecutiveAssignments) {
9238 FormatStyle Alignment = getLLVMStyle();
9239 Alignment.AlignConsecutiveAssignments = false;
9240 verifyFormat("int a = 5;\n"
9241 "int oneTwoThree = 123;",
9242 Alignment);
9243 verifyFormat("int a = 5;\n"
9244 "int oneTwoThree = 123;",
9245 Alignment);
9246
9247 Alignment.AlignConsecutiveAssignments = true;
9248 verifyFormat("int a = 5;\n"
9249 "int oneTwoThree = 123;",
9250 Alignment);
9251 verifyFormat("int a = method();\n"
9252 "int oneTwoThree = 133;",
9253 Alignment);
9254 verifyFormat("a &= 5;\n"
9255 "bcd *= 5;\n"
9256 "ghtyf += 5;\n"
9257 "dvfvdb -= 5;\n"
9258 "a /= 5;\n"
9259 "vdsvsv %= 5;\n"
9260 "sfdbddfbdfbb ^= 5;\n"
9261 "dvsdsv |= 5;\n"
9262 "int dsvvdvsdvvv = 123;",
9263 Alignment);
9264 verifyFormat("int i = 1, j = 10;\n"
9265 "something = 2000;",
9266 Alignment);
9267 verifyFormat("something = 2000;\n"
9268 "int i = 1, j = 10;\n",
9269 Alignment);
9270 verifyFormat("something = 2000;\n"
9271 "another = 911;\n"
9272 "int i = 1, j = 10;\n"
9273 "oneMore = 1;\n"
9274 "i = 2;",
9275 Alignment);
9276 verifyFormat("int a = 5;\n"
9277 "int one = 1;\n"
9278 "method();\n"
9279 "int oneTwoThree = 123;\n"
9280 "int oneTwo = 12;",
9281 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009282 verifyFormat("int oneTwoThree = 123;\n"
9283 "int oneTwo = 12;\n"
9284 "method();\n",
9285 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009286 verifyFormat("int oneTwoThree = 123; // comment\n"
9287 "int oneTwo = 12; // comment",
9288 Alignment);
9289 EXPECT_EQ("int a = 5;\n"
9290 "\n"
9291 "int oneTwoThree = 123;",
9292 format("int a = 5;\n"
9293 "\n"
9294 "int oneTwoThree= 123;",
9295 Alignment));
9296 EXPECT_EQ("int a = 5;\n"
9297 "int one = 1;\n"
9298 "\n"
9299 "int oneTwoThree = 123;",
9300 format("int a = 5;\n"
9301 "int one = 1;\n"
9302 "\n"
9303 "int oneTwoThree = 123;",
9304 Alignment));
9305 EXPECT_EQ("int a = 5;\n"
9306 "int one = 1;\n"
9307 "\n"
9308 "int oneTwoThree = 123;\n"
9309 "int oneTwo = 12;",
9310 format("int a = 5;\n"
9311 "int one = 1;\n"
9312 "\n"
9313 "int oneTwoThree = 123;\n"
9314 "int oneTwo = 12;",
9315 Alignment));
9316 Alignment.AlignEscapedNewlinesLeft = true;
9317 verifyFormat("#define A \\\n"
9318 " int aaaa = 12; \\\n"
9319 " int b = 23; \\\n"
9320 " int ccc = 234; \\\n"
9321 " int dddddddddd = 2345;",
9322 Alignment);
9323 Alignment.AlignEscapedNewlinesLeft = false;
9324 verifyFormat("#define A "
9325 " \\\n"
9326 " int aaaa = 12; "
9327 " \\\n"
9328 " int b = 23; "
9329 " \\\n"
9330 " int ccc = 234; "
9331 " \\\n"
9332 " int dddddddddd = 2345;",
9333 Alignment);
9334 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9335 "k = 4, int l = 5,\n"
9336 " int m = 6) {\n"
9337 " int j = 10;\n"
9338 " otherThing = 1;\n"
9339 "}",
9340 Alignment);
9341 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9342 " int i = 1;\n"
9343 " int j = 2;\n"
9344 " int big = 10000;\n"
9345 "}",
9346 Alignment);
9347 verifyFormat("class C {\n"
9348 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009349 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009350 " virtual void f() = 0;\n"
9351 "};",
9352 Alignment);
9353 verifyFormat("int i = 1;\n"
9354 "if (SomeType t = getSomething()) {\n"
9355 "}\n"
9356 "int j = 2;\n"
9357 "int big = 10000;",
9358 Alignment);
9359 verifyFormat("int j = 7;\n"
9360 "for (int k = 0; k < N; ++k) {\n"
9361 "}\n"
9362 "int j = 2;\n"
9363 "int big = 10000;\n"
9364 "}",
9365 Alignment);
9366 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9367 verifyFormat("int i = 1;\n"
9368 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9369 " = someLooooooooooooooooongFunction();\n"
9370 "int j = 2;",
9371 Alignment);
9372 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9373 verifyFormat("int i = 1;\n"
9374 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9375 " someLooooooooooooooooongFunction();\n"
9376 "int j = 2;",
9377 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009378
9379 verifyFormat("auto lambda = []() {\n"
9380 " auto i = 0;\n"
9381 " return 0;\n"
9382 "};\n"
9383 "int i = 0;\n"
9384 "auto v = type{\n"
9385 " i = 1, //\n"
9386 " (i = 2), //\n"
9387 " i = 3 //\n"
9388 "};",
9389 Alignment);
9390
Daniel Jaspera44991332015-04-29 13:06:49 +00009391 // FIXME: Should align all three assignments
9392 verifyFormat(
9393 "int i = 1;\n"
9394 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9395 " loooooooooooooooooooooongParameterB);\n"
9396 "int j = 2;",
9397 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009398
9399 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9400 " typename B = very_long_type_name_1,\n"
9401 " typename T_2 = very_long_type_name_2>\n"
9402 "auto foo() {}\n",
9403 Alignment);
9404 verifyFormat("int a, b = 1;\n"
9405 "int c = 2;\n"
9406 "int dd = 3;\n",
9407 Alignment);
9408 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9409 "float b[1][] = {{3.f}};\n",
9410 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009411}
9412
Daniel Jaspere12597c2015-10-01 10:06:54 +00009413TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9414 FormatStyle Alignment = getLLVMStyle();
9415 Alignment.AlignConsecutiveDeclarations = false;
9416 verifyFormat("float const a = 5;\n"
9417 "int oneTwoThree = 123;",
9418 Alignment);
9419 verifyFormat("int a = 5;\n"
9420 "float const oneTwoThree = 123;",
9421 Alignment);
9422
9423 Alignment.AlignConsecutiveDeclarations = true;
9424 verifyFormat("float const a = 5;\n"
9425 "int oneTwoThree = 123;",
9426 Alignment);
9427 verifyFormat("int a = method();\n"
9428 "float const oneTwoThree = 133;",
9429 Alignment);
9430 verifyFormat("int i = 1, j = 10;\n"
9431 "something = 2000;",
9432 Alignment);
9433 verifyFormat("something = 2000;\n"
9434 "int i = 1, j = 10;\n",
9435 Alignment);
9436 verifyFormat("float something = 2000;\n"
9437 "double another = 911;\n"
9438 "int i = 1, j = 10;\n"
9439 "const int *oneMore = 1;\n"
9440 "unsigned i = 2;",
9441 Alignment);
9442 verifyFormat("float a = 5;\n"
9443 "int one = 1;\n"
9444 "method();\n"
9445 "const double oneTwoThree = 123;\n"
9446 "const unsigned int oneTwo = 12;",
9447 Alignment);
9448 verifyFormat("int oneTwoThree{0}; // comment\n"
9449 "unsigned oneTwo; // comment",
9450 Alignment);
9451 EXPECT_EQ("float const a = 5;\n"
9452 "\n"
9453 "int oneTwoThree = 123;",
9454 format("float const a = 5;\n"
9455 "\n"
9456 "int oneTwoThree= 123;",
9457 Alignment));
9458 EXPECT_EQ("float a = 5;\n"
9459 "int one = 1;\n"
9460 "\n"
9461 "unsigned oneTwoThree = 123;",
9462 format("float a = 5;\n"
9463 "int one = 1;\n"
9464 "\n"
9465 "unsigned oneTwoThree = 123;",
9466 Alignment));
9467 EXPECT_EQ("float a = 5;\n"
9468 "int one = 1;\n"
9469 "\n"
9470 "unsigned oneTwoThree = 123;\n"
9471 "int oneTwo = 12;",
9472 format("float a = 5;\n"
9473 "int one = 1;\n"
9474 "\n"
9475 "unsigned oneTwoThree = 123;\n"
9476 "int oneTwo = 12;",
9477 Alignment));
9478 Alignment.AlignConsecutiveAssignments = true;
9479 verifyFormat("float something = 2000;\n"
9480 "double another = 911;\n"
9481 "int i = 1, j = 10;\n"
9482 "const int *oneMore = 1;\n"
9483 "unsigned i = 2;",
9484 Alignment);
9485 verifyFormat("int oneTwoThree = {0}; // comment\n"
9486 "unsigned oneTwo = 0; // comment",
9487 Alignment);
9488 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9489 " int const i = 1;\n"
9490 " int * j = 2;\n"
9491 " int big = 10000;\n"
9492 "\n"
9493 " unsigned oneTwoThree = 123;\n"
9494 " int oneTwo = 12;\n"
9495 " method();\n"
9496 " float k = 2;\n"
9497 " int ll = 10000;\n"
9498 "}",
9499 format("void SomeFunction(int parameter= 0) {\n"
9500 " int const i= 1;\n"
9501 " int *j=2;\n"
9502 " int big = 10000;\n"
9503 "\n"
9504 "unsigned oneTwoThree =123;\n"
9505 "int oneTwo = 12;\n"
9506 " method();\n"
9507 "float k= 2;\n"
9508 "int ll=10000;\n"
9509 "}",
9510 Alignment));
9511 Alignment.AlignConsecutiveAssignments = false;
9512 Alignment.AlignEscapedNewlinesLeft = true;
9513 verifyFormat("#define A \\\n"
9514 " int aaaa = 12; \\\n"
9515 " float b = 23; \\\n"
9516 " const int ccc = 234; \\\n"
9517 " unsigned dddddddddd = 2345;",
9518 Alignment);
9519 Alignment.AlignEscapedNewlinesLeft = false;
9520 Alignment.ColumnLimit = 30;
9521 verifyFormat("#define A \\\n"
9522 " int aaaa = 12; \\\n"
9523 " float b = 23; \\\n"
9524 " const int ccc = 234; \\\n"
9525 " int dddddddddd = 2345;",
9526 Alignment);
9527 Alignment.ColumnLimit = 80;
9528 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9529 "k = 4, int l = 5,\n"
9530 " int m = 6) {\n"
9531 " const int j = 10;\n"
9532 " otherThing = 1;\n"
9533 "}",
9534 Alignment);
9535 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9536 " int const i = 1;\n"
9537 " int * j = 2;\n"
9538 " int big = 10000;\n"
9539 "}",
9540 Alignment);
9541 verifyFormat("class C {\n"
9542 "public:\n"
9543 " int i = 1;\n"
9544 " virtual void f() = 0;\n"
9545 "};",
9546 Alignment);
9547 verifyFormat("float i = 1;\n"
9548 "if (SomeType t = getSomething()) {\n"
9549 "}\n"
9550 "const unsigned j = 2;\n"
9551 "int big = 10000;",
9552 Alignment);
9553 verifyFormat("float j = 7;\n"
9554 "for (int k = 0; k < N; ++k) {\n"
9555 "}\n"
9556 "unsigned j = 2;\n"
9557 "int big = 10000;\n"
9558 "}",
9559 Alignment);
9560 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9561 verifyFormat("float i = 1;\n"
9562 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9563 " = someLooooooooooooooooongFunction();\n"
9564 "int j = 2;",
9565 Alignment);
9566 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9567 verifyFormat("int i = 1;\n"
9568 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9569 " someLooooooooooooooooongFunction();\n"
9570 "int j = 2;",
9571 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009572
9573 Alignment.AlignConsecutiveAssignments = true;
9574 verifyFormat("auto lambda = []() {\n"
9575 " auto ii = 0;\n"
9576 " float j = 0;\n"
9577 " return 0;\n"
9578 "};\n"
9579 "int i = 0;\n"
9580 "float i2 = 0;\n"
9581 "auto v = type{\n"
9582 " i = 1, //\n"
9583 " (i = 2), //\n"
9584 " i = 3 //\n"
9585 "};",
9586 Alignment);
9587 Alignment.AlignConsecutiveAssignments = false;
9588
Daniel Jaspere12597c2015-10-01 10:06:54 +00009589 // FIXME: Should align all three declarations
9590 verifyFormat(
9591 "int i = 1;\n"
9592 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9593 " loooooooooooooooooooooongParameterB);\n"
9594 "int j = 2;",
9595 Alignment);
9596
9597 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9598 // We expect declarations and assignments to align, as long as it doesn't
9599 // exceed the column limit, starting a new alignemnt sequence whenever it
9600 // happens.
9601 Alignment.AlignConsecutiveAssignments = true;
9602 Alignment.ColumnLimit = 30;
9603 verifyFormat("float ii = 1;\n"
9604 "unsigned j = 2;\n"
9605 "int someVerylongVariable = 1;\n"
9606 "AnotherLongType ll = 123456;\n"
9607 "VeryVeryLongType k = 2;\n"
9608 "int myvar = 1;",
9609 Alignment);
9610 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009611 Alignment.AlignConsecutiveAssignments = false;
9612
9613 verifyFormat(
9614 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9615 " typename LongType, typename B>\n"
9616 "auto foo() {}\n",
9617 Alignment);
9618 verifyFormat("float a, b = 1;\n"
9619 "int c = 2;\n"
9620 "int dd = 3;\n",
9621 Alignment);
9622 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9623 "float b[1][] = {{3.f}};\n",
9624 Alignment);
9625 Alignment.AlignConsecutiveAssignments = true;
9626 verifyFormat("float a, b = 1;\n"
9627 "int c = 2;\n"
9628 "int dd = 3;\n",
9629 Alignment);
9630 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9631 "float b[1][] = {{3.f}};\n",
9632 Alignment);
9633 Alignment.AlignConsecutiveAssignments = false;
9634
9635 Alignment.ColumnLimit = 30;
9636 Alignment.BinPackParameters = false;
9637 verifyFormat("void foo(float a,\n"
9638 " float b,\n"
9639 " int c,\n"
9640 " uint32_t *d) {\n"
9641 " int * e = 0;\n"
9642 " float f = 0;\n"
9643 " double g = 0;\n"
9644 "}\n"
9645 "void bar(ino_t a,\n"
9646 " int b,\n"
9647 " uint32_t *c,\n"
9648 " bool d) {}\n",
9649 Alignment);
9650 Alignment.BinPackParameters = true;
9651 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009652}
9653
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009654TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009655 FormatStyle LinuxBraceStyle = getLLVMStyle();
9656 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009657 verifyFormat("namespace a\n"
9658 "{\n"
9659 "class A\n"
9660 "{\n"
9661 " void f()\n"
9662 " {\n"
9663 " if (true) {\n"
9664 " a();\n"
9665 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009666 " } else {\n"
9667 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009668 " }\n"
9669 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009670 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009671 "};\n"
9672 "struct B {\n"
9673 " int x;\n"
9674 "};\n"
9675 "}\n",
9676 LinuxBraceStyle);
9677 verifyFormat("enum X {\n"
9678 " Y = 0,\n"
9679 "}\n",
9680 LinuxBraceStyle);
9681 verifyFormat("struct S {\n"
9682 " int Type;\n"
9683 " union {\n"
9684 " int x;\n"
9685 " double y;\n"
9686 " } Value;\n"
9687 " class C\n"
9688 " {\n"
9689 " MyFavoriteType Value;\n"
9690 " } Class;\n"
9691 "}\n",
9692 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009693}
9694
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009695TEST_F(FormatTest, MozillaBraceBreaking) {
9696 FormatStyle MozillaBraceStyle = getLLVMStyle();
9697 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
9698 verifyFormat("namespace a {\n"
9699 "class A\n"
9700 "{\n"
9701 " void f()\n"
9702 " {\n"
9703 " if (true) {\n"
9704 " a();\n"
9705 " b();\n"
9706 " }\n"
9707 " }\n"
9708 " void g() { return; }\n"
9709 "};\n"
9710 "enum E\n"
9711 "{\n"
9712 " A,\n"
9713 " // foo\n"
9714 " B,\n"
9715 " C\n"
9716 "};\n"
9717 "struct B\n"
9718 "{\n"
9719 " int x;\n"
9720 "};\n"
9721 "}\n",
9722 MozillaBraceStyle);
9723 verifyFormat("struct S\n"
9724 "{\n"
9725 " int Type;\n"
9726 " union\n"
9727 " {\n"
9728 " int x;\n"
9729 " double y;\n"
9730 " } Value;\n"
9731 " class C\n"
9732 " {\n"
9733 " MyFavoriteType Value;\n"
9734 " } Class;\n"
9735 "}\n",
9736 MozillaBraceStyle);
9737}
9738
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009739TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009740 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9741 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009742 verifyFormat("namespace a {\n"
9743 "class A {\n"
9744 " void f()\n"
9745 " {\n"
9746 " if (true) {\n"
9747 " a();\n"
9748 " b();\n"
9749 " }\n"
9750 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009751 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009752 "};\n"
9753 "struct B {\n"
9754 " int x;\n"
9755 "};\n"
9756 "}\n",
9757 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009758
Daniel Jasperd9670872014-08-05 12:06:20 +00009759 verifyFormat("void foo()\n"
9760 "{\n"
9761 " if (a) {\n"
9762 " a();\n"
9763 " }\n"
9764 " else {\n"
9765 " b();\n"
9766 " }\n"
9767 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009768 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009769
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009770 verifyFormat("#ifdef _DEBUG\n"
9771 "int foo(int i = 0)\n"
9772 "#else\n"
9773 "int foo(int i = 5)\n"
9774 "#endif\n"
9775 "{\n"
9776 " return i;\n"
9777 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009778 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009779
9780 verifyFormat("void foo() {}\n"
9781 "void bar()\n"
9782 "#ifdef _DEBUG\n"
9783 "{\n"
9784 " foo();\n"
9785 "}\n"
9786 "#else\n"
9787 "{\n"
9788 "}\n"
9789 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009790 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009791
9792 verifyFormat("void foobar() { int i = 5; }\n"
9793 "#ifdef _DEBUG\n"
9794 "void bar() {}\n"
9795 "#else\n"
9796 "void bar() { foobar(); }\n"
9797 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009798 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009799}
9800
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009801TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009802 FormatStyle AllmanBraceStyle = getLLVMStyle();
9803 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009804 verifyFormat("namespace a\n"
9805 "{\n"
9806 "class A\n"
9807 "{\n"
9808 " void f()\n"
9809 " {\n"
9810 " if (true)\n"
9811 " {\n"
9812 " a();\n"
9813 " b();\n"
9814 " }\n"
9815 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009816 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009817 "};\n"
9818 "struct B\n"
9819 "{\n"
9820 " int x;\n"
9821 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009822 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009823 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009824
9825 verifyFormat("void f()\n"
9826 "{\n"
9827 " if (true)\n"
9828 " {\n"
9829 " a();\n"
9830 " }\n"
9831 " else if (false)\n"
9832 " {\n"
9833 " b();\n"
9834 " }\n"
9835 " else\n"
9836 " {\n"
9837 " c();\n"
9838 " }\n"
9839 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009840 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009841
9842 verifyFormat("void f()\n"
9843 "{\n"
9844 " for (int i = 0; i < 10; ++i)\n"
9845 " {\n"
9846 " a();\n"
9847 " }\n"
9848 " while (false)\n"
9849 " {\n"
9850 " b();\n"
9851 " }\n"
9852 " do\n"
9853 " {\n"
9854 " c();\n"
9855 " } while (false)\n"
9856 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009857 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009858
9859 verifyFormat("void f(int a)\n"
9860 "{\n"
9861 " switch (a)\n"
9862 " {\n"
9863 " case 0:\n"
9864 " break;\n"
9865 " case 1:\n"
9866 " {\n"
9867 " break;\n"
9868 " }\n"
9869 " case 2:\n"
9870 " {\n"
9871 " }\n"
9872 " break;\n"
9873 " default:\n"
9874 " break;\n"
9875 " }\n"
9876 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009877 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009878
9879 verifyFormat("enum X\n"
9880 "{\n"
9881 " Y = 0,\n"
9882 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009883 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009884 verifyFormat("enum X\n"
9885 "{\n"
9886 " Y = 0\n"
9887 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009888 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009889
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009890 verifyFormat("@interface BSApplicationController ()\n"
9891 "{\n"
9892 "@private\n"
9893 " id _extraIvar;\n"
9894 "}\n"
9895 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009896 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009897
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009898 verifyFormat("#ifdef _DEBUG\n"
9899 "int foo(int i = 0)\n"
9900 "#else\n"
9901 "int foo(int i = 5)\n"
9902 "#endif\n"
9903 "{\n"
9904 " return i;\n"
9905 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009906 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009907
9908 verifyFormat("void foo() {}\n"
9909 "void bar()\n"
9910 "#ifdef _DEBUG\n"
9911 "{\n"
9912 " foo();\n"
9913 "}\n"
9914 "#else\n"
9915 "{\n"
9916 "}\n"
9917 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009918 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009919
9920 verifyFormat("void foobar() { int i = 5; }\n"
9921 "#ifdef _DEBUG\n"
9922 "void bar() {}\n"
9923 "#else\n"
9924 "void bar() { foobar(); }\n"
9925 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009926 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009927
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009928 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009929 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009930 " // ...\n"
9931 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009932 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009933 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009934 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009935 " // ...\n"
9936 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009937 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009938 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009939 // .. or dict literals.
9940 verifyFormat("void f()\n"
9941 "{\n"
9942 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
9943 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009944 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009945 verifyFormat("int f()\n"
9946 "{ // comment\n"
9947 " return 42;\n"
9948 "}",
9949 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009950
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009951 AllmanBraceStyle.ColumnLimit = 19;
9952 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9953 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009954 verifyFormat("void f()\n"
9955 "{\n"
9956 " int i;\n"
9957 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009958 AllmanBraceStyle);
9959 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009960
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009961 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009962 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9963 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9964 verifyFormat("void f(bool b)\n"
9965 "{\n"
9966 " if (b)\n"
9967 " {\n"
9968 " return;\n"
9969 " }\n"
9970 "}\n",
9971 BreakBeforeBraceShortIfs);
9972 verifyFormat("void f(bool b)\n"
9973 "{\n"
9974 " if (b) return;\n"
9975 "}\n",
9976 BreakBeforeBraceShortIfs);
9977 verifyFormat("void f(bool b)\n"
9978 "{\n"
9979 " while (b)\n"
9980 " {\n"
9981 " return;\n"
9982 " }\n"
9983 "}\n",
9984 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009985}
9986
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009987TEST_F(FormatTest, GNUBraceBreaking) {
9988 FormatStyle GNUBraceStyle = getLLVMStyle();
9989 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9990 verifyFormat("namespace a\n"
9991 "{\n"
9992 "class A\n"
9993 "{\n"
9994 " void f()\n"
9995 " {\n"
9996 " int a;\n"
9997 " {\n"
9998 " int b;\n"
9999 " }\n"
10000 " if (true)\n"
10001 " {\n"
10002 " a();\n"
10003 " b();\n"
10004 " }\n"
10005 " }\n"
10006 " void g() { return; }\n"
10007 "}\n"
10008 "}",
10009 GNUBraceStyle);
10010
10011 verifyFormat("void f()\n"
10012 "{\n"
10013 " if (true)\n"
10014 " {\n"
10015 " a();\n"
10016 " }\n"
10017 " else if (false)\n"
10018 " {\n"
10019 " b();\n"
10020 " }\n"
10021 " else\n"
10022 " {\n"
10023 " c();\n"
10024 " }\n"
10025 "}\n",
10026 GNUBraceStyle);
10027
10028 verifyFormat("void f()\n"
10029 "{\n"
10030 " for (int i = 0; i < 10; ++i)\n"
10031 " {\n"
10032 " a();\n"
10033 " }\n"
10034 " while (false)\n"
10035 " {\n"
10036 " b();\n"
10037 " }\n"
10038 " do\n"
10039 " {\n"
10040 " c();\n"
10041 " }\n"
10042 " while (false);\n"
10043 "}\n",
10044 GNUBraceStyle);
10045
10046 verifyFormat("void f(int a)\n"
10047 "{\n"
10048 " switch (a)\n"
10049 " {\n"
10050 " case 0:\n"
10051 " break;\n"
10052 " case 1:\n"
10053 " {\n"
10054 " break;\n"
10055 " }\n"
10056 " case 2:\n"
10057 " {\n"
10058 " }\n"
10059 " break;\n"
10060 " default:\n"
10061 " break;\n"
10062 " }\n"
10063 "}\n",
10064 GNUBraceStyle);
10065
10066 verifyFormat("enum X\n"
10067 "{\n"
10068 " Y = 0,\n"
10069 "}\n",
10070 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +000010071
10072 verifyFormat("@interface BSApplicationController ()\n"
10073 "{\n"
10074 "@private\n"
10075 " id _extraIvar;\n"
10076 "}\n"
10077 "@end\n",
10078 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010079
10080 verifyFormat("#ifdef _DEBUG\n"
10081 "int foo(int i = 0)\n"
10082 "#else\n"
10083 "int foo(int i = 5)\n"
10084 "#endif\n"
10085 "{\n"
10086 " return i;\n"
10087 "}",
10088 GNUBraceStyle);
10089
10090 verifyFormat("void foo() {}\n"
10091 "void bar()\n"
10092 "#ifdef _DEBUG\n"
10093 "{\n"
10094 " foo();\n"
10095 "}\n"
10096 "#else\n"
10097 "{\n"
10098 "}\n"
10099 "#endif",
10100 GNUBraceStyle);
10101
10102 verifyFormat("void foobar() { int i = 5; }\n"
10103 "#ifdef _DEBUG\n"
10104 "void bar() {}\n"
10105 "#else\n"
10106 "void bar() { foobar(); }\n"
10107 "#endif",
10108 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010109}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010110
10111TEST_F(FormatTest, WebKitBraceBreaking) {
10112 FormatStyle WebKitBraceStyle = getLLVMStyle();
10113 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
10114 verifyFormat("namespace a {\n"
10115 "class A {\n"
10116 " void f()\n"
10117 " {\n"
10118 " if (true) {\n"
10119 " a();\n"
10120 " b();\n"
10121 " }\n"
10122 " }\n"
10123 " void g() { return; }\n"
10124 "};\n"
10125 "enum E {\n"
10126 " A,\n"
10127 " // foo\n"
10128 " B,\n"
10129 " C\n"
10130 "};\n"
10131 "struct B {\n"
10132 " int x;\n"
10133 "};\n"
10134 "}\n",
10135 WebKitBraceStyle);
10136 verifyFormat("struct S {\n"
10137 " int Type;\n"
10138 " union {\n"
10139 " int x;\n"
10140 " double y;\n"
10141 " } Value;\n"
10142 " class C {\n"
10143 " MyFavoriteType Value;\n"
10144 " } Class;\n"
10145 "};\n",
10146 WebKitBraceStyle);
10147}
10148
Manuel Klimekd5735502013-08-12 03:51:17 +000010149TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10150 verifyFormat("void f() {\n"
10151 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010152 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010153 " }\n"
10154 "}\n",
10155 getLLVMStyle());
10156}
10157
Daniel Jasper9613c812013-08-07 16:29:23 +000010158TEST_F(FormatTest, UnderstandsPragmas) {
10159 verifyFormat("#pragma omp reduction(| : var)");
10160 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010161
10162 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10163 "(including parentheses).",
10164 format("#pragma mark Any non-hyphenated or hyphenated string "
10165 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010166}
10167
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010168TEST_F(FormatTest, UnderstandPragmaOption) {
10169 verifyFormat("#pragma option -C -A");
10170
10171 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10172}
10173
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010174#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10175 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010176 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10177 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010178
10179TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010180 SmallVector<FormatStyle, 3> Styles;
10181 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010182
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010183 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010184 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10185 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10186 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010187
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010188 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010189 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10190 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10191 EXPECT_ALL_STYLES_EQUAL(Styles);
10192
Nico Weber514ecc82014-02-02 20:50:45 +000010193 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010194 EXPECT_TRUE(
10195 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10196 EXPECT_TRUE(
10197 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10198 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010199
Nico Weber514ecc82014-02-02 20:50:45 +000010200 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010201 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10202 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10203 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010204
10205 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010206 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10207 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10208 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010209
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010210 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010211 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10212 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10213 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010214
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010215 Styles[0] = getGNUStyle();
10216 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10217 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10218 EXPECT_ALL_STYLES_EQUAL(Styles);
10219
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010220 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10221}
10222
10223TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10224 SmallVector<FormatStyle, 8> Styles;
10225 Styles.resize(2);
10226
10227 Styles[0] = getGoogleStyle();
10228 Styles[1] = getLLVMStyle();
10229 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10230 EXPECT_ALL_STYLES_EQUAL(Styles);
10231
10232 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010233 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010234 Styles[1] = getLLVMStyle();
10235 Styles[1].Language = FormatStyle::LK_JavaScript;
10236 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10237
10238 Styles[2] = getLLVMStyle();
10239 Styles[2].Language = FormatStyle::LK_JavaScript;
10240 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10241 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010242 &Styles[2])
10243 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010244
10245 Styles[3] = getLLVMStyle();
10246 Styles[3].Language = FormatStyle::LK_JavaScript;
10247 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10248 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010249 &Styles[3])
10250 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010251
10252 Styles[4] = getLLVMStyle();
10253 Styles[4].Language = FormatStyle::LK_JavaScript;
10254 EXPECT_EQ(0, parseConfiguration("---\n"
10255 "BasedOnStyle: LLVM\n"
10256 "IndentWidth: 123\n"
10257 "---\n"
10258 "BasedOnStyle: Google\n"
10259 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010260 &Styles[4])
10261 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010262 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010263}
10264
Daniel Jasper91881d92014-09-29 08:07:46 +000010265#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010266 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010267 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010268 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010269 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010270 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010271
Daniel Jasper91881d92014-09-29 08:07:46 +000010272#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10273
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010274#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10275 Style.STRUCT.FIELD = false; \
10276 EXPECT_EQ(0, \
10277 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10278 .value()); \
10279 EXPECT_TRUE(Style.STRUCT.FIELD); \
10280 EXPECT_EQ(0, \
10281 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10282 .value()); \
10283 EXPECT_FALSE(Style.STRUCT.FIELD);
10284
10285#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10286 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10287
Daniel Jasper00853002014-09-16 16:22:30 +000010288#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10289 EXPECT_NE(VALUE, Style.FIELD); \
10290 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10291 EXPECT_EQ(VALUE, Style.FIELD)
10292
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010293TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010294 FormatStyle Style = {};
10295 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010296 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +000010297 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010298 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010299 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010300 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010301 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010302 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010303 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010304 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010305 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010306 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010307 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010308 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010309 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010310 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +000010311 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010312 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010313 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010314 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010315 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010316 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010317 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010318 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010319 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010320 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010321 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010322 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010323 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010324 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010325 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010326 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010327 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010328 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010329 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010330 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010331 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010332 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010333 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010334
10335 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10336 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10337 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10338 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10339 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10340 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10341 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10342 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
10343 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10344 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10345 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010346}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010347
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010348#undef CHECK_PARSE_BOOL
10349
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010350TEST_F(FormatTest, ParsesConfiguration) {
10351 FormatStyle Style = {};
10352 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010353 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010354 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10355 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010356 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010357 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10358 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010359 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10360 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010361 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10362 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10363 PenaltyReturnTypeOnItsOwnLine, 1234u);
10364 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10365 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010366 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010367 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010368 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010369
Daniel Jasper553d4872014-06-17 12:40:34 +000010370 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010371 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10372 FormatStyle::PAS_Left);
10373 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10374 FormatStyle::PAS_Right);
10375 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10376 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010377 // For backward compatibility:
10378 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10379 FormatStyle::PAS_Left);
10380 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10381 FormatStyle::PAS_Right);
10382 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10383 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010384
Alexander Kornienkod6538332013-05-07 15:32:14 +000010385 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010386 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10387 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010388 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10389 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10390 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10391
Daniel Jasperac043c92014-09-15 11:11:00 +000010392 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010393 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10394 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010395 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10396 FormatStyle::BOS_None);
10397 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10398 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010399 // For backward compatibility:
10400 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10401 FormatStyle::BOS_None);
10402 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10403 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010404
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010405 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10406 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10407 FormatStyle::BAS_Align);
10408 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10409 FormatStyle::BAS_DontAlign);
10410 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10411 FormatStyle::BAS_AlwaysBreak);
10412 // For backward compatibility:
10413 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10414 FormatStyle::BAS_DontAlign);
10415 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10416 FormatStyle::BAS_Align);
10417
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010418 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010419 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10420 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10421 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010422 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10423 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010424 // For backward compatibility:
10425 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10426 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010427
Daniel Jasperd74cf402014-04-08 12:46:38 +000010428 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010429 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10430 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10431 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10432 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010433 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10434 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010435 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10436 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010437 // For backward compatibility:
10438 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10439 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10440 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10441 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010442
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010443 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10444 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10445 FormatStyle::SBPO_Never);
10446 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10447 FormatStyle::SBPO_Always);
10448 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10449 FormatStyle::SBPO_ControlStatements);
10450 // For backward compatibility:
10451 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10452 FormatStyle::SBPO_Never);
10453 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10454 FormatStyle::SBPO_ControlStatements);
10455
Alexander Kornienkod6538332013-05-07 15:32:14 +000010456 Style.ColumnLimit = 123;
10457 FormatStyle BaseStyle = getLLVMStyle();
10458 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10459 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10460
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010461 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10462 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10463 FormatStyle::BS_Attach);
10464 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10465 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010466 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10467 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010468 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10469 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010470 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10471 FormatStyle::BS_Allman);
10472 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010473 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10474 FormatStyle::BS_WebKit);
10475 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10476 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010477
Zachary Turner448592e2015-12-18 22:20:15 +000010478 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10479 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10480 FormatStyle::RTBS_None);
10481 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10482 FormatStyle::RTBS_All);
10483 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010484 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010485 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10486 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10487 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10488 AlwaysBreakAfterReturnType,
10489 FormatStyle::RTBS_TopLevelDefinitions);
10490
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010491 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10492 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10493 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10494 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10495 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10496 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10497 AlwaysBreakAfterDefinitionReturnType,
10498 FormatStyle::DRTBS_TopLevel);
10499
Daniel Jasper65ee3472013-07-31 23:16:02 +000010500 Style.NamespaceIndentation = FormatStyle::NI_All;
10501 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10502 FormatStyle::NI_None);
10503 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10504 FormatStyle::NI_Inner);
10505 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10506 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010507
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010508 // FIXME: This is required because parsing a configuration simply overwrites
10509 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010510 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010511 std::vector<std::string> BoostForeach;
10512 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010513 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010514 std::vector<std::string> BoostAndQForeach;
10515 BoostAndQForeach.push_back("BOOST_FOREACH");
10516 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010517 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10518 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010519
10520 Style.IncludeCategories.clear();
10521 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10522 {".*", 1}};
10523 CHECK_PARSE("IncludeCategories:\n"
10524 " - Regex: abc/.*\n"
10525 " Priority: 2\n"
10526 " - Regex: .*\n"
10527 " Priority: 1",
10528 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010529 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010530}
10531
10532TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10533 FormatStyle Style = {};
10534 Style.Language = FormatStyle::LK_Cpp;
10535 CHECK_PARSE("Language: Cpp\n"
10536 "IndentWidth: 12",
10537 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010538 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10539 "IndentWidth: 34",
10540 &Style),
10541 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010542 EXPECT_EQ(12u, Style.IndentWidth);
10543 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10544 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10545
10546 Style.Language = FormatStyle::LK_JavaScript;
10547 CHECK_PARSE("Language: JavaScript\n"
10548 "IndentWidth: 12",
10549 IndentWidth, 12u);
10550 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010551 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10552 "IndentWidth: 34",
10553 &Style),
10554 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010555 EXPECT_EQ(23u, Style.IndentWidth);
10556 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10557 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10558
10559 CHECK_PARSE("BasedOnStyle: LLVM\n"
10560 "IndentWidth: 67",
10561 IndentWidth, 67u);
10562
10563 CHECK_PARSE("---\n"
10564 "Language: JavaScript\n"
10565 "IndentWidth: 12\n"
10566 "---\n"
10567 "Language: Cpp\n"
10568 "IndentWidth: 34\n"
10569 "...\n",
10570 IndentWidth, 12u);
10571
10572 Style.Language = FormatStyle::LK_Cpp;
10573 CHECK_PARSE("---\n"
10574 "Language: JavaScript\n"
10575 "IndentWidth: 12\n"
10576 "---\n"
10577 "Language: Cpp\n"
10578 "IndentWidth: 34\n"
10579 "...\n",
10580 IndentWidth, 34u);
10581 CHECK_PARSE("---\n"
10582 "IndentWidth: 78\n"
10583 "---\n"
10584 "Language: JavaScript\n"
10585 "IndentWidth: 56\n"
10586 "...\n",
10587 IndentWidth, 78u);
10588
10589 Style.ColumnLimit = 123;
10590 Style.IndentWidth = 234;
10591 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10592 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010593 EXPECT_FALSE(parseConfiguration("---\n"
10594 "IndentWidth: 456\n"
10595 "BreakBeforeBraces: Allman\n"
10596 "---\n"
10597 "Language: JavaScript\n"
10598 "IndentWidth: 111\n"
10599 "TabWidth: 111\n"
10600 "---\n"
10601 "Language: Cpp\n"
10602 "BreakBeforeBraces: Stroustrup\n"
10603 "TabWidth: 789\n"
10604 "...\n",
10605 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010606 EXPECT_EQ(123u, Style.ColumnLimit);
10607 EXPECT_EQ(456u, Style.IndentWidth);
10608 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10609 EXPECT_EQ(789u, Style.TabWidth);
10610
Rafael Espindola1f243172014-06-12 11:35:17 +000010611 EXPECT_EQ(parseConfiguration("---\n"
10612 "Language: JavaScript\n"
10613 "IndentWidth: 56\n"
10614 "---\n"
10615 "IndentWidth: 78\n"
10616 "...\n",
10617 &Style),
10618 ParseError::Error);
10619 EXPECT_EQ(parseConfiguration("---\n"
10620 "Language: JavaScript\n"
10621 "IndentWidth: 56\n"
10622 "---\n"
10623 "Language: JavaScript\n"
10624 "IndentWidth: 78\n"
10625 "...\n",
10626 &Style),
10627 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010628
10629 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10630}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010631
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010632#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010633
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010634TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10635 FormatStyle Style = {};
10636 Style.Language = FormatStyle::LK_JavaScript;
10637 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010638 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010639 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010640
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010641 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010642 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010643 "BasedOnStyle: Google\n"
10644 "---\n"
10645 "Language: JavaScript\n"
10646 "IndentWidth: 76\n"
10647 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010648 &Style)
10649 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010650 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010651 EXPECT_EQ(76u, Style.IndentWidth);
10652 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10653}
10654
Alexander Kornienkod6538332013-05-07 15:32:14 +000010655TEST_F(FormatTest, ConfigurationRoundTripTest) {
10656 FormatStyle Style = getLLVMStyle();
10657 std::string YAML = configurationAsText(Style);
10658 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010659 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010660 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10661 EXPECT_EQ(Style, ParsedStyle);
10662}
10663
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010664TEST_F(FormatTest, WorksFor8bitEncodings) {
10665 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10666 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10667 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10668 "\"\xef\xee\xf0\xf3...\"",
10669 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10670 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10671 "\xef\xee\xf0\xf3...\"",
10672 getLLVMStyleWithColumns(12)));
10673}
10674
Alexander Kornienko393e3082013-11-13 14:04:17 +000010675TEST_F(FormatTest, HandlesUTF8BOM) {
10676 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10677 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10678 format("\xef\xbb\xbf#include <iostream>"));
10679 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10680 format("\xef\xbb\xbf\n#include <iostream>"));
10681}
10682
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010683// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10684#if !defined(_MSC_VER)
10685
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010686TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10687 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10688 getLLVMStyleWithColumns(35));
10689 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010690 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010691 verifyFormat("// Однажды в студёную зимнюю пору...",
10692 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010693 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010694 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10695 getLLVMStyleWithColumns(39));
10696 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010697 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010698}
10699
10700TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010701 // Non-printable characters' width is currently considered to be the length in
10702 // bytes in UTF8. The characters can be displayed in very different manner
10703 // (zero-width, single width with a substitution glyph, expanded to their code
10704 // (e.g. "<8d>"), so there's no single correct way to handle them.
10705 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010706 "\"\xc2\x8d\";",
10707 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010708 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010709 "\"\xc2\x8d\";",
10710 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010711 EXPECT_EQ("\"Однажды, в \"\n"
10712 "\"студёную \"\n"
10713 "\"зимнюю \"\n"
10714 "\"пору,\"",
10715 format("\"Однажды, в студёную зимнюю пору,\"",
10716 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010717 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010718 "\"一 二 三 \"\n"
10719 "\"四 五六 \"\n"
10720 "\"七 八 九 \"\n"
10721 "\"十\"",
10722 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010723 EXPECT_EQ("\"一\t二 \"\n"
10724 "\"\t三 \"\n"
10725 "\"四 五\t六 \"\n"
10726 "\"\t七 \"\n"
10727 "\"八九十\tqq\"",
10728 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10729 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010730
10731 // UTF8 character in an escape sequence.
10732 EXPECT_EQ("\"aaaaaa\"\n"
10733 "\"\\\xC2\x8D\"",
10734 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010735}
10736
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010737TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10738 EXPECT_EQ("const char *sssss =\n"
10739 " \"一二三四五六七八\\\n"
10740 " 九 十\";",
10741 format("const char *sssss = \"一二三四五六七八\\\n"
10742 " 九 十\";",
10743 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010744}
10745
10746TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010747 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10748 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010749 EXPECT_EQ("// Я из лесу\n"
10750 "// вышел; был\n"
10751 "// сильный\n"
10752 "// мороз.",
10753 format("// Я из лесу вышел; был сильный мороз.",
10754 getLLVMStyleWithColumns(13)));
10755 EXPECT_EQ("// 一二三\n"
10756 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010757 "// 八 九\n"
10758 "// 十",
10759 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010760}
10761
10762TEST_F(FormatTest, SplitsUTF8BlockComments) {
10763 EXPECT_EQ("/* Гляжу,\n"
10764 " * поднимается\n"
10765 " * медленно в\n"
10766 " * гору\n"
10767 " * Лошадка,\n"
10768 " * везущая\n"
10769 " * хворосту\n"
10770 " * воз. */",
10771 format("/* Гляжу, поднимается медленно в гору\n"
10772 " * Лошадка, везущая хворосту воз. */",
10773 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010774 EXPECT_EQ(
10775 "/* 一二三\n"
10776 " * 四五六七\n"
10777 " * 八 九\n"
10778 " * 十 */",
10779 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010780 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10781 " * 𝕓𝕪𝕥𝕖\n"
10782 " * 𝖀𝕿𝕱-𝟠 */",
10783 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010784}
10785
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010786#endif // _MSC_VER
10787
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010788TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10789 FormatStyle Style = getLLVMStyle();
10790
10791 Style.ConstructorInitializerIndentWidth = 4;
10792 verifyFormat(
10793 "SomeClass::Constructor()\n"
10794 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10795 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10796 Style);
10797
10798 Style.ConstructorInitializerIndentWidth = 2;
10799 verifyFormat(
10800 "SomeClass::Constructor()\n"
10801 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10802 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10803 Style);
10804
10805 Style.ConstructorInitializerIndentWidth = 0;
10806 verifyFormat(
10807 "SomeClass::Constructor()\n"
10808 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10809 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10810 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010811 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10812 verifyFormat(
10813 "SomeLongTemplateVariableName<\n"
10814 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10815 Style);
10816 verifyFormat(
10817 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10818 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10819 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010820}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010821
Daniel Jasper00853002014-09-16 16:22:30 +000010822TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10823 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010824 Style.BreakConstructorInitializersBeforeComma = true;
10825 Style.ConstructorInitializerIndentWidth = 4;
10826 verifyFormat("SomeClass::Constructor()\n"
10827 " : a(a)\n"
10828 " , b(b)\n"
10829 " , c(c) {}",
10830 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010831 verifyFormat("SomeClass::Constructor()\n"
10832 " : a(a) {}",
10833 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010834
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010835 Style.ColumnLimit = 0;
10836 verifyFormat("SomeClass::Constructor()\n"
10837 " : a(a) {}",
10838 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010839 verifyFormat("SomeClass::Constructor() noexcept\n"
10840 " : a(a) {}",
10841 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010842 verifyFormat("SomeClass::Constructor()\n"
10843 " : a(a)\n"
10844 " , b(b)\n"
10845 " , c(c) {}",
10846 Style);
10847 verifyFormat("SomeClass::Constructor()\n"
10848 " : a(a) {\n"
10849 " foo();\n"
10850 " bar();\n"
10851 "}",
10852 Style);
10853
Daniel Jasperd74cf402014-04-08 12:46:38 +000010854 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010855 verifyFormat("SomeClass::Constructor()\n"
10856 " : a(a)\n"
10857 " , b(b)\n"
10858 " , c(c) {\n}",
10859 Style);
10860 verifyFormat("SomeClass::Constructor()\n"
10861 " : a(a) {\n}",
10862 Style);
10863
10864 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010865 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010866 Style.ConstructorInitializerIndentWidth = 2;
10867 verifyFormat("SomeClass::Constructor()\n"
10868 " : a(a)\n"
10869 " , b(b)\n"
10870 " , c(c) {}",
10871 Style);
10872
10873 Style.ConstructorInitializerIndentWidth = 0;
10874 verifyFormat("SomeClass::Constructor()\n"
10875 ": a(a)\n"
10876 ", b(b)\n"
10877 ", c(c) {}",
10878 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010879
10880 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10881 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010882 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10883 verifyFormat(
10884 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10885 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010886 verifyFormat(
10887 "SomeClass::Constructor()\n"
10888 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10889 Style);
10890 Style.ConstructorInitializerIndentWidth = 4;
10891 Style.ColumnLimit = 60;
10892 verifyFormat("SomeClass::Constructor()\n"
10893 " : aaaaaaaa(aaaaaaaa)\n"
10894 " , aaaaaaaa(aaaaaaaa)\n"
10895 " , aaaaaaaa(aaaaaaaa) {}",
10896 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010897}
10898
Daniel Jasper38efc132014-10-21 07:51:54 +000010899TEST_F(FormatTest, Destructors) {
10900 verifyFormat("void F(int &i) { i.~int(); }");
10901 verifyFormat("void F(int &i) { i->~int(); }");
10902}
10903
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010904TEST_F(FormatTest, FormatsWithWebKitStyle) {
10905 FormatStyle Style = getWebKitStyle();
10906
10907 // Don't indent in outer namespaces.
10908 verifyFormat("namespace outer {\n"
10909 "int i;\n"
10910 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010911 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010912 "} // namespace inner\n"
10913 "} // namespace outer\n"
10914 "namespace other_outer {\n"
10915 "int i;\n"
10916 "}",
10917 Style);
10918
10919 // Don't indent case labels.
10920 verifyFormat("switch (variable) {\n"
10921 "case 1:\n"
10922 "case 2:\n"
10923 " doSomething();\n"
10924 " break;\n"
10925 "default:\n"
10926 " ++variable;\n"
10927 "}",
10928 Style);
10929
10930 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010931 EXPECT_EQ("void f()\n"
10932 "{\n"
10933 " if (aaaaaaaaaaaaaaaa\n"
10934 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10935 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10936 " return;\n"
10937 "}",
10938 format("void f() {\n"
10939 "if (aaaaaaaaaaaaaaaa\n"
10940 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10941 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10942 "return;\n"
10943 "}",
10944 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010945
Daniel Jasper35995672014-04-29 14:05:20 +000010946 // Allow functions on a single line.
10947 verifyFormat("void f() { return; }", Style);
10948
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010949 // Constructor initializers are formatted one per line with the "," on the
10950 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010951 verifyFormat("Constructor()\n"
10952 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10953 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010954 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010955 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10956 "{\n"
10957 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010958 Style);
10959 verifyFormat("SomeClass::Constructor()\n"
10960 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010961 "{\n"
10962 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010963 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010964 EXPECT_EQ("SomeClass::Constructor()\n"
10965 " : a(a)\n"
10966 "{\n"
10967 "}",
10968 format("SomeClass::Constructor():a(a){}", Style));
10969 verifyFormat("SomeClass::Constructor()\n"
10970 " : a(a)\n"
10971 " , b(b)\n"
10972 " , c(c)\n"
10973 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010974 "}",
10975 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010976 verifyFormat("SomeClass::Constructor()\n"
10977 " : a(a)\n"
10978 "{\n"
10979 " foo();\n"
10980 " bar();\n"
10981 "}",
10982 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010983
Daniel Jasper65ee3472013-07-31 23:16:02 +000010984 // Access specifiers should be aligned left.
10985 verifyFormat("class C {\n"
10986 "public:\n"
10987 " int i;\n"
10988 "};",
10989 Style);
10990
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010991 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010992 verifyFormat("int a; // Do not\n"
10993 "double b; // align comments.",
10994 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010995
Daniel Jasper3219e432014-12-02 13:24:51 +000010996 // Do not align operands.
10997 EXPECT_EQ("ASSERT(aaaa\n"
10998 " || bbbb);",
10999 format("ASSERT ( aaaa\n||bbbb);", Style));
11000
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011001 // Accept input's line breaks.
11002 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
11003 " || bbbbbbbbbbbbbbb) {\n"
11004 " i++;\n"
11005 "}",
11006 format("if (aaaaaaaaaaaaaaa\n"
11007 "|| bbbbbbbbbbbbbbb) { i++; }",
11008 Style));
11009 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
11010 " i++;\n"
11011 "}",
11012 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000011013
11014 // Don't automatically break all macro definitions (llvm.org/PR17842).
11015 verifyFormat("#define aNumber 10", Style);
11016 // However, generally keep the line breaks that the user authored.
11017 EXPECT_EQ("#define aNumber \\\n"
11018 " 10",
11019 format("#define aNumber \\\n"
11020 " 10",
11021 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000011022
11023 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011024 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
11025 " copyItems:YES];",
11026 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
11027 "copyItems:YES];",
11028 Style));
11029 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
11030 " copyItems:YES];",
11031 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
11032 " copyItems:YES];",
11033 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000011034 // FIXME: This does not seem right, there should be more indentation before
11035 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011036 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000011037 " @\"a\",\n"
11038 " @\"a\"\n"
11039 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011040 " copyItems:YES];",
11041 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
11042 " @\"a\",\n"
11043 " @\"a\"\n"
11044 " ]\n"
11045 " copyItems:YES];",
11046 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011047 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000011048 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11049 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000011050 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
11051 " copyItems:YES];",
11052 Style));
11053
11054 verifyFormat("[self.a b:c c:d];", Style);
11055 EXPECT_EQ("[self.a b:c\n"
11056 " c:d];",
11057 format("[self.a b:c\n"
11058 "c:d];",
11059 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000011060}
11061
Manuel Klimekffdeb592013-09-03 15:10:01 +000011062TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011063 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
11064 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
11065 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
11066 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
11067 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000011068 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000011069 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011070 verifyFormat("void f() {\n"
11071 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
11072 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011073 verifyFormat("void f() {\n"
11074 " other(x.begin(), //\n"
11075 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000011076 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011077 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000011078 verifyFormat("SomeFunction([]() { // A cool function...\n"
11079 " return 43;\n"
11080 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000011081 EXPECT_EQ("SomeFunction([]() {\n"
11082 "#define A a\n"
11083 " return 43;\n"
11084 "});",
11085 format("SomeFunction([](){\n"
11086 "#define A a\n"
11087 "return 43;\n"
11088 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000011089 verifyFormat("void f() {\n"
11090 " SomeFunction([](decltype(x), A *a) {});\n"
11091 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011092 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11093 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000011094 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
11095 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11096 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011097 verifyFormat("Constructor()\n"
11098 " : Field([] { // comment\n"
11099 " int i;\n"
11100 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011101 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11102 " return some_parameter.size();\n"
11103 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011104 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11105 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011106 verifyFormat("int i = aaaaaa ? 1 //\n"
11107 " : [] {\n"
11108 " return 2; //\n"
11109 " }();");
11110 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11111 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11112 " return x == 2; // force break\n"
11113 " });");
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011114 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n"
11115 " int iiiiiiiiiiii) {\n"
11116 " return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n"
11117 "});",
11118 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011119 verifyFormat("SomeFunction({[&] {\n"
11120 " // comment\n"
11121 " },\n"
11122 " [&] {\n"
11123 " // comment\n"
11124 " }});");
11125 verifyFormat("SomeFunction({[&] {\n"
11126 " // comment\n"
11127 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011128 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11129 " [&]() { return true; },\n"
11130 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011131
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011132 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011133 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011134 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011135 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11136 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011137 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011138 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011139 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11140 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011141 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011142 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11143 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011144 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011145 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011146 verifyFormat(
11147 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11148 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11149 " return aaaaaaaaaaaaaaaaa;\n"
11150 " });",
11151 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011152 verifyFormat("[]() //\n"
11153 " -> int {\n"
11154 " return 1; //\n"
11155 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011156
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011157 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011158 verifyFormat("SomeFunction(\n"
11159 " []() {\n"
11160 " int i = 42;\n"
11161 " return i;\n"
11162 " },\n"
11163 " []() {\n"
11164 " int j = 43;\n"
11165 " return j;\n"
11166 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011167
Daniel Jasperda18fd82014-06-10 06:39:03 +000011168 // More complex introducers.
11169 verifyFormat("return [i, args...] {};");
11170
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011171 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011172 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011173 verifyFormat("double &operator[](int i) { return 0; }\n"
11174 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011175 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011176 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011177 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011178
11179 // Other corner cases.
11180 verifyFormat("void f() {\n"
11181 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
11182 " );\n"
11183 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011184
11185 // Lambdas created through weird macros.
11186 verifyFormat("void f() {\n"
11187 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011188 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011189 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011190
11191 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11192 " doo_dah();\n"
11193 " doo_dah();\n"
11194 " })) {\n"
11195 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011196 verifyFormat("auto lambda = []() {\n"
11197 " int a = 2\n"
11198 "#if A\n"
11199 " + 2\n"
11200 "#endif\n"
11201 " ;\n"
11202 "};");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011203}
11204
Manuel Klimek516e0542013-09-04 13:25:30 +000011205TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011206 FormatStyle ShortBlocks = getLLVMStyle();
11207 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11208 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11209 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11210 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11211 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11212 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11213 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011214
Daniel Jasper76284682014-10-22 09:12:44 +000011215 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11216 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11217 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011218
Daniel Jasper76284682014-10-22 09:12:44 +000011219 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011220 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011221 "}];");
11222 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011223 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011224 "}]};");
11225 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011226 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011227 "}];");
11228 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011229 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011230 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011231 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011232 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011233 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011234 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011235 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011236
11237 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011238 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011239 "}];",
11240 getLLVMStyleWithColumns(60));
11241 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011242 " NSString *path = [self sessionFilePath];\n"
11243 " if (path) {\n"
11244 " // ...\n"
11245 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011246 "});");
11247 verifyFormat("[[SessionService sharedService]\n"
11248 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011249 " if (window) {\n"
11250 " [self windowDidLoad:window];\n"
11251 " } else {\n"
11252 " [self errorLoadingWindow];\n"
11253 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011254 " }];");
11255 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011256 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011257 "};\n",
11258 getLLVMStyleWithColumns(40));
11259 verifyFormat("[[SessionService sharedService]\n"
11260 " loadWindowWithCompletionBlock: //\n"
11261 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011262 " if (window) {\n"
11263 " [self windowDidLoad:window];\n"
11264 " } else {\n"
11265 " [self errorLoadingWindow];\n"
11266 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011267 " }];",
11268 getLLVMStyleWithColumns(60));
11269 verifyFormat("[myObject doSomethingWith:arg1\n"
11270 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011271 " // ...\n"
11272 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011273 " }\n"
11274 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011275 " // ...\n"
11276 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011277 " }\n"
11278 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011279 " // ...\n"
11280 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011281 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011282 verifyFormat("[myObject doSomethingWith:arg1\n"
11283 " firstBlock:-1\n"
11284 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011285 " // ...\n"
11286 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011287 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011288
11289 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011290 " @autoreleasepool {\n"
11291 " if (a) {\n"
11292 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011293 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011294 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011295 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011296 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011297 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11298 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011299
11300 FormatStyle FourIndent = getLLVMStyle();
11301 FourIndent.ObjCBlockIndentWidth = 4;
11302 verifyFormat("[operation setCompletionBlock:^{\n"
11303 " [self onOperationDone];\n"
11304 "}];",
11305 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011306}
11307
Daniel Jasper289afc02015-04-23 09:23:17 +000011308TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11309 FormatStyle ZeroColumn = getLLVMStyle();
11310 ZeroColumn.ColumnLimit = 0;
11311
11312 verifyFormat("[[SessionService sharedService] "
11313 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11314 " if (window) {\n"
11315 " [self windowDidLoad:window];\n"
11316 " } else {\n"
11317 " [self errorLoadingWindow];\n"
11318 " }\n"
11319 "}];",
11320 ZeroColumn);
11321 EXPECT_EQ("[[SessionService sharedService]\n"
11322 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11323 " if (window) {\n"
11324 " [self windowDidLoad:window];\n"
11325 " } else {\n"
11326 " [self errorLoadingWindow];\n"
11327 " }\n"
11328 " }];",
11329 format("[[SessionService sharedService]\n"
11330 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11331 " if (window) {\n"
11332 " [self windowDidLoad:window];\n"
11333 " } else {\n"
11334 " [self errorLoadingWindow];\n"
11335 " }\n"
11336 "}];",
11337 ZeroColumn));
11338 verifyFormat("[myObject doSomethingWith:arg1\n"
11339 " firstBlock:^(Foo *a) {\n"
11340 " // ...\n"
11341 " int i;\n"
11342 " }\n"
11343 " secondBlock:^(Bar *b) {\n"
11344 " // ...\n"
11345 " int i;\n"
11346 " }\n"
11347 " thirdBlock:^Foo(Bar *b) {\n"
11348 " // ...\n"
11349 " int i;\n"
11350 " }];",
11351 ZeroColumn);
11352 verifyFormat("f(^{\n"
11353 " @autoreleasepool {\n"
11354 " if (a) {\n"
11355 " g();\n"
11356 " }\n"
11357 " }\n"
11358 "});",
11359 ZeroColumn);
11360 verifyFormat("void (^largeBlock)(void) = ^{\n"
11361 " // ...\n"
11362 "};",
11363 ZeroColumn);
11364
11365 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11366 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011367 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011368 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11369 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11370 " int i;\n"
11371 "};",
11372 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11373}
11374
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011375TEST_F(FormatTest, SupportsCRLF) {
11376 EXPECT_EQ("int a;\r\n"
11377 "int b;\r\n"
11378 "int c;\r\n",
11379 format("int a;\r\n"
11380 " int b;\r\n"
11381 " int c;\r\n",
11382 getLLVMStyle()));
11383 EXPECT_EQ("int a;\r\n"
11384 "int b;\r\n"
11385 "int c;\r\n",
11386 format("int a;\r\n"
11387 " int b;\n"
11388 " int c;\r\n",
11389 getLLVMStyle()));
11390 EXPECT_EQ("int a;\n"
11391 "int b;\n"
11392 "int c;\n",
11393 format("int a;\r\n"
11394 " int b;\n"
11395 " int c;\n",
11396 getLLVMStyle()));
11397 EXPECT_EQ("\"aaaaaaa \"\r\n"
11398 "\"bbbbbbb\";\r\n",
11399 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11400 EXPECT_EQ("#define A \\\r\n"
11401 " b; \\\r\n"
11402 " c; \\\r\n"
11403 " d;\r\n",
11404 format("#define A \\\r\n"
11405 " b; \\\r\n"
11406 " c; d; \r\n",
11407 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011408
11409 EXPECT_EQ("/*\r\n"
11410 "multi line block comments\r\n"
11411 "should not introduce\r\n"
11412 "an extra carriage return\r\n"
11413 "*/\r\n",
11414 format("/*\r\n"
11415 "multi line block comments\r\n"
11416 "should not introduce\r\n"
11417 "an extra carriage return\r\n"
11418 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011419}
11420
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011421TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11422 verifyFormat("MY_CLASS(C) {\n"
11423 " int i;\n"
11424 " int j;\n"
11425 "};");
11426}
11427
Daniel Jasper6633ab82013-10-18 10:38:14 +000011428TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11429 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11430 TwoIndent.ContinuationIndentWidth = 2;
11431
11432 EXPECT_EQ("int i =\n"
11433 " longFunction(\n"
11434 " arg);",
11435 format("int i = longFunction(arg);", TwoIndent));
11436
11437 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11438 SixIndent.ContinuationIndentWidth = 6;
11439
11440 EXPECT_EQ("int i =\n"
11441 " longFunction(\n"
11442 " arg);",
11443 format("int i = longFunction(arg);", SixIndent));
11444}
11445
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011446TEST_F(FormatTest, SpacesInAngles) {
11447 FormatStyle Spaces = getLLVMStyle();
11448 Spaces.SpacesInAngles = true;
11449
11450 verifyFormat("static_cast< int >(arg);", Spaces);
11451 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11452 verifyFormat("f< int, float >();", Spaces);
11453 verifyFormat("template <> g() {}", Spaces);
11454 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011455 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11456 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11457 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011458
11459 Spaces.Standard = FormatStyle::LS_Cpp03;
11460 Spaces.SpacesInAngles = true;
11461 verifyFormat("A< A< int > >();", Spaces);
11462
11463 Spaces.SpacesInAngles = false;
11464 verifyFormat("A<A<int> >();", Spaces);
11465
11466 Spaces.Standard = FormatStyle::LS_Cpp11;
11467 Spaces.SpacesInAngles = true;
11468 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011469
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011470 Spaces.SpacesInAngles = false;
11471 verifyFormat("A<A<int>>();", Spaces);
11472}
11473
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011474TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11475 FormatStyle Style = getLLVMStyle();
11476 Style.SpaceAfterTemplateKeyword = false;
11477 verifyFormat("template<int> void foo();", Style);
11478}
11479
Jacques Pienaarfc275112015-02-18 23:48:37 +000011480TEST_F(FormatTest, TripleAngleBrackets) {
11481 verifyFormat("f<<<1, 1>>>();");
11482 verifyFormat("f<<<1, 1, 1, s>>>();");
11483 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011484 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011485 verifyFormat("f<param><<<1, 1>>>();");
11486 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011487 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011488 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11489 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011490 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11491 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011492}
11493
11494TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011495 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011496 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011497 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11498 "aaallvm::outs() <<");
11499 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11500 "aaaallvm::outs()\n <<");
11501}
11502
Manuel Klimek819788d2014-03-18 11:22:45 +000011503TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11504 std::string code = "#if A\n"
11505 "#if B\n"
11506 "a.\n"
11507 "#endif\n"
11508 " a = 1;\n"
11509 "#else\n"
11510 "#endif\n"
11511 "#if C\n"
11512 "#else\n"
11513 "#endif\n";
11514 EXPECT_EQ(code, format(code));
11515}
11516
Manuel Klimek68b03042014-04-14 09:14:11 +000011517TEST_F(FormatTest, HandleConflictMarkers) {
11518 // Git/SVN conflict markers.
11519 EXPECT_EQ("int a;\n"
11520 "void f() {\n"
11521 " callme(some(parameter1,\n"
11522 "<<<<<<< text by the vcs\n"
11523 " parameter2),\n"
11524 "||||||| text by the vcs\n"
11525 " parameter2),\n"
11526 " parameter3,\n"
11527 "======= text by the vcs\n"
11528 " parameter2, parameter3),\n"
11529 ">>>>>>> text by the vcs\n"
11530 " otherparameter);\n",
11531 format("int a;\n"
11532 "void f() {\n"
11533 " callme(some(parameter1,\n"
11534 "<<<<<<< text by the vcs\n"
11535 " parameter2),\n"
11536 "||||||| text by the vcs\n"
11537 " parameter2),\n"
11538 " parameter3,\n"
11539 "======= text by the vcs\n"
11540 " parameter2,\n"
11541 " parameter3),\n"
11542 ">>>>>>> text by the vcs\n"
11543 " otherparameter);\n"));
11544
11545 // Perforce markers.
11546 EXPECT_EQ("void f() {\n"
11547 " function(\n"
11548 ">>>> text by the vcs\n"
11549 " parameter,\n"
11550 "==== text by the vcs\n"
11551 " parameter,\n"
11552 "==== text by the vcs\n"
11553 " parameter,\n"
11554 "<<<< text by the vcs\n"
11555 " parameter);\n",
11556 format("void f() {\n"
11557 " function(\n"
11558 ">>>> text by the vcs\n"
11559 " parameter,\n"
11560 "==== text by the vcs\n"
11561 " parameter,\n"
11562 "==== text by the vcs\n"
11563 " parameter,\n"
11564 "<<<< text by the vcs\n"
11565 " parameter);\n"));
11566
11567 EXPECT_EQ("<<<<<<<\n"
11568 "|||||||\n"
11569 "=======\n"
11570 ">>>>>>>",
11571 format("<<<<<<<\n"
11572 "|||||||\n"
11573 "=======\n"
11574 ">>>>>>>"));
11575
11576 EXPECT_EQ("<<<<<<<\n"
11577 "|||||||\n"
11578 "int i;\n"
11579 "=======\n"
11580 ">>>>>>>",
11581 format("<<<<<<<\n"
11582 "|||||||\n"
11583 "int i;\n"
11584 "=======\n"
11585 ">>>>>>>"));
11586
11587 // FIXME: Handle parsing of macros around conflict markers correctly:
11588 EXPECT_EQ("#define Macro \\\n"
11589 "<<<<<<<\n"
11590 "Something \\\n"
11591 "|||||||\n"
11592 "Else \\\n"
11593 "=======\n"
11594 "Other \\\n"
11595 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011596 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011597 format("#define Macro \\\n"
11598 "<<<<<<<\n"
11599 " Something \\\n"
11600 "|||||||\n"
11601 " Else \\\n"
11602 "=======\n"
11603 " Other \\\n"
11604 ">>>>>>>\n"
11605 " End\n"
11606 "int i;\n"));
11607}
11608
Daniel Jasper471894432014-08-06 13:40:26 +000011609TEST_F(FormatTest, DisableRegions) {
11610 EXPECT_EQ("int i;\n"
11611 "// clang-format off\n"
11612 " int j;\n"
11613 "// clang-format on\n"
11614 "int k;",
11615 format(" int i;\n"
11616 " // clang-format off\n"
11617 " int j;\n"
11618 " // clang-format on\n"
11619 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011620 EXPECT_EQ("int i;\n"
11621 "/* clang-format off */\n"
11622 " int j;\n"
11623 "/* clang-format on */\n"
11624 "int k;",
11625 format(" int i;\n"
11626 " /* clang-format off */\n"
11627 " int j;\n"
11628 " /* clang-format on */\n"
11629 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011630
11631 // Don't reflow comments within disabled regions.
11632 EXPECT_EQ(
11633 "// clang-format off\n"
11634 "// long long long long long long line\n"
11635 "/* clang-format on */\n"
11636 "/* long long long\n"
11637 " * long long long\n"
11638 " * line */\n"
11639 "int i;\n"
11640 "/* clang-format off */\n"
11641 "/* long long long long long long line */\n",
11642 format("// clang-format off\n"
11643 "// long long long long long long line\n"
11644 "/* clang-format on */\n"
11645 "/* long long long long long long line */\n"
11646 "int i;\n"
11647 "/* clang-format off */\n"
11648 "/* long long long long long long line */\n",
11649 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011650}
11651
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011652TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11653 format("? ) =");
11654 verifyNoCrash("#define a\\\n /**/}");
11655}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011656
Daniel Jasper498f5582015-12-25 08:53:31 +000011657TEST_F(FormatTest, FormatsTableGenCode) {
11658 FormatStyle Style = getLLVMStyle();
11659 Style.Language = FormatStyle::LK_TableGen;
11660 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11661}
11662
Nico Weberb2673a12016-11-10 21:49:25 +000011663TEST_F(FormatTest, ArrayOfTemplates) {
11664 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11665 format("auto a = new unique_ptr<int > [ 10];"));
11666
11667 FormatStyle Spaces = getLLVMStyle();
11668 Spaces.SpacesInSquareBrackets = true;
11669 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11670 format("auto a = new unique_ptr<int > [10];", Spaces));
11671}
11672
11673TEST_F(FormatTest, ArrayAsTemplateType) {
11674 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11675 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11676
11677 FormatStyle Spaces = getLLVMStyle();
11678 Spaces.SpacesInSquareBrackets = true;
11679 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11680 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11681}
11682
Eric Liu547d8792016-03-24 13:22:42 +000011683TEST(FormatStyle, GetStyleOfFile) {
11684 vfs::InMemoryFileSystem FS;
11685 // Test 1: format file in the same directory.
11686 ASSERT_TRUE(
11687 FS.addFile("/a/.clang-format", 0,
11688 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11689 ASSERT_TRUE(
11690 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011691 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011692 ASSERT_TRUE((bool)Style1);
11693 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011694
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011695 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011696 ASSERT_TRUE(
11697 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011698 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011699 ASSERT_TRUE((bool)Style2);
11700 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011701
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011702 // Test 2.2: no format on 'none' fallback style.
11703 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11704 ASSERT_TRUE((bool)Style2);
11705 ASSERT_EQ(*Style2, getNoStyle());
11706
11707 // Test 2.3: format if config is found with no based style while fallback is
11708 // 'none'.
11709 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11710 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11711 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11712 ASSERT_TRUE((bool)Style2);
11713 ASSERT_EQ(*Style2, getLLVMStyle());
11714
11715 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11716 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11717 ASSERT_TRUE((bool)Style2);
11718 ASSERT_EQ(*Style2, getLLVMStyle());
11719
Eric Liu547d8792016-03-24 13:22:42 +000011720 // Test 3: format file in parent directory.
11721 ASSERT_TRUE(
11722 FS.addFile("/c/.clang-format", 0,
11723 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11724 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11725 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011726 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011727 ASSERT_TRUE((bool)Style3);
11728 ASSERT_EQ(*Style3, getGoogleStyle());
11729
11730 // Test 4: error on invalid fallback style
11731 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11732 ASSERT_FALSE((bool)Style4);
11733 llvm::consumeError(Style4.takeError());
11734
11735 // Test 5: error on invalid yaml on command line
11736 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11737 ASSERT_FALSE((bool)Style5);
11738 llvm::consumeError(Style5.takeError());
11739
11740 // Test 6: error on invalid style
11741 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11742 ASSERT_FALSE((bool)Style6);
11743 llvm::consumeError(Style6.takeError());
11744
11745 // Test 7: found config file, error on parsing it
11746 ASSERT_TRUE(
11747 FS.addFile("/d/.clang-format", 0,
11748 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11749 "InvalidKey: InvalidValue")));
11750 ASSERT_TRUE(
11751 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11752 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11753 ASSERT_FALSE((bool)Style7);
11754 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011755}
11756
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011757TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11758 // Column limit is 20.
11759 std::string Code = "Type *a =\n"
11760 " new Type();\n"
11761 "g(iiiii, 0, jjjjj,\n"
11762 " 0, kkkkk, 0, mm);\n"
11763 "int bad = format ;";
11764 std::string Expected = "auto a = new Type();\n"
11765 "g(iiiii, nullptr,\n"
11766 " jjjjj, nullptr,\n"
11767 " kkkkk, nullptr,\n"
11768 " mm);\n"
11769 "int bad = format ;";
11770 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011771 tooling::Replacements Replaces = toReplacements(
11772 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11773 "auto "),
11774 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11775 "nullptr"),
11776 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11777 "nullptr"),
11778 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11779 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011780
11781 format::FormatStyle Style = format::getLLVMStyle();
11782 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011783 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11784 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11785 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11786 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11787 EXPECT_TRUE(static_cast<bool>(Result));
11788 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011789}
11790
Eric Liubaf58c22016-05-18 13:43:48 +000011791TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11792 std::string Code = "#include \"a.h\"\n"
11793 "#include \"c.h\"\n"
11794 "\n"
11795 "int main() {\n"
11796 " return 0;\n"
11797 "}";
11798 std::string Expected = "#include \"a.h\"\n"
11799 "#include \"b.h\"\n"
11800 "#include \"c.h\"\n"
11801 "\n"
11802 "int main() {\n"
11803 " return 0;\n"
11804 "}";
11805 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011806 tooling::Replacements Replaces = toReplacements(
11807 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11808 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011809
11810 format::FormatStyle Style = format::getLLVMStyle();
11811 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011812 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11813 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11814 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11815 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11816 EXPECT_TRUE(static_cast<bool>(Result));
11817 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011818}
11819
Krasimir Georgiev13dbaa02017-02-01 10:10:04 +000011820TEST_F(FormatTest, AlignTrailingComments) {
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011821 EXPECT_EQ("#define MACRO(V) \\\n"
11822 " V(Rt2) /* one more char */ \\\n"
11823 " V(Rs) /* than here */ \\\n"
11824 "/* comment 3 */\n",
11825 format("#define MACRO(V)\\\n"
11826 "V(Rt2) /* one more char */ \\\n"
11827 "V(Rs) /* than here */ \\\n"
11828 "/* comment 3 */ \\\n",
11829 getLLVMStyleWithColumns(40)));
Krasimir Georgiev13dbaa02017-02-01 10:10:04 +000011830 EXPECT_EQ("int i = f(abc, // line 1\n"
11831 " d, // line 2\n"
11832 " // line 3\n"
11833 " b);",
11834 format("int i = f(abc, // line 1\n"
11835 " d, // line 2\n"
11836 " // line 3\n"
11837 " b);",
11838 getLLVMStyleWithColumns(40)));
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011839}
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011840} // end namespace
11841} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011842} // end namespace clang