blob: fb770064753a2319f27836c9cc56e7829477a32c [file] [log] [blame]
Daniel Jasperf7935112012-12-03 18:12:45 +00001//===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Chandler Carruth320d9662012-12-04 09:45:34 +000010#include "clang/Format/Format.h"
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011
Eric Liu40ef2fb2016-08-01 10:16:37 +000012#include "../Tooling/ReplacementTest.h"
Manuel Klimekb12e5a52016-03-01 12:37:30 +000013#include "FormatTestUtils.h"
14
15#include "clang/Frontend/TextDiagnosticPrinter.h"
Chandler Carruth4b417452013-01-19 08:09:44 +000016#include "llvm/Support/Debug.h"
Eric Liu547d8792016-03-24 13:22:42 +000017#include "llvm/Support/MemoryBuffer.h"
Chandler Carruth4b417452013-01-19 08:09:44 +000018#include "gtest/gtest.h"
Manuel Klimek24998102013-01-16 14:55:28 +000019
Chandler Carruth10346662014-04-22 03:17:02 +000020#define DEBUG_TYPE "format-test"
21
Eric Liu40ef2fb2016-08-01 10:16:37 +000022using clang::tooling::ReplacementTest;
23using clang::tooling::toReplacements;
24
Daniel Jasperf7935112012-12-03 18:12:45 +000025namespace clang {
26namespace format {
Daniel Jasperd246a5a2015-06-15 15:25:11 +000027namespace {
Daniel Jasperf7935112012-12-03 18:12:45 +000028
Daniel Jaspera44991332015-04-29 13:06:49 +000029FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); }
Nico Weber514ecc82014-02-02 20:50:45 +000030
Daniel Jasperf7935112012-12-03 18:12:45 +000031class FormatTest : public ::testing::Test {
32protected:
Manuel Klimekec5c3db2015-05-07 12:26:30 +000033 enum IncompleteCheck {
34 IC_ExpectComplete,
35 IC_ExpectIncomplete,
36 IC_DoNotCheck
37 };
38
Daniel Jasperd246a5a2015-06-15 15:25:11 +000039 std::string format(llvm::StringRef Code,
40 const FormatStyle &Style = getLLVMStyle(),
Manuel Klimekec5c3db2015-05-07 12:26:30 +000041 IncompleteCheck CheckIncomplete = IC_ExpectComplete) {
Manuel Klimek24998102013-01-16 14:55:28 +000042 DEBUG(llvm::errs() << "---\n");
Manuel Klimek71814b42013-10-11 21:25:45 +000043 DEBUG(llvm::errs() << Code << "\n\n");
Daniel Jasperd246a5a2015-06-15 15:25:11 +000044 std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
Manuel Klimekec5c3db2015-05-07 12:26:30 +000045 bool IncompleteFormat = false;
46 tooling::Replacements Replaces =
47 reformat(Style, Code, Ranges, "<stdin>", &IncompleteFormat);
48 if (CheckIncomplete != IC_DoNotCheck) {
49 bool ExpectedIncompleteFormat = CheckIncomplete == IC_ExpectIncomplete;
50 EXPECT_EQ(ExpectedIncompleteFormat, IncompleteFormat) << Code << "\n\n";
51 }
Daniel Jasperec04c0d2013-05-16 10:40:07 +000052 ReplacementCount = Replaces.size();
Eric Liu4f8d9942016-07-11 13:53:12 +000053 auto Result = applyAllReplacements(Code, Replaces);
54 EXPECT_TRUE(static_cast<bool>(Result));
55 DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
56 return *Result;
Daniel Jasperf7935112012-12-03 18:12:45 +000057 }
58
Manuel Klimekb69e3c62013-01-02 18:33:23 +000059 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
60 FormatStyle Style = getLLVMStyle();
61 Style.ColumnLimit = ColumnLimit;
62 return Style;
63 }
64
Daniel Jasper1b750ed2013-01-14 16:24:39 +000065 FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
66 FormatStyle Style = getGoogleStyle();
67 Style.ColumnLimit = ColumnLimit;
68 return Style;
69 }
70
Manuel Klimekb69e3c62013-01-02 18:33:23 +000071 void verifyFormat(llvm::StringRef Code,
72 const FormatStyle &Style = getLLVMStyle()) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000073 EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
Daniel Jasperf7935112012-12-03 18:12:45 +000074 }
75
Manuel Klimekec5c3db2015-05-07 12:26:30 +000076 void verifyIncompleteFormat(llvm::StringRef Code,
77 const FormatStyle &Style = getLLVMStyle()) {
78 EXPECT_EQ(Code.str(),
79 format(test::messUp(Code), Style, IC_ExpectIncomplete));
80 }
81
Daniel Jasperf7935112012-12-03 18:12:45 +000082 void verifyGoogleFormat(llvm::StringRef Code) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000083 verifyFormat(Code, getGoogleStyle());
Daniel Jasperf7935112012-12-03 18:12:45 +000084 }
Daniel Jasper5b49f472013-01-23 12:10:53 +000085
86 void verifyIndependentOfContext(llvm::StringRef text) {
87 verifyFormat(text);
88 verifyFormat(llvm::Twine("void f() { " + text + " }").str());
89 }
Daniel Jasper7b038a22013-01-30 09:46:12 +000090
Daniel Jasper675b4f82015-01-19 10:51:23 +000091 /// \brief Verify that clang-format does not crash on the given input.
92 void verifyNoCrash(llvm::StringRef Code,
93 const FormatStyle &Style = getLLVMStyle()) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +000094 format(Code, Style, IC_DoNotCheck);
Daniel Jasper675b4f82015-01-19 10:51:23 +000095 }
96
Daniel Jasper7b038a22013-01-30 09:46:12 +000097 int ReplacementCount;
Daniel Jasperf7935112012-12-03 18:12:45 +000098};
99
Manuel Klimek52b15152013-01-09 15:25:02 +0000100TEST_F(FormatTest, MessUp) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +0000101 EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
102 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
103 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
104 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
105 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
Manuel Klimek52b15152013-01-09 15:25:02 +0000106}
107
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000108//===----------------------------------------------------------------------===//
109// Basic function tests.
110//===----------------------------------------------------------------------===//
111
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +0000112TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000113 EXPECT_EQ(";", format(";"));
114}
115
116TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
117 EXPECT_EQ("int i;", format(" int i;"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +0000118 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000119 EXPECT_EQ("int i;\nint j;", format(" int i; int j;"));
120 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;"));
121}
122
123TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
124 EXPECT_EQ("int i;", format("int\ni;"));
125}
126
127TEST_F(FormatTest, FormatsNestedBlockStatements) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000128 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000129}
130
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000131TEST_F(FormatTest, FormatsNestedCall) {
132 verifyFormat("Method(f1, f2(f3));");
133 verifyFormat("Method(f1(f2, f3()));");
Daniel Jasper48cb3b92013-01-13 08:19:51 +0000134 verifyFormat("Method(f1(f2, (f3())));");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000135}
136
Daniel Jasper14556742013-02-07 21:08:36 +0000137TEST_F(FormatTest, NestedNameSpecifiers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +0000138 verifyFormat("vector<::Type> v;");
Daniel Jasper14556742013-02-07 21:08:36 +0000139 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
Daniel Jasper11be8ac2013-08-28 07:07:07 +0000140 verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
Daniel Jasperf322eb52014-10-23 20:22:22 +0000141 verifyFormat("bool a = 2 < ::SomeFunction();");
Daniel Jasper736c14f2013-01-16 07:19:28 +0000142}
143
Daniel Jasper7b038a22013-01-30 09:46:12 +0000144TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
145 EXPECT_EQ("if (a) {\n"
146 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000147 "}",
148 format("if(a){f();}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000149 EXPECT_EQ(4, ReplacementCount);
150 EXPECT_EQ("if (a) {\n"
151 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000152 "}",
153 format("if (a) {\n"
154 " f();\n"
155 "}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000156 EXPECT_EQ(0, ReplacementCount);
Daniel Jasperd6e61882015-06-17 12:23:15 +0000157 EXPECT_EQ("/*\r\n"
158 "\r\n"
159 "*/\r\n",
160 format("/*\r\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +0000161 "\r\n"
162 "*/\r\n"));
Daniel Jasperd6e61882015-06-17 12:23:15 +0000163 EXPECT_EQ(0, ReplacementCount);
Daniel Jasper7b038a22013-01-30 09:46:12 +0000164}
165
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000166TEST_F(FormatTest, RemovesEmptyLines) {
167 EXPECT_EQ("class C {\n"
168 " int i;\n"
169 "};",
170 format("class C {\n"
171 " int i;\n"
172 "\n"
173 "};"));
174
Nico Weber34272652014-11-13 16:25:37 +0000175 // Don't remove empty lines at the start of namespaces or extern "C" blocks.
Daniel Jasper01b35482014-03-21 13:03:33 +0000176 EXPECT_EQ("namespace N {\n"
177 "\n"
178 "int i;\n"
179 "}",
180 format("namespace N {\n"
181 "\n"
182 "int i;\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000183 "}",
184 getGoogleStyle()));
Nico Weber34272652014-11-13 16:25:37 +0000185 EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
186 "\n"
187 "int i;\n"
188 "}",
189 format("extern /**/ \"C\" /**/ {\n"
190 "\n"
191 "int i;\n"
192 "}",
193 getGoogleStyle()));
194
195 // ...but do keep inlining and removing empty lines for non-block extern "C"
196 // functions.
197 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
198 EXPECT_EQ("extern \"C\" int f() {\n"
199 " int i = 42;\n"
200 " return i;\n"
201 "}",
202 format("extern \"C\" int f() {\n"
203 "\n"
204 " int i = 42;\n"
205 " return i;\n"
206 "}",
207 getGoogleStyle()));
Daniel Jasper01b35482014-03-21 13:03:33 +0000208
Daniel Jasper11164bd2014-03-21 12:58:53 +0000209 // Remove empty lines at the beginning and end of blocks.
210 EXPECT_EQ("void f() {\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000211 "\n"
212 " if (a) {\n"
213 "\n"
214 " f();\n"
215 " }\n"
216 "}",
217 format("void f() {\n"
218 "\n"
219 " if (a) {\n"
220 "\n"
221 " f();\n"
222 "\n"
223 " }\n"
224 "\n"
225 "}",
226 getLLVMStyle()));
227 EXPECT_EQ("void f() {\n"
Daniel Jasper11164bd2014-03-21 12:58:53 +0000228 " if (a) {\n"
229 " f();\n"
230 " }\n"
231 "}",
232 format("void f() {\n"
233 "\n"
234 " if (a) {\n"
235 "\n"
236 " f();\n"
237 "\n"
238 " }\n"
239 "\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000240 "}",
241 getGoogleStyle()));
Daniel Jasper11164bd2014-03-21 12:58:53 +0000242
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000243 // Don't remove empty lines in more complex control statements.
244 EXPECT_EQ("void f() {\n"
245 " if (a) {\n"
246 " f();\n"
247 "\n"
248 " } else if (b) {\n"
249 " f();\n"
250 " }\n"
251 "}",
252 format("void f() {\n"
253 " if (a) {\n"
254 " f();\n"
255 "\n"
256 " } else if (b) {\n"
257 " f();\n"
258 "\n"
259 " }\n"
260 "\n"
261 "}"));
262
263 // FIXME: This is slightly inconsistent.
264 EXPECT_EQ("namespace {\n"
265 "int i;\n"
266 "}",
267 format("namespace {\n"
268 "int i;\n"
269 "\n"
270 "}"));
271 EXPECT_EQ("namespace {\n"
272 "int i;\n"
273 "\n"
274 "} // namespace",
275 format("namespace {\n"
276 "int i;\n"
277 "\n"
278 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000279
280 FormatStyle Style = getLLVMStyle();
281 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
282 Style.MaxEmptyLinesToKeep = 2;
283 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
284 Style.BraceWrapping.AfterClass = true;
285 Style.BraceWrapping.AfterFunction = true;
286 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
287
288 EXPECT_EQ("class Foo\n"
289 "{\n"
290 " Foo() {}\n"
291 "\n"
292 " void funk() {}\n"
293 "};",
294 format("class Foo\n"
295 "{\n"
296 " Foo()\n"
297 " {\n"
298 " }\n"
299 "\n"
300 " void funk() {}\n"
301 "};",
302 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000303}
304
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000305TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000306 verifyFormat("x = (a) and (b);");
307 verifyFormat("x = (a) or (b);");
308 verifyFormat("x = (a) bitand (b);");
309 verifyFormat("x = (a) bitor (b);");
310 verifyFormat("x = (a) not_eq (b);");
311 verifyFormat("x = (a) and_eq (b);");
312 verifyFormat("x = (a) or_eq (b);");
313 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000314}
315
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000316//===----------------------------------------------------------------------===//
317// Tests for control statements.
318//===----------------------------------------------------------------------===//
319
Daniel Jaspercdd06622013-05-14 10:31:09 +0000320TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000321 verifyFormat("if (true)\n f();\ng();");
322 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000323 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000324
Daniel Jasper3a685df2013-05-16 12:12:21 +0000325 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000326 AllowsMergedIf.AlignEscapedNewlinesLeft = true;
Daniel Jasperced17f82013-01-16 15:44:34 +0000327 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
328 verifyFormat("if (a)\n"
329 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000330 " f();",
331 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000332 verifyFormat("{\n"
333 " if (a)\n"
334 " label:\n"
335 " f();\n"
336 "}",
337 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000338 verifyFormat("#define A \\\n"
339 " if (a) \\\n"
340 " label: \\\n"
341 " f()",
342 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000343 verifyFormat("if (a)\n"
344 " ;",
345 AllowsMergedIf);
346 verifyFormat("if (a)\n"
347 " if (b) return;",
348 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000349
Daniel Jasper3a685df2013-05-16 12:12:21 +0000350 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000351 " f();\n",
352 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000353 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000354 " f();",
355 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000356 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000357 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000358 "}",
359 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000360 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000361 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000362 "}",
363 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000364
365 AllowsMergedIf.ColumnLimit = 14;
366 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000367 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000368 " return;",
369 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000370
371 AllowsMergedIf.ColumnLimit = 13;
372 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000373}
374
Daniel Jasper3a685df2013-05-16 12:12:21 +0000375TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
376 FormatStyle AllowsMergedLoops = getLLVMStyle();
377 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
378 verifyFormat("while (true) continue;", AllowsMergedLoops);
379 verifyFormat("for (;;) continue;", AllowsMergedLoops);
380 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
381 verifyFormat("while (true)\n"
382 " ;",
383 AllowsMergedLoops);
384 verifyFormat("for (;;)\n"
385 " ;",
386 AllowsMergedLoops);
387 verifyFormat("for (;;)\n"
388 " for (;;) continue;",
389 AllowsMergedLoops);
390 verifyFormat("for (;;) // Can't merge this\n"
391 " continue;",
392 AllowsMergedLoops);
393 verifyFormat("for (;;) /* still don't merge */\n"
394 " continue;",
395 AllowsMergedLoops);
396}
397
Daniel Jasper17605d32014-05-14 09:33:35 +0000398TEST_F(FormatTest, FormatShortBracedStatements) {
399 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
400 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
401
402 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
403 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
404
405 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
406 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
407 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
408 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
409 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
410 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
411 verifyFormat("if (true) { //\n"
412 " f();\n"
413 "}",
414 AllowSimpleBracedStatements);
415 verifyFormat("if (true) {\n"
416 " f();\n"
417 " f();\n"
418 "}",
419 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000420 verifyFormat("if (true) {\n"
421 " f();\n"
422 "} else {\n"
423 " f();\n"
424 "}",
425 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000426
Daniel Jasperbd630732014-05-22 13:25:26 +0000427 verifyFormat("template <int> struct A2 {\n"
428 " struct B {};\n"
429 "};",
430 AllowSimpleBracedStatements);
431
Daniel Jasper17605d32014-05-14 09:33:35 +0000432 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
433 verifyFormat("if (true) {\n"
434 " f();\n"
435 "}",
436 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000437 verifyFormat("if (true) {\n"
438 " f();\n"
439 "} else {\n"
440 " f();\n"
441 "}",
442 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000443
444 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
445 verifyFormat("while (true) {\n"
446 " f();\n"
447 "}",
448 AllowSimpleBracedStatements);
449 verifyFormat("for (;;) {\n"
450 " f();\n"
451 "}",
452 AllowSimpleBracedStatements);
453}
454
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000455TEST_F(FormatTest, ParseIfElse) {
456 verifyFormat("if (true)\n"
457 " if (true)\n"
458 " if (true)\n"
459 " f();\n"
460 " else\n"
461 " g();\n"
462 " else\n"
463 " h();\n"
464 "else\n"
465 " i();");
466 verifyFormat("if (true)\n"
467 " if (true)\n"
468 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000469 " if (true)\n"
470 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000471 " } else {\n"
472 " g();\n"
473 " }\n"
474 " else\n"
475 " h();\n"
476 "else {\n"
477 " i();\n"
478 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000479 verifyFormat("void f() {\n"
480 " if (a) {\n"
481 " } else {\n"
482 " }\n"
483 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000484}
485
486TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000487 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000488 verifyFormat("if (a)\n"
489 " f();\n"
490 "else if (b)\n"
491 " g();\n"
492 "else\n"
493 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000494 verifyFormat("if (a) {\n"
495 " f();\n"
496 "}\n"
497 "// or else ..\n"
498 "else {\n"
499 " g()\n"
500 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000501
502 verifyFormat("if (a) {\n"
503 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
504 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
505 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000506 verifyFormat("if (a) {\n"
507 "} else if (\n"
508 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
509 "}",
510 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000511}
512
Daniel Jasperf7935112012-12-03 18:12:45 +0000513TEST_F(FormatTest, FormatsForLoop) {
514 verifyFormat(
515 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000516 " ++VeryVeryLongLoopVariable)\n"
517 " ;");
518 verifyFormat("for (;;)\n"
519 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000520 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000521 verifyFormat("for (;;) {\n"
522 " f();\n"
523 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000524 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000525
526 verifyFormat(
527 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
528 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000529 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000530
531 verifyFormat(
532 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000533 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000534 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
535 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000536 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000537 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
538 " I = FD->getDeclsInPrototypeScope().begin(),\n"
539 " E = FD->getDeclsInPrototypeScope().end();\n"
540 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000541 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
542 " I = Container.begin(),\n"
543 " E = Container.end();\n"
544 " I != E; ++I) {\n}",
545 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000546
Daniel Jasper48c62f92013-01-28 17:30:17 +0000547 verifyFormat(
548 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
549 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000550 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
551 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000552 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000553 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
554 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
555 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000556 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
557 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
558 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000559 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
560 " aaaaaaaaaa);\n"
561 " iter; ++iter) {\n"
562 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000563 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
564 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
565 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
566 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000567
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000568 FormatStyle NoBinPacking = getLLVMStyle();
569 NoBinPacking.BinPackParameters = false;
570 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
571 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
572 " aaaaaaaaaaaaaaaa,\n"
573 " aaaaaaaaaaaaaaaa,\n"
574 " aaaaaaaaaaaaaaaa);\n"
575 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
576 "}",
577 NoBinPacking);
578 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000579 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
580 " E = UnwrappedLines.end();\n"
581 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000582 " ++I) {\n}",
583 NoBinPacking);
Daniel Jasperf7935112012-12-03 18:12:45 +0000584}
585
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000586TEST_F(FormatTest, RangeBasedForLoops) {
587 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
588 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
589 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
590 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000591 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
592 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000593 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
594 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000595}
596
Daniel Jaspere1e43192014-04-01 12:55:11 +0000597TEST_F(FormatTest, ForEachLoops) {
598 verifyFormat("void f() {\n"
599 " foreach (Item *item, itemlist) {}\n"
600 " Q_FOREACH (Item *item, itemlist) {}\n"
601 " BOOST_FOREACH (Item *item, itemlist) {}\n"
602 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
603 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000604
605 // As function-like macros.
606 verifyFormat("#define foreach(x, y)\n"
607 "#define Q_FOREACH(x, y)\n"
608 "#define BOOST_FOREACH(x, y)\n"
609 "#define UNKNOWN_FOREACH(x, y)\n");
610
611 // Not as function-like macros.
612 verifyFormat("#define foreach (x, y)\n"
613 "#define Q_FOREACH (x, y)\n"
614 "#define BOOST_FOREACH (x, y)\n"
615 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000616}
617
Daniel Jasperf7935112012-12-03 18:12:45 +0000618TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000619 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000620 verifyFormat("while (true)\n"
621 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000622 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000623 verifyFormat("while () {\n"
624 " f();\n"
625 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000626}
627
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000628TEST_F(FormatTest, FormatsDoWhile) {
629 verifyFormat("do {\n"
630 " do_something();\n"
631 "} while (something());");
632 verifyFormat("do\n"
633 " do_something();\n"
634 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000635}
636
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000637TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000638 verifyFormat("switch (x) {\n"
639 "case 1:\n"
640 " f();\n"
641 " break;\n"
642 "case kFoo:\n"
643 "case ns::kBar:\n"
644 "case kBaz:\n"
645 " break;\n"
646 "default:\n"
647 " g();\n"
648 " break;\n"
649 "}");
650 verifyFormat("switch (x) {\n"
651 "case 1: {\n"
652 " f();\n"
653 " break;\n"
654 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000655 "case 2: {\n"
656 " break;\n"
657 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000658 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000659 verifyFormat("switch (x) {\n"
660 "case 1: {\n"
661 " f();\n"
662 " {\n"
663 " g();\n"
664 " h();\n"
665 " }\n"
666 " break;\n"
667 "}\n"
668 "}");
669 verifyFormat("switch (x) {\n"
670 "case 1: {\n"
671 " f();\n"
672 " if (foo) {\n"
673 " g();\n"
674 " h();\n"
675 " }\n"
676 " break;\n"
677 "}\n"
678 "}");
679 verifyFormat("switch (x) {\n"
680 "case 1: {\n"
681 " f();\n"
682 " g();\n"
683 "} break;\n"
684 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000685 verifyFormat("switch (test)\n"
686 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000687 verifyFormat("switch (x) {\n"
688 "default: {\n"
689 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000690 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000691 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000692 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000693 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000694 "// if 1, do f()\n"
695 "case 1:\n"
696 " f();\n"
697 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000698 verifyFormat("switch (x) {\n"
699 "case 1:\n"
700 " // Do amazing stuff\n"
701 " {\n"
702 " f();\n"
703 " g();\n"
704 " }\n"
705 " break;\n"
706 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000707 verifyFormat("#define A \\\n"
708 " switch (x) { \\\n"
709 " case a: \\\n"
710 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000711 " }",
712 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000713 verifyFormat("#define OPERATION_CASE(name) \\\n"
714 " case OP_name: \\\n"
715 " return operations::Operation##name\n",
716 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000717 verifyFormat("switch (x) {\n"
718 "case 1:;\n"
719 "default:;\n"
720 " int i;\n"
721 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000722
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000723 verifyGoogleFormat("switch (x) {\n"
724 " case 1:\n"
725 " f();\n"
726 " break;\n"
727 " case kFoo:\n"
728 " case ns::kBar:\n"
729 " case kBaz:\n"
730 " break;\n"
731 " default:\n"
732 " g();\n"
733 " break;\n"
734 "}");
735 verifyGoogleFormat("switch (x) {\n"
736 " case 1: {\n"
737 " f();\n"
738 " break;\n"
739 " }\n"
740 "}");
741 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000742 " ;");
743
744 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
745 " case OP_name: \\\n"
746 " return operations::Operation##name\n");
747 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
748 " // Get the correction operation class.\n"
749 " switch (OpCode) {\n"
750 " CASE(Add);\n"
751 " CASE(Subtract);\n"
752 " default:\n"
753 " return operations::Unknown;\n"
754 " }\n"
755 "#undef OPERATION_CASE\n"
756 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000757 verifyFormat("DEBUG({\n"
758 " switch (x) {\n"
759 " case A:\n"
760 " f();\n"
761 " break;\n"
762 " // On B:\n"
763 " case B:\n"
764 " g();\n"
765 " break;\n"
766 " }\n"
767 "});");
Daniel Jasper031e2402014-04-28 07:48:36 +0000768 verifyFormat("switch (a) {\n"
769 "case (b):\n"
770 " return;\n"
771 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000772
773 verifyFormat("switch (a) {\n"
774 "case some_namespace::\n"
775 " some_constant:\n"
776 " return;\n"
777 "}",
778 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000779}
780
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000781TEST_F(FormatTest, CaseRanges) {
782 verifyFormat("switch (x) {\n"
783 "case 'A' ... 'Z':\n"
784 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000785 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000786 " break;\n"
787 "}");
788}
789
Daniel Jasperb87899b2014-09-10 13:11:45 +0000790TEST_F(FormatTest, ShortCaseLabels) {
791 FormatStyle Style = getLLVMStyle();
792 Style.AllowShortCaseLabelsOnASingleLine = true;
793 verifyFormat("switch (a) {\n"
794 "case 1: x = 1; break;\n"
795 "case 2: return;\n"
796 "case 3:\n"
797 "case 4:\n"
798 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +0000799 "case 6: // comment\n"
800 " return;\n"
801 "case 7:\n"
802 " // comment\n"
803 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +0000804 "case 8:\n"
805 " x = 8; // comment\n"
806 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000807 "default: y = 1; break;\n"
808 "}",
809 Style);
810 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +0000811 "#if FOO\n"
812 "case 0: return 0;\n"
813 "#endif\n"
814 "}",
815 Style);
816 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000817 "case 1: {\n"
818 "}\n"
819 "case 2: {\n"
820 " return;\n"
821 "}\n"
822 "case 3: {\n"
823 " x = 1;\n"
824 " return;\n"
825 "}\n"
826 "case 4:\n"
827 " if (x)\n"
828 " return;\n"
829 "}",
830 Style);
831 Style.ColumnLimit = 21;
832 verifyFormat("switch (a) {\n"
833 "case 1: x = 1; break;\n"
834 "case 2: return;\n"
835 "case 3:\n"
836 "case 4:\n"
837 "case 5: return;\n"
838 "default:\n"
839 " y = 1;\n"
840 " break;\n"
841 "}",
842 Style);
843}
844
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000845TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000846 verifyFormat("void f() {\n"
847 " some_code();\n"
848 "test_label:\n"
849 " some_other_code();\n"
850 " {\n"
851 " some_more_code();\n"
852 " another_label:\n"
853 " some_more_code();\n"
854 " }\n"
855 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +0000856 verifyFormat("{\n"
857 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000858 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +0000859 " some_other_code();\n"
860 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000861 verifyFormat("{\n"
862 " some_code();\n"
863 "test_label:;\n"
864 " int i = 0;\n"
865 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000866}
867
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000868//===----------------------------------------------------------------------===//
869// Tests for comments.
870//===----------------------------------------------------------------------===//
871
872TEST_F(FormatTest, UnderstandsSingleLineComments) {
Daniel Jasper55213652013-03-22 10:01:29 +0000873 verifyFormat("//* */");
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000874 verifyFormat("// line 1\n"
875 "// line 2\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000876 "void f() {}\n");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000877
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000878 verifyFormat("void f() {\n"
879 " // Doesn't do anything\n"
880 "}");
Daniel Jasper185de242013-07-11 13:48:16 +0000881 verifyFormat("SomeObject\n"
882 " // Calling someFunction on SomeObject\n"
883 " .someFunction();");
Daniel Jaspera0407742014-02-11 10:08:11 +0000884 verifyFormat("auto result = SomeObject\n"
885 " // Calling someFunction on SomeObject\n"
886 " .someFunction();");
Daniel Jasperaa701fa2013-01-18 08:44:07 +0000887 verifyFormat("void f(int i, // some comment (probably for i)\n"
888 " int j, // some comment (probably for j)\n"
Daniel Jasper942ee722013-01-13 16:10:20 +0000889 " int k); // some comment (probably for k)");
890 verifyFormat("void f(int i,\n"
891 " // some comment (probably for j)\n"
892 " int j,\n"
893 " // some comment (probably for k)\n"
894 " int k);");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000895
Daniel Jasperaa701fa2013-01-18 08:44:07 +0000896 verifyFormat("int i // This is a fancy variable\n"
897 " = 5; // with nicely aligned comment.");
898
899 verifyFormat("// Leading comment.\n"
900 "int a; // Trailing comment.");
901 verifyFormat("int a; // Trailing comment\n"
902 " // on 2\n"
903 " // or 3 lines.\n"
904 "int b;");
905 verifyFormat("int a; // Trailing comment\n"
906 "\n"
907 "// Leading comment.\n"
908 "int b;");
909 verifyFormat("int a; // Comment.\n"
910 " // More details.\n"
911 "int bbbb; // Another comment.");
912 verifyFormat(
913 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
914 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // comment\n"
915 "int cccccccccccccccccccccccccccccc; // comment\n"
916 "int ddd; // looooooooooooooooooooooooong comment\n"
917 "int aaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
918 "int bbbbbbbbbbbbbbbbbbbbb; // comment\n"
919 "int ccccccccccccccccccc; // comment");
920
Daniel Jasper997b08c2013-01-18 09:19:33 +0000921 verifyFormat("#include \"a\" // comment\n"
922 "#include \"a/b/c\" // comment");
923 verifyFormat("#include <a> // comment\n"
924 "#include <a/b/c> // comment");
Daniel Jasper98857842013-10-30 13:54:53 +0000925 EXPECT_EQ("#include \"a\" // comment\n"
Manuel Klimek5c24cca2013-05-23 10:56:37 +0000926 "#include \"a/b/c\" // comment",
927 format("#include \\\n"
928 " \"a\" // comment\n"
929 "#include \"a/b/c\" // comment"));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000930
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000931 verifyFormat("enum E {\n"
932 " // comment\n"
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000933 " VAL_A, // comment\n"
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000934 " VAL_B\n"
935 "};");
Daniel Jaspere25509f2012-12-17 11:29:41 +0000936
Krasimir Georgiev753625b2017-01-31 13:32:38 +0000937 EXPECT_EQ("enum A {\n"
938 " // line a\n"
939 " a,\n"
940 " b, // line b\n"
941 "\n"
942 " // line c\n"
943 " c\n"
944 "};",
945 format("enum A {\n"
946 " // line a\n"
947 " a,\n"
948 " b, // line b\n"
949 "\n"
950 " // line c\n"
951 " c\n"
952 "};",
953 getLLVMStyleWithColumns(20)));
954
Daniel Jaspere25509f2012-12-17 11:29:41 +0000955 verifyFormat(
956 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000957 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // Trailing comment");
Daniel Jasperd8bb2db2013-01-09 09:33:39 +0000958 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
959 " // Comment inside a statement.\n"
960 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper4281c5a2014-10-07 14:45:34 +0000961 verifyFormat("SomeFunction(a,\n"
962 " // comment\n"
963 " b + x);");
964 verifyFormat("SomeFunction(a, a,\n"
965 " // comment\n"
966 " b + x);");
Daniel Jasper38396592013-02-06 15:23:09 +0000967 verifyFormat(
968 "bool aaaaaaaaaaaaa = // comment\n"
969 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
970 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Manuel Klimekc74d2922013-01-07 08:54:53 +0000971
Daniel Jasper525264c2013-02-13 19:25:54 +0000972 verifyFormat("int aaaa; // aaaaa\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000973 "int aa; // aaaaaaa",
974 getLLVMStyleWithColumns(20));
Daniel Jasper525264c2013-02-13 19:25:54 +0000975
Daniel Jasper304a9862013-01-21 22:49:20 +0000976 EXPECT_EQ("void f() { // This does something ..\n"
977 "}\n"
978 "int a; // This is unrelated",
979 format("void f() { // This does something ..\n"
980 " }\n"
981 "int a; // This is unrelated"));
Daniel Jasper251b3c92013-07-01 11:22:57 +0000982 EXPECT_EQ("class C {\n"
983 " void f() { // This does something ..\n"
984 " } // awesome..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +0000985 "\n"
Daniel Jasper251b3c92013-07-01 11:22:57 +0000986 " int a; // This is unrelated\n"
987 "};",
988 format("class C{void f() { // This does something ..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +0000989 " } // awesome..\n"
990 " \n"
Daniel Jasper251b3c92013-07-01 11:22:57 +0000991 "int a; // This is unrelated\n"
992 "};"));
Daniel Jasper304a9862013-01-21 22:49:20 +0000993
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000994 EXPECT_EQ("int i; // single line trailing comment",
Manuel Klimekc74d2922013-01-07 08:54:53 +0000995 format("int i;\\\n// single line trailing comment"));
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000996
997 verifyGoogleFormat("int a; // Trailing comment.");
Daniel Jasperddaa9be2013-01-29 19:41:55 +0000998
999 verifyFormat("someFunction(anotherFunction( // Force break.\n"
1000 " parameter));");
Daniel Jaspera885dbe2013-02-05 09:34:14 +00001001
1002 verifyGoogleFormat("#endif // HEADER_GUARD");
Daniel Jasperf79f9352013-02-06 22:04:05 +00001003
1004 verifyFormat("const char *test[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001005 " // A\n"
1006 " \"aaaa\",\n"
1007 " // B\n"
1008 " \"aaaaa\"};");
Daniel Jaspereef30492013-02-11 12:36:37 +00001009 verifyGoogleFormat(
1010 "aaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001011 " aaaaaaaaaaaaaaaaaaaaaa); // 81_cols_with_this_comment");
Alexander Kornienkob1be9d62013-04-03 12:38:53 +00001012 EXPECT_EQ("D(a, {\n"
1013 " // test\n"
1014 " int a;\n"
1015 "});",
1016 format("D(a, {\n"
1017 "// test\n"
1018 "int a;\n"
1019 "});"));
Manuel Klimekc5730802013-05-23 11:42:52 +00001020
1021 EXPECT_EQ("lineWith(); // comment\n"
1022 "// at start\n"
1023 "otherLine();",
1024 format("lineWith(); // comment\n"
1025 "// at start\n"
1026 "otherLine();"));
1027 EXPECT_EQ("lineWith(); // comment\n"
Daniel Jasperbb37a2f2016-02-01 11:20:55 +00001028 "/*\n"
1029 " * at start */\n"
1030 "otherLine();",
1031 format("lineWith(); // comment\n"
1032 "/*\n"
1033 " * at start */\n"
1034 "otherLine();"));
1035 EXPECT_EQ("lineWith(); // comment\n"
Manuel Klimekc5730802013-05-23 11:42:52 +00001036 " // at start\n"
1037 "otherLine();",
1038 format("lineWith(); // comment\n"
1039 " // at start\n"
1040 "otherLine();"));
Manuel Klimekb27375f2013-05-23 19:54:43 +00001041
1042 EXPECT_EQ("lineWith(); // comment\n"
1043 "// at start\n"
1044 "otherLine(); // comment",
1045 format("lineWith(); // comment\n"
1046 "// at start\n"
1047 "otherLine(); // comment"));
Manuel Klimek75ef31f2013-05-23 20:46:07 +00001048 EXPECT_EQ("lineWith();\n"
1049 "// at start\n"
1050 "otherLine(); // comment",
1051 format("lineWith();\n"
1052 " // at start\n"
1053 "otherLine(); // comment"));
1054 EXPECT_EQ("// first\n"
1055 "// at start\n"
1056 "otherLine(); // comment",
1057 format("// first\n"
1058 " // at start\n"
1059 "otherLine(); // comment"));
1060 EXPECT_EQ("f();\n"
1061 "// first\n"
1062 "// at start\n"
1063 "otherLine(); // comment",
1064 format("f();\n"
1065 "// first\n"
1066 " // at start\n"
1067 "otherLine(); // comment"));
Daniel Jasper0e93cdb2013-11-08 23:31:14 +00001068 verifyFormat("f(); // comment\n"
1069 "// first\n"
1070 "// at start\n"
1071 "otherLine();");
1072 EXPECT_EQ("f(); // comment\n"
1073 "// first\n"
1074 "// at start\n"
1075 "otherLine();",
1076 format("f(); // comment\n"
1077 "// first\n"
1078 " // at start\n"
1079 "otherLine();"));
1080 EXPECT_EQ("f(); // comment\n"
1081 " // first\n"
1082 "// at start\n"
1083 "otherLine();",
1084 format("f(); // comment\n"
1085 " // first\n"
1086 "// at start\n"
1087 "otherLine();"));
Daniel Jasper49532102015-01-07 14:00:11 +00001088 EXPECT_EQ("void f() {\n"
1089 " lineWith(); // comment\n"
1090 " // at start\n"
1091 "}",
1092 format("void f() {\n"
1093 " lineWith(); // comment\n"
1094 " // at start\n"
1095 "}"));
Benjamin Kramerdab50462016-01-11 16:27:16 +00001096 EXPECT_EQ("int xy; // a\n"
1097 "int z; // b",
1098 format("int xy; // a\n"
1099 "int z; //b"));
1100 EXPECT_EQ("int xy; // a\n"
1101 "int z; // bb",
1102 format("int xy; // a\n"
1103 "int z; //bb",
1104 getLLVMStyleWithColumns(12)));
Daniel Jasper66935022014-04-27 10:03:19 +00001105
Daniel Jaspera44991332015-04-29 13:06:49 +00001106 verifyFormat("#define A \\\n"
1107 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1108 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1109 getLLVMStyleWithColumns(60));
Daniel Jasper66935022014-04-27 10:03:19 +00001110 verifyFormat(
1111 "#define A \\\n"
1112 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1113 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1114 getLLVMStyleWithColumns(61));
Daniel Jasper8acf8222014-05-07 09:23:05 +00001115
1116 verifyFormat("if ( // This is some comment\n"
1117 " x + 3) {\n"
1118 "}");
1119 EXPECT_EQ("if ( // This is some comment\n"
1120 " // spanning two lines\n"
1121 " x + 3) {\n"
1122 "}",
1123 format("if( // This is some comment\n"
1124 " // spanning two lines\n"
1125 " x + 3) {\n"
1126 "}"));
Daniel Jasper9b79efb2015-01-19 11:49:32 +00001127
1128 verifyNoCrash("/\\\n/");
1129 verifyNoCrash("/\\\n* */");
Daniel Jasper62c78f52015-05-06 08:58:57 +00001130 // The 0-character somehow makes the lexer return a proper comment.
1131 verifyNoCrash(StringRef("/*\\\0\n/", 6));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001132}
1133
Daniel Jasper14e58e52014-03-21 11:58:45 +00001134TEST_F(FormatTest, KeepsParameterWithTrailingCommentsOnTheirOwnLine) {
1135 EXPECT_EQ("SomeFunction(a,\n"
1136 " b, // comment\n"
1137 " c);",
1138 format("SomeFunction(a,\n"
1139 " b, // comment\n"
1140 " c);"));
Daniel Jasper28df0a32014-03-21 12:15:40 +00001141 EXPECT_EQ("SomeFunction(a, b,\n"
1142 " // comment\n"
1143 " c);",
1144 format("SomeFunction(a,\n"
1145 " b,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001146 " // comment\n"
Daniel Jasper28df0a32014-03-21 12:15:40 +00001147 " c);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001148 EXPECT_EQ("SomeFunction(a, b, // comment (unclear relation)\n"
1149 " c);",
1150 format("SomeFunction(a, b, // comment (unclear relation)\n"
1151 " c);"));
1152 EXPECT_EQ("SomeFunction(a, // comment\n"
1153 " b,\n"
1154 " c); // comment",
1155 format("SomeFunction(a, // comment\n"
1156 " b,\n"
1157 " c); // comment"));
Daniel Jasper35e41222016-11-29 09:40:01 +00001158 EXPECT_EQ("aaaaaaaaaa(aaaa(aaaa,\n"
1159 " aaaa), //\n"
1160 " aaaa, bbbbb);",
1161 format("aaaaaaaaaa(aaaa(aaaa,\n"
1162 "aaaa), //\n"
1163 "aaaa, bbbbb);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001164}
1165
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001166TEST_F(FormatTest, RemovesTrailingWhitespaceOfComments) {
1167 EXPECT_EQ("// comment", format("// comment "));
1168 EXPECT_EQ("int aaaaaaa, bbbbbbb; // comment",
1169 format("int aaaaaaa, bbbbbbb; // comment ",
1170 getLLVMStyleWithColumns(33)));
Alexander Kornienko9ab4a772013-09-06 17:24:54 +00001171 EXPECT_EQ("// comment\\\n", format("// comment\\\n \t \v \f "));
1172 EXPECT_EQ("// comment \\\n", format("// comment \\\n \t \v \f "));
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001173}
1174
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001175TEST_F(FormatTest, UnderstandsBlockComments) {
Nico Weber8084cff2013-06-26 00:15:19 +00001176 verifyFormat("f(/*noSpaceAfterParameterNamingComment=*/true);");
Daniel Jasper2b2c9672016-05-08 18:14:01 +00001177 verifyFormat("void f() { g(/*aaa=*/x, /*bbb=*/!y, /*c=*/::c); }");
Daniel Jasper38c82402013-11-29 09:27:43 +00001178 EXPECT_EQ("f(aaaaaaaaaaaaaaaaaaaaaaaaa, /* Trailing comment for aa... */\n"
1179 " bbbbbbbbbbbbbbbbbbbbbbbbb);",
1180 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \\\n"
1181 "/* Trailing comment for aa... */\n"
1182 " bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001183 EXPECT_EQ(
1184 "f(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1185 " /* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);",
1186 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \n"
1187 "/* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper61a40782013-06-06 16:08:57 +00001188 EXPECT_EQ(
1189 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1190 " aaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001191 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001192 "}",
1193 format("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1194 " aaaaaaaaaaaaaaaaaa ,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001195 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001196 "}"));
Daniel Jasper99302ed2016-05-27 08:59:34 +00001197 verifyFormat("f(/* aaaaaaaaaaaaaaaaaa = */\n"
1198 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperddaa9be2013-01-29 19:41:55 +00001199
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00001200 FormatStyle NoBinPacking = getLLVMStyle();
1201 NoBinPacking.BinPackParameters = false;
1202 verifyFormat("aaaaaaaa(/* parameter 1 */ aaaaaa,\n"
1203 " /* parameter 2 */ aaaaaa,\n"
1204 " /* parameter 3 */ aaaaaa,\n"
1205 " /* parameter 4 */ aaaaaa);",
1206 NoBinPacking);
Daniel Jasper03b1bc72014-03-28 15:06:01 +00001207
1208 // Aligning block comments in macros.
1209 verifyGoogleFormat("#define A \\\n"
1210 " int i; /*a*/ \\\n"
1211 " int jjj; /*b*/");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001212}
1213
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001214TEST_F(FormatTest, AlignsBlockComments) {
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001215 EXPECT_EQ("/*\n"
1216 " * Really multi-line\n"
1217 " * comment.\n"
1218 " */\n"
1219 "void f() {}",
1220 format(" /*\n"
1221 " * Really multi-line\n"
1222 " * comment.\n"
1223 " */\n"
1224 " void f() {}"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001225 EXPECT_EQ("class C {\n"
1226 " /*\n"
1227 " * Another multi-line\n"
1228 " * comment.\n"
1229 " */\n"
1230 " void f() {}\n"
1231 "};",
1232 format("class C {\n"
1233 "/*\n"
1234 " * Another multi-line\n"
1235 " * comment.\n"
1236 " */\n"
1237 "void f() {}\n"
1238 "};"));
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001239 EXPECT_EQ("/*\n"
1240 " 1. This is a comment with non-trivial formatting.\n"
1241 " 1.1. We have to indent/outdent all lines equally\n"
1242 " 1.1.1. to keep the formatting.\n"
1243 " */",
1244 format(" /*\n"
1245 " 1. This is a comment with non-trivial formatting.\n"
1246 " 1.1. We have to indent/outdent all lines equally\n"
1247 " 1.1.1. to keep the formatting.\n"
1248 " */"));
1249 EXPECT_EQ("/*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001250 "Don't try to outdent if there's not enough indentation.\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001251 "*/",
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001252 format(" /*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001253 " Don't try to outdent if there's not enough indentation.\n"
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001254 " */"));
Manuel Klimek281dcbe2013-05-28 08:55:01 +00001255
1256 EXPECT_EQ("int i; /* Comment with empty...\n"
1257 " *\n"
1258 " * line. */",
1259 format("int i; /* Comment with empty...\n"
1260 " *\n"
1261 " * line. */"));
Alexander Kornienko67d9c8c2014-04-17 16:12:46 +00001262 EXPECT_EQ("int foobar = 0; /* comment */\n"
1263 "int bar = 0; /* multiline\n"
1264 " comment 1 */\n"
1265 "int baz = 0; /* multiline\n"
1266 " comment 2 */\n"
1267 "int bzz = 0; /* multiline\n"
1268 " comment 3 */",
1269 format("int foobar = 0; /* comment */\n"
1270 "int bar = 0; /* multiline\n"
1271 " comment 1 */\n"
1272 "int baz = 0; /* multiline\n"
1273 " comment 2 */\n"
1274 "int bzz = 0; /* multiline\n"
1275 " comment 3 */"));
1276 EXPECT_EQ("int foobar = 0; /* comment */\n"
1277 "int bar = 0; /* multiline\n"
1278 " comment */\n"
1279 "int baz = 0; /* multiline\n"
1280 "comment */",
1281 format("int foobar = 0; /* comment */\n"
1282 "int bar = 0; /* multiline\n"
1283 "comment */\n"
1284 "int baz = 0; /* multiline\n"
1285 "comment */"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001286}
1287
Daniel Jaspera0a50392015-12-01 13:28:53 +00001288TEST_F(FormatTest, CommentReflowingCanBeTurnedOff) {
1289 FormatStyle Style = getLLVMStyleWithColumns(20);
1290 Style.ReflowComments = false;
1291 verifyFormat("// aaaaaaaaa aaaaaaaaaa aaaaaaaaaa", Style);
1292 verifyFormat("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa */", Style);
1293}
1294
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001295TEST_F(FormatTest, CorrectlyHandlesLengthOfBlockComments) {
1296 EXPECT_EQ("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1297 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */",
1298 format("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1299 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */"));
Alexander Kornienkoaa620e12013-07-01 13:42:42 +00001300 EXPECT_EQ(
1301 "void ffffffffffff(\n"
1302 " int aaaaaaaa, int bbbbbbbb,\n"
1303 " int cccccccccccc) { /*\n"
1304 " aaaaaaaaaa\n"
1305 " aaaaaaaaaaaaa\n"
1306 " bbbbbbbbbbbbbb\n"
1307 " bbbbbbbbbb\n"
1308 " */\n"
1309 "}",
1310 format("void ffffffffffff(int aaaaaaaa, int bbbbbbbb, int cccccccccccc)\n"
1311 "{ /*\n"
1312 " aaaaaaaaaa aaaaaaaaaaaaa\n"
1313 " bbbbbbbbbbbbbb bbbbbbbbbb\n"
1314 " */\n"
1315 "}",
1316 getLLVMStyleWithColumns(40)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001317}
1318
Alexander Kornienko94042342013-07-16 23:47:22 +00001319TEST_F(FormatTest, DontBreakNonTrailingBlockComments) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00001320 EXPECT_EQ("void ffffffffff(\n"
1321 " int aaaaa /* test */);",
Alexander Kornienko94042342013-07-16 23:47:22 +00001322 format("void ffffffffff(int aaaaa /* test */);",
1323 getLLVMStyleWithColumns(35)));
1324}
1325
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001326TEST_F(FormatTest, SplitsLongCxxComments) {
1327 EXPECT_EQ("// A comment that\n"
1328 "// doesn't fit on\n"
1329 "// one line",
1330 format("// A comment that doesn't fit on one line",
1331 getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001332 EXPECT_EQ("/// A comment that\n"
1333 "/// doesn't fit on\n"
1334 "/// one line",
1335 format("/// A comment that doesn't fit on one line",
1336 getLLVMStyleWithColumns(20)));
1337 EXPECT_EQ("//! A comment that\n"
1338 "//! doesn't fit on\n"
1339 "//! one line",
1340 format("//! A comment that doesn't fit on one line",
1341 getLLVMStyleWithColumns(20)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00001342 EXPECT_EQ("// a b c d\n"
1343 "// e f g\n"
1344 "// h i j k",
Daniel Jaspera44991332015-04-29 13:06:49 +00001345 format("// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
1346 EXPECT_EQ(
1347 "// a b c d\n"
1348 "// e f g\n"
1349 "// h i j k",
1350 format("\\\n// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001351 EXPECT_EQ("if (true) // A comment that\n"
1352 " // doesn't fit on\n"
1353 " // one line",
1354 format("if (true) // A comment that doesn't fit on one line ",
1355 getLLVMStyleWithColumns(30)));
1356 EXPECT_EQ("// Don't_touch_leading_whitespace",
1357 format("// Don't_touch_leading_whitespace",
1358 getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001359 EXPECT_EQ("// Add leading\n"
1360 "// whitespace",
1361 format("//Add leading whitespace", getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001362 EXPECT_EQ("/// Add leading\n"
1363 "/// whitespace",
1364 format("///Add leading whitespace", getLLVMStyleWithColumns(20)));
1365 EXPECT_EQ("//! Add leading\n"
1366 "//! whitespace",
1367 format("//!Add leading whitespace", getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001368 EXPECT_EQ("// whitespace", format("//whitespace", getLLVMStyle()));
1369 EXPECT_EQ("// Even if it makes the line exceed the column\n"
1370 "// limit",
1371 format("//Even if it makes the line exceed the column limit",
1372 getLLVMStyleWithColumns(51)));
1373 EXPECT_EQ("//--But not here", format("//--But not here", getLLVMStyle()));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001374
1375 EXPECT_EQ("// aa bb cc dd",
1376 format("// aa bb cc dd ",
1377 getLLVMStyleWithColumns(15)));
1378
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001379 EXPECT_EQ("// A comment before\n"
1380 "// a macro\n"
1381 "// definition\n"
1382 "#define a b",
1383 format("// A comment before a macro definition\n"
1384 "#define a b",
1385 getLLVMStyleWithColumns(20)));
Daniel Jaspere068ac72014-10-27 17:13:59 +00001386 EXPECT_EQ("void ffffff(\n"
1387 " int aaaaaaaaa, // wwww\n"
1388 " int bbbbbbbbbb, // xxxxxxx\n"
1389 " // yyyyyyyyyy\n"
1390 " int c, int d, int e) {}",
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001391 format("void ffffff(\n"
1392 " int aaaaaaaaa, // wwww\n"
Daniel Jasper19a541e2013-12-19 16:45:34 +00001393 " int bbbbbbbbbb, // xxxxxxx yyyyyyyyyy\n"
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001394 " int c, int d, int e) {}",
1395 getLLVMStyleWithColumns(40)));
Alexander Kornienkob93062e2013-06-20 13:58:37 +00001396 EXPECT_EQ("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1397 format("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1398 getLLVMStyleWithColumns(20)));
Alexander Kornienko3abbb8a2013-11-12 17:30:49 +00001399 EXPECT_EQ(
1400 "#define XXX // a b c d\n"
1401 " // e f g h",
1402 format("#define XXX // a b c d e f g h", getLLVMStyleWithColumns(22)));
1403 EXPECT_EQ(
1404 "#define XXX // q w e r\n"
1405 " // t y u i",
1406 format("#define XXX //q w e r t y u i", getLLVMStyleWithColumns(22)));
Krasimir Georgieve518e0b2017-01-30 21:00:01 +00001407 EXPECT_EQ("{\n"
1408 " //\n"
1409 " //\\\n"
1410 " // long 1 2 3 4\n"
1411 " // 5\n"
1412 "}",
1413 format("{\n"
1414 " //\n"
1415 " //\\\n"
1416 " // long 1 2 3 4 5\n"
1417 "}",
1418 getLLVMStyleWithColumns(20)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001419}
Manuel Klimek9043c742013-05-27 15:23:34 +00001420
Alexander Kornienko4504f932014-03-10 13:14:56 +00001421TEST_F(FormatTest, PreservesHangingIndentInCxxComments) {
1422 EXPECT_EQ("// A comment\n"
1423 "// that doesn't\n"
1424 "// fit on one\n"
1425 "// line",
1426 format("// A comment that doesn't fit on one line",
1427 getLLVMStyleWithColumns(20)));
1428 EXPECT_EQ("/// A comment\n"
1429 "/// that doesn't\n"
1430 "/// fit on one\n"
1431 "/// line",
1432 format("/// A comment that doesn't fit on one line",
1433 getLLVMStyleWithColumns(20)));
1434}
1435
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001436TEST_F(FormatTest, DontSplitLineCommentsWithEscapedNewlines) {
1437 EXPECT_EQ("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1438 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1439 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1440 format("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1441 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1442 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
1443 EXPECT_EQ("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1444 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1445 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1446 format("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1447 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1448 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1449 getLLVMStyleWithColumns(50)));
1450 // FIXME: One day we might want to implement adjustment of leading whitespace
1451 // of the consecutive lines in this kind of comment:
Daniel Jasper4355e7f2014-07-09 07:50:33 +00001452 EXPECT_EQ("double\n"
1453 " a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1454 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1455 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1456 format("double a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1457 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1458 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001459 getLLVMStyleWithColumns(49)));
1460}
1461
Alexander Kornienkoce9161a2014-01-02 15:13:14 +00001462TEST_F(FormatTest, DontSplitLineCommentsWithPragmas) {
1463 FormatStyle Pragmas = getLLVMStyleWithColumns(30);
1464 Pragmas.CommentPragmas = "^ IWYU pragma:";
1465 EXPECT_EQ(
1466 "// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb",
1467 format("// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb", Pragmas));
1468 EXPECT_EQ(
1469 "/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */",
1470 format("/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */", Pragmas));
1471}
1472
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001473TEST_F(FormatTest, PriorityOfCommentBreaking) {
Daniel Jasper2739af32013-08-28 10:03:58 +00001474 EXPECT_EQ("if (xxx ==\n"
1475 " yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001476 " zzz)\n"
1477 " q();",
1478 format("if (xxx == yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
1479 " zzz) q();",
1480 getLLVMStyleWithColumns(40)));
1481 EXPECT_EQ("if (xxxxxxxxxx ==\n"
1482 " yyy && // aaaaaa bbbbbbbb cccc\n"
1483 " zzz)\n"
1484 " q();",
1485 format("if (xxxxxxxxxx == yyy && // aaaaaa bbbbbbbb cccc\n"
1486 " zzz) q();",
1487 getLLVMStyleWithColumns(40)));
1488 EXPECT_EQ("if (xxxxxxxxxx &&\n"
1489 " yyy || // aaaaaa bbbbbbbb cccc\n"
1490 " zzz)\n"
1491 " q();",
1492 format("if (xxxxxxxxxx && yyy || // aaaaaa bbbbbbbb cccc\n"
1493 " zzz) q();",
1494 getLLVMStyleWithColumns(40)));
Daniel Jasper19a541e2013-12-19 16:45:34 +00001495 EXPECT_EQ("fffffffff(\n"
1496 " &xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1497 " zzz);",
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001498 format("fffffffff(&xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1499 " zzz);",
1500 getLLVMStyleWithColumns(40)));
Manuel Klimek9043c742013-05-27 15:23:34 +00001501}
1502
1503TEST_F(FormatTest, MultiLineCommentsInDefines) {
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001504 EXPECT_EQ("#define A(x) /* \\\n"
1505 " a comment \\\n"
1506 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001507 " f();",
1508 format("#define A(x) /* \\\n"
1509 " a comment \\\n"
1510 " inside */ \\\n"
1511 " f();",
1512 getLLVMStyleWithColumns(17)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001513 EXPECT_EQ("#define A( \\\n"
1514 " x) /* \\\n"
1515 " a comment \\\n"
1516 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001517 " f();",
1518 format("#define A( \\\n"
1519 " x) /* \\\n"
1520 " a comment \\\n"
1521 " inside */ \\\n"
1522 " f();",
1523 getLLVMStyleWithColumns(17)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001524}
1525
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001526TEST_F(FormatTest, ParsesCommentsAdjacentToPPDirectives) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001527 EXPECT_EQ("namespace {}\n// Test\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001528 format("namespace {}\n // Test\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001529 EXPECT_EQ("namespace {}\n/* Test */\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001530 format("namespace {}\n /* Test */\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001531 EXPECT_EQ("namespace {}\n/* Test */ #define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001532 format("namespace {}\n /* Test */ #define A"));
1533}
1534
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001535TEST_F(FormatTest, SplitsLongLinesInComments) {
1536 EXPECT_EQ("/* This is a long\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001537 " * comment that\n"
1538 " * doesn't\n"
1539 " * fit on one line.\n"
1540 " */",
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001541 format("/* "
1542 "This is a long "
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001543 "comment that "
1544 "doesn't "
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001545 "fit on one line. */",
1546 getLLVMStyleWithColumns(20)));
Daniel Jaspera44991332015-04-29 13:06:49 +00001547 EXPECT_EQ(
1548 "/* a b c d\n"
1549 " * e f g\n"
1550 " * h i j k\n"
1551 " */",
1552 format("/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
1553 EXPECT_EQ(
1554 "/* a b c d\n"
1555 " * e f g\n"
1556 " * h i j k\n"
1557 " */",
1558 format("\\\n/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001559 EXPECT_EQ("/*\n"
1560 "This is a long\n"
1561 "comment that doesn't\n"
1562 "fit on one line.\n"
1563 "*/",
1564 format("/*\n"
1565 "This is a long "
1566 "comment that doesn't "
1567 "fit on one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001568 "*/",
1569 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001570 EXPECT_EQ("/*\n"
1571 " * This is a long\n"
1572 " * comment that\n"
1573 " * doesn't fit on\n"
1574 " * one line.\n"
1575 " */",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001576 format("/* \n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001577 " * This is a long "
1578 " comment that "
1579 " doesn't fit on "
1580 " one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001581 " */",
1582 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001583 EXPECT_EQ("/*\n"
1584 " * This_is_a_comment_with_words_that_dont_fit_on_one_line\n"
1585 " * so_it_should_be_broken\n"
1586 " * wherever_a_space_occurs\n"
1587 " */",
1588 format("/*\n"
1589 " * This_is_a_comment_with_words_that_dont_fit_on_one_line "
1590 " so_it_should_be_broken "
1591 " wherever_a_space_occurs \n"
1592 " */",
1593 getLLVMStyleWithColumns(20)));
1594 EXPECT_EQ("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001595 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001596 " */",
1597 format("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001598 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001599 " */",
1600 getLLVMStyleWithColumns(20)));
1601 EXPECT_EQ("{\n"
1602 " /*\n"
1603 " This is another\n"
1604 " long comment that\n"
1605 " doesn't fit on one\n"
1606 " line 1234567890\n"
1607 " */\n"
1608 "}",
1609 format("{\n"
1610 "/*\n"
1611 "This is another "
1612 " long comment that "
1613 " doesn't fit on one"
1614 " line 1234567890\n"
1615 "*/\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001616 "}",
1617 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001618 EXPECT_EQ("{\n"
1619 " /*\n"
1620 " * This i s\n"
1621 " * another comment\n"
1622 " * t hat doesn' t\n"
1623 " * fit on one l i\n"
1624 " * n e\n"
1625 " */\n"
1626 "}",
1627 format("{\n"
1628 "/*\n"
1629 " * This i s"
1630 " another comment"
1631 " t hat doesn' t"
1632 " fit on one l i"
1633 " n e\n"
1634 " */\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001635 "}",
1636 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001637 EXPECT_EQ("/*\n"
1638 " * This is a long\n"
1639 " * comment that\n"
1640 " * doesn't fit on\n"
1641 " * one line\n"
1642 " */",
1643 format(" /*\n"
1644 " * This is a long comment that doesn't fit on one line\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001645 " */",
1646 getLLVMStyleWithColumns(20)));
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001647 EXPECT_EQ("{\n"
1648 " if (something) /* This is a\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001649 " long\n"
1650 " comment */\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001651 " ;\n"
1652 "}",
1653 format("{\n"
1654 " if (something) /* This is a long comment */\n"
1655 " ;\n"
1656 "}",
1657 getLLVMStyleWithColumns(30)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001658
1659 EXPECT_EQ("/* A comment before\n"
1660 " * a macro\n"
1661 " * definition */\n"
1662 "#define a b",
1663 format("/* A comment before a macro definition */\n"
1664 "#define a b",
1665 getLLVMStyleWithColumns(20)));
1666
1667 EXPECT_EQ("/* some comment\n"
1668 " * a comment\n"
1669 "* that we break\n"
1670 " * another comment\n"
1671 "* we have to break\n"
1672 "* a left comment\n"
1673 " */",
1674 format(" /* some comment\n"
1675 " * a comment that we break\n"
1676 " * another comment we have to break\n"
1677 "* a left comment\n"
1678 " */",
1679 getLLVMStyleWithColumns(20)));
1680
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00001681 EXPECT_EQ("/**\n"
1682 " * multiline block\n"
1683 " * comment\n"
1684 " *\n"
1685 " */",
1686 format("/**\n"
1687 " * multiline block comment\n"
1688 " *\n"
1689 " */",
1690 getLLVMStyleWithColumns(20)));
1691
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001692 EXPECT_EQ("/*\n"
1693 "\n"
1694 "\n"
1695 " */\n",
1696 format(" /* \n"
1697 " \n"
1698 " \n"
1699 " */\n"));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001700
1701 EXPECT_EQ("/* a a */",
1702 format("/* a a */", getLLVMStyleWithColumns(15)));
1703 EXPECT_EQ("/* a a bc */",
1704 format("/* a a bc */", getLLVMStyleWithColumns(15)));
1705 EXPECT_EQ("/* aaa aaa\n"
1706 " * aaaaa */",
1707 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
1708 EXPECT_EQ("/* aaa aaa\n"
1709 " * aaaaa */",
1710 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001711}
1712
1713TEST_F(FormatTest, SplitsLongLinesInCommentsInPreprocessor) {
1714 EXPECT_EQ("#define X \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001715 " /* \\\n"
1716 " Test \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001717 " Macro comment \\\n"
1718 " with a long \\\n"
1719 " line \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001720 " */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001721 " A + B",
1722 format("#define X \\\n"
1723 " /*\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001724 " Test\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001725 " Macro comment with a long line\n"
1726 " */ \\\n"
1727 " A + B",
1728 getLLVMStyleWithColumns(20)));
1729 EXPECT_EQ("#define X \\\n"
1730 " /* Macro comment \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001731 " with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001732 " line */ \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001733 " A + B",
1734 format("#define X \\\n"
1735 " /* Macro comment with a long\n"
1736 " line */ \\\n"
1737 " A + B",
1738 getLLVMStyleWithColumns(20)));
1739 EXPECT_EQ("#define X \\\n"
1740 " /* Macro comment \\\n"
1741 " * with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001742 " * line */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001743 " A + B",
1744 format("#define X \\\n"
1745 " /* Macro comment with a long line */ \\\n"
1746 " A + B",
1747 getLLVMStyleWithColumns(20)));
1748}
1749
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001750TEST_F(FormatTest, CommentsInStaticInitializers) {
1751 EXPECT_EQ(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001752 "static SomeType type = {aaaaaaaaaaaaaaaaaaaa, /* comment */\n"
1753 " aaaaaaaaaaaaaaaaaaaa /* comment */,\n"
1754 " /* comment */ aaaaaaaaaaaaaaaaaaaa,\n"
1755 " aaaaaaaaaaaaaaaaaaaa, // comment\n"
1756 " aaaaaaaaaaaaaaaaaaaa};",
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001757 format("static SomeType type = { aaaaaaaaaaaaaaaaaaaa , /* comment */\n"
1758 " aaaaaaaaaaaaaaaaaaaa /* comment */ ,\n"
1759 " /* comment */ aaaaaaaaaaaaaaaaaaaa ,\n"
1760 " aaaaaaaaaaaaaaaaaaaa , // comment\n"
1761 " aaaaaaaaaaaaaaaaaaaa };"));
Chandler Carruthf8b72662014-03-02 12:37:31 +00001762 verifyFormat("static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1763 " bbbbbbbbbbb, ccccccccccc};");
1764 verifyFormat("static SomeType type = {aaaaaaaaaaa,\n"
1765 " // comment for bb....\n"
1766 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001767 verifyGoogleFormat(
Daniel Jaspere5777d22013-05-23 10:15:45 +00001768 "static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1769 " bbbbbbbbbbb, ccccccccccc};");
1770 verifyGoogleFormat("static SomeType type = {aaaaaaaaaaa,\n"
1771 " // comment for bb....\n"
1772 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001773
Chandler Carruthf8b72662014-03-02 12:37:31 +00001774 verifyFormat("S s = {{a, b, c}, // Group #1\n"
1775 " {d, e, f}, // Group #2\n"
1776 " {g, h, i}}; // Group #3");
1777 verifyFormat("S s = {{// Group #1\n"
1778 " a, b, c},\n"
1779 " {// Group #2\n"
1780 " d, e, f},\n"
1781 " {// Group #3\n"
1782 " g, h, i}};");
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001783
1784 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001785 " // Some comment\n"
1786 " a,\n"
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001787 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001788 " // Comment after empty line\n"
1789 " b}",
Daniel Jasperfb5e2412013-02-26 13:10:34 +00001790 format("S s = {\n"
1791 " // Some comment\n"
1792 " a,\n"
1793 " \n"
1794 " // Comment after empty line\n"
1795 " b\n"
1796 "}"));
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001797 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001798 " /* Some comment */\n"
1799 " a,\n"
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001800 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001801 " /* Comment after empty line */\n"
1802 " b}",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001803 format("S s = {\n"
1804 " /* Some comment */\n"
1805 " a,\n"
1806 " \n"
1807 " /* Comment after empty line */\n"
1808 " b\n"
1809 "}"));
Daniel Jaspera400cab2013-02-28 15:04:12 +00001810 verifyFormat("const uint8_t aaaaaaaaaaaaaaaaaaaaaa[0] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001811 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1812 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1813 " 0x00, 0x00, 0x00, 0x00}; // comment\n");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001814}
1815
Krasimir Georgiev84321612017-01-30 19:18:55 +00001816TEST_F(FormatTest, LineCommentsAfterRightBrace) {
1817 EXPECT_EQ("if (true) { // comment about branch\n"
1818 " // comment about f\n"
1819 " f();\n"
1820 "}",
1821 format("if (true) { // comment about branch\n"
1822 " // comment about f\n"
1823 " f();\n"
1824 "}",
1825 getLLVMStyleWithColumns(80)));
1826 EXPECT_EQ("if (1) { // if line 1\n"
1827 " // if line 2\n"
1828 " // if line 3\n"
1829 " // f line 1\n"
1830 " // f line 2\n"
1831 " f();\n"
1832 "} else { // else line 1\n"
1833 " // else line 2\n"
1834 " // else line 3\n"
1835 " // g line 1\n"
1836 " g();\n"
1837 "}",
1838 format("if (1) { // if line 1\n"
1839 " // if line 2\n"
1840 " // if line 3\n"
1841 " // f line 1\n"
1842 " // f line 2\n"
1843 " f();\n"
1844 "} else { // else line 1\n"
1845 " // else line 2\n"
1846 " // else line 3\n"
1847 " // g line 1\n"
1848 " g();\n"
1849 "}"));
1850 EXPECT_EQ("do { // line 1\n"
1851 " // line 2\n"
1852 " // line 3\n"
1853 " f();\n"
1854 "} while (true);",
1855 format("do { // line 1\n"
1856 " // line 2\n"
1857 " // line 3\n"
1858 " f();\n"
1859 "} while (true);",
1860 getLLVMStyleWithColumns(80)));
1861 EXPECT_EQ("while (a < b) { // line 1\n"
1862 " // line 2\n"
1863 " // line 3\n"
1864 " f();\n"
1865 "}",
1866 format("while (a < b) {// line 1\n"
1867 " // line 2\n"
1868 " // line 3\n"
1869 " f();\n"
1870 "}",
1871 getLLVMStyleWithColumns(80)));
1872}
1873
Krasimir Georgiev91834222017-01-25 13:58:58 +00001874TEST_F(FormatTest, ReflowsComments) {
1875 // Break a long line and reflow with the full next line.
1876 EXPECT_EQ("// long long long\n"
1877 "// long long",
1878 format("// long long long long\n"
1879 "// long",
1880 getLLVMStyleWithColumns(20)));
1881
1882 // Keep the trailing newline while reflowing.
1883 EXPECT_EQ("// long long long\n"
1884 "// long long\n",
1885 format("// long long long long\n"
1886 "// long\n",
1887 getLLVMStyleWithColumns(20)));
1888
1889 // Break a long line and reflow with a part of the next line.
1890 EXPECT_EQ("// long long long\n"
1891 "// long long\n"
1892 "// long_long",
1893 format("// long long long long\n"
1894 "// long long_long",
1895 getLLVMStyleWithColumns(20)));
1896
1897 // Break but do not reflow if the first word from the next line is too long.
1898 EXPECT_EQ("// long long long\n"
1899 "// long\n"
1900 "// long_long_long\n",
1901 format("// long long long long\n"
1902 "// long_long_long\n",
1903 getLLVMStyleWithColumns(20)));
1904
1905 // Don't break or reflow short lines.
1906 verifyFormat("// long\n"
1907 "// long long long lo\n"
1908 "// long long long lo\n"
1909 "// long",
1910 getLLVMStyleWithColumns(20));
1911
1912 // Keep prefixes and decorations while reflowing.
1913 EXPECT_EQ("/// long long long\n"
1914 "/// long long\n",
1915 format("/// long long long long\n"
1916 "/// long\n",
1917 getLLVMStyleWithColumns(20)));
1918 EXPECT_EQ("//! long long long\n"
1919 "//! long long\n",
1920 format("//! long long long long\n"
1921 "//! long\n",
1922 getLLVMStyleWithColumns(20)));
1923 EXPECT_EQ("/* long long long\n"
1924 " * long long */",
1925 format("/* long long long long\n"
1926 " * long */",
1927 getLLVMStyleWithColumns(20)));
1928
1929 // Don't bring leading whitespace up while reflowing.
1930 EXPECT_EQ("/* long long long\n"
1931 " * long long long\n"
1932 " */",
1933 format("/* long long long long\n"
1934 " * long long\n"
1935 " */",
1936 getLLVMStyleWithColumns(20)));
1937
1938 // Reflow the last line of a block comment with its trailing '*/'.
1939 EXPECT_EQ("/* long long long\n"
1940 " long long */",
1941 format("/* long long long long\n"
1942 " long */",
1943 getLLVMStyleWithColumns(20)));
1944
1945 // Reflow two short lines; keep the postfix of the last one.
1946 EXPECT_EQ("/* long long long\n"
1947 " * long long long */",
1948 format("/* long long long long\n"
1949 " * long\n"
1950 " * long */",
1951 getLLVMStyleWithColumns(20)));
1952
1953 // Put the postfix of the last short reflow line on a newline if it doesn't
1954 // fit.
1955 EXPECT_EQ("/* long long long\n"
1956 " * long long longg\n"
1957 " */",
1958 format("/* long long long long\n"
1959 " * long\n"
1960 " * longg */",
1961 getLLVMStyleWithColumns(20)));
1962
1963 // Break single line block comments that are first in the line with ' *'
1964 // decoration.
1965 EXPECT_EQ("/* long long long\n"
1966 " * long */",
1967 format("/* long long long long */", getLLVMStyleWithColumns(20)));
1968
1969 // Break single line block comment that are not first in the line with ' '
1970 // decoration.
1971 EXPECT_EQ("int i; /* long long\n"
1972 " long */",
1973 format("int i; /* long long long */", getLLVMStyleWithColumns(20)));
1974
1975 // Reflow a line that goes just over the column limit.
1976 EXPECT_EQ("// long long long\n"
1977 "// lon long",
1978 format("// long long long lon\n"
1979 "// long",
1980 getLLVMStyleWithColumns(20)));
1981
1982 // Stop reflowing if the next line has a different indentation than the
1983 // previous line.
1984 EXPECT_EQ("// long long long\n"
1985 "// long\n"
1986 "// long long\n"
1987 "// long",
1988 format("// long long long long\n"
1989 "// long long\n"
1990 "// long",
1991 getLLVMStyleWithColumns(20)));
1992
1993 // Reflow into the last part of a really long line that has been broken into
1994 // multiple lines.
1995 EXPECT_EQ("// long long long\n"
1996 "// long long long\n"
1997 "// long long long\n",
1998 format("// long long long long long long long long\n"
1999 "// long\n",
2000 getLLVMStyleWithColumns(20)));
2001
2002 // Break the first line, then reflow the beginning of the second and third
2003 // line up.
2004 EXPECT_EQ("// long long long\n"
2005 "// lon1 lon2 lon2\n"
2006 "// lon2 lon3 lon3",
2007 format("// long long long lon1\n"
2008 "// lon2 lon2 lon2\n"
2009 "// lon3 lon3",
2010 getLLVMStyleWithColumns(20)));
2011
2012 // Reflow the beginning of the second line, then break the rest.
2013 EXPECT_EQ("// long long long\n"
2014 "// lon1 lon2 lon2\n"
2015 "// lon2 lon2 lon2\n"
2016 "// lon3",
2017 format("// long long long lon1\n"
2018 "// lon2 lon2 lon2 lon2 lon2 lon3",
2019 getLLVMStyleWithColumns(20)));
2020
2021 // Shrink the first line, then reflow the second line up.
2022 EXPECT_EQ("// long long long", format("// long long\n"
2023 "// long",
2024 getLLVMStyleWithColumns(20)));
2025
2026 // Don't shrink leading whitespace.
2027 EXPECT_EQ("int i; /// a",
2028 format("int i; /// a", getLLVMStyleWithColumns(20)));
2029
2030 // Shrink trailing whitespace if there is no postfix and reflow.
2031 EXPECT_EQ("// long long long\n"
2032 "// long long",
2033 format("// long long long long \n"
2034 "// long",
2035 getLLVMStyleWithColumns(20)));
2036
2037 // Shrink trailing whitespace to a single one if there is postfix.
2038 EXPECT_EQ("/* long long long */",
2039 format("/* long long long */", getLLVMStyleWithColumns(20)));
2040
2041 // Break a block comment postfix if exceeding the line limit.
2042 EXPECT_EQ("/* long\n"
2043 " */",
2044 format("/* long */", getLLVMStyleWithColumns(20)));
2045
2046 // Reflow indented comments.
2047 EXPECT_EQ("{\n"
2048 " // long long long\n"
2049 " // long long\n"
2050 " int i; /* long lon\n"
2051 " g long\n"
2052 " */\n"
2053 "}",
2054 format("{\n"
2055 " // long long long long\n"
2056 " // long\n"
2057 " int i; /* long lon g\n"
2058 " long */\n"
2059 "}",
2060 getLLVMStyleWithColumns(20)));
2061
2062 // Don't realign trailing comments after reflow has happened.
2063 EXPECT_EQ("// long long long\n"
2064 "// long long\n"
2065 "long i; // long",
2066 format("// long long long long\n"
2067 "// long\n"
2068 "long i; // long",
2069 getLLVMStyleWithColumns(20)));
2070 EXPECT_EQ("// long long long\n"
2071 "// longng long long\n"
2072 "// long lo",
2073 format("// long long long longng\n"
2074 "// long long long\n"
2075 "// lo",
2076 getLLVMStyleWithColumns(20)));
2077
2078 // Reflow lines after a broken line.
2079 EXPECT_EQ("int a; // Trailing\n"
2080 " // comment on\n"
2081 " // 2 or 3\n"
2082 " // lines.\n",
2083 format("int a; // Trailing comment\n"
2084 " // on 2\n"
2085 " // or 3\n"
2086 " // lines.\n",
2087 getLLVMStyleWithColumns(20)));
2088 EXPECT_EQ("/// This long line\n"
2089 "/// gets reflown.\n",
2090 format("/// This long line gets\n"
2091 "/// reflown.\n",
2092 getLLVMStyleWithColumns(20)));
2093 EXPECT_EQ("//! This long line\n"
2094 "//! gets reflown.\n",
2095 format(" //! This long line gets\n"
2096 " //! reflown.\n",
2097 getLLVMStyleWithColumns(20)));
2098 EXPECT_EQ("/* This long line\n"
2099 " * gets reflown.\n"
2100 " */\n",
2101 format("/* This long line gets\n"
2102 " * reflown.\n"
2103 " */\n",
2104 getLLVMStyleWithColumns(20)));
2105
2106 // Reflow after indentation makes a line too long.
2107 EXPECT_EQ("{\n"
2108 " // long long long\n"
2109 " // lo long\n"
2110 "}\n",
2111 format("{\n"
2112 "// long long long lo\n"
2113 "// long\n"
2114 "}\n",
2115 getLLVMStyleWithColumns(20)));
2116
2117 // Break and reflow multiple lines.
2118 EXPECT_EQ("/*\n"
2119 " * Reflow the end of\n"
2120 " * line by 11 22 33\n"
2121 " * 4.\n"
2122 " */\n",
2123 format("/*\n"
2124 " * Reflow the end of line\n"
2125 " * by\n"
2126 " * 11\n"
2127 " * 22\n"
2128 " * 33\n"
2129 " * 4.\n"
2130 " */\n",
2131 getLLVMStyleWithColumns(20)));
2132 EXPECT_EQ("/// First line gets\n"
2133 "/// broken. Second\n"
2134 "/// line gets\n"
2135 "/// reflown and\n"
2136 "/// broken. Third\n"
2137 "/// gets reflown.\n",
2138 format("/// First line gets broken.\n"
2139 "/// Second line gets reflown and broken.\n"
2140 "/// Third gets reflown.\n",
2141 getLLVMStyleWithColumns(20)));
2142 EXPECT_EQ("int i; // first long\n"
2143 " // long snd\n"
2144 " // long.\n",
2145 format("int i; // first long long\n"
2146 " // snd long.\n",
2147 getLLVMStyleWithColumns(20)));
2148 EXPECT_EQ("{\n"
2149 " // first long line\n"
2150 " // line second\n"
2151 " // long line line\n"
2152 " // third long line\n"
2153 " // line\n"
2154 "}\n",
2155 format("{\n"
2156 " // first long line line\n"
2157 " // second long line line\n"
2158 " // third long line line\n"
2159 "}\n",
2160 getLLVMStyleWithColumns(20)));
2161 EXPECT_EQ("int i; /* first line\n"
2162 " * second\n"
2163 " * line third\n"
2164 " * line\n"
2165 " */",
2166 format("int i; /* first line\n"
2167 " * second line\n"
2168 " * third line\n"
2169 " */",
2170 getLLVMStyleWithColumns(20)));
2171
2172 // Reflow the last two lines of a section that starts with a line having
2173 // different indentation.
2174 EXPECT_EQ(
2175 "// long\n"
2176 "// long long long\n"
2177 "// long long",
2178 format("// long\n"
2179 "// long long long long\n"
2180 "// long",
2181 getLLVMStyleWithColumns(20)));
2182
2183 // Keep the block comment endling '*/' while reflowing.
2184 EXPECT_EQ("/* Long long long\n"
2185 " * line short */\n",
2186 format("/* Long long long line\n"
2187 " * short */\n",
2188 getLLVMStyleWithColumns(20)));
2189
2190 // Don't reflow between separate blocks of comments.
2191 EXPECT_EQ("/* First comment\n"
2192 " * block will */\n"
2193 "/* Snd\n"
2194 " */\n",
2195 format("/* First comment block\n"
2196 " * will */\n"
2197 "/* Snd\n"
2198 " */\n",
2199 getLLVMStyleWithColumns(20)));
2200
2201 // Don't reflow across blank comment lines.
2202 EXPECT_EQ("int i; // This long\n"
2203 " // line gets\n"
2204 " // broken.\n"
2205 " // \n"
2206 " // keep.\n",
2207 format("int i; // This long line gets broken.\n"
2208 " // \n"
2209 " // keep.\n",
2210 getLLVMStyleWithColumns(20)));
2211 EXPECT_EQ("{\n"
2212 " /// long long long\n"
2213 " /// long long\n"
2214 " ///\n"
2215 " /// long\n"
2216 "}",
2217 format("{\n"
2218 " /// long long long long\n"
2219 " /// long\n"
2220 " ///\n"
2221 " /// long\n"
2222 "}",
2223 getLLVMStyleWithColumns(20)));
2224 EXPECT_EQ("//! long long long\n"
2225 "//! long\n"
2226 "\n"
2227 "//! long",
2228 format("//! long long long long\n"
2229 "\n"
2230 "//! long",
2231 getLLVMStyleWithColumns(20)));
2232 EXPECT_EQ("/* long long long\n"
2233 " long\n"
2234 "\n"
2235 " long */",
2236 format("/* long long long long\n"
2237 "\n"
2238 " long */",
2239 getLLVMStyleWithColumns(20)));
2240 EXPECT_EQ("/* long long long\n"
2241 " * long\n"
2242 " *\n"
2243 " * long */",
2244 format("/* long long long long\n"
2245 " *\n"
2246 " * long */",
2247 getLLVMStyleWithColumns(20)));
2248
2249 // Don't reflow lines having content that is a single character.
2250 EXPECT_EQ("// long long long\n"
2251 "// long\n"
2252 "// l",
2253 format("// long long long long\n"
2254 "// l",
2255 getLLVMStyleWithColumns(20)));
2256
2257 // Don't reflow lines starting with two punctuation characters.
2258 EXPECT_EQ("// long long long\n"
2259 "// long\n"
2260 "// ... --- ...",
2261 format(
2262 "// long long long long\n"
2263 "// ... --- ...",
2264 getLLVMStyleWithColumns(20)));
Krasimir Georgiev8f62cf72017-01-31 11:38:02 +00002265
2266 // Don't reflow lines starting with '@'.
2267 EXPECT_EQ("// long long long\n"
2268 "// long\n"
2269 "// @param arg",
2270 format("// long long long long\n"
2271 "// @param arg",
2272 getLLVMStyleWithColumns(20)));
2273
Krasimir Georgiev91834222017-01-25 13:58:58 +00002274 // Reflow lines that have a non-punctuation character among their first 2
2275 // characters.
2276 EXPECT_EQ("// long long long\n"
2277 "// long 'long'",
2278 format(
2279 "// long long long long\n"
2280 "// 'long'",
2281 getLLVMStyleWithColumns(20)));
2282
2283 // Don't reflow between separate blocks of comments.
2284 EXPECT_EQ("/* First comment\n"
2285 " * block will */\n"
2286 "/* Snd\n"
2287 " */\n",
2288 format("/* First comment block\n"
2289 " * will */\n"
2290 "/* Snd\n"
2291 " */\n",
2292 getLLVMStyleWithColumns(20)));
2293
2294 // Don't reflow lines having different indentation.
2295 EXPECT_EQ("// long long long\n"
2296 "// long\n"
2297 "// long",
2298 format("// long long long long\n"
2299 "// long",
2300 getLLVMStyleWithColumns(20)));
2301
2302 // Don't break or reflow after implicit string literals.
2303 verifyFormat("#include <t> // l l l\n"
2304 " // l",
2305 getLLVMStyleWithColumns(20));
2306
2307 // Don't break or reflow comments on import lines.
2308 EXPECT_EQ("#include \"t\" /* l l l\n"
2309 " * l */",
2310 format("#include \"t\" /* l l l\n"
2311 " * l */",
2312 getLLVMStyleWithColumns(20)));
2313
2314 // Don't reflow between different trailing comment sections.
2315 EXPECT_EQ("int i; // long long\n"
2316 " // long\n"
2317 "int j; // long long\n"
2318 " // long\n",
2319 format("int i; // long long long\n"
2320 "int j; // long long long\n",
2321 getLLVMStyleWithColumns(20)));
2322
2323 // Don't reflow if the first word on the next line is longer than the
2324 // available space at current line.
2325 EXPECT_EQ("int i; // trigger\n"
2326 " // reflow\n"
2327 " // longsec\n",
2328 format("int i; // trigger reflow\n"
2329 " // longsec\n",
2330 getLLVMStyleWithColumns(20)));
2331
2332 // Keep empty comment lines.
2333 EXPECT_EQ("/**/", format(" /**/", getLLVMStyleWithColumns(20)));
2334 EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
2335 EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
2336 EXPECT_EQ("//", format(" // ", getLLVMStyleWithColumns(20)));
2337 EXPECT_EQ("///", format(" /// ", getLLVMStyleWithColumns(20)));
2338}
2339
Alexander Kornienkof2e02122013-05-24 18:24:24 +00002340TEST_F(FormatTest, IgnoresIf0Contents) {
2341 EXPECT_EQ("#if 0\n"
2342 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
2343 "#endif\n"
2344 "void f() {}",
2345 format("#if 0\n"
2346 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
2347 "#endif\n"
2348 "void f( ) { }"));
2349 EXPECT_EQ("#if false\n"
2350 "void f( ) { }\n"
2351 "#endif\n"
2352 "void g() {}\n",
2353 format("#if false\n"
2354 "void f( ) { }\n"
2355 "#endif\n"
2356 "void g( ) { }\n"));
2357 EXPECT_EQ("enum E {\n"
2358 " One,\n"
2359 " Two,\n"
2360 "#if 0\n"
2361 "Three,\n"
2362 " Four,\n"
2363 "#endif\n"
2364 " Five\n"
2365 "};",
2366 format("enum E {\n"
2367 " One,Two,\n"
2368 "#if 0\n"
2369 "Three,\n"
2370 " Four,\n"
2371 "#endif\n"
2372 " Five};"));
2373 EXPECT_EQ("enum F {\n"
2374 " One,\n"
2375 "#if 1\n"
2376 " Two,\n"
2377 "#if 0\n"
2378 "Three,\n"
2379 " Four,\n"
2380 "#endif\n"
2381 " Five\n"
2382 "#endif\n"
2383 "};",
2384 format("enum F {\n"
2385 "One,\n"
2386 "#if 1\n"
2387 "Two,\n"
2388 "#if 0\n"
2389 "Three,\n"
2390 " Four,\n"
2391 "#endif\n"
2392 "Five\n"
2393 "#endif\n"
2394 "};"));
2395 EXPECT_EQ("enum G {\n"
2396 " One,\n"
2397 "#if 0\n"
2398 "Two,\n"
2399 "#else\n"
2400 " Three,\n"
2401 "#endif\n"
2402 " Four\n"
2403 "};",
2404 format("enum G {\n"
2405 "One,\n"
2406 "#if 0\n"
2407 "Two,\n"
2408 "#else\n"
2409 "Three,\n"
2410 "#endif\n"
2411 "Four\n"
2412 "};"));
2413 EXPECT_EQ("enum H {\n"
2414 " One,\n"
2415 "#if 0\n"
2416 "#ifdef Q\n"
2417 "Two,\n"
2418 "#else\n"
2419 "Three,\n"
2420 "#endif\n"
2421 "#endif\n"
2422 " Four\n"
2423 "};",
2424 format("enum H {\n"
2425 "One,\n"
2426 "#if 0\n"
2427 "#ifdef Q\n"
2428 "Two,\n"
2429 "#else\n"
2430 "Three,\n"
2431 "#endif\n"
2432 "#endif\n"
2433 "Four\n"
2434 "};"));
2435 EXPECT_EQ("enum I {\n"
2436 " One,\n"
2437 "#if /* test */ 0 || 1\n"
2438 "Two,\n"
2439 "Three,\n"
2440 "#endif\n"
2441 " Four\n"
2442 "};",
2443 format("enum I {\n"
2444 "One,\n"
2445 "#if /* test */ 0 || 1\n"
2446 "Two,\n"
2447 "Three,\n"
2448 "#endif\n"
2449 "Four\n"
2450 "};"));
2451 EXPECT_EQ("enum J {\n"
2452 " One,\n"
2453 "#if 0\n"
2454 "#if 0\n"
2455 "Two,\n"
2456 "#else\n"
2457 "Three,\n"
2458 "#endif\n"
2459 "Four,\n"
2460 "#endif\n"
2461 " Five\n"
2462 "};",
2463 format("enum J {\n"
2464 "One,\n"
2465 "#if 0\n"
2466 "#if 0\n"
2467 "Two,\n"
2468 "#else\n"
2469 "Three,\n"
2470 "#endif\n"
2471 "Four,\n"
2472 "#endif\n"
2473 "Five\n"
2474 "};"));
Alexander Kornienkof2e02122013-05-24 18:24:24 +00002475}
2476
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002477//===----------------------------------------------------------------------===//
2478// Tests for classes, namespaces, etc.
2479//===----------------------------------------------------------------------===//
2480
2481TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002482 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002483}
2484
2485TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
2486 verifyFormat("class A {\n"
2487 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00002488 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002489 "protected:\n"
2490 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002491 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002492 "};");
2493 verifyGoogleFormat("class A {\n"
2494 " public:\n"
2495 " protected:\n"
2496 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002497 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002498 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00002499 verifyFormat("class A {\n"
2500 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002501 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00002502 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002503 " void f2() {}\n"
2504 "protected slots:\n"
2505 " void f3() {}\n"
2506 "protected Q_SLOTS:\n"
2507 " void f4() {}\n"
2508 "private slots:\n"
2509 " void f5() {}\n"
2510 "private Q_SLOTS:\n"
2511 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00002512 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002513 " void g1();\n"
2514 "Q_SIGNALS:\n"
2515 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00002516 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00002517
2518 // Don't interpret 'signals' the wrong way.
2519 verifyFormat("signals.set();");
2520 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00002521 verifyFormat("{\n"
2522 " signals.set(); // This needs indentation.\n"
2523 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00002524 verifyFormat("void f() {\n"
2525 "label:\n"
2526 " signals.baz();\n"
2527 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002528}
2529
Alexander Kornienkofd433362013-03-27 17:08:02 +00002530TEST_F(FormatTest, SeparatesLogicalBlocks) {
2531 EXPECT_EQ("class A {\n"
2532 "public:\n"
2533 " void f();\n"
2534 "\n"
2535 "private:\n"
2536 " void g() {}\n"
2537 " // test\n"
2538 "protected:\n"
2539 " int h;\n"
2540 "};",
2541 format("class A {\n"
2542 "public:\n"
2543 "void f();\n"
2544 "private:\n"
2545 "void g() {}\n"
2546 "// test\n"
2547 "protected:\n"
2548 "int h;\n"
2549 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00002550 EXPECT_EQ("class A {\n"
2551 "protected:\n"
2552 "public:\n"
2553 " void f();\n"
2554 "};",
2555 format("class A {\n"
2556 "protected:\n"
2557 "\n"
2558 "public:\n"
2559 "\n"
2560 " void f();\n"
2561 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00002562
2563 // Even ensure proper spacing inside macros.
2564 EXPECT_EQ("#define B \\\n"
2565 " class A { \\\n"
2566 " protected: \\\n"
2567 " public: \\\n"
2568 " void f(); \\\n"
2569 " };",
2570 format("#define B \\\n"
2571 " class A { \\\n"
2572 " protected: \\\n"
2573 " \\\n"
2574 " public: \\\n"
2575 " \\\n"
2576 " void f(); \\\n"
2577 " };",
2578 getGoogleStyle()));
2579 // But don't remove empty lines after macros ending in access specifiers.
2580 EXPECT_EQ("#define A private:\n"
2581 "\n"
2582 "int i;",
2583 format("#define A private:\n"
2584 "\n"
2585 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00002586}
2587
Daniel Jasper83193602013-04-05 17:22:09 +00002588TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002589 verifyFormat("class A : public B {};");
2590 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002591
2592 verifyFormat(
2593 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002594 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00002595 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
2596 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002597 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002598 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002599 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002600 verifyFormat("class AAAAAAAAAAAA : public B,\n"
2601 " public C,\n"
2602 " public D,\n"
2603 " public E,\n"
2604 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002605 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00002606
2607 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002608 " ReallyReallyLongClassName {\n"
2609 " int i;\n"
2610 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00002611 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00002612 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
2613 " aaaaaaaaaaaaaaaa> {};");
2614 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
2615 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
2616 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00002617 verifyFormat("template <class R, class C>\n"
2618 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
2619 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00002620 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00002621}
2622
Manuel Klimek28cacc72013-01-07 18:10:23 +00002623TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002624 verifyFormat("class A {\n} a, b;");
2625 verifyFormat("struct A {\n} a, b;");
2626 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00002627}
2628
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002629TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002630 verifyFormat("enum {\n"
2631 " Zero,\n"
2632 " One = 1,\n"
2633 " Two = One + 1,\n"
2634 " Three = (One + Two),\n"
2635 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2636 " Five = (One, Two, Three, Four, 5)\n"
2637 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002638 verifyGoogleFormat("enum {\n"
2639 " Zero,\n"
2640 " One = 1,\n"
2641 " Two = One + 1,\n"
2642 " Three = (One + Two),\n"
2643 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2644 " Five = (One, Two, Three, Four, 5)\n"
2645 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002646 verifyFormat("enum Enum {};");
2647 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002648 verifyFormat("enum X E {} d;");
2649 verifyFormat("enum __attribute__((...)) E {} d;");
2650 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00002651 verifyFormat("enum {\n"
2652 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002653 "};",
2654 getLLVMStyleWithColumns(30));
2655
2656 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00002657 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002658
2659 EXPECT_EQ("enum KeepEmptyLines {\n"
2660 " ONE,\n"
2661 "\n"
2662 " TWO,\n"
2663 "\n"
2664 " THREE\n"
2665 "}",
2666 format("enum KeepEmptyLines {\n"
2667 " ONE,\n"
2668 "\n"
2669 " TWO,\n"
2670 "\n"
2671 "\n"
2672 " THREE\n"
2673 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00002674 verifyFormat("enum E { // comment\n"
2675 " ONE,\n"
2676 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00002677 "};\n"
2678 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002679 // Not enums.
2680 verifyFormat("enum X f() {\n"
2681 " a();\n"
2682 " return 42;\n"
2683 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00002684 verifyFormat("enum X Type::f() {\n"
2685 " a();\n"
2686 " return 42;\n"
2687 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002688 verifyFormat("enum ::X f() {\n"
2689 " a();\n"
2690 " return 42;\n"
2691 "}");
2692 verifyFormat("enum ns::X f() {\n"
2693 " a();\n"
2694 " return 42;\n"
2695 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002696}
2697
Daniel Jasperb7150872013-08-30 10:10:19 +00002698TEST_F(FormatTest, FormatsEnumsWithErrors) {
2699 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002700 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002701 " Two = 1;\n"
2702 "};");
2703 verifyFormat("namespace n {\n"
2704 "enum Type {\n"
2705 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002706 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002707 " int i;\n"
2708 "}\n"
2709 "void g() {}");
2710}
2711
Daniel Jasper2b41a822013-08-20 12:42:50 +00002712TEST_F(FormatTest, FormatsEnumStruct) {
2713 verifyFormat("enum struct {\n"
2714 " Zero,\n"
2715 " One = 1,\n"
2716 " Two = One + 1,\n"
2717 " Three = (One + Two),\n"
2718 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2719 " Five = (One, Two, Three, Four, 5)\n"
2720 "};");
2721 verifyFormat("enum struct Enum {};");
2722 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002723 verifyFormat("enum struct X E {} d;");
2724 verifyFormat("enum struct __attribute__((...)) E {} d;");
2725 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002726 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
2727}
2728
2729TEST_F(FormatTest, FormatsEnumClass) {
2730 verifyFormat("enum class {\n"
2731 " Zero,\n"
2732 " One = 1,\n"
2733 " Two = One + 1,\n"
2734 " Three = (One + Two),\n"
2735 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2736 " Five = (One, Two, Three, Four, 5)\n"
2737 "};");
2738 verifyFormat("enum class Enum {};");
2739 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002740 verifyFormat("enum class X E {} d;");
2741 verifyFormat("enum class __attribute__((...)) E {} d;");
2742 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002743 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
2744}
2745
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002746TEST_F(FormatTest, FormatsEnumTypes) {
2747 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002748 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002749 " B\n"
2750 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00002751 verifyFormat("enum X : int { A, B };");
2752 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002753}
2754
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002755TEST_F(FormatTest, FormatsNSEnums) {
2756 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
2757 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
2758 " // Information about someDecentlyLongValue.\n"
2759 " someDecentlyLongValue,\n"
2760 " // Information about anotherDecentlyLongValue.\n"
2761 " anotherDecentlyLongValue,\n"
2762 " // Information about aThirdDecentlyLongValue.\n"
2763 " aThirdDecentlyLongValue\n"
2764 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00002765 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
2766 " a = 1,\n"
2767 " b = 2,\n"
2768 " c = 3,\n"
2769 "};");
2770 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
2771 " a = 1,\n"
2772 " b = 2,\n"
2773 " c = 3,\n"
2774 "};");
2775 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
2776 " a = 1,\n"
2777 " b = 2,\n"
2778 " c = 3,\n"
2779 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002780}
2781
Nico Weber7769a902013-01-14 05:49:49 +00002782TEST_F(FormatTest, FormatsBitfields) {
2783 verifyFormat("struct Bitfields {\n"
2784 " unsigned sClass : 8;\n"
2785 " unsigned ValueKind : 2;\n"
2786 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00002787 verifyFormat("struct A {\n"
2788 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
2789 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
2790 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00002791 verifyFormat("struct MyStruct {\n"
2792 " uchar data;\n"
2793 " uchar : 8;\n"
2794 " uchar : 8;\n"
2795 " uchar other;\n"
2796 "};");
Nico Weber7769a902013-01-14 05:49:49 +00002797}
2798
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002799TEST_F(FormatTest, FormatsNamespaces) {
2800 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002801 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002802 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002803 "}");
2804 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002805 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002806 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002807 "}");
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002808 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002809 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002810 "void f() { f(); }\n"
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002811 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002812 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002813 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002814 "void f() { f(); }");
Manuel Klimek046b9302013-02-06 16:08:09 +00002815
2816 // This code is more common than we thought; if we
2817 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002818 // its own line, which is undesirable.
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002819 verifyFormat("namespace {};");
Manuel Klimek046b9302013-02-06 16:08:09 +00002820 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002821 "class A {};\n"
Manuel Klimek046b9302013-02-06 16:08:09 +00002822 "};");
Daniel Jasper251b3c92013-07-01 11:22:57 +00002823
2824 verifyFormat("namespace {\n"
2825 "int SomeVariable = 0; // comment\n"
2826 "} // namespace");
2827 EXPECT_EQ("#ifndef HEADER_GUARD\n"
2828 "#define HEADER_GUARD\n"
2829 "namespace my_namespace {\n"
2830 "int i;\n"
2831 "} // my_namespace\n"
2832 "#endif // HEADER_GUARD",
2833 format("#ifndef HEADER_GUARD\n"
2834 " #define HEADER_GUARD\n"
2835 " namespace my_namespace {\n"
2836 "int i;\n"
2837 "} // my_namespace\n"
2838 "#endif // HEADER_GUARD"));
Daniel Jasper65ee3472013-07-31 23:16:02 +00002839
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00002840 EXPECT_EQ("namespace A::B {\n"
2841 "class C {};\n"
2842 "}",
2843 format("namespace A::B {\n"
2844 "class C {};\n"
2845 "}"));
2846
Daniel Jasper65ee3472013-07-31 23:16:02 +00002847 FormatStyle Style = getLLVMStyle();
2848 Style.NamespaceIndentation = FormatStyle::NI_All;
2849 EXPECT_EQ("namespace out {\n"
2850 " int i;\n"
2851 " namespace in {\n"
2852 " int i;\n"
2853 " } // namespace\n"
2854 "} // namespace",
2855 format("namespace out {\n"
2856 "int i;\n"
2857 "namespace in {\n"
2858 "int i;\n"
2859 "} // namespace\n"
2860 "} // namespace",
2861 Style));
2862
2863 Style.NamespaceIndentation = FormatStyle::NI_Inner;
2864 EXPECT_EQ("namespace out {\n"
2865 "int i;\n"
2866 "namespace in {\n"
2867 " int i;\n"
2868 "} // namespace\n"
2869 "} // namespace",
2870 format("namespace out {\n"
2871 "int i;\n"
2872 "namespace in {\n"
2873 "int i;\n"
2874 "} // namespace\n"
2875 "} // namespace",
2876 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002877}
2878
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002879TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00002880
Daniel Jasper40aacf42013-03-14 13:45:21 +00002881TEST_F(FormatTest, FormatsInlineASM) {
2882 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00002883 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00002884 verifyFormat(
2885 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2886 " \"cpuid\\n\\t\"\n"
2887 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00002888 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00002889 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00002890 EXPECT_EQ(
2891 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002892 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002893 " mov edx,[that] // vtable in edx\n"
2894 " mov eax,methodIndex\n"
2895 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002896 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002897 "}",
2898 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2899 " __asm {\n"
2900 " mov edx,[that] // vtable in edx\n"
2901 " mov eax,methodIndex\n"
2902 " call [edx][eax*4] // stdcall\n"
2903 " }\n"
2904 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00002905 EXPECT_EQ("_asm {\n"
2906 " xor eax, eax;\n"
2907 " cpuid;\n"
2908 "}",
2909 format("_asm {\n"
2910 " xor eax, eax;\n"
2911 " cpuid;\n"
2912 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00002913 verifyFormat("void function() {\n"
2914 " // comment\n"
2915 " asm(\"\");\n"
2916 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00002917 EXPECT_EQ("__asm {\n"
2918 "}\n"
2919 "int i;",
2920 format("__asm {\n"
2921 "}\n"
2922 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00002923}
2924
Nico Weberd5650bd2013-01-07 16:36:17 +00002925TEST_F(FormatTest, FormatTryCatch) {
2926 verifyFormat("try {\n"
2927 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002928 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002929 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002930 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002931 " exit(42);\n"
2932 "}");
2933
2934 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00002935 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002936 " return 5;\n"
2937 "}");
2938 verifyFormat("class A {\n"
2939 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002940 " A() try : a(0) {\n"
2941 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002942 " throw;\n"
2943 " }\n"
2944 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00002945
2946 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002947 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00002948}
2949
Nico Weberfac23712015-02-04 15:26:27 +00002950TEST_F(FormatTest, FormatSEHTryCatch) {
2951 verifyFormat("__try {\n"
2952 " int a = b * c;\n"
2953 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2954 " // Do nothing.\n"
2955 "}");
2956
2957 verifyFormat("__try {\n"
2958 " int a = b * c;\n"
2959 "} __finally {\n"
2960 " // Do nothing.\n"
2961 "}");
2962
2963 verifyFormat("DEBUG({\n"
2964 " __try {\n"
2965 " } __finally {\n"
2966 " }\n"
2967 "});\n");
2968}
2969
Daniel Jasper04a71a42014-05-08 11:58:24 +00002970TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2971 verifyFormat("try {\n"
2972 " f();\n"
2973 "} catch {\n"
2974 " g();\n"
2975 "}");
2976 verifyFormat("try {\n"
2977 " f();\n"
2978 "} catch (A a) MACRO(x) {\n"
2979 " g();\n"
2980 "} catch (B b) MACRO(x) {\n"
2981 " g();\n"
2982 "}");
2983}
2984
2985TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2986 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00002987 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2988 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00002989 Style.BreakBeforeBraces = BraceStyle;
2990 verifyFormat("try {\n"
2991 " // something\n"
2992 "} catch (...) {\n"
2993 " // something\n"
2994 "}",
2995 Style);
2996 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00002997 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2998 verifyFormat("try {\n"
2999 " // something\n"
3000 "}\n"
3001 "catch (...) {\n"
3002 " // something\n"
3003 "}",
3004 Style);
Nico Weberfac23712015-02-04 15:26:27 +00003005 verifyFormat("__try {\n"
3006 " // something\n"
3007 "}\n"
3008 "__finally {\n"
3009 " // something\n"
3010 "}",
3011 Style);
Nico Weber33381f52015-02-07 01:57:32 +00003012 verifyFormat("@try {\n"
3013 " // something\n"
3014 "}\n"
3015 "@finally {\n"
3016 " // something\n"
3017 "}",
3018 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00003019 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3020 verifyFormat("try\n"
3021 "{\n"
3022 " // something\n"
3023 "}\n"
3024 "catch (...)\n"
3025 "{\n"
3026 " // something\n"
3027 "}",
3028 Style);
3029 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
3030 verifyFormat("try\n"
3031 " {\n"
3032 " // something\n"
3033 " }\n"
3034 "catch (...)\n"
3035 " {\n"
3036 " // something\n"
3037 " }",
3038 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00003039 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
3040 Style.BraceWrapping.BeforeCatch = true;
3041 verifyFormat("try {\n"
3042 " // something\n"
3043 "}\n"
3044 "catch (...) {\n"
3045 " // something\n"
3046 "}",
3047 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00003048}
3049
Daniel Jaspere25509f2012-12-17 11:29:41 +00003050TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003051 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00003052
Daniel Jaspera44991332015-04-29 13:06:49 +00003053 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
3054 " 100000000, "
3055 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00003056
Daniel Jasper473c62c2013-05-17 09:35:01 +00003057 // Here, everything other than the "}" would fit on a line.
3058 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003059 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00003060 EXPECT_EQ("S s = {a,\n"
3061 "\n"
3062 " b};",
3063 format("S s = {\n"
3064 " a,\n"
3065 "\n"
3066 " b\n"
3067 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00003068
3069 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
3070 // line. However, the formatting looks a bit off and this probably doesn't
3071 // happen often in practice.
3072 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003073 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00003074 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00003075}
3076
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003077TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003078 verifyFormat("const struct A a = {.a = 1, .b = 2};");
3079 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
3080 " .bbbbbbbbbb = 2,\n"
3081 " .cccccccccc = 3,\n"
3082 " .dddddddddd = 4,\n"
3083 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003084 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003085 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
3086 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
3087 " .ccccccccccccccccccccccccccc = 3,\n"
3088 " .ddddddddddddddddddddddddddd = 4,\n"
3089 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003090
3091 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
3092}
3093
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003094TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003095 verifyFormat("static A x = {{{}}};\n");
3096 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
3097 " {init1, init2, init3, init4}}};",
3098 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00003099
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003100 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003101 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
3102 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
3103 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
3104 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00003105 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00003106 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
3107 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
3108 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00003109 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
3110 " {rect.fRight - rect.fLeft, rect.fBottom - "
3111 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003112
Daniel Jasper8a8ce242013-01-31 14:59:26 +00003113 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00003114 "SomeArrayOfSomeType a = {\n"
3115 " {{1, 2, 3},\n"
3116 " {1, 2, 3},\n"
3117 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
3118 " 333333333333333333333333333333},\n"
3119 " {1, 2, 3},\n"
3120 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00003121 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00003122 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00003123 " {{1, 2, 3}},\n"
3124 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00003125 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
3126 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00003127 " {{1, 2, 3}},\n"
3128 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00003129
Daniel Jaspera44991332015-04-29 13:06:49 +00003130 verifyFormat("struct {\n"
3131 " unsigned bit;\n"
3132 " const char *const name;\n"
3133 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
3134 " {kOsWin, \"Windows\"},\n"
3135 " {kOsLinux, \"Linux\"},\n"
3136 " {kOsCrOS, \"Chrome OS\"}};");
3137 verifyFormat("struct {\n"
3138 " unsigned bit;\n"
3139 " const char *const name;\n"
3140 "} kBitsToOs[] = {\n"
3141 " {kOsMac, \"Mac\"},\n"
3142 " {kOsWin, \"Windows\"},\n"
3143 " {kOsLinux, \"Linux\"},\n"
3144 " {kOsCrOS, \"Chrome OS\"},\n"
3145 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003146}
3147
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003148TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
3149 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3150 " \\\n"
3151 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
3152}
3153
Daniel Jasperda16db32013-01-07 10:48:50 +00003154TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00003155 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
3156 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00003157
3158 // Do break defaulted and deleted functions.
3159 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
3160 " default;",
3161 getLLVMStyleWithColumns(40));
3162 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
3163 " delete;",
3164 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00003165}
3166
3167TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
3168 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
3169 getLLVMStyleWithColumns(40));
3170 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
3171 getLLVMStyleWithColumns(40));
3172 EXPECT_EQ("#define Q \\\n"
3173 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
3174 " \"aaaaaaaa.cpp\"",
3175 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
3176 getLLVMStyleWithColumns(40)));
3177}
3178
3179TEST_F(FormatTest, UnderstandsLinePPDirective) {
3180 EXPECT_EQ("# 123 \"A string literal\"",
3181 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00003182}
3183
Manuel Klimek591b5802013-01-31 15:58:48 +00003184TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00003185 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00003186 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003187}
3188
3189TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
3190 EXPECT_EQ("#line 42 \"test\"\n",
3191 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003192 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
3193 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003194}
3195
3196TEST_F(FormatTest, EndOfFileEndsPPDirective) {
3197 EXPECT_EQ("#line 42 \"test\"",
3198 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003199 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003200}
3201
Daniel Jasper877615c2013-10-11 19:45:02 +00003202TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
3203 verifyFormat("#define A \\x20");
3204 verifyFormat("#define A \\ x20");
3205 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
3206 verifyFormat("#define A ''");
3207 verifyFormat("#define A ''qqq");
3208 verifyFormat("#define A `qqq");
3209 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00003210 EXPECT_EQ("const char *c = STRINGIFY(\n"
3211 "\\na : b);",
3212 format("const char * c = STRINGIFY(\n"
3213 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00003214
3215 verifyFormat("a\r\\");
3216 verifyFormat("a\v\\");
3217 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00003218}
3219
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003220TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003221 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
3222 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003223 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003224 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00003225 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00003226
3227 verifyFormat("#define A A\n#define A A");
3228 verifyFormat("#define A(X) A\n#define A A");
3229
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003230 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
3231 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003232}
3233
3234TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00003235 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003236 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003237 "#define A( \\\n"
3238 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003239 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00003240 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00003241 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003242 " #include \"a.h\"\n"
3243 "#define A(A,\\\n"
3244 " B)\n"
3245 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00003246 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003247 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003248}
3249
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003250TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00003251
3252TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
3253 EXPECT_EQ("#define A \\\n"
3254 " c; \\\n"
3255 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003256 "f;",
3257 format("#define A c; e;\n"
3258 "f;",
3259 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00003260}
3261
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003262TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00003263
Manuel Klimek1abf7892013-01-04 23:34:14 +00003264TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00003265 EXPECT_EQ("int x,\n"
3266 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003267 " y;",
3268 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00003269}
3270
Manuel Klimek09e07972013-01-05 21:34:55 +00003271TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00003272 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00003273 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00003274 verifyFormat("#define A \\\n"
3275 " { \\\n"
3276 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003277 " }",
3278 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00003279
3280 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003281 " void function##X()",
3282 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00003283
3284 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003285 " void a##b##c()",
3286 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00003287
Daniel Jasper39825ea2013-01-14 15:40:57 +00003288 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00003289}
3290
Manuel Klimekd053c5b2013-01-23 14:37:36 +00003291TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00003292 EXPECT_EQ("#define A (x)", format("#define A (x)"));
3293 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00003294}
3295
Manuel Klimek0c137952013-02-11 12:33:24 +00003296TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
3297 EXPECT_EQ("#define A b;", format("#define A \\\n"
3298 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003299 " b;",
3300 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003301 EXPECT_EQ("#define A \\\n"
3302 " \\\n"
3303 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003304 " b;",
3305 format("#define A \\\n"
3306 " \\\n"
3307 " a; \\\n"
3308 " b;",
3309 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003310 EXPECT_EQ("#define A \\\n"
3311 " a; \\\n"
3312 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003313 " b;",
3314 format("#define A \\\n"
3315 " a; \\\n"
3316 " \\\n"
3317 " b;",
3318 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003319}
3320
Daniel Jasper00475962013-02-19 17:14:38 +00003321TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003322 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00003323 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00003324 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00003325 " case 2\n",
3326 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00003327 verifyFormat("#define MACRO(a) \\\n"
3328 " if (a) \\\n"
3329 " f(); \\\n"
3330 " else \\\n"
3331 " g()",
3332 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00003333 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003334 verifyIncompleteFormat("#define STR(x) #x\n"
3335 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00003336 verifyFormat("#pragma omp threadprivate( \\\n"
3337 " y)), // expected-warning",
3338 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00003339 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00003340 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003341 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00003342 "#define b \\\n"
3343 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003344 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003345 "a",
3346 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00003347 verifyFormat("#define A \\\n"
3348 " { \\\n"
3349 " {\n"
3350 "#define B \\\n"
3351 " } \\\n"
3352 " }",
3353 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00003354 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00003355 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00003356 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00003357 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00003358}
3359
Daniel Jasper40e19212013-05-29 13:16:10 +00003360TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
3361 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
3362 EXPECT_EQ("class A : public QObject {\n"
3363 " Q_OBJECT\n"
3364 "\n"
3365 " A() {}\n"
3366 "};",
3367 format("class A : public QObject {\n"
3368 " Q_OBJECT\n"
3369 "\n"
3370 " A() {\n}\n"
3371 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00003372 EXPECT_EQ("MACRO\n"
3373 "/*static*/ int i;",
3374 format("MACRO\n"
3375 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00003376 EXPECT_EQ("SOME_MACRO\n"
3377 "namespace {\n"
3378 "void f();\n"
3379 "}",
3380 format("SOME_MACRO\n"
3381 " namespace {\n"
3382 "void f( );\n"
3383 "}"));
Daniel Jasper40e19212013-05-29 13:16:10 +00003384 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00003385 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
3386 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00003387 // Only if everything is upper case.
3388 EXPECT_EQ("class A : public QObject {\n"
3389 " Q_Object A() {}\n"
3390 "};",
3391 format("class A : public QObject {\n"
3392 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00003393 " A() {\n}\n"
3394 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00003395
3396 // Only if the next line can actually start an unwrapped line.
3397 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
3398 format("SOME_WEIRD_LOG_MACRO\n"
3399 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00003400
3401 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00003402 "(n, buffers))\n",
3403 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00003404}
3405
Alexander Kornienkode644272013-04-08 22:16:06 +00003406TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
3407 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3408 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3409 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003410 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00003411 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3412 "int *createScopDetectionPass() { return 0; }",
3413 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3414 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3415 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
3416 " class X {};\n"
3417 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3418 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003419 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
3420 // braces, so that inner block is indented one level more.
3421 EXPECT_EQ("int q() {\n"
3422 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3423 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3424 " IPC_END_MESSAGE_MAP()\n"
3425 "}",
3426 format("int q() {\n"
3427 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3428 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3429 " IPC_END_MESSAGE_MAP()\n"
3430 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00003431
Daniel Jasper352dae12014-01-03 11:50:46 +00003432 // Same inside macros.
3433 EXPECT_EQ("#define LIST(L) \\\n"
3434 " L(A) \\\n"
3435 " L(B) \\\n"
3436 " L(C)",
3437 format("#define LIST(L) \\\n"
3438 " L(A) \\\n"
3439 " L(B) \\\n"
3440 " L(C)",
3441 getGoogleStyle()));
3442
Daniel Jasper545c6522013-09-17 09:26:07 +00003443 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003444 EXPECT_EQ("int q() {\n"
3445 " f(x);\n"
3446 " f(x) {}\n"
3447 " f(x)->g();\n"
3448 " f(x)->*g();\n"
3449 " f(x).g();\n"
3450 " f(x) = x;\n"
3451 " f(x) += x;\n"
3452 " f(x) -= x;\n"
3453 " f(x) *= x;\n"
3454 " f(x) /= x;\n"
3455 " f(x) %= x;\n"
3456 " f(x) &= x;\n"
3457 " f(x) |= x;\n"
3458 " f(x) ^= x;\n"
3459 " f(x) >>= x;\n"
3460 " f(x) <<= x;\n"
3461 " f(x)[y].z();\n"
3462 " LOG(INFO) << x;\n"
3463 " ifstream(x) >> x;\n"
3464 "}\n",
3465 format("int q() {\n"
3466 " f(x)\n;\n"
3467 " f(x)\n {}\n"
3468 " f(x)\n->g();\n"
3469 " f(x)\n->*g();\n"
3470 " f(x)\n.g();\n"
3471 " f(x)\n = x;\n"
3472 " f(x)\n += x;\n"
3473 " f(x)\n -= x;\n"
3474 " f(x)\n *= x;\n"
3475 " f(x)\n /= x;\n"
3476 " f(x)\n %= x;\n"
3477 " f(x)\n &= x;\n"
3478 " f(x)\n |= x;\n"
3479 " f(x)\n ^= x;\n"
3480 " f(x)\n >>= x;\n"
3481 " f(x)\n <<= x;\n"
3482 " f(x)\n[y].z();\n"
3483 " LOG(INFO)\n << x;\n"
3484 " ifstream(x)\n >> x;\n"
3485 "}\n"));
3486 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003487 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003488 " if (1) {\n"
3489 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003490 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003491 " while (1) {\n"
3492 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003493 " F(x)\n"
3494 " G(x);\n"
3495 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003496 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003497 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003498 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003499 " }\n"
3500 "}\n",
3501 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003502 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003503 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003504 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003505 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003506 "F(x)\n"
3507 "G(x);\n"
3508 "F(x)\n"
3509 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003510 "}\n"));
3511 EXPECT_EQ("class A {\n"
3512 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00003513 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003514 " A(X x)\n" // FIXME: function-level try blocks are broken.
3515 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003516 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003517 " }\n"
3518 "};",
3519 format("class A {\n"
3520 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00003521 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003522 " A(X x)\n"
3523 " try : t(0) {} catch (...) {}\n"
3524 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00003525 EXPECT_EQ("class SomeClass {\n"
3526 "public:\n"
3527 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3528 "};",
3529 format("class SomeClass {\n"
3530 "public:\n"
3531 " SomeClass()\n"
3532 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3533 "};"));
3534 EXPECT_EQ("class SomeClass {\n"
3535 "public:\n"
3536 " SomeClass()\n"
3537 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3538 "};",
3539 format("class SomeClass {\n"
3540 "public:\n"
3541 " SomeClass()\n"
3542 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3543 "};",
3544 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00003545
3546 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00003547}
3548
Manuel Klimek4fe43002013-05-22 12:51:29 +00003549TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
3550 verifyFormat("#define A \\\n"
3551 " f({ \\\n"
3552 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003553 " });",
3554 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00003555}
3556
Manuel Klimekef2cfb12013-01-05 22:14:16 +00003557TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
3558 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
3559}
3560
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003561TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003562 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003563}
3564
Manuel Klimek1058d982013-01-06 20:07:31 +00003565TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3566 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
3567 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3568 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
3569 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3570}
Manuel Klimek1abf7892013-01-04 23:34:14 +00003571
Daniel Jaspere2408e32015-05-06 11:16:43 +00003572TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003573 EXPECT_EQ(
3574 "#define A \\\n int i; \\\n int j;",
3575 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003576 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00003577 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003578 EXPECT_EQ("/* \\ \\ \\\n*/", format("\\\n/* \\ \\ \\\n*/"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00003579 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003580}
3581
Alexander Kornienko00691cf2015-01-12 13:11:12 +00003582TEST_F(FormatTest, DontCrashOnBlockComments) {
3583 EXPECT_EQ(
3584 "int xxxxxxxxx; /* "
3585 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\n"
3586 "zzzzzz\n"
3587 "0*/",
3588 format("int xxxxxxxxx; /* "
3589 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzz\n"
3590 "0*/"));
3591}
3592
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003593TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3594 verifyFormat("#define A \\\n"
3595 " int v( \\\n"
3596 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003597 " int i;",
3598 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003599}
3600
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003601TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00003602 EXPECT_EQ(
3603 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3604 " \\\n"
3605 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3606 "\n"
3607 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3608 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3609 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
3610 "\\\n"
3611 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3612 " \n"
3613 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3614 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003615}
3616
Manuel Klimek52b15152013-01-09 15:25:02 +00003617TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3618 EXPECT_EQ("int\n"
3619 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003620 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003621 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003622 verifyFormat("functionCallTo(\n"
3623 " someOtherFunction(\n"
3624 " withSomeParameters, whichInSequence,\n"
3625 " areLongerThanALine(andAnotherCall,\n"
3626 "#define A B\n"
3627 " withMoreParamters,\n"
3628 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003629 " andMoreParameters),\n"
3630 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003631 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00003632 verifyFormat("Foo::Foo()\n"
3633 "#ifdef BAR\n"
3634 " : baz(0)\n"
3635 "#endif\n"
3636 "{\n"
3637 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00003638 verifyFormat("void f() {\n"
3639 " if (true)\n"
3640 "#ifdef A\n"
3641 " f(42);\n"
3642 " x();\n"
3643 "#else\n"
3644 " g();\n"
3645 " x();\n"
3646 "#endif\n"
3647 "}");
3648 verifyFormat("void f(param1, param2,\n"
3649 " param3,\n"
3650 "#ifdef A\n"
3651 " param4(param5,\n"
3652 "#ifdef A1\n"
3653 " param6,\n"
3654 "#ifdef A2\n"
3655 " param7),\n"
3656 "#else\n"
3657 " param8),\n"
3658 " param9,\n"
3659 "#endif\n"
3660 " param10,\n"
3661 "#endif\n"
3662 " param11)\n"
3663 "#else\n"
3664 " param12)\n"
3665 "#endif\n"
3666 "{\n"
3667 " x();\n"
3668 "}",
3669 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00003670 verifyFormat("#if 1\n"
3671 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003672 verifyFormat("#if 1\n"
3673 "#endif\n"
3674 "#if 1\n"
3675 "#else\n"
3676 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00003677 verifyFormat("DEBUG({\n"
3678 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3679 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3680 "});\n"
3681 "#if a\n"
3682 "#else\n"
3683 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00003684
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003685 verifyIncompleteFormat("void f(\n"
3686 "#if A\n"
3687 " );\n"
3688 "#else\n"
3689 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00003690}
3691
Manuel Klimek14bd9172014-01-29 08:49:02 +00003692TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3693 verifyFormat("#endif\n"
3694 "#if B");
3695}
3696
Manuel Klimek88033d72013-10-21 08:11:15 +00003697TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3698 FormatStyle SingleLine = getLLVMStyle();
3699 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00003700 verifyFormat("#if 0\n"
3701 "#elif 1\n"
3702 "#endif\n"
3703 "void foo() {\n"
3704 " if (test) foo2();\n"
3705 "}",
3706 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00003707}
3708
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003709TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00003710 verifyFormat("functionCall({ int i; });");
3711 verifyFormat("functionCall({\n"
3712 " int i;\n"
3713 " int j;\n"
3714 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00003715 verifyFormat("functionCall(\n"
3716 " {\n"
3717 " int i;\n"
3718 " int j;\n"
3719 " },\n"
3720 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00003721 verifyFormat("functionA(functionB({\n"
3722 " int i;\n"
3723 " int j;\n"
3724 " }),\n"
3725 " aaaa, bbbb, cccc);");
3726 verifyFormat("functionCall(\n"
3727 " {\n"
3728 " int i;\n"
3729 " int j;\n"
3730 " },\n"
3731 " aaaa, bbbb, // comment\n"
3732 " cccc);");
3733 verifyFormat("functionA(functionB({\n"
3734 " int i;\n"
3735 " int j;\n"
3736 " }),\n"
3737 " aaaa, bbbb, // comment\n"
3738 " cccc);");
3739 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3740 verifyFormat("functionCall(aaaa, bbbb, {\n"
3741 " int i;\n"
3742 " int j;\n"
3743 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00003744 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00003745 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00003746 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003747 " int i; // break\n"
3748 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00003749 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3750 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003751 verifyFormat("DEBUG({\n"
3752 " if (a)\n"
3753 " f();\n"
3754 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003755}
3756
3757TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003758 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003759 "int i;",
3760 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003761}
3762
3763TEST_F(FormatTest, LayoutNestedBlocks) {
3764 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3765 " struct s {\n"
3766 " int i;\n"
3767 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003768 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003769 " for (int i = 0; i < 10; ++i)\n"
3770 " return;\n"
3771 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003772 verifyFormat("call(parameter, {\n"
3773 " something();\n"
3774 " // Comment using all columns.\n"
3775 " somethingelse();\n"
3776 "});",
3777 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00003778 verifyFormat("DEBUG( //\n"
3779 " { f(); }, a);");
3780 verifyFormat("DEBUG( //\n"
3781 " {\n"
3782 " f(); //\n"
3783 " },\n"
3784 " a);");
3785
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003786 EXPECT_EQ("call(parameter, {\n"
3787 " something();\n"
3788 " // Comment too\n"
3789 " // looooooooooong.\n"
3790 " somethingElse();\n"
3791 "});",
3792 format("call(parameter, {\n"
3793 " something();\n"
3794 " // Comment too looooooooooong.\n"
3795 " somethingElse();\n"
3796 "});",
3797 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003798 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003799 EXPECT_EQ("DEBUG({ // comment\n"
3800 " int i;\n"
3801 "});",
3802 format("DEBUG({ // comment\n"
3803 "int i;\n"
3804 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003805 EXPECT_EQ("DEBUG({\n"
3806 " int i;\n"
3807 "\n"
3808 " // comment\n"
3809 " int j;\n"
3810 "});",
3811 format("DEBUG({\n"
3812 " int i;\n"
3813 "\n"
3814 " // comment\n"
3815 " int j;\n"
3816 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003817
3818 verifyFormat("DEBUG({\n"
3819 " if (a)\n"
3820 " return;\n"
3821 "});");
3822 verifyGoogleFormat("DEBUG({\n"
3823 " if (a) return;\n"
3824 "});");
3825 FormatStyle Style = getGoogleStyle();
3826 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003827 verifyFormat("Debug(aaaaa,\n"
3828 " {\n"
3829 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3830 " },\n"
3831 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003832 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003833
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003834 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3835
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003836 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003837}
3838
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003839TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3840 EXPECT_EQ("#define MACRO() \\\n"
3841 " Debug(aaa, /* force line break */ \\\n"
3842 " { \\\n"
3843 " int i; \\\n"
3844 " int j; \\\n"
3845 " })",
3846 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3847 " { int i; int j; })",
3848 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003849
3850 EXPECT_EQ("#define A \\\n"
3851 " [] { \\\n"
3852 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3853 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3854 " }",
3855 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3856 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3857 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003858}
3859
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003860TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3861 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003862 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003863 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003864}
3865
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003866TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3867 FormatStyle Style = getLLVMStyle();
3868 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3869 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3870 verifyFormat("FOO_BEGIN\n"
3871 " FOO_ENTRY\n"
3872 "FOO_END", Style);
3873 verifyFormat("FOO_BEGIN\n"
3874 " NESTED_FOO_BEGIN\n"
3875 " NESTED_FOO_ENTRY\n"
3876 " NESTED_FOO_END\n"
3877 "FOO_END", Style);
3878 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3879 " int x;\n"
3880 " x = 1;\n"
3881 "FOO_END(Baz)", Style);
3882}
3883
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003884//===----------------------------------------------------------------------===//
3885// Line break tests.
3886//===----------------------------------------------------------------------===//
3887
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003888TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003889 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003890 "void f() {\n"
3891 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3892 " parameter, parameter, parameter)),\n"
3893 " SecondLongCall(parameter));\n"
3894 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003895 verifyFormat(
3896 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3897 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3898 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3899 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3900 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003901 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3902 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3903 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3904 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003905 verifyFormat(
3906 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3907 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3908 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3909 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003910 verifyFormat("int a = bbbb && ccc &&\n"
3911 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003912 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003913 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003914}
3915
Daniel Jasperd69fc772013-05-08 14:12:04 +00003916TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3917 verifyFormat(
3918 "bool aaaaaaa =\n"
3919 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3920 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003921 verifyFormat(
3922 "bool aaaaaaa =\n"
3923 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3924 " bbbbbbbb();");
3925
Daniel Jasperd69fc772013-05-08 14:12:04 +00003926 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3927 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3928 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003929 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3930 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3931 " ccccccccc == ddddddddddd;");
3932 verifyFormat(
3933 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3934 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3935 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003936
3937 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3938 " aaaaaa) &&\n"
3939 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003940 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3941 " aaaaaa) >>\n"
3942 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003943 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003944 " SourceMgr.getSpellingColumnNumber(\n"
3945 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3946 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003947
Daniel Jasper68d888c2013-06-03 08:42:05 +00003948 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3949 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3950 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003951 verifyFormat("b = a &&\n"
3952 " // Comment\n"
3953 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003954
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003955 // If the LHS of a comparison is not a binary expression itself, the
3956 // additional linebreak confuses many people.
3957 verifyFormat(
3958 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3959 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3960 "}");
3961 verifyFormat(
3962 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3963 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3964 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003965 verifyFormat(
3966 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3967 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3968 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003969 // Even explicit parentheses stress the precedence enough to make the
3970 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003971 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3972 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3973 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003974 // This cases is borderline, but with the indentation it is still readable.
3975 verifyFormat(
3976 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3977 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3978 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3979 "}",
3980 getLLVMStyleWithColumns(75));
3981
3982 // If the LHS is a binary expression, we should still use the additional break
3983 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003984 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3985 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3986 " 5) {\n"
3987 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003988
Daniel Jasper571f1af2013-05-14 20:39:56 +00003989 FormatStyle OnePerLine = getLLVMStyle();
3990 OnePerLine.BinPackParameters = false;
3991 verifyFormat(
3992 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3993 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3994 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3995 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00003996
3997 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3998 " .aaa(aaaaaaaaaaaaa) *\n"
3999 " aaaaaaa +\n"
4000 " aaaaaaa;",
4001 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00004002}
4003
Daniel Jasper6bee6822013-04-08 20:33:42 +00004004TEST_F(FormatTest, ExpressionIndentation) {
4005 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4006 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4007 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4008 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4009 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4010 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
4011 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4012 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
4013 " ccccccccccccccccccccccccccccccccccccccccc;");
4014 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4015 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4016 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4017 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4018 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4019 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4020 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4021 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4022 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4023 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4024 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4025 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00004026 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00004027 "} else if (aaaaa &&\n"
4028 " bbbbb > // break\n"
4029 " ccccc) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00004030 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00004031
4032 // Presence of a trailing comment used to change indentation of b.
4033 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
4034 " b;\n"
4035 "return aaaaaaaaaaaaaaaaaaa +\n"
4036 " b; //",
4037 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00004038}
4039
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004040TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
4041 // Not sure what the best system is here. Like this, the LHS can be found
4042 // immediately above an operator (everything with the same or a higher
4043 // indent). The RHS is aligned right of the operator and so compasses
4044 // everything until something with the same indent as the operator is found.
4045 // FIXME: Is this a good system?
4046 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00004047 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004048 verifyFormat(
4049 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004050 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4051 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4052 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4053 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4054 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004055 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004056 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4057 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004058 Style);
4059 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004060 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4061 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004062 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4063 Style);
4064 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004065 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4066 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004067 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4068 Style);
4069 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4070 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004071 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4072 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004073 Style);
4074 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004075 "} else if (aaaaa\n"
4076 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004077 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004078 "}",
4079 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00004080 verifyFormat("return (a)\n"
4081 " // comment\n"
4082 " + b;",
4083 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004084 verifyFormat(
4085 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4086 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4087 " + cc;",
4088 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00004089
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00004090 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4091 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4092 Style);
4093
Daniel Jasper9e5ede02013-11-08 19:56:28 +00004094 // Forced by comments.
4095 verifyFormat(
4096 "unsigned ContentSize =\n"
4097 " sizeof(int16_t) // DWARF ARange version number\n"
4098 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4099 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
4100 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00004101
4102 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
4103 " == boost::fusion::at_c<1>(iiii).second;",
4104 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00004105
4106 Style.ColumnLimit = 60;
4107 verifyFormat("zzzzzzzzzz\n"
4108 " = bbbbbbbbbbbbbbbbb\n"
4109 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
4110 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004111}
4112
Daniel Jasper3219e432014-12-02 13:24:51 +00004113TEST_F(FormatTest, NoOperandAlignment) {
4114 FormatStyle Style = getLLVMStyle();
4115 Style.AlignOperands = false;
4116 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00004117 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4118 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4119 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4120 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4121 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4122 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4123 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4124 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4125 " > ccccccccccccccccccccccccccccccccccccccccc;",
4126 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004127
4128 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4129 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4130 " + cc;",
4131 Style);
4132 verifyFormat("int a = aa\n"
4133 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4134 " * cccccccccccccccccccccccccccccccccccc;",
4135 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00004136
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004137 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00004138 verifyFormat("return (a > b\n"
4139 " // comment1\n"
4140 " // comment2\n"
4141 " || c);",
4142 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004143}
4144
Daniel Jasperac043c92014-09-15 11:11:00 +00004145TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
4146 FormatStyle Style = getLLVMStyle();
4147 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4148 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4149 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00004150 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4151 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00004152}
4153
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004154TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004155 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004156 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
4157 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004158 verifyFormat("Constructor()\n"
4159 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004160 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004161 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004162 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004163 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004164
Daniel Jasper7b259cd2015-08-27 11:59:31 +00004165 verifyFormat("template <typename T>\n"
4166 "Constructor() : Initializer(FitsOnTheLine) {}",
4167 getLLVMStyleWithColumns(45));
4168
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004169 verifyFormat(
4170 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004171 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004172
4173 verifyFormat(
4174 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004175 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004176 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004177 verifyFormat(
4178 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004179 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004180 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00004181 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4182 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4183 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004184
4185 verifyFormat("Constructor()\n"
4186 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4187 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4188 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004189 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004190
Daniel Jasper65585ed2013-01-28 13:31:35 +00004191 verifyFormat("Constructor()\n"
4192 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004193 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00004194
Daniel Jasper62e68172013-02-25 15:59:54 +00004195 verifyFormat("Constructor(int Parameter = 0)\n"
4196 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4197 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00004198 verifyFormat("Constructor()\n"
4199 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4200 "}",
4201 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00004202 verifyFormat("Constructor()\n"
4203 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4204 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00004205
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004206 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00004207 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004208 verifyFormat("Constructor()\n"
4209 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4210 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
4211 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004212
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004213 FormatStyle OnePerLine = getLLVMStyle();
4214 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00004215 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004216 verifyFormat("SomeClass::Constructor()\n"
4217 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4218 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004219 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004220 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004221 verifyFormat("SomeClass::Constructor()\n"
4222 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4223 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004224 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004225 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004226 verifyFormat("MyClass::MyClass(int var)\n"
4227 " : some_var_(var), // 4 space indent\n"
4228 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004229 "}",
4230 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00004231 verifyFormat("Constructor()\n"
4232 " : aaaaa(aaaaaa),\n"
4233 " aaaaa(aaaaaa),\n"
4234 " aaaaa(aaaaaa),\n"
4235 " aaaaa(aaaaaa),\n"
4236 " aaaaa(aaaaaa) {}",
4237 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00004238 verifyFormat("Constructor()\n"
4239 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4240 " aaaaaaaaaaaaaaaaaaaaaa) {}",
4241 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00004242 OnePerLine.BinPackParameters = false;
4243 verifyFormat(
4244 "Constructor()\n"
4245 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4246 " aaaaaaaaaaa().aaa(),\n"
4247 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4248 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00004249 OnePerLine.ColumnLimit = 60;
4250 verifyFormat("Constructor()\n"
4251 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
4252 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4253 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00004254
4255 EXPECT_EQ("Constructor()\n"
4256 " : // Comment forcing unwanted break.\n"
4257 " aaaa(aaaa) {}",
4258 format("Constructor() :\n"
4259 " // Comment forcing unwanted break.\n"
4260 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004261}
4262
4263TEST_F(FormatTest, MemoizationTests) {
4264 // This breaks if the memoization lookup does not take \c Indent and
4265 // \c LastSpace into account.
4266 verifyFormat(
4267 "extern CFRunLoopTimerRef\n"
4268 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
4269 " CFTimeInterval interval, CFOptionFlags flags,\n"
4270 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00004271 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004272
4273 // Deep nesting somewhat works around our memoization.
4274 verifyFormat(
4275 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4276 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4277 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4278 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4279 " aaaaa())))))))))))))))))))))))))))))))))))))));",
4280 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00004281 verifyFormat(
4282 "aaaaa(\n"
4283 " aaaaa,\n"
4284 " aaaaa(\n"
4285 " aaaaa,\n"
4286 " aaaaa(\n"
4287 " aaaaa,\n"
4288 " aaaaa(\n"
4289 " aaaaa,\n"
4290 " aaaaa(\n"
4291 " aaaaa,\n"
4292 " aaaaa(\n"
4293 " aaaaa,\n"
4294 " aaaaa(\n"
4295 " aaaaa,\n"
4296 " aaaaa(\n"
4297 " aaaaa,\n"
4298 " aaaaa(\n"
4299 " aaaaa,\n"
4300 " aaaaa(\n"
4301 " aaaaa,\n"
4302 " aaaaa(\n"
4303 " aaaaa,\n"
4304 " aaaaa(\n"
4305 " aaaaa,\n"
4306 " aaaaa))))))))))));",
4307 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00004308 verifyFormat(
4309 "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"
4310 " a),\n"
4311 " a),\n"
4312 " a),\n"
4313 " a),\n"
4314 " a),\n"
4315 " a),\n"
4316 " a),\n"
4317 " a),\n"
4318 " a),\n"
4319 " a),\n"
4320 " a),\n"
4321 " a),\n"
4322 " a),\n"
4323 " a),\n"
4324 " a),\n"
4325 " a),\n"
4326 " a)",
4327 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00004328
4329 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004330 FormatStyle OnePerLine = getLLVMStyle();
4331 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004332 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00004333 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00004334 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00004335 for (unsigned i = 0, e = 80; i != e; ++i) {
4336 input += " a,\n";
4337 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004338 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004339 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004340}
4341
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004342TEST_F(FormatTest, BreaksAsHighAsPossible) {
4343 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004344 "void f() {\n"
4345 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
4346 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
4347 " f();\n"
4348 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00004349 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004350 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004351}
4352
Daniel Jasper6728fc12013-04-11 14:29:13 +00004353TEST_F(FormatTest, BreaksFunctionDeclarations) {
4354 // Principially, we break function declarations in a certain order:
4355 // 1) break amongst arguments.
4356 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
4357 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004358 verifyFormat("template <class TemplateIt>\n"
4359 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
4360 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00004361
4362 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00004363 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004364 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004365 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004366 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004367
4368 // 3) break after (.
4369 verifyFormat(
4370 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00004371 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
4372 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004373
4374 // 4) break before after nested name specifiers.
4375 verifyFormat(
4376 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004377 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
4378 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004379 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004380
4381 // However, there are exceptions, if a sufficient amount of lines can be
4382 // saved.
4383 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
4384 // more adjusting.
4385 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4386 " Cccccccccccccc cccccccccc,\n"
4387 " Cccccccccccccc cccccccccc,\n"
4388 " Cccccccccccccc cccccccccc,\n"
4389 " Cccccccccccccc cccccccccc);");
4390 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004391 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004392 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4393 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4394 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004395 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004396 verifyFormat(
4397 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4398 " Cccccccccccccc cccccccccc,\n"
4399 " Cccccccccccccc cccccccccc,\n"
4400 " Cccccccccccccc cccccccccc,\n"
4401 " Cccccccccccccc cccccccccc,\n"
4402 " Cccccccccccccc cccccccccc,\n"
4403 " Cccccccccccccc cccccccccc);");
4404 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4405 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4406 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4407 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4408 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00004409
4410 // Break after multi-line parameters.
4411 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4412 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4413 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4414 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00004415 verifyFormat("void SomeLoooooooooooongFunction(\n"
4416 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
4417 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4418 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004419
4420 // Treat overloaded operators like other functions.
4421 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4422 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00004423 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4424 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00004425 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4426 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
4427 verifyGoogleFormat(
4428 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
4429 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004430 verifyGoogleFormat(
4431 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
4432 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00004433 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4434 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4435 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
4436 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00004437 verifyGoogleFormat(
4438 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
4439 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4440 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00004441 verifyGoogleFormat(
4442 "template <typename T>\n"
4443 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4444 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
4445 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00004446
4447 FormatStyle Style = getLLVMStyle();
4448 Style.PointerAlignment = FormatStyle::PAS_Left;
4449 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4450 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
4451 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004452 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
4453 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4454 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00004455}
4456
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004457TEST_F(FormatTest, TrailingReturnType) {
4458 verifyFormat("auto foo() -> int;\n");
4459 verifyFormat("struct S {\n"
4460 " auto bar() const -> int;\n"
4461 "};");
4462 verifyFormat("template <size_t Order, typename T>\n"
4463 "auto load_img(const std::string &filename)\n"
4464 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00004465 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
4466 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00004467 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00004468 verifyFormat("template <typename T>\n"
4469 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
4470 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00004471
4472 // Not trailing return types.
4473 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004474}
4475
Daniel Jasper5be31f72013-05-21 09:16:31 +00004476TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004477 // Avoid breaking before trailing 'const' or other trailing annotations, if
4478 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00004479 FormatStyle Style = getGoogleStyle();
4480 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00004481 verifyFormat("void someLongFunction(\n"
4482 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00004483 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00004484 verifyFormat("LoooooongReturnType\n"
4485 "someLoooooooongFunction() const {}",
4486 getLLVMStyleWithColumns(47));
4487 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
4488 " const {}",
4489 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004490 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4491 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
4492 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4493 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
4494 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4495 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00004496 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
4497 " aaaaaaaaaaa aaaaa) const override;");
4498 verifyGoogleFormat(
4499 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4500 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004501
Daniel Jasper5550de62014-02-17 07:57:46 +00004502 // Even if the first parameter has to be wrapped.
4503 verifyFormat("void someLongFunction(\n"
4504 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004505 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00004506 verifyFormat("void someLongFunction(\n"
4507 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004508 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00004509 verifyFormat("void someLongFunction(\n"
4510 " int someLongParameter) override {}",
4511 Style);
4512 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004513 " int someLongParameter) OVERRIDE {}",
4514 Style);
4515 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004516 " int someLongParameter) final {}",
4517 Style);
4518 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004519 " int someLongParameter) FINAL {}",
4520 Style);
4521 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004522 " int parameter) const override {}",
4523 Style);
4524
Daniel Jaspere3f907f2014-06-02 09:52:08 +00004525 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
4526 verifyFormat("void someLongFunction(\n"
4527 " int someLongParameter) const\n"
4528 "{\n"
4529 "}",
4530 Style);
4531
Daniel Jasper5550de62014-02-17 07:57:46 +00004532 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004533 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
4534 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4535 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00004536
4537 // Breaking before function-like trailing annotations is fine to keep them
4538 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00004539 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4540 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4541 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4542 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4543 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4544 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00004545 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4546 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00004547 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004548
4549 verifyFormat(
4550 "void aaaaaaaaaaaaaaaaaa()\n"
4551 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4552 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
4553 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4554 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004555 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004556 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004557 " GUARDED_BY(aaaaaaaaaaaa);");
4558 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004559 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004560 " GUARDED_BY(aaaaaaaaaaaa);");
4561 verifyGoogleFormat(
4562 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4563 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004564 verifyGoogleFormat(
4565 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4566 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004567}
4568
Daniel Jasperf090f032015-05-18 09:47:22 +00004569TEST_F(FormatTest, FunctionAnnotations) {
4570 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004571 "int OldFunction(const string &parameter) {}");
4572 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004573 "string OldFunction(const string &parameter) {}");
4574 verifyFormat("template <typename T>\n"
4575 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4576 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004577
4578 // Not function annotations.
4579 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4580 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004581 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4582 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004583 verifyFormat("MACRO(abc).function() // wrap\n"
4584 " << abc;");
4585 verifyFormat("MACRO(abc)->function() // wrap\n"
4586 " << abc;");
4587 verifyFormat("MACRO(abc)::function() // wrap\n"
4588 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004589}
4590
Daniel Jasperf7935112012-12-03 18:12:45 +00004591TEST_F(FormatTest, BreaksDesireably) {
4592 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4593 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004594 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004595 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4596 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4597 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004598
4599 verifyFormat(
4600 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004601 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004602
4603 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4604 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4605 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004606
4607 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004608 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4609 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4610 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004611 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4612 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004613
4614 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4615 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4616
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004617 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004618 "void f() {\n"
4619 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4620 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4621 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004622 verifyFormat(
4623 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4624 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4625 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004626 "aaaaaa(aaa,\n"
4627 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4628 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jaspera44991332015-04-29 13:06:49 +00004629 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4630 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4631 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004632
Daniel Jasper739b85f2015-06-29 10:42:59 +00004633 // Indent consistently independent of call expression and unary operator.
4634 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4635 " dddddddddddddddddddddddddddddd));");
4636 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4637 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004638 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004639 " dddddddddddddddddddddddddddddd));");
4640
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004641 // This test case breaks on an incorrect memoization, i.e. an optimization not
4642 // taking into account the StopAt value.
4643 verifyFormat(
4644 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004645 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4646 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4647 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004648
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004649 verifyFormat("{\n {\n {\n"
4650 " Annotation.SpaceRequiredBefore =\n"
4651 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4652 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4653 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004654
4655 // Break on an outer level if there was a break on an inner level.
4656 EXPECT_EQ("f(g(h(a, // comment\n"
4657 " b, c),\n"
4658 " d, e),\n"
4659 " x, y);",
4660 format("f(g(h(a, // comment\n"
4661 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004662
4663 // Prefer breaking similar line breaks.
4664 verifyFormat(
4665 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4666 " NSTrackingMouseEnteredAndExited |\n"
4667 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004668}
4669
Daniel Jasper18210d72014-10-09 09:52:05 +00004670TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4671 FormatStyle NoBinPacking = getGoogleStyle();
4672 NoBinPacking.BinPackParameters = false;
4673 NoBinPacking.BinPackArguments = true;
4674 verifyFormat("void f() {\n"
4675 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4676 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4677 "}",
4678 NoBinPacking);
4679 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4680 " int aaaaaaaaaaaaaaaaaaaa,\n"
4681 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4682 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004683
Daniel Jasper00693b082016-01-09 15:56:47 +00004684 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4685 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4686 " vector<int> bbbbbbbbbbbbbbb);",
4687 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004688 // FIXME: This behavior difference is probably not wanted. However, currently
4689 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4690 // template arguments from BreakBeforeParameter being set because of the
4691 // one-per-line formatting.
4692 verifyFormat(
4693 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4694 " aaaaaaaaaa> aaaaaaaaaa);",
4695 NoBinPacking);
4696 verifyFormat(
4697 "void fffffffffff(\n"
4698 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4699 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004700}
4701
Daniel Jasper9278eb92013-01-16 14:59:02 +00004702TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004703 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004704 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004705 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004706 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4707 " aaaaaaaaaaaaaaaaaaaa,\n"
4708 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4709 NoBinPacking);
4710 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4711 " aaaaaaaaaaaaa,\n"
4712 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4713 NoBinPacking);
4714 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004715 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4716 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4717 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4718 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004719 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4720 NoBinPacking);
4721 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4722 " .aaaaaaaaaaaaaaaaaa();",
4723 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004724 verifyFormat("void f() {\n"
4725 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4726 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4727 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004728 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004729
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004730 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004731 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4732 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004733 " aaaaaaaaaaaa);",
4734 NoBinPacking);
4735 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004736 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4737 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004738 " test);",
4739 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004740
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004741 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4742 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004743 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4744 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004745 NoBinPacking);
4746 verifyFormat("a(\"a\"\n"
4747 " \"a\",\n"
4748 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004749
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004750 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004751 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004752 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004753 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004754 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004755 verifyFormat(
4756 "void f() {\n"
4757 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4758 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004759 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004760 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004761 verifyFormat(
4762 "template <class SomeType, class SomeOtherType>\n"
4763 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4764 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004765}
4766
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004767TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4768 FormatStyle Style = getLLVMStyleWithColumns(15);
4769 Style.ExperimentalAutoDetectBinPacking = true;
4770 EXPECT_EQ("aaa(aaaa,\n"
4771 " aaaa,\n"
4772 " aaaa);\n"
4773 "aaa(aaaa,\n"
4774 " aaaa,\n"
4775 " aaaa);",
4776 format("aaa(aaaa,\n" // one-per-line
4777 " aaaa,\n"
4778 " aaaa );\n"
4779 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4780 Style));
4781 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4782 " aaaa);\n"
4783 "aaa(aaaa, aaaa,\n"
4784 " aaaa);",
4785 format("aaa(aaaa, aaaa,\n" // bin-packed
4786 " aaaa );\n"
4787 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4788 Style));
4789}
4790
Daniel Jasper04468962013-01-18 10:56:38 +00004791TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004792 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4793 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4794 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4795 " .StartsWith(\".init\", ORDER_INIT)\n"
4796 " .StartsWith(\".fini\", ORDER_FINI)\n"
4797 " .StartsWith(\".hash\", ORDER_HASH)\n"
4798 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004799
Daniel Jaspereb50c672013-02-15 20:33:06 +00004800 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004801 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004802 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004803 "aaaaaaa->aaaaaaa\n"
4804 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4805 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004806 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004807 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004808 "aaaaaaa->aaaaaaa\n"
4809 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4810 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4811 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004812 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004813 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004814 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004815 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4816 " aaaaaa->aaaaaaaaaaaa()\n"
4817 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004818 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004819 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004820 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004821 "void f() {\n"
4822 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004823 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004824 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004825 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004826 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004827 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004828 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004829 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004830 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004831 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004832 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004833 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004834
4835 verifyFormat(
4836 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4837 verifyFormat("aaaaaaaaaaaaaaa()\n"
4838 " .aaaaaaaaaaaaaaa()\n"
4839 " .aaaaaaaaaaaaaaa()\n"
4840 " .aaaaaaaaaaaaaaa()\n"
4841 " .aaaaaaaaaaaaaaa();");
4842 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4843 " .aaaaaaaaaaaaaaa()\n"
4844 " .aaaaaaaaaaaaaaa()\n"
4845 " .aaaaaaaaaaaaaaa();");
4846 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4847 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4848 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004849 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4850 " ->aaaaaaaaaaaaaae(0)\n"
4851 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004852
Daniel Jasper775954b2015-04-24 10:08:09 +00004853 // Don't linewrap after very short segments.
4854 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4855 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4856 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4857 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4858 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4859 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4860 verifyFormat("aaa()\n"
4861 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4862 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4863 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4864
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004865 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4866 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4867 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4868 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4869 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004870 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004871
Daniel Jaspera41aa532014-09-19 08:01:25 +00004872 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004873 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4874 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004875
4876 // Prefer not to create "hanging" indents.
4877 verifyFormat(
4878 "return !soooooooooooooome_map\n"
4879 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4880 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004881 verifyFormat(
4882 "return aaaaaaaaaaaaaaaa\n"
4883 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4884 " .aaaa(aaaaaaaaaaaaaa);");
4885 // No hanging indent here.
4886 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4887 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4888 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4889 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004890 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4891 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4892 getLLVMStyleWithColumns(60));
4893 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4894 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4895 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4896 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004897 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4898 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4899 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004900}
4901
Daniel Jasperde5c2072012-12-24 00:13:23 +00004902TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4903 verifyFormat(
4904 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004905 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004906 verifyFormat(
4907 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4908 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4909
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004910 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004911 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004912 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4913 " ccccccccccccccccccccccccc) {\n}");
4914
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004915 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004916 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004917 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4918 " ccccccccccccccccccccccccc) {\n}");
4919
Daniel Jasperde5c2072012-12-24 00:13:23 +00004920 verifyFormat(
4921 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004922 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004923 verifyFormat(
4924 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4925 " ccccccccccccccccccccccccc) {\n}");
4926
Daniel Jasper400adc62013-02-08 15:28:42 +00004927 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4928 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4929 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4930 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004931 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4932 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4933 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4934 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4935
Daniel Jasper400adc62013-02-08 15:28:42 +00004936 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4937 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4938 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004939 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4940 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4941 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004942}
4943
Daniel Jasper43b65482013-01-23 12:27:43 +00004944TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004945 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004946 "unsigned Cost =\n"
4947 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4948 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004949 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004950 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4951 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004952
4953 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004954 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4955 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004956 verifyFormat("unsigned OriginalStartColumn =\n"
4957 " SourceMgr.getSpellingColumnNumber(\n"
4958 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4959 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004960}
4961
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004962TEST_F(FormatTest, AlignsAfterAssignments) {
4963 verifyFormat(
4964 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004965 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004966 verifyFormat(
4967 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004968 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004969 verifyFormat(
4970 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004971 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004972 verifyFormat(
4973 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004974 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004975 verifyFormat(
4976 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4977 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4978 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004979}
4980
4981TEST_F(FormatTest, AlignsAfterReturn) {
4982 verifyFormat(
4983 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4984 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4985 verifyFormat(
4986 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4987 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004988 verifyFormat(
4989 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004990 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004991 verifyFormat(
4992 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004993 " aaaaaaaaaaaaaaaaaaaaaa());");
4994 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4995 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4996 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4997 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4998 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004999 verifyFormat("return\n"
5000 " // true if code is one of a or b.\n"
5001 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005002}
5003
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005004TEST_F(FormatTest, AlignsAfterOpenBracket) {
5005 verifyFormat(
5006 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5007 " aaaaaaaaa aaaaaaa) {}");
5008 verifyFormat(
5009 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5010 " aaaaaaaaaaa aaaaaaaaa);");
5011 verifyFormat(
5012 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5013 " aaaaaaaaaaaaaaaaaaaaa));");
5014 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005015 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00005016 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5017 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
5018 Style);
5019 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5020 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
5021 Style);
5022 verifyFormat("SomeLongVariableName->someFunction(\n"
5023 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
5024 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005025 verifyFormat(
5026 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5027 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5028 Style);
5029 verifyFormat(
5030 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5031 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5032 Style);
5033 verifyFormat(
5034 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5035 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5036 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005037
Daniel Jasper2a9f7202016-02-08 09:52:54 +00005038 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
5039 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
5040 " b));",
5041 Style);
5042
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005043 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5044 Style.BinPackArguments = false;
5045 Style.BinPackParameters = false;
5046 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5047 " aaaaaaaaaaa aaaaaaaa,\n"
5048 " aaaaaaaaa aaaaaaa,\n"
5049 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5050 Style);
5051 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5052 " aaaaaaaaaaa aaaaaaaaa,\n"
5053 " aaaaaaaaaaa aaaaaaaaa,\n"
5054 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5055 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00005056 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
5057 " aaaaaaaaaaaaaaa,\n"
5058 " aaaaaaaaaaaaaaaaaaaaa,\n"
5059 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005060 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00005061 verifyFormat(
5062 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
5063 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5064 Style);
5065 verifyFormat(
5066 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
5067 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5068 Style);
5069 verifyFormat(
5070 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5071 " aaaaaaaaaaaaaaaaaaaaa(\n"
5072 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
5073 " aaaaaaaaaaaaaaaa);",
5074 Style);
5075 verifyFormat(
5076 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5077 " aaaaaaaaaaaaaaaaaaaaa(\n"
5078 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
5079 " aaaaaaaaaaaaaaaa);",
5080 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005081}
5082
Daniel Jasper3219e432014-12-02 13:24:51 +00005083TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
5084 FormatStyle Style = getLLVMStyleWithColumns(40);
5085 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5086 " bbbbbbbbbbbbbbbbbbbbbb);",
5087 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005088 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00005089 Style.AlignOperands = false;
5090 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5091 " bbbbbbbbbbbbbbbbbbbbbb);",
5092 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005093 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00005094 Style.AlignOperands = true;
5095 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5096 " bbbbbbbbbbbbbbbbbbbbbb);",
5097 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005098 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00005099 Style.AlignOperands = false;
5100 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5101 " bbbbbbbbbbbbbbbbbbbbbb);",
5102 Style);
5103}
5104
Daniel Jasper399d24b2013-01-09 07:06:56 +00005105TEST_F(FormatTest, BreaksConditionalExpressions) {
5106 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005107 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
5108 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5109 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00005110 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005111 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
5112 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5113 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005114 verifyFormat(
5115 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
5116 " : aaaaaaaaaaaaa);");
5117 verifyFormat(
5118 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00005119 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005120 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5121 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005122 verifyFormat(
5123 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5124 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5125 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005126 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5127 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5128 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5129 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5130 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5131 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5132 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5133 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5134 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5135 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5136 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5137 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005138 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5139 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5140 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5141 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5142 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00005143 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5144 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5145 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005146 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5147 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5148 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5149 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00005150 verifyFormat(
5151 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5152 " ? aaaaaaaaaaaaaaa\n"
5153 " : aaaaaaaaaaaaaaa;");
5154 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005155 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00005156 " ? b\n"
5157 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00005158 verifyFormat("return aaaa == bbbb\n"
5159 " // comment\n"
5160 " ? aaaa\n"
5161 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005162 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005163 " format(TheLine.First,\n"
5164 " IndentForLevel[TheLine.Level] >= 0\n"
5165 " ? IndentForLevel[TheLine.Level]\n"
5166 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005167 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005168 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00005169 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5170 " ? aaaaaaaaaaaaaaa\n"
5171 " : bbbbbbbbbbbbbbb //\n"
5172 " ? ccccccccccccccc\n"
5173 " : ddddddddddddddd;");
5174 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5175 " ? aaaaaaaaaaaaaaa\n"
5176 " : (bbbbbbbbbbbbbbb //\n"
5177 " ? ccccccccccccccc\n"
5178 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005179 verifyFormat(
5180 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5181 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5182 " aaaaaaaaaaaaaaaaaaaaa +\n"
5183 " aaaaaaaaaaaaaaaaaaaaa\n"
5184 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00005185 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005186 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5187 " : aaaaaaaaaaaaaaaaaaaaaa\n"
5188 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00005189
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005190 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00005191 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005192 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00005193 "void f() {\n"
5194 " g(aaa,\n"
5195 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5196 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5197 " ? aaaaaaaaaaaaaaa\n"
5198 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005199 "}",
5200 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005201 verifyFormat(
5202 "void f() {\n"
5203 " g(aaa,\n"
5204 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5205 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5206 " ?: aaaaaaaaaaaaaaa);\n"
5207 "}",
5208 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00005209
5210 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
5211 " // comment.\n"
5212 " ccccccccccccccccccccccccccccccccccccccc\n"
5213 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5214 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00005215
5216 // Assignments in conditional expressions. Apparently not uncommon :-(.
5217 verifyFormat("return a != b\n"
5218 " // comment\n"
5219 " ? a = b\n"
5220 " : a = b;");
5221 verifyFormat("return a != b\n"
5222 " // comment\n"
5223 " ? a = a != b\n"
5224 " // comment\n"
5225 " ? a = b\n"
5226 " : a\n"
5227 " : a;\n");
5228 verifyFormat("return a != b\n"
5229 " // comment\n"
5230 " ? a\n"
5231 " : a = a != b\n"
5232 " // comment\n"
5233 " ? a = b\n"
5234 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00005235}
5236
Daniel Jasper165b29e2013-11-08 00:57:11 +00005237TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
5238 FormatStyle Style = getLLVMStyle();
5239 Style.BreakBeforeTernaryOperators = false;
5240 Style.ColumnLimit = 70;
5241 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005242 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
5243 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5244 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005245 Style);
5246 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005247 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
5248 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5249 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005250 Style);
5251 verifyFormat(
5252 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
5253 " aaaaaaaaaaaaa);",
5254 Style);
5255 verifyFormat(
5256 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5257 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5258 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5259 " aaaaaaaaaaaaa);",
5260 Style);
5261 verifyFormat(
5262 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5263 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5264 " aaaaaaaaaaaaa);",
5265 Style);
5266 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5267 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5268 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5269 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5270 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5271 Style);
5272 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5273 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5274 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5275 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5276 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5277 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5278 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5279 Style);
5280 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5281 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
5282 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5283 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5284 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5285 Style);
5286 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5287 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5288 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5289 Style);
5290 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00005291 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00005292 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5293 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5294 Style);
5295 verifyFormat(
5296 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5297 " aaaaaaaaaaaaaaa :\n"
5298 " aaaaaaaaaaaaaaa;",
5299 Style);
5300 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5301 " aaaaaaaaa ?\n"
5302 " b :\n"
5303 " c);",
5304 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00005305 verifyFormat("unsigned Indent =\n"
5306 " format(TheLine.First,\n"
5307 " IndentForLevel[TheLine.Level] >= 0 ?\n"
5308 " IndentForLevel[TheLine.Level] :\n"
5309 " TheLine * 2,\n"
5310 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
5311 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005312 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5313 " aaaaaaaaaaaaaaa :\n"
5314 " bbbbbbbbbbbbbbb ? //\n"
5315 " ccccccccccccccc :\n"
5316 " ddddddddddddddd;",
5317 Style);
5318 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5319 " aaaaaaaaaaaaaaa :\n"
5320 " (bbbbbbbbbbbbbbb ? //\n"
5321 " ccccccccccccccc :\n"
5322 " ddddddddddddddd);",
5323 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00005324 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5325 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
5326 " ccccccccccccccccccccccccccc;",
5327 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00005328 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5329 " aaaaa :\n"
5330 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
5331 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005332}
5333
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005334TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
5335 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
5336 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
5337 verifyFormat("bool a = true, b = false;");
5338
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005339 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005340 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005341 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00005342 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005343 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00005344 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005345 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00005346 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00005347 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
5348 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
5349 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5350 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
5351 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
5352 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005353
Daniel Jasperbea1ab42015-03-01 18:55:26 +00005354 FormatStyle Style = getGoogleStyle();
5355 Style.PointerAlignment = FormatStyle::PAS_Left;
5356 Style.DerivePointerAlignment = false;
5357 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5358 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
5359 " *b = bbbbbbbbbbbbbbbbbbb;",
5360 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00005361 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5362 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
5363 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00005364 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00005365 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005366}
5367
Nico Weber4a5030c2013-01-12 01:28:06 +00005368TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
5369 verifyFormat("arr[foo ? bar : baz];");
5370 verifyFormat("f()[foo ? bar : baz];");
5371 verifyFormat("(a + b)[foo ? bar : baz];");
5372 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
5373}
5374
Daniel Jasperf7935112012-12-03 18:12:45 +00005375TEST_F(FormatTest, AlignsStringLiterals) {
5376 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
5377 " \"short literal\");");
5378 verifyFormat(
5379 "looooooooooooooooooooooooongFunction(\n"
5380 " \"short literal\"\n"
5381 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005382 verifyFormat("someFunction(\"Always break between multi-line\"\n"
5383 " \" string literals\",\n"
5384 " and, other, parameters);");
Daniel Jasper240527c2017-01-16 13:13:15 +00005385 EXPECT_EQ("fun +\n"
5386 " \"1243\" /* comment */\n"
5387 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005388 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00005389 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005390 getLLVMStyleWithColumns(28)));
5391 EXPECT_EQ(
5392 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5393 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
5394 " \"aaaaaaaaaaaaaaaa\";",
5395 format("aaaaaa ="
5396 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
5397 "aaaaaaaaaaaaaaaaaaaaa\" "
5398 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper240527c2017-01-16 13:13:15 +00005399 verifyFormat("a = a +\n"
5400 " \"a\"\n"
5401 " \"a\"\n"
5402 " \"a\";");
5403 verifyFormat("f(\"a\",\n"
5404 " \"b\"\n"
5405 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005406
5407 verifyFormat(
5408 "#define LL_FORMAT \"ll\"\n"
5409 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
5410 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00005411
5412 verifyFormat("#define A(X) \\\n"
5413 " \"aaaaa\" #X \"bbbbbb\" \\\n"
5414 " \"ccccc\"",
5415 getLLVMStyleWithColumns(23));
5416 verifyFormat("#define A \"def\"\n"
5417 "f(\"abc\" A \"ghi\"\n"
5418 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005419
5420 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005421 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005422 verifyFormat("#define A(X) \\\n"
5423 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
5424 " L\"ccccc\"",
5425 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00005426
5427 verifyFormat("f(@\"a\"\n"
5428 " @\"b\");");
5429 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00005430 " @\"b\"\n"
5431 " @\"c\";");
5432 verifyFormat("NSString s = @\"a\"\n"
5433 " \"b\"\n"
5434 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00005435}
5436
Zachary Turner448592e2015-12-18 22:20:15 +00005437TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005438 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005439 // No declarations or definitions should be moved to own line.
5440 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
5441 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005442 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005443 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005444 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005445 "int f() { return 1; }\n"
5446 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005447 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00005448
5449 // All declarations and definitions should have the return type moved to its
5450 // own
5451 // line.
5452 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
5453 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005454 " int\n"
5455 " f() {\n"
5456 " return 1;\n"
5457 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005458 " int\n"
5459 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005460 "};\n"
5461 "int\n"
5462 "f() {\n"
5463 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005464 "}\n"
5465 "int\n"
5466 "g();\n",
5467 Style);
5468
5469 // Top-level definitions, and no kinds of declarations should have the
5470 // return type moved to its own line.
5471 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
5472 verifyFormat("class B {\n"
5473 " int f() { return 1; }\n"
5474 " int g();\n"
5475 "};\n"
5476 "int\n"
5477 "f() {\n"
5478 " return 1;\n"
5479 "}\n"
5480 "int g();\n",
5481 Style);
5482
5483 // Top-level definitions and declarations should have the return type moved
5484 // to its own line.
5485 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
5486 verifyFormat("class C {\n"
5487 " int f() { return 1; }\n"
5488 " int g();\n"
5489 "};\n"
5490 "int\n"
5491 "f() {\n"
5492 " return 1;\n"
5493 "}\n"
5494 "int\n"
5495 "g();\n",
5496 Style);
5497
5498 // All definitions should have the return type moved to its own line, but no
5499 // kinds of declarations.
5500 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5501 verifyFormat("class D {\n"
5502 " int\n"
5503 " f() {\n"
5504 " return 1;\n"
5505 " }\n"
5506 " int g();\n"
5507 "};\n"
5508 "int\n"
5509 "f() {\n"
5510 " return 1;\n"
5511 "}\n"
5512 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005513 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005514 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005515 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005516 " return \"\";\n"
5517 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005518 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005519 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005520 verifyFormat("template <class T>\n"
5521 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005522 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005523 " return NULL;\n"
5524 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005525 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005526 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00005527 verifyFormat("class C {\n"
5528 " int\n"
5529 " operator+() {\n"
5530 " return 1;\n"
5531 " }\n"
5532 " int\n"
5533 " operator()() {\n"
5534 " return 1;\n"
5535 " }\n"
5536 "};\n",
5537 Style);
5538 verifyFormat("void\n"
5539 "A::operator()() {}\n"
5540 "void\n"
5541 "A::operator>>() {}\n"
5542 "void\n"
5543 "A::operator+() {}\n",
5544 Style);
5545 verifyFormat("void *operator new(std::size_t s);", // No break here.
5546 Style);
5547 verifyFormat("void *\n"
5548 "operator new(std::size_t s) {}",
5549 Style);
5550 verifyFormat("void *\n"
5551 "operator delete[](void *ptr) {}",
5552 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005553 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005554 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005555 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005556 "{\n"
5557 " return \"\";\n"
5558 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005559 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005560 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005561 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005562 "T *\n" // Problem here: no line break
5563 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005564 "{\n"
5565 " return NULL;\n"
5566 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005567 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005568 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005569}
5570
Alexander Kornienko58611712013-07-04 12:02:44 +00005571TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5572 FormatStyle NoBreak = getLLVMStyle();
5573 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5574 FormatStyle Break = getLLVMStyle();
5575 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005576 verifyFormat("aaaa = \"bbbb\"\n"
5577 " \"cccc\";",
5578 NoBreak);
5579 verifyFormat("aaaa =\n"
5580 " \"bbbb\"\n"
5581 " \"cccc\";",
5582 Break);
5583 verifyFormat("aaaa(\"bbbb\"\n"
5584 " \"cccc\");",
5585 NoBreak);
5586 verifyFormat("aaaa(\n"
5587 " \"bbbb\"\n"
5588 " \"cccc\");",
5589 Break);
Daniel Jasper240527c2017-01-16 13:13:15 +00005590 verifyFormat("aaaa(qqq,\n"
5591 " \"bbbb\"\n"
5592 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005593 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005594 verifyFormat("aaaa(qqq,\n"
5595 " \"bbbb\"\n"
5596 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005597 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005598 verifyFormat("aaaa(qqq,\n"
5599 " L\"bbbb\"\n"
5600 " L\"cccc\");",
5601 Break);
Daniel Jasper240527c2017-01-16 13:13:15 +00005602 verifyFormat("aaaaa(aaaaaa,\n"
5603 " aaaaaaa(\"aaaa\"\n"
5604 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005605 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005606 verifyFormat("string s = someFunction(\n"
5607 " \"abc\"\n"
5608 " \"abc\");",
5609 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005610
Daniel Jasper3251fff2014-06-10 06:27:23 +00005611 // As we break before unary operators, breaking right after them is bad.
5612 verifyFormat("string foo = abc ? \"x\"\n"
5613 " \"blah blah blah blah blah blah\"\n"
5614 " : \"y\";",
5615 Break);
5616
Daniel Jasperc834c702013-07-17 15:38:19 +00005617 // Don't break if there is no column gain.
5618 verifyFormat("f(\"aaaa\"\n"
5619 " \"bbbb\");",
5620 Break);
5621
5622 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005623 EXPECT_EQ("x = \"a\\\n"
5624 "b\\\n"
5625 "c\";",
5626 format("x = \"a\\\n"
5627 "b\\\n"
5628 "c\";",
5629 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005630 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005631 " \"a\\\n"
5632 "b\\\n"
5633 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005634 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005635 "b\\\n"
5636 "c\";",
5637 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005638
5639 // Exempt ObjC strings for now.
5640 EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005641 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005642 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005643 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005644 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005645
5646 Break.ColumnLimit = 0;
5647 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005648}
5649
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005650TEST_F(FormatTest, AlignsPipes) {
5651 verifyFormat(
5652 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5653 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5654 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5655 verifyFormat(
5656 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5657 " << aaaaaaaaaaaaaaaaaaaa;");
5658 verifyFormat(
5659 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5660 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5661 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005662 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5663 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5664 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005665 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5666 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5667 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5668 verifyFormat(
5669 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5670 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5671 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005672 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5673 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5674 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5675 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005676 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5677 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005678 verifyFormat(
5679 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5680 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005681
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005682 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5683 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005684 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5685 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5686 " aaaaaaaaaaaaaaaaaaaaa)\n"
5687 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005688 verifyFormat("LOG_IF(aaa == //\n"
5689 " bbb)\n"
5690 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005691
Daniel Jasper467ddb12013-08-12 12:58:05 +00005692 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005693 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5694 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005695 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5696 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5697 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005698 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5699 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005700 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5701 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5702 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5703 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5704 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5705 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5706 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005707
Daniel Jasperc238c872013-04-02 14:33:13 +00005708 verifyFormat(
5709 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5710 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005711
5712 // Incomplete string literal.
5713 EXPECT_EQ("llvm::errs() << \"\n"
5714 " << a;",
5715 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005716
5717 verifyFormat("void f() {\n"
5718 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5719 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5720 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005721
5722 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005723 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5724 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5725 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005726
5727 // Handle '\n'.
5728 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5729 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5730 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5731 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5732 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5733 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5734 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005735}
5736
Daniel Jasper7209bb92016-12-13 11:16:42 +00005737TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5738 verifyFormat("return out << \"somepacket = {\\n\"\n"
5739 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5740 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5741 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5742 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5743 " << \"}\";");
5744
5745 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5746 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5747 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5748 verifyFormat(
5749 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5750 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5751 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5752 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5753 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5754 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5755 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5756 verifyFormat(
5757 "void f() {\n"
5758 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5759 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5760 "}");
5761
5762 // Breaking before the first "<<" is generally not desirable.
5763 verifyFormat(
5764 "llvm::errs()\n"
5765 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5766 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5767 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5768 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5769 getLLVMStyleWithColumns(70));
5770 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5771 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5772 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5773 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5774 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5775 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5776 getLLVMStyleWithColumns(70));
5777
5778 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5779 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5780 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5781 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5782 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5783 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005784 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5785 " (aaaa + aaaa);",
5786 getLLVMStyleWithColumns(40));
5787 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5788 " (aaaaaaa + aaaaa));",
5789 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005790 verifyFormat(
5791 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5792 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5793 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005794}
5795
Daniel Jasperf7935112012-12-03 18:12:45 +00005796TEST_F(FormatTest, UnderstandsEquals) {
5797 verifyFormat(
5798 "aaaaaaaaaaaaaaaaa =\n"
5799 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5800 verifyFormat(
5801 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005802 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005803 verifyFormat(
5804 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005805 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005806 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005807 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5808 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005809
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005810 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5811 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005812}
5813
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005814TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005815 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5816 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005817
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005818 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5819 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005820
5821 verifyFormat(
5822 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5823 " Parameter2);");
5824
5825 verifyFormat(
5826 "ShortObject->shortFunction(\n"
5827 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5828 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5829
5830 verifyFormat("loooooooooooooongFunction(\n"
5831 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5832
5833 verifyFormat(
5834 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5835 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5836
Daniel Jasper687af3b2013-02-14 14:26:07 +00005837 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5838 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005839 verifyFormat("void f() {\n"
5840 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5841 " .Times(2)\n"
5842 " .WillRepeatedly(Return(SomeValue));\n"
5843 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005844 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5845 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005846 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005847 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5848 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005849 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005850 verifyFormat("void f() {\n"
5851 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5852 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5853 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005854 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5855 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5856 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5857 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5858 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005859 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5860 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5861 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5862 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5863 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005864
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005865 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005866 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005867 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005868 verifyFormat(
5869 "aaaaaaaaaaa->aaaaaaaaa(\n"
5870 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5871 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005872
5873 verifyFormat(
5874 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5875 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005876 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5877 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5878 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5879 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005880
Daniel Jasper9b334242013-03-15 14:57:30 +00005881 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005882 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5883 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005884
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005885 FormatStyle NoBinPacking = getLLVMStyle();
5886 NoBinPacking.BinPackParameters = false;
5887 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5888 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5889 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5890 " aaaaaaaaaaaaaaaaaaa,\n"
5891 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5892 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005893
5894 // If there is a subsequent call, change to hanging indentation.
5895 verifyFormat(
5896 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5897 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5898 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5899 verifyFormat(
5900 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5901 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005902 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5903 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5904 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5905 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5906 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5907 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005908}
5909
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005910TEST_F(FormatTest, WrapsTemplateDeclarations) {
5911 verifyFormat("template <typename T>\n"
5912 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005913 verifyFormat("template <typename T>\n"
5914 "// T should be one of {A, B}.\n"
5915 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005916 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005917 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005918 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005919 verifyFormat("template <typename T>\n"
5920 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5921 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005922 verifyFormat(
5923 "template <typename T>\n"
5924 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5925 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005926 verifyFormat(
5927 "template <typename T>\n"
5928 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5929 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5930 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005931 verifyFormat("template <typename T>\n"
5932 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005933 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005934 verifyFormat(
5935 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5936 " typename T4 = char>\n"
5937 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005938 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5939 " template <typename> class cccccccccccccccccccccc,\n"
5940 " typename ddddddddddddd>\n"
5941 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005942 verifyFormat(
5943 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5944 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005945
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005946 verifyFormat("void f() {\n"
5947 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5948 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5949 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005950
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005951 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005952 verifyFormat("template <typename T> void f();");
5953 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005954 verifyFormat(
5955 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5956 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5957 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5958 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5959 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5960 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5961 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5962 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005963 EXPECT_EQ("static_cast<A< //\n"
5964 " B> *>(\n"
5965 "\n"
5966 " );",
5967 format("static_cast<A<//\n"
5968 " B>*>(\n"
5969 "\n"
5970 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005971 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5972 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005973
5974 FormatStyle AlwaysBreak = getLLVMStyle();
5975 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5976 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5977 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5978 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5979 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5980 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5981 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5982 verifyFormat("template <template <typename> class Fooooooo,\n"
5983 " template <typename> class Baaaaaaar>\n"
5984 "struct C {};",
5985 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005986 verifyFormat("template <typename T> // T can be A, B or C.\n"
5987 "struct C {};",
5988 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005989 verifyFormat("template <enum E> class A {\n"
5990 "public:\n"
5991 " E *f();\n"
5992 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005993}
5994
Daniel Jasper45797022013-01-25 10:57:27 +00005995TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5996 verifyFormat(
5997 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5998 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5999 verifyFormat(
6000 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6001 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6002 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
6003
Daniel Jasper0f0234e2013-05-08 10:00:18 +00006004 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00006005 verifyFormat(
6006 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6007 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00006008 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00006009
Daniel Jasper45797022013-01-25 10:57:27 +00006010 verifyFormat(
6011 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00006012 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00006013
6014 // Breaking at nested name specifiers is generally not desirable.
6015 verifyFormat(
6016 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6017 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00006018
6019 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00006020 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
6021 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6022 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00006023 " aaaaaaaaaaaaaaaaaaaaa);",
6024 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00006025
6026 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6027 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6028 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00006029}
6030
Daniel Jasperf7935112012-12-03 18:12:45 +00006031TEST_F(FormatTest, UnderstandsTemplateParameters) {
6032 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006033 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006034 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
6035 verifyFormat("bool x = a < 1 || 2 > a;");
6036 verifyFormat("bool x = 5 < f<int>();");
6037 verifyFormat("bool x = f<int>() > 5;");
6038 verifyFormat("bool x = 5 < a<int>::x;");
6039 verifyFormat("bool x = a < 4 ? a > 2 : false;");
6040 verifyFormat("bool x = f() ? a < 2 : a > 2;");
6041
6042 verifyGoogleFormat("A<A<int>> a;");
6043 verifyGoogleFormat("A<A<A<int>>> a;");
6044 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006045 verifyGoogleFormat("A<A<int> > a;");
6046 verifyGoogleFormat("A<A<A<int> > > a;");
6047 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00006048 verifyGoogleFormat("A<::A<int>> a;");
6049 verifyGoogleFormat("A<::A> a;");
6050 verifyGoogleFormat("A< ::A> a;");
6051 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006052 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
6053 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00006054 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
6055 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006056 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
6057 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006058
Nico Weber7533b4d2014-09-24 17:17:32 +00006059 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
6060
Daniel Jasperf7935112012-12-03 18:12:45 +00006061 verifyFormat("test >> a >> b;");
6062 verifyFormat("test << a >> b;");
6063
6064 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006065 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00006066 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00006067 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
6068 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00006069 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00006070 verifyFormat("f(a.operator()<A>());");
6071 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6072 " .template operator()<A>());",
6073 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00006074
6075 // Not template parameters.
6076 verifyFormat("return a < b && c > d;");
6077 verifyFormat("void f() {\n"
6078 " while (a < b && c > d) {\n"
6079 " }\n"
6080 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006081 verifyFormat("template <typename... Types>\n"
6082 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00006083
6084 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6085 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
6086 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00006087 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00006088 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00006089 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00006090}
6091
Malcolm Parsons6af3f142016-11-03 16:57:30 +00006092TEST_F(FormatTest, BitshiftOperatorWidth) {
6093 EXPECT_EQ("int a = 1 << 2; /* foo\n"
6094 " bar */",
6095 format("int a=1<<2; /* foo\n"
6096 " bar */"));
6097
6098 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
6099 " bar */",
6100 format("int b =256>>1 ; /* foo\n"
6101 " bar */"));
6102}
6103
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006104TEST_F(FormatTest, UnderstandsBinaryOperators) {
6105 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00006106 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00006107}
6108
6109TEST_F(FormatTest, UnderstandsPointersToMembers) {
6110 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006111 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006112 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006113 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006114 verifyFormat("void f() {\n"
6115 " (a->*f)();\n"
6116 " a->*x;\n"
6117 " (a.*f)();\n"
6118 " ((*a).*f)();\n"
6119 " a.*x;\n"
6120 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00006121 verifyFormat("void f() {\n"
6122 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
6123 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
6124 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00006125 verifyFormat(
6126 "(aaaaaaaaaa->*bbbbbbb)(\n"
6127 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006128 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006129 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006130 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006131}
6132
Daniel Jasper8dd40472012-12-21 09:41:31 +00006133TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00006134 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00006135 verifyFormat("f(-1, -2, -3);");
6136 verifyFormat("a[-1] = 5;");
6137 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006138 verifyFormat("if (i == -1) {\n}");
6139 verifyFormat("if (i != -1) {\n}");
6140 verifyFormat("if (i > -1) {\n}");
6141 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00006142 verifyFormat("++(a->f());");
6143 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00006144 verifyFormat("(a->f())++;");
6145 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006146 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00006147
6148 verifyFormat("a-- > b;");
6149 verifyFormat("b ? -a : c;");
6150 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006151 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00006152 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006153 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00006154
6155 verifyFormat("return -1;");
6156 verifyFormat("switch (a) {\n"
6157 "case -1:\n"
6158 " break;\n"
6159 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00006160 verifyFormat("#define X -1");
6161 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00006162
Chandler Carruthf8b72662014-03-02 12:37:31 +00006163 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
6164 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00006165
6166 verifyFormat("int a = /* confusing comment */ -1;");
6167 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
6168 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006169}
6170
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006171TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00006172 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006173 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00006174 "}");
6175 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00006176 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00006177 verifyFormat("*aaa = aaaaaaa( // break\n"
6178 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00006179}
6180
Daniel Jasper8863ada2013-08-26 08:10:17 +00006181TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00006182 verifyFormat("bool operator<();");
6183 verifyFormat("bool operator>();");
6184 verifyFormat("bool operator=();");
6185 verifyFormat("bool operator==();");
6186 verifyFormat("bool operator!=();");
6187 verifyFormat("int operator+();");
6188 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00006189 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006190 verifyFormat("bool operator();");
6191 verifyFormat("bool operator()();");
6192 verifyFormat("bool operator[]();");
6193 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006194 verifyFormat("operator int();");
6195 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006196 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006197 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006198 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006199 verifyFormat("void *operator new(std::size_t size);");
6200 verifyFormat("void *operator new[](std::size_t size);");
6201 verifyFormat("void operator delete(void *ptr);");
6202 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00006203 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
6204 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00006205 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00006206 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006207
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006208 verifyFormat(
6209 "ostream &operator<<(ostream &OutputStream,\n"
6210 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00006211 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
6212 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
6213 " return left.group < right.group;\n"
6214 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00006215 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00006216 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006217
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006218 verifyGoogleFormat("operator void*();");
6219 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00006220 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00006221
6222 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00006223 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
6224 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006225}
6226
Daniel Jasper1c220482015-02-25 10:30:06 +00006227TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00006228 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
6229 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
6230 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
6231 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
6232 verifyFormat("Deleted &operator=(const Deleted &) &;");
6233 verifyFormat("Deleted &operator=(const Deleted &) &&;");
6234 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
6235 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
6236 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
6237 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
6238 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00006239 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00006240 verifyFormat("template <typename T>\n"
6241 "void F(T) && = delete;",
6242 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00006243
Daniel Jasperaf642c62015-08-25 13:40:51 +00006244 FormatStyle AlignLeft = getLLVMStyle();
6245 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00006246 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00006247 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
6248 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
6249 AlignLeft);
6250 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
6251 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006252 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
6253 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
6254 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
6255 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00006256 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00006257
6258 FormatStyle Spaces = getLLVMStyle();
6259 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006260 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
6261 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
6262 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
6263 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006264
6265 Spaces.SpacesInCStyleCastParentheses = false;
6266 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006267 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
6268 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
6269 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
6270 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006271}
6272
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006273TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00006274 verifyFormat("void f() {\n"
6275 " A *a = new A;\n"
6276 " A *a = new (placement) A;\n"
6277 " delete a;\n"
6278 " delete (A *)a;\n"
6279 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00006280 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6281 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00006282 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6283 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6284 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00006285 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006286}
6287
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006288TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006289 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006290 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006291 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006292 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006293 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006294 verifyIndependentOfContext("int a = b * 10;");
6295 verifyIndependentOfContext("int a = 10 * b;");
6296 verifyIndependentOfContext("int a = b * c;");
6297 verifyIndependentOfContext("int a += b * c;");
6298 verifyIndependentOfContext("int a -= b * c;");
6299 verifyIndependentOfContext("int a *= b * c;");
6300 verifyIndependentOfContext("int a /= b * c;");
6301 verifyIndependentOfContext("int a = *b;");
6302 verifyIndependentOfContext("int a = *b * c;");
6303 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00006304 verifyIndependentOfContext("int a = b * (10);");
6305 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006306 verifyIndependentOfContext("return 10 * b;");
6307 verifyIndependentOfContext("return *b * *c;");
6308 verifyIndependentOfContext("return a & ~b;");
6309 verifyIndependentOfContext("f(b ? *c : *d);");
6310 verifyIndependentOfContext("int a = b ? *c : *d;");
6311 verifyIndependentOfContext("*b = a;");
6312 verifyIndependentOfContext("a * ~b;");
6313 verifyIndependentOfContext("a * !b;");
6314 verifyIndependentOfContext("a * +b;");
6315 verifyIndependentOfContext("a * -b;");
6316 verifyIndependentOfContext("a * ++b;");
6317 verifyIndependentOfContext("a * --b;");
6318 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00006319 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006320 verifyIndependentOfContext("f() * b;");
6321 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006322 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006323 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00006324 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006325 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00006326 verifyIndependentOfContext("return sizeof(int **);");
6327 verifyIndependentOfContext("return sizeof(int ******);");
6328 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00006329 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006330 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00006331 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00006332 verifyGoogleFormat("return sizeof(int**);");
6333 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
6334 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006335 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00006336 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00006337 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00006338 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00006339 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00006340 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00006341 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00006342 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00006343 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00006344 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00006345 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00006346 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00006347 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00006348 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00006349 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00006350 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00006351 verifyFormat("void f(const MyOverride &override);");
6352 verifyFormat("void f(const MyFinal &final);");
6353 verifyIndependentOfContext("bool a = f() && override.f();");
6354 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00006355
Daniel Jasper5b49f472013-01-23 12:10:53 +00006356 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00006357
Daniel Jasper5b49f472013-01-23 12:10:53 +00006358 verifyIndependentOfContext("A<int *> a;");
6359 verifyIndependentOfContext("A<int **> a;");
6360 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00006361 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006362 verifyIndependentOfContext(
6363 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006364 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00006365 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00006366 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00006367 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00006368 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00006369
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00006370 verifyFormat(
6371 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6372 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6373
Daniel Jasper1f5d6372016-06-13 14:45:12 +00006374 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00006375 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00006376 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006377 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00006378 verifyGoogleFormat("A<int*> a;");
6379 verifyGoogleFormat("A<int**> a;");
6380 verifyGoogleFormat("A<int*, int*> a;");
6381 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006382 verifyGoogleFormat("f(b ? *c : *d);");
6383 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00006384 verifyGoogleFormat("Type* t = **x;");
6385 verifyGoogleFormat("Type* t = *++*x;");
6386 verifyGoogleFormat("*++*x;");
6387 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
6388 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006389 verifyGoogleFormat(
6390 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00006391 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00006392 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
6393 verifyGoogleFormat("template <typename T>\n"
6394 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00006395
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006396 FormatStyle Left = getLLVMStyle();
6397 Left.PointerAlignment = FormatStyle::PAS_Left;
6398 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00006399 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00006400 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006401
Daniel Jasper5b49f472013-01-23 12:10:53 +00006402 verifyIndependentOfContext("a = *(x + y);");
6403 verifyIndependentOfContext("a = &(x + y);");
6404 verifyIndependentOfContext("*(x + y).call();");
6405 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006406 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00006407
Daniel Jasper5b49f472013-01-23 12:10:53 +00006408 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00006409 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00006410 "int *MyValues = {\n"
6411 " *A, // Operator detection might be confused by the '{'\n"
6412 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00006413 "};");
Nico Weber80a82762013-01-17 17:17:19 +00006414
Daniel Jasper5b49f472013-01-23 12:10:53 +00006415 verifyIndependentOfContext("if (int *a = &b)");
6416 verifyIndependentOfContext("if (int &a = *b)");
6417 verifyIndependentOfContext("if (a & b[i])");
6418 verifyIndependentOfContext("if (a::b::c::d & b[i])");
6419 verifyIndependentOfContext("if (*b[i])");
6420 verifyIndependentOfContext("if (int *a = (&b))");
6421 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00006422 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00006423 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00006424 verifyFormat("void f() {\n"
6425 " for (const int &v : Values) {\n"
6426 " }\n"
6427 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006428 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
6429 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00006430 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00006431
Daniel Jaspera98da3d2013-11-07 19:56:07 +00006432 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006433 verifyFormat("#define MACRO \\\n"
6434 " int *i = a * b; \\\n"
6435 " void f(a *b);",
6436 getLLVMStyleWithColumns(19));
6437
Daniel Jasper97b89482013-03-13 07:49:51 +00006438 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006439 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006440 verifyIndependentOfContext("T **t = new T *;");
6441 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00006442 verifyGoogleFormat("A = new SomeType*[Length]();");
6443 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006444 verifyGoogleFormat("T** t = new T*;");
6445 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006446
Daniel Jasper990ff972013-05-07 14:17:18 +00006447 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006448 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00006449 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00006450 verifyFormat("STATIC_ASSERT((a & b) == 0);");
6451 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006452 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006453 "typename t::if<x && y>::type f() {}");
6454 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006455 verifyFormat("vector<int *> v;");
6456 verifyFormat("vector<int *const> v;");
6457 verifyFormat("vector<int *const **const *> v;");
6458 verifyFormat("vector<int *volatile> v;");
6459 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006460 verifyFormat("foo<b && false>();");
6461 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00006462 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00006463 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00006464 "template <class T,\n"
6465 " class = typename std::enable_if<\n"
6466 " std::is_integral<T>::value &&\n"
6467 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006468 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00006469 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006470 verifyFormat(
6471 "template <class T,\n"
6472 " class = typename ::std::enable_if<\n"
6473 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6474 "void F();",
6475 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006476
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006477 verifyIndependentOfContext("MACRO(int *i);");
6478 verifyIndependentOfContext("MACRO(auto *a);");
6479 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006480 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006481 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006482 // FIXME: Is there a way to make this work?
6483 // verifyIndependentOfContext("MACRO(A *a);");
6484
Daniel Jasper32ccb032014-06-23 07:36:18 +00006485 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006486 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006487
Daniel Jasper866468a2014-04-14 13:15:29 +00006488 EXPECT_EQ("#define OP(x) \\\n"
6489 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6490 " return s << a.DebugString(); \\\n"
6491 " }",
6492 format("#define OP(x) \\\n"
6493 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6494 " return s << a.DebugString(); \\\n"
6495 " }",
6496 getLLVMStyleWithColumns(50)));
6497
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006498 // FIXME: We cannot handle this case yet; we might be able to figure out that
6499 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006500 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006501
6502 FormatStyle PointerMiddle = getLLVMStyle();
6503 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6504 verifyFormat("delete *x;", PointerMiddle);
6505 verifyFormat("int * x;", PointerMiddle);
6506 verifyFormat("template <int * y> f() {}", PointerMiddle);
6507 verifyFormat("int * f(int * a) {}", PointerMiddle);
6508 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6509 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6510 verifyFormat("A<int *> a;", PointerMiddle);
6511 verifyFormat("A<int **> a;", PointerMiddle);
6512 verifyFormat("A<int *, int *> a;", PointerMiddle);
6513 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006514 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6515 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006516 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006517
6518 // Member function reference qualifiers aren't binary operators.
6519 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006520 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006521 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006522 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006523 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006524 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006525}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006526
Daniel Jasperee6d6502013-07-17 20:25:02 +00006527TEST_F(FormatTest, UnderstandsAttributes) {
6528 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006529 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6530 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006531 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006532 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006533 verifyFormat("__attribute__((nodebug)) void\n"
6534 "foo() {}\n",
6535 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006536}
6537
Daniel Jasper10cd5812013-05-06 06:35:44 +00006538TEST_F(FormatTest, UnderstandsEllipsis) {
6539 verifyFormat("int printf(const char *fmt, ...);");
6540 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006541 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6542
6543 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006544 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006545 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006546}
6547
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006548TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006549 EXPECT_EQ("int *a;\n"
6550 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006551 "int *a;",
6552 format("int *a;\n"
6553 "int* a;\n"
6554 "int *a;",
6555 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006556 EXPECT_EQ("int* a;\n"
6557 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006558 "int* a;",
6559 format("int* a;\n"
6560 "int* a;\n"
6561 "int *a;",
6562 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006563 EXPECT_EQ("int *a;\n"
6564 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006565 "int *a;",
6566 format("int *a;\n"
6567 "int * a;\n"
6568 "int * a;",
6569 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006570 EXPECT_EQ("auto x = [] {\n"
6571 " int *a;\n"
6572 " int *a;\n"
6573 " int *a;\n"
6574 "};",
6575 format("auto x=[]{int *a;\n"
6576 "int * a;\n"
6577 "int * a;};",
6578 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006579}
6580
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006581TEST_F(FormatTest, UnderstandsRvalueReferences) {
6582 verifyFormat("int f(int &&a) {}");
6583 verifyFormat("int f(int a, char &&b) {}");
6584 verifyFormat("void f() { int &&a = b; }");
6585 verifyGoogleFormat("int f(int a, char&& b) {}");
6586 verifyGoogleFormat("void f() { int&& a = b; }");
6587
Daniel Jasper1eff9082013-05-27 16:36:33 +00006588 verifyIndependentOfContext("A<int &&> a;");
6589 verifyIndependentOfContext("A<int &&, int &&> a;");
6590 verifyGoogleFormat("A<int&&> a;");
6591 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006592
6593 // Not rvalue references:
6594 verifyFormat("template <bool B, bool C> class A {\n"
6595 " static_assert(B && C, \"Something is wrong\");\n"
6596 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006597 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6598 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006599 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006600}
6601
Manuel Klimekc1237a82013-01-23 14:08:21 +00006602TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6603 verifyFormat("void f() {\n"
6604 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006605 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006606 "}",
6607 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006608}
6609
Daniel Jasperef906a92013-01-13 08:01:36 +00006610TEST_F(FormatTest, FormatsCasts) {
6611 verifyFormat("Type *A = static_cast<Type *>(P);");
6612 verifyFormat("Type *A = (Type *)P;");
6613 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6614 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006615 verifyFormat("int a = (int)2.0f;");
6616 verifyFormat("x[(int32)y];");
6617 verifyFormat("x = (int32)y;");
6618 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6619 verifyFormat("int a = (int)*b;");
6620 verifyFormat("int a = (int)2.0f;");
6621 verifyFormat("int a = (int)~0;");
6622 verifyFormat("int a = (int)++a;");
6623 verifyFormat("int a = (int)sizeof(int);");
6624 verifyFormat("int a = (int)+2;");
6625 verifyFormat("my_int a = (my_int)2.0f;");
6626 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006627 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006628 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006629 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006630 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006631 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006632
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006633 verifyFormat("void f() { my_int a = (my_int)*b; }");
6634 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6635 verifyFormat("my_int a = (my_int)~0;");
6636 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006637 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006638 verifyFormat("my_int a = (my_int)1;");
6639 verifyFormat("my_int a = (my_int *)1;");
6640 verifyFormat("my_int a = (const my_int)-1;");
6641 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006642 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006643 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006644 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006645 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006646
6647 // FIXME: single value wrapped with paren will be treated as cast.
6648 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006649
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006650 verifyFormat("{ (void)F; }");
6651
Daniel Jasper998cabc2013-07-18 14:46:07 +00006652 // Don't break after a cast's
6653 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6654 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6655 " bbbbbbbbbbbbbbbbbbbbbb);");
6656
Daniel Jasperef906a92013-01-13 08:01:36 +00006657 // These are not casts.
6658 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006659 verifyFormat("f(foo)->b;");
6660 verifyFormat("f(foo).b;");
6661 verifyFormat("f(foo)(b);");
6662 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006663 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006664 verifyFormat("(*funptr)(foo)[4];");
6665 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006666 verifyFormat("void f(int *);");
6667 verifyFormat("void f(int *) = 0;");
6668 verifyFormat("void f(SmallVector<int>) {}");
6669 verifyFormat("void f(SmallVector<int>);");
6670 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006671 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006672 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006673 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006674 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6675 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006676 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006677
Daniel Jasperba0bda92013-02-23 08:07:18 +00006678 // These are not casts, but at some point were confused with casts.
6679 verifyFormat("virtual void foo(int *) override;");
6680 verifyFormat("virtual void foo(char &) const;");
6681 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006682 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006683 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006684 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006685 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006686
6687 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6688 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006689 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006690 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006691 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6692 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6693 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006694}
6695
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006696TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006697 verifyFormat("A<bool()> a;");
6698 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006699 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006700 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006701 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006702 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006703 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006704 verifyFormat("template <class CallbackClass>\n"
6705 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006706
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006707 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6708 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006709 verifyGoogleFormat(
6710 "template <class CallbackClass>\n"
6711 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006712
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006713 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006714 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006715 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006716 verifyFormat("some_var = function(*some_pointer_var)[0];");
6717 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006718 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006719 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006720}
6721
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006722TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6723 verifyFormat("A (*foo_)[6];");
6724 verifyFormat("vector<int> (*foo_)[6];");
6725}
6726
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006727TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6728 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6729 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6730 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6731 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006732 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6733 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006734
6735 // Different ways of ()-initializiation.
6736 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6737 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6738 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6739 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6740 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6741 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006742 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6743 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006744}
6745
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006746TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006747 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006748 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006749 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006750 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006751 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006752 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006753 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6754 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006755 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6756 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006757 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6758 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006759 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6760 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006761 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6762 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006763 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6764 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6765 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6766 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006767 FormatStyle Indented = getLLVMStyle();
6768 Indented.IndentWrappedFunctionNames = true;
6769 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6770 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6771 Indented);
6772 verifyFormat(
6773 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6774 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6775 Indented);
6776 verifyFormat(
6777 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6778 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6779 Indented);
6780 verifyFormat(
6781 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6782 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6783 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006784
6785 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006786 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6787 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6788 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006789
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006790 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006791 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006792 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006793 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6794 " SourceLocation L, IdentifierIn *II,\n"
6795 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006796 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006797 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006798 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006799 " const SomeType<string, SomeOtherTemplateParameter>\n"
6800 " &ReallyReallyLongParameterName,\n"
6801 " const SomeType<string, SomeOtherTemplateParameter>\n"
6802 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006803 verifyFormat("template <typename A>\n"
6804 "SomeLoooooooooooooooooooooongType<\n"
6805 " typename some_namespace::SomeOtherType<A>::Type>\n"
6806 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006807
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006808 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006809 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6810 " aaaaaaaaaaaaaaaaaaaaaaa;");
6811 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006812 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6813 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006814 verifyGoogleFormat(
6815 "some_namespace::LongReturnType\n"
6816 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006817 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006818
6819 verifyGoogleFormat("template <typename T>\n"
6820 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006821 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006822 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6823 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006824
6825 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006826 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6827 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006828 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6829 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6830 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6831 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6832 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6833 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6834 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006835}
6836
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006837TEST_F(FormatTest, FormatsArrays) {
6838 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6839 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006840 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6841 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006842 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6843 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006844 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6845 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6846 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6847 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6848 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6849 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6850 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6851 verifyFormat(
6852 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6853 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6854 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006855 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6856 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006857
6858 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6859 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006860 verifyFormat(
6861 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6862 " .aaaaaaa[0]\n"
6863 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006864 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006865
6866 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006867
6868 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6869 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006870}
6871
Daniel Jaspere9de2602012-12-06 09:56:08 +00006872TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6873 verifyFormat("(a)->b();");
6874 verifyFormat("--a;");
6875}
6876
Daniel Jasper8b529712012-12-04 13:02:32 +00006877TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006878 verifyFormat("#include <string>\n"
6879 "#include <a/b/c.h>\n"
6880 "#include \"a/b/string\"\n"
6881 "#include \"string.h\"\n"
6882 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006883 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006884 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006885 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006886 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006887 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006888 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
6889 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006890 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6891 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006892
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006893 verifyFormat("#import <string>");
6894 verifyFormat("#import <a/b/c.h>");
6895 verifyFormat("#import \"a/b/string\"");
6896 verifyFormat("#import \"string.h\"");
6897 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006898 verifyFormat("#if __has_include(<strstream>)\n"
6899 "#include <strstream>\n"
6900 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006901
Daniel Jasper343643b2014-08-13 08:29:18 +00006902 verifyFormat("#define MY_IMPORT <a/b>");
6903
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006904 // Protocol buffer definition or missing "#".
6905 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6906 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006907
6908 FormatStyle Style = getLLVMStyle();
6909 Style.AlwaysBreakBeforeMultilineStrings = true;
6910 Style.ColumnLimit = 0;
6911 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006912
6913 // But 'import' might also be a regular C++ namespace.
6914 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6915 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006916}
6917
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006918//===----------------------------------------------------------------------===//
6919// Error recovery tests.
6920//===----------------------------------------------------------------------===//
6921
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006922TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006923 FormatStyle NoBinPacking = getLLVMStyle();
6924 NoBinPacking.BinPackParameters = false;
6925 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6926 " double *min_x,\n"
6927 " double *max_x,\n"
6928 " double *min_y,\n"
6929 " double *max_y,\n"
6930 " double *min_z,\n"
6931 " double *max_z, ) {}",
6932 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006933}
6934
Daniel Jasper83a54d22013-01-10 09:26:47 +00006935TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006936 verifyFormat("void f() { return; }\n42");
6937 verifyFormat("void f() {\n"
6938 " if (0)\n"
6939 " return;\n"
6940 "}\n"
6941 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006942 verifyFormat("void f() { return }\n42");
6943 verifyFormat("void f() {\n"
6944 " if (0)\n"
6945 " return\n"
6946 "}\n"
6947 "42");
6948}
6949
6950TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6951 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6952 EXPECT_EQ("void f() {\n"
6953 " if (a)\n"
6954 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006955 "}",
6956 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006957 EXPECT_EQ("namespace N {\n"
6958 "void f()\n"
6959 "}",
6960 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006961 EXPECT_EQ("namespace N {\n"
6962 "void f() {}\n"
6963 "void g()\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006964 "}",
6965 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006966}
6967
Daniel Jasper2df93312013-01-09 10:16:05 +00006968TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6969 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006970 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006971 " b;",
6972 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006973 verifyFormat("function(\n"
6974 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006975 " LoooooooooooongArgument);\n",
6976 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006977}
6978
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006979TEST_F(FormatTest, IncorrectAccessSpecifier) {
6980 verifyFormat("public:");
6981 verifyFormat("class A {\n"
6982 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006983 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006984 "};");
6985 verifyFormat("public\n"
6986 "int qwerty;");
6987 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006988 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006989 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006990 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006991 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006992 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006993}
Daniel Jasperf7935112012-12-03 18:12:45 +00006994
Daniel Jasper291f9362013-03-20 15:58:10 +00006995TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6996 verifyFormat("{");
6997 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006998 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006999}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007000
7001TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007002 verifyFormat("do {\n}");
7003 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007004 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007005 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007006 "wheeee(fun);");
7007 verifyFormat("do {\n"
7008 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00007009 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007010}
7011
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007012TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00007013 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007014 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007015 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007016 verifyFormat("while {\n foo;\n foo();\n}");
7017 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00007018}
7019
Daniel Jasperc0880a92013-01-04 18:52:56 +00007020TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007021 verifyIncompleteFormat("namespace {\n"
7022 "class Foo { Foo (\n"
7023 "};\n"
7024 "} // comment");
Daniel Jasperc0880a92013-01-04 18:52:56 +00007025}
7026
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007027TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007028 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007029 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
7030 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007031 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007032
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007033 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007034 " {\n"
7035 " breakme(\n"
7036 " qwe);\n"
7037 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007038 format("{\n"
7039 " {\n"
7040 " breakme(qwe);\n"
7041 "}\n",
7042 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007043}
7044
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00007045TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007046 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007047 " avariable,\n"
7048 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007049 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00007050}
7051
Manuel Klimek762dd182013-01-21 10:07:49 +00007052TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007053 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00007054}
7055
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007056TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007057 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00007058 verifyFormat("vector<int> x{\n"
7059 " 1, 2, 3, 4,\n"
7060 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007061 verifyFormat("vector<T> x{{}, {}, {}, {}};");
7062 verifyFormat("f({1, 2});");
7063 verifyFormat("auto v = Foo{-1};");
7064 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
7065 verifyFormat("Class::Class : member{1, 2, 3} {}");
7066 verifyFormat("new vector<int>{1, 2, 3};");
7067 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00007068 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007069 verifyFormat("return {arg1, arg2};");
7070 verifyFormat("return {arg1, SomeType{parameter}};");
7071 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
7072 verifyFormat("new T{arg1, arg2};");
7073 verifyFormat("f(MyMap[{composite, key}]);");
7074 verifyFormat("class Class {\n"
7075 " T member = {arg1, arg2};\n"
7076 "};");
7077 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00007078 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
7079 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00007080
Daniel Jasper438059e2014-05-22 12:11:13 +00007081 verifyFormat("int foo(int i) { return fo1{}(i); }");
7082 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007083 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00007084 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00007085 verifyFormat("Node n{1, Node{1000}, //\n"
7086 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00007087 verifyFormat("Aaaa aaaaaaa{\n"
7088 " {\n"
7089 " aaaa,\n"
7090 " },\n"
7091 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00007092 verifyFormat("class C : public D {\n"
7093 " SomeClass SC{2};\n"
7094 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00007095 verifyFormat("class C : public A {\n"
7096 " class D : public B {\n"
7097 " void f() { int i{2}; }\n"
7098 " };\n"
7099 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00007100 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00007101
Daniel Jaspere4ada022016-12-13 10:05:03 +00007102 // Cases where distinguising braced lists and blocks is hard.
7103 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
7104 verifyFormat("void f() {\n"
7105 " return; // comment\n"
7106 "}\n"
7107 "SomeType t;");
7108 verifyFormat("void f() {\n"
7109 " if (a) {\n"
7110 " f();\n"
7111 " }\n"
7112 "}\n"
7113 "SomeType t;");
7114
Daniel Jasper08434342015-05-26 07:26:26 +00007115 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007116 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00007117 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007118 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
7119 " bbbbb,\n"
7120 " ccccc,\n"
7121 " ddddd,\n"
7122 " eeeee,\n"
7123 " ffffff,\n"
7124 " ggggg,\n"
7125 " hhhhhh,\n"
7126 " iiiiii,\n"
7127 " jjjjjj,\n"
7128 " kkkkkk};",
7129 NoBinPacking);
7130 verifyFormat("const Aaaaaa aaaaa = {\n"
7131 " aaaaa,\n"
7132 " bbbbb,\n"
7133 " ccccc,\n"
7134 " ddddd,\n"
7135 " eeeee,\n"
7136 " ffffff,\n"
7137 " ggggg,\n"
7138 " hhhhhh,\n"
7139 " iiiiii,\n"
7140 " jjjjjj,\n"
7141 " kkkkkk,\n"
7142 "};",
7143 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00007144 verifyFormat(
7145 "const Aaaaaa aaaaa = {\n"
7146 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
7147 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
7148 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
7149 "};",
7150 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007151
Chandler Carruthf8b72662014-03-02 12:37:31 +00007152 // FIXME: The alignment of these trailing comments might be bad. Then again,
7153 // this might be utterly useless in real code.
7154 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00007155 " : some_value{ //\n"
7156 " aaaaaaa, //\n"
7157 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00007158
Chandler Carruthf8b72662014-03-02 12:37:31 +00007159 // In braced lists, the first comment is always assumed to belong to the
7160 // first element. Thus, it can be moved to the next or previous line as
7161 // appropriate.
7162 EXPECT_EQ("function({// First element:\n"
7163 " 1,\n"
7164 " // Second element:\n"
7165 " 2});",
7166 format("function({\n"
7167 " // First element:\n"
7168 " 1,\n"
7169 " // Second element:\n"
7170 " 2});"));
7171 EXPECT_EQ("std::vector<int> MyNumbers{\n"
7172 " // First element:\n"
7173 " 1,\n"
7174 " // Second element:\n"
7175 " 2};",
7176 format("std::vector<int> MyNumbers{// First element:\n"
7177 " 1,\n"
7178 " // Second element:\n"
7179 " 2};",
7180 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00007181 // A trailing comma should still lead to an enforced line break.
7182 EXPECT_EQ("vector<int> SomeVector = {\n"
7183 " // aaa\n"
7184 " 1, 2,\n"
7185 "};",
7186 format("vector<int> SomeVector = { // aaa\n"
7187 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00007188
Chandler Carruthf8b72662014-03-02 12:37:31 +00007189 FormatStyle ExtraSpaces = getLLVMStyle();
7190 ExtraSpaces.Cpp11BracedListStyle = false;
7191 ExtraSpaces.ColumnLimit = 75;
7192 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
7193 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
7194 verifyFormat("f({ 1, 2 });", ExtraSpaces);
7195 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
7196 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
7197 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
7198 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
7199 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
7200 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
7201 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
7202 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
7203 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
7204 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
7205 verifyFormat("class Class {\n"
7206 " T member = { arg1, arg2 };\n"
7207 "};",
7208 ExtraSpaces);
7209 verifyFormat(
7210 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7211 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
7212 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
7213 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
7214 ExtraSpaces);
7215 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00007216 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007217 ExtraSpaces);
7218 verifyFormat(
7219 "someFunction(OtherParam,\n"
7220 " BracedList{ // comment 1 (Forcing interesting break)\n"
7221 " param1, param2,\n"
7222 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00007223 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007224 ExtraSpaces);
7225 verifyFormat(
7226 "std::this_thread::sleep_for(\n"
7227 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
7228 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00007229 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00007230 " aaaaaaa,\n"
7231 " aaaaaaaaaa,\n"
7232 " aaaaa,\n"
7233 " aaaaaaaaaaaaaaa,\n"
7234 " aaa,\n"
7235 " aaaaaaaaaa,\n"
7236 " a,\n"
7237 " aaaaaaaaaaaaaaaaaaaaa,\n"
7238 " aaaaaaaaaaaa,\n"
7239 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
7240 " aaaaaaa,\n"
7241 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007242 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00007243}
7244
Daniel Jasper33b909c2013-10-25 14:29:37 +00007245TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007246 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7247 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7248 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7249 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7250 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7251 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007252 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007253 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00007254 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007255 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7256 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007257 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007258 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7259 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7260 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
7261 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7262 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7263 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7264 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007265 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007266 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7267 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007268 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7269 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7270 " // Separating comment.\n"
7271 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
7272 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7273 " // Leading comment\n"
7274 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7275 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007276 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7277 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007278 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00007279 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7280 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007281 getLLVMStyleWithColumns(38));
7282 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007283 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
7284 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007285 verifyFormat(
7286 "static unsigned SomeValues[10][3] = {\n"
7287 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
7288 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
7289 verifyFormat("static auto fields = new vector<string>{\n"
7290 " \"aaaaaaaaaaaaa\",\n"
7291 " \"aaaaaaaaaaaaa\",\n"
7292 " \"aaaaaaaaaaaa\",\n"
7293 " \"aaaaaaaaaaaaaa\",\n"
7294 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7295 " \"aaaaaaaaaaaa\",\n"
7296 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7297 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00007298 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
7299 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
7300 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
7301 " 3, cccccccccccccccccccccc};",
7302 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00007303
7304 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00007305 verifyFormat("vector<int> x = {\n"
7306 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
7307 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00007308 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00007309 verifyFormat("vector<int> x = {\n"
7310 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00007311 "};",
7312 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00007313 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7314 " 1, 1, 1, 1,\n"
7315 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00007316 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007317
Daniel Jasper60c27072015-05-13 08:16:00 +00007318 // Trailing comment in the first line.
7319 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
7320 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
7321 " 111111111, 222222222, 3333333333, 444444444, //\n"
7322 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00007323 // Trailing comment in the last line.
7324 verifyFormat("int aaaaa[] = {\n"
7325 " 1, 2, 3, // comment\n"
7326 " 4, 5, 6 // comment\n"
7327 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00007328
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007329 // With nested lists, we should either format one item per line or all nested
7330 // lists one on line.
7331 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007332 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
7333 " {aaaaaaaaaaaaaaaaaaa},\n"
7334 " {aaaaaaaaaaaaaaaaaaaaa},\n"
7335 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00007336 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00007337 verifyFormat(
7338 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007339 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
7340 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
7341 " {aaa, aaa},\n"
7342 " {aaa, aaa},\n"
7343 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
7344 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7345 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00007346
7347 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007348 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
7349 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00007350
7351 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00007352
Daniel Jaspereb65e912015-12-21 18:31:15 +00007353 // No braced initializer here.
7354 verifyFormat("void f() {\n"
7355 " struct Dummy {};\n"
7356 " f(v);\n"
7357 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00007358
7359 // Long lists should be formatted in columns even if they are nested.
7360 verifyFormat(
7361 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7362 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7363 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7364 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7365 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7366 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00007367
7368 // Allow "single-column" layout even if that violates the column limit. There
7369 // isn't going to be a better way.
7370 verifyFormat("std::vector<int> a = {\n"
7371 " aaaaaaaa,\n"
7372 " aaaaaaaa,\n"
7373 " aaaaaaaa,\n"
7374 " aaaaaaaa,\n"
7375 " aaaaaaaaaa,\n"
7376 " aaaaaaaa,\n"
7377 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
7378 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00007379 verifyFormat("vector<int> aaaa = {\n"
7380 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7381 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7382 " aaaaaa.aaaaaaa,\n"
7383 " aaaaaa.aaaaaaa,\n"
7384 " aaaaaa.aaaaaaa,\n"
7385 " aaaaaa.aaaaaaa,\n"
7386 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007387
7388 // Don't create hanging lists.
7389 verifyFormat("someFunction(Param,\n"
7390 " {List1, List2,\n"
7391 " List3});",
7392 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00007393 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
7394 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007395}
7396
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007397TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007398 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00007399 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007400
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007401 verifyFormat("void f() { return 42; }");
7402 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007403 " return 42;\n"
7404 "}",
7405 DoNotMerge);
7406 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007407 " // Comment\n"
7408 "}");
7409 verifyFormat("{\n"
7410 "#error {\n"
7411 " int a;\n"
7412 "}");
7413 verifyFormat("{\n"
7414 " int a;\n"
7415 "#error {\n"
7416 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00007417 verifyFormat("void f() {} // comment");
7418 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00007419 verifyFormat("void f() {\n"
7420 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007421 DoNotMerge);
7422 verifyFormat("void f() {\n"
7423 " int a;\n"
7424 "} // comment",
7425 DoNotMerge);
7426 verifyFormat("void f() {\n"
7427 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00007428 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007429
7430 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7431 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7432
7433 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7434 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007435 verifyFormat("class C {\n"
7436 " C()\n"
7437 " : iiiiiiii(nullptr),\n"
7438 " kkkkkkk(nullptr),\n"
7439 " mmmmmmm(nullptr),\n"
7440 " nnnnnnn(nullptr) {}\n"
7441 "};",
7442 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007443
7444 FormatStyle NoColumnLimit = getLLVMStyle();
7445 NoColumnLimit.ColumnLimit = 0;
7446 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7447 EXPECT_EQ("class C {\n"
7448 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007449 "};",
7450 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007451 EXPECT_EQ("A()\n"
7452 " : b(0) {\n"
7453 "}",
7454 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7455
7456 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007457 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7458 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007459 EXPECT_EQ("A()\n"
7460 " : b(0) {\n"
7461 "}",
7462 format("A():b(0){}", DoNotMergeNoColumnLimit));
7463 EXPECT_EQ("A()\n"
7464 " : b(0) {\n"
7465 "}",
7466 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007467
7468 verifyFormat("#define A \\\n"
7469 " void f() { \\\n"
7470 " int i; \\\n"
7471 " }",
7472 getLLVMStyleWithColumns(20));
7473 verifyFormat("#define A \\\n"
7474 " void f() { int i; }",
7475 getLLVMStyleWithColumns(21));
7476 verifyFormat("#define A \\\n"
7477 " void f() { \\\n"
7478 " int i; \\\n"
7479 " } \\\n"
7480 " int j;",
7481 getLLVMStyleWithColumns(22));
7482 verifyFormat("#define A \\\n"
7483 " void f() { int i; } \\\n"
7484 " int j;",
7485 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007486}
7487
Daniel Jasperd74cf402014-04-08 12:46:38 +00007488TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7489 FormatStyle MergeInlineOnly = getLLVMStyle();
7490 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7491 verifyFormat("class C {\n"
7492 " int f() { return 42; }\n"
7493 "};",
7494 MergeInlineOnly);
7495 verifyFormat("int f() {\n"
7496 " return 42;\n"
7497 "}",
7498 MergeInlineOnly);
7499}
7500
Manuel Klimeke01bab52013-01-15 13:38:33 +00007501TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7502 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007503 verifyFormat("struct foo a = {bar};\nint n;");
7504 verifyFormat("class foo a = {bar};\nint n;");
7505 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007506
7507 // Elaborate types inside function definitions.
7508 verifyFormat("struct foo f() {}\nint n;");
7509 verifyFormat("class foo f() {}\nint n;");
7510 verifyFormat("union foo f() {}\nint n;");
7511
7512 // Templates.
7513 verifyFormat("template <class X> void f() {}\nint n;");
7514 verifyFormat("template <struct X> void f() {}\nint n;");
7515 verifyFormat("template <union X> void f() {}\nint n;");
7516
7517 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007518 verifyFormat("struct {\n} n;");
7519 verifyFormat(
7520 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007521 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007522 verifyFormat("class MACRO Z {\n} n;");
7523 verifyFormat("class MACRO(X) Z {\n} n;");
7524 verifyFormat("class __attribute__(X) Z {\n} n;");
7525 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007526 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007527 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007528 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7529 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007530
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007531 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007532 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007533
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007534 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007535 verifyFormat(
7536 "template <typename F>\n"
7537 "Matcher(const Matcher<F> &Other,\n"
7538 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7539 " !is_same<F, T>::value>::type * = 0)\n"
7540 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7541
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007542 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007543 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007544 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007545
7546 // FIXME:
7547 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007548 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007549
Manuel Klimeke01bab52013-01-15 13:38:33 +00007550 // Elaborate types where incorrectly parsing the structural element would
7551 // break the indent.
7552 verifyFormat("if (true)\n"
7553 " class X x;\n"
7554 "else\n"
7555 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007556
7557 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007558 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007559}
7560
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007561TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007562 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7563 format("#error Leave all white!!!!! space* alone!\n"));
7564 EXPECT_EQ(
7565 "#warning Leave all white!!!!! space* alone!\n",
7566 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007567 EXPECT_EQ("#error 1", format(" # error 1"));
7568 EXPECT_EQ("#warning 1", format(" # warning 1"));
7569}
7570
Daniel Jasper4431aa92013-04-23 13:54:04 +00007571TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007572 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007573 verifyFormat("#if (AAAA && BBBB)");
7574 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007575 // FIXME: Come up with a better indentation for #elif.
7576 verifyFormat(
7577 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7578 " defined(BBBBBBBB)\n"
7579 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7580 " defined(BBBBBBBB)\n"
7581 "#endif",
7582 getLLVMStyleWithColumns(65));
7583}
7584
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007585TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7586 FormatStyle AllowsMergedIf = getGoogleStyle();
7587 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7588 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7589 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007590 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7591 EXPECT_EQ("if (true) return 42;",
7592 format("if (true)\nreturn 42;", AllowsMergedIf));
7593 FormatStyle ShortMergedIf = AllowsMergedIf;
7594 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007595 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007596 " if (true) return 42;",
7597 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007598 verifyFormat("#define A \\\n"
7599 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007600 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007601 "#define B",
7602 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007603 verifyFormat("#define A \\\n"
7604 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007605 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007606 "g();",
7607 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007608 verifyFormat("{\n"
7609 "#ifdef A\n"
7610 " // Comment\n"
7611 " if (true) continue;\n"
7612 "#endif\n"
7613 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007614 " if (true) continue;\n"
7615 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007616 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007617 ShortMergedIf.ColumnLimit = 29;
7618 verifyFormat("#define A \\\n"
7619 " if (aaaaaaaaaa) return 1; \\\n"
7620 " return 2;",
7621 ShortMergedIf);
7622 ShortMergedIf.ColumnLimit = 28;
7623 verifyFormat("#define A \\\n"
7624 " if (aaaaaaaaaa) \\\n"
7625 " return 1; \\\n"
7626 " return 2;",
7627 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007628}
7629
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007630TEST_F(FormatTest, BlockCommentsInControlLoops) {
7631 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7632 " f();\n"
7633 "}");
7634 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7635 " f();\n"
7636 "} /* another comment */ else /* comment #3 */ {\n"
7637 " g();\n"
7638 "}");
7639 verifyFormat("while (0) /* a comment in a strange place */ {\n"
7640 " f();\n"
7641 "}");
7642 verifyFormat("for (;;) /* a comment in a strange place */ {\n"
7643 " f();\n"
7644 "}");
7645 verifyFormat("do /* a comment in a strange place */ {\n"
7646 " f();\n"
7647 "} /* another comment */ while (0);");
7648}
7649
7650TEST_F(FormatTest, BlockComments) {
7651 EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
7652 format("/* *//* */ /* */\n/* *//* */ /* */"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007653 EXPECT_EQ("/* */ a /* */ b;", format(" /* */ a/* */ b;"));
Daniel Jaspera49393f2013-08-28 09:07:32 +00007654 EXPECT_EQ("#define A /*123*/ \\\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007655 " b\n"
7656 "/* */\n"
7657 "someCall(\n"
7658 " parameter);",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00007659 format("#define A /*123*/ b\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007660 "/* */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007661 "someCall(parameter);",
7662 getLLVMStyleWithColumns(15)));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007663
7664 EXPECT_EQ("#define A\n"
7665 "/* */ someCall(\n"
7666 " parameter);",
7667 format("#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007668 "/* */someCall(parameter);",
7669 getLLVMStyleWithColumns(15)));
Daniel Jasper51fb2b22013-05-30 06:40:07 +00007670 EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007671 EXPECT_EQ("/*\n"
7672 "*\n"
7673 " * aaaaaa\n"
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00007674 " * aaaaaa\n"
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007675 "*/",
7676 format("/*\n"
7677 "*\n"
7678 " * aaaaaa aaaaaa\n"
7679 "*/",
7680 getLLVMStyleWithColumns(10)));
Daniel Jasperce257f22013-05-30 17:27:48 +00007681 EXPECT_EQ("/*\n"
7682 "**\n"
7683 "* aaaaaa\n"
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007684 "*aaaaaa\n"
Daniel Jasperce257f22013-05-30 17:27:48 +00007685 "*/",
7686 format("/*\n"
7687 "**\n"
7688 "* aaaaaa aaaaaa\n"
7689 "*/",
7690 getLLVMStyleWithColumns(10)));
Daniel Jasperacadc8e2016-06-08 09:45:08 +00007691 EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7692 " /* line 1\n"
7693 " bbbbbbbbbbbb */\n"
7694 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7695 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7696 " /* line 1\n"
7697 " bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7698 getLLVMStyleWithColumns(50)));
Daniel Jasper1f140982013-02-04 07:32:14 +00007699
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007700 FormatStyle NoBinPacking = getLLVMStyle();
7701 NoBinPacking.BinPackParameters = false;
Daniel Jasper1f140982013-02-04 07:32:14 +00007702 EXPECT_EQ("someFunction(1, /* comment 1 */\n"
7703 " 2, /* comment 2 */\n"
7704 " 3, /* comment 3 */\n"
Daniel Jasper14e40ec2013-02-04 08:34:57 +00007705 " aaaa,\n"
7706 " bbbb);",
Daniel Jasper1f140982013-02-04 07:32:14 +00007707 format("someFunction (1, /* comment 1 */\n"
7708 " 2, /* comment 2 */ \n"
7709 " 3, /* comment 3 */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007710 "aaaa, bbbb );",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007711 NoBinPacking));
Daniel Jasper38396592013-02-06 15:23:09 +00007712 verifyFormat(
7713 "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7714 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7715 EXPECT_EQ(
7716 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7717 " aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7718 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
7719 format(
7720 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7721 " aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7722 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
Daniel Jasper94f0e132013-02-06 20:07:35 +00007723 EXPECT_EQ(
7724 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7725 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7726 "int cccccccccccccccccccccccccccccc; /* comment */\n",
7727 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7728 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7729 "int cccccccccccccccccccccccccccccc; /* comment */\n"));
Daniel Jasper022612d2013-07-01 09:34:09 +00007730
7731 verifyFormat("void f(int * /* unused */) {}");
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007732
7733 EXPECT_EQ("/*\n"
7734 " **\n"
7735 " */",
7736 format("/*\n"
7737 " **\n"
7738 " */"));
7739 EXPECT_EQ("/*\n"
7740 " *q\n"
7741 " */",
7742 format("/*\n"
7743 " *q\n"
7744 " */"));
7745 EXPECT_EQ("/*\n"
7746 " * q\n"
7747 " */",
7748 format("/*\n"
7749 " * q\n"
7750 " */"));
7751 EXPECT_EQ("/*\n"
7752 " **/",
7753 format("/*\n"
7754 " **/"));
7755 EXPECT_EQ("/*\n"
7756 " ***/",
7757 format("/*\n"
7758 " ***/"));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007759}
7760
Manuel Klimek82b836a2013-02-06 16:40:56 +00007761TEST_F(FormatTest, BlockCommentsInMacros) {
7762 EXPECT_EQ("#define A \\\n"
7763 " { \\\n"
7764 " /* one line */ \\\n"
7765 " someCall();",
7766 format("#define A { \\\n"
7767 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007768 " someCall();",
7769 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007770 EXPECT_EQ("#define A \\\n"
7771 " { \\\n"
7772 " /* previous */ \\\n"
7773 " /* one line */ \\\n"
7774 " someCall();",
7775 format("#define A { \\\n"
7776 " /* previous */ \\\n"
7777 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007778 " someCall();",
7779 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007780}
7781
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007782TEST_F(FormatTest, BlockCommentsAtEndOfLine) {
7783 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007784 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007785 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007786 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007787 "};",
7788 getLLVMStyleWithColumns(15)));
7789 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007790 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007791 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007792 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007793 "};",
7794 getLLVMStyleWithColumns(15)));
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007795 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007796 " 1111 /* a\n"
Krasimir Georgiev91834222017-01-25 13:58:58 +00007797 " */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007798 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007799 format("a = {1111 /* a */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007800 "};",
7801 getLLVMStyleWithColumns(15)));
7802}
7803
Manuel Klimek82b836a2013-02-06 16:40:56 +00007804TEST_F(FormatTest, IndentLineCommentsInStartOfBlockAtEndOfFile) {
Manuel Klimek82b836a2013-02-06 16:40:56 +00007805 verifyFormat("{\n"
Marianne Mailhot-Sarrasin03137c62016-04-14 14:56:49 +00007806 " // a\n"
7807 " // b");
Manuel Klimek82b836a2013-02-06 16:40:56 +00007808}
7809
Manuel Klimekd33516e2013-01-23 10:09:28 +00007810TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007811 verifyFormat("void f(int *a);");
7812 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007813 verifyFormat("class A {\n void f(int *a);\n};");
7814 verifyFormat("class A {\n int *a;\n};");
7815 verifyFormat("namespace a {\n"
7816 "namespace b {\n"
7817 "class A {\n"
7818 " void f() {}\n"
7819 " int *a;\n"
7820 "};\n"
7821 "}\n"
7822 "}");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007823}
7824
Manuel Klimekd33516e2013-01-23 10:09:28 +00007825TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7826 verifyFormat("while");
7827 verifyFormat("operator");
7828}
7829
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007830TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7831 // This code would be painfully slow to format if we didn't skip it.
7832 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
7833 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7834 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7835 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7836 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7837 "A(1, 1)\n"
7838 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7839 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7840 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7841 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7842 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7843 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7844 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7845 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7846 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7847 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7848 // Deeply nested part is untouched, rest is formatted.
7849 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7850 format(std::string("int i;\n") + Code + "int j;\n",
7851 getLLVMStyle(), IC_ExpectIncomplete));
7852}
7853
Nico Weber7e6a7a12013-01-08 17:56:31 +00007854//===----------------------------------------------------------------------===//
7855// Objective-C tests.
7856//===----------------------------------------------------------------------===//
7857
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007858TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7859 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7860 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7861 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007862 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007863 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7864 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7865 format("-(NSInteger)Method3:(id)anObject;"));
7866 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7867 format("-(NSInteger)Method4:(id)anObject;"));
7868 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7869 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7870 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7871 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007872 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7873 "forAllCells:(BOOL)flag;",
7874 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7875 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007876
7877 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007878 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7879 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007880 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7881 " inRange:(NSRange)range\n"
7882 " outRange:(NSRange)out_range\n"
7883 " outRange1:(NSRange)out_range1\n"
7884 " outRange2:(NSRange)out_range2\n"
7885 " outRange3:(NSRange)out_range3\n"
7886 " outRange4:(NSRange)out_range4\n"
7887 " outRange5:(NSRange)out_range5\n"
7888 " outRange6:(NSRange)out_range6\n"
7889 " outRange7:(NSRange)out_range7\n"
7890 " outRange8:(NSRange)out_range8\n"
7891 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007892
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007893 // When the function name has to be wrapped.
7894 FormatStyle Style = getLLVMStyle();
7895 Style.IndentWrappedFunctionNames = false;
7896 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7897 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7898 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7899 "}",
7900 Style);
7901 Style.IndentWrappedFunctionNames = true;
7902 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7903 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7904 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7905 "}",
7906 Style);
7907
Nico Weberd6f962f2013-01-10 20:18:33 +00007908 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007909 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007910 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7911 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007912 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007913
Daniel Jasper37194282013-05-28 08:33:00 +00007914 verifyFormat("- (int (*)())foo:(int (*)())f;");
7915 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007916
7917 // If there's no return type (very rare in practice!), LLVM and Google style
7918 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007919 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007920 verifyFormat("- foo:(int)f;");
7921 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007922}
7923
Nico Weber0588b502013-02-07 00:19:29 +00007924
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007925TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007926 EXPECT_EQ("\"some text \"\n"
7927 "\"other\";",
7928 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007929 EXPECT_EQ("\"some text \"\n"
7930 "\"other\";",
7931 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007932 EXPECT_EQ(
7933 "#define A \\\n"
7934 " \"some \" \\\n"
7935 " \"text \" \\\n"
7936 " \"other\";",
7937 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7938 EXPECT_EQ(
7939 "#define A \\\n"
7940 " \"so \" \\\n"
7941 " \"text \" \\\n"
7942 " \"other\";",
7943 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7944
7945 EXPECT_EQ("\"some text\"",
7946 format("\"some text\"", getLLVMStyleWithColumns(1)));
7947 EXPECT_EQ("\"some text\"",
7948 format("\"some text\"", getLLVMStyleWithColumns(11)));
7949 EXPECT_EQ("\"some \"\n"
7950 "\"text\"",
7951 format("\"some text\"", getLLVMStyleWithColumns(10)));
7952 EXPECT_EQ("\"some \"\n"
7953 "\"text\"",
7954 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007955 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007956 "\" tex\"\n"
7957 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007958 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007959 EXPECT_EQ("\"some\"\n"
7960 "\" tex\"\n"
7961 "\" and\"",
7962 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7963 EXPECT_EQ("\"some\"\n"
7964 "\"/tex\"\n"
7965 "\"/and\"",
7966 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007967
7968 EXPECT_EQ("variable =\n"
7969 " \"long string \"\n"
7970 " \"literal\";",
7971 format("variable = \"long string literal\";",
7972 getLLVMStyleWithColumns(20)));
7973
7974 EXPECT_EQ("variable = f(\n"
7975 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007976 " \"literal\",\n"
7977 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007978 " loooooooooooooooooooong);",
7979 format("variable = f(\"long string literal\", short, "
7980 "loooooooooooooooooooong);",
7981 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007982
Daniel Jaspera44991332015-04-29 13:06:49 +00007983 EXPECT_EQ(
7984 "f(g(\"long string \"\n"
7985 " \"literal\"),\n"
7986 " b);",
7987 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007988 EXPECT_EQ("f(g(\"long string \"\n"
7989 " \"literal\",\n"
7990 " a),\n"
7991 " b);",
7992 format("f(g(\"long string literal\", a), b);",
7993 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007994 EXPECT_EQ(
7995 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00007996 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007997 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7998 EXPECT_EQ("f(\"one two three four five six \"\n"
7999 " \"seven\".split(\n"
8000 " really_looooong_variable));",
8001 format("f(\"one two three four five six seven\"."
8002 "split(really_looooong_variable));",
8003 getLLVMStyleWithColumns(33)));
8004
8005 EXPECT_EQ("f(\"some \"\n"
8006 " \"text\",\n"
8007 " other);",
8008 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00008009
8010 // Only break as a last resort.
8011 verifyFormat(
8012 "aaaaaaaaaaaaaaaaaaaa(\n"
8013 " aaaaaaaaaaaaaaaaaaaa,\n"
8014 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00008015
Daniel Jaspera44991332015-04-29 13:06:49 +00008016 EXPECT_EQ("\"splitmea\"\n"
8017 "\"trandomp\"\n"
8018 "\"oint\"",
8019 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00008020
Daniel Jaspera44991332015-04-29 13:06:49 +00008021 EXPECT_EQ("\"split/\"\n"
8022 "\"pathat/\"\n"
8023 "\"slashes\"",
8024 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008025
Daniel Jaspera44991332015-04-29 13:06:49 +00008026 EXPECT_EQ("\"split/\"\n"
8027 "\"pathat/\"\n"
8028 "\"slashes\"",
8029 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00008030 EXPECT_EQ("\"split at \"\n"
8031 "\"spaces/at/\"\n"
8032 "\"slashes.at.any$\"\n"
8033 "\"non-alphanumeric%\"\n"
8034 "\"1111111111characte\"\n"
8035 "\"rs\"",
8036 format("\"split at "
8037 "spaces/at/"
8038 "slashes.at."
8039 "any$non-"
8040 "alphanumeric%"
8041 "1111111111characte"
8042 "rs\"",
8043 getLLVMStyleWithColumns(20)));
8044
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008045 // Verify that splitting the strings understands
8046 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00008047 EXPECT_EQ(
8048 "aaaaaaaaaaaa(\n"
8049 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8050 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8051 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8052 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8053 "aaaaaaaaaaaaaaaaaaaaaa\");",
8054 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00008055 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8056 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8057 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8058 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8059 "aaaaaaaaaaaaaaaaaaaaaa\";",
8060 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00008061 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8062 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8063 format("llvm::outs() << "
8064 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8065 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00008066 EXPECT_EQ("ffff(\n"
8067 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8068 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8069 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8070 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8071 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008072
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008073 FormatStyle Style = getLLVMStyleWithColumns(12);
8074 Style.BreakStringLiterals = false;
8075 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8076
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008077 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
8078 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00008079 EXPECT_EQ("#define A \\\n"
8080 " \"some \" \\\n"
8081 " \"text \" \\\n"
8082 " \"other\";",
8083 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008084}
8085
Manuel Klimek9e321992015-07-28 15:50:24 +00008086TEST_F(FormatTest, FullyRemoveEmptyLines) {
8087 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8088 NoEmptyLines.MaxEmptyLinesToKeep = 0;
8089 EXPECT_EQ("int i = a(b());",
8090 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8091}
8092
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008093TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8094 EXPECT_EQ(
8095 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8096 "(\n"
8097 " \"x\t\");",
8098 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8099 "aaaaaaa("
8100 "\"x\t\");"));
8101}
8102
Daniel Jasper174b0122014-01-09 14:18:12 +00008103TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00008104 EXPECT_EQ(
8105 "u8\"utf8 string \"\n"
8106 "u8\"literal\";",
8107 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8108 EXPECT_EQ(
8109 "u\"utf16 string \"\n"
8110 "u\"literal\";",
8111 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8112 EXPECT_EQ(
8113 "U\"utf32 string \"\n"
8114 "U\"literal\";",
8115 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8116 EXPECT_EQ("L\"wide string \"\n"
8117 "L\"literal\";",
8118 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00008119 EXPECT_EQ("@\"NSString \"\n"
8120 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00008121 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00008122
8123 // This input makes clang-format try to split the incomplete unicode escape
8124 // sequence, which used to lead to a crasher.
8125 verifyNoCrash(
8126 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8127 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008128}
8129
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00008130TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8131 FormatStyle Style = getGoogleStyleWithColumns(15);
8132 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8133 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8134 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8135 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8136 EXPECT_EQ("u8R\"x(raw literal)x\";",
8137 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008138}
8139
8140TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8141 FormatStyle Style = getLLVMStyleWithColumns(20);
8142 EXPECT_EQ(
8143 "_T(\"aaaaaaaaaaaaaa\")\n"
8144 "_T(\"aaaaaaaaaaaaaa\")\n"
8145 "_T(\"aaaaaaaaaaaa\")",
8146 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
8147 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
8148 " _T(\"aaaaaa\"),\n"
8149 " z);",
8150 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8151
8152 // FIXME: Handle embedded spaces in one iteration.
8153 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8154 // "_T(\"aaaaaaaaaaaaa\")\n"
8155 // "_T(\"aaaaaaaaaaaaa\")\n"
8156 // "_T(\"a\")",
8157 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8158 // getLLVMStyleWithColumns(20)));
8159 EXPECT_EQ(
8160 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8161 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008162 EXPECT_EQ("f(\n"
8163 "#if !TEST\n"
8164 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8165 "#endif\n"
8166 " );",
8167 format("f(\n"
8168 "#if !TEST\n"
8169 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8170 "#endif\n"
8171 ");"));
8172 EXPECT_EQ("f(\n"
8173 "\n"
8174 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8175 format("f(\n"
8176 "\n"
8177 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008178}
8179
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008180TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008181 EXPECT_EQ(
8182 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8183 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8184 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8185 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8186 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8187 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8188}
8189
8190TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8191 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008192 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008193 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8194 "multiline raw string literal xxxxxxxxxxxxxx\n"
8195 ")x\",\n"
8196 " a),\n"
8197 " b);",
8198 format("fffffffffff(g(R\"x(\n"
8199 "multiline raw string literal xxxxxxxxxxxxxx\n"
8200 ")x\", a), b);",
8201 getGoogleStyleWithColumns(20)));
8202 EXPECT_EQ("fffffffffff(\n"
8203 " g(R\"x(qqq\n"
8204 "multiline raw string literal xxxxxxxxxxxxxx\n"
8205 ")x\",\n"
8206 " a),\n"
8207 " b);",
8208 format("fffffffffff(g(R\"x(qqq\n"
8209 "multiline raw string literal xxxxxxxxxxxxxx\n"
8210 ")x\", a), b);",
8211 getGoogleStyleWithColumns(20)));
8212
8213 EXPECT_EQ("fffffffffff(R\"x(\n"
8214 "multiline raw string literal xxxxxxxxxxxxxx\n"
8215 ")x\");",
8216 format("fffffffffff(R\"x(\n"
8217 "multiline raw string literal xxxxxxxxxxxxxx\n"
8218 ")x\");",
8219 getGoogleStyleWithColumns(20)));
8220 EXPECT_EQ("fffffffffff(R\"x(\n"
8221 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008222 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008223 format("fffffffffff(R\"x(\n"
8224 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008225 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008226 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008227 EXPECT_EQ("fffffffffff(\n"
8228 " R\"x(\n"
8229 "multiline raw string literal xxxxxxxxxxxxxx\n"
8230 ")x\" +\n"
8231 " bbbbbb);",
8232 format("fffffffffff(\n"
8233 " R\"x(\n"
8234 "multiline raw string literal xxxxxxxxxxxxxx\n"
8235 ")x\" + bbbbbb);",
8236 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008237}
8238
Alexander Kornienkobe633902013-06-14 11:46:10 +00008239TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008240 verifyFormat("string a = \"unterminated;");
8241 EXPECT_EQ("function(\"unterminated,\n"
8242 " OtherParameter);",
8243 format("function( \"unterminated,\n"
8244 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008245}
8246
8247TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008248 FormatStyle Style = getLLVMStyle();
8249 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008250 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008251 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008252}
8253
Daniel Jaspera44991332015-04-29 13:06:49 +00008254TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008255
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008256TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8257 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8258 " \"ddeeefff\");",
8259 format("someFunction(\"aaabbbcccdddeeefff\");",
8260 getLLVMStyleWithColumns(25)));
8261 EXPECT_EQ("someFunction1234567890(\n"
8262 " \"aaabbbcccdddeeefff\");",
8263 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8264 getLLVMStyleWithColumns(26)));
8265 EXPECT_EQ("someFunction1234567890(\n"
8266 " \"aaabbbcccdddeeeff\"\n"
8267 " \"f\");",
8268 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8269 getLLVMStyleWithColumns(25)));
8270 EXPECT_EQ("someFunction1234567890(\n"
8271 " \"aaabbbcccdddeeeff\"\n"
8272 " \"f\");",
8273 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8274 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008275 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8276 " \"ddde \"\n"
8277 " \"efff\");",
8278 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008279 getLLVMStyleWithColumns(25)));
8280 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8281 " \"ddeeefff\");",
8282 format("someFunction(\"aaabbbccc ddeeefff\");",
8283 getLLVMStyleWithColumns(25)));
8284 EXPECT_EQ("someFunction1234567890(\n"
8285 " \"aaabb \"\n"
8286 " \"cccdddeeefff\");",
8287 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8288 getLLVMStyleWithColumns(25)));
8289 EXPECT_EQ("#define A \\\n"
8290 " string s = \\\n"
8291 " \"123456789\" \\\n"
8292 " \"0\"; \\\n"
8293 " int i;",
8294 format("#define A string s = \"1234567890\"; int i;",
8295 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008296 // FIXME: Put additional penalties on breaking at non-whitespace locations.
8297 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8298 " \"dddeeeff\"\n"
8299 " \"f\");",
8300 format("someFunction(\"aaabbbcc dddeeefff\");",
8301 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008302}
8303
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008304TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008305 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8306 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008307 EXPECT_EQ("\"test\"\n"
8308 "\"\\n\"",
8309 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8310 EXPECT_EQ("\"tes\\\\\"\n"
8311 "\"n\"",
8312 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8313 EXPECT_EQ("\"\\\\\\\\\"\n"
8314 "\"\\n\"",
8315 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008316 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008317 EXPECT_EQ("\"\\uff01\"\n"
8318 "\"test\"",
8319 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8320 EXPECT_EQ("\"\\Uff01ff02\"",
8321 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8322 EXPECT_EQ("\"\\x000000000001\"\n"
8323 "\"next\"",
8324 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8325 EXPECT_EQ("\"\\x000000000001next\"",
8326 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8327 EXPECT_EQ("\"\\x000000000001\"",
8328 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8329 EXPECT_EQ("\"test\"\n"
8330 "\"\\000000\"\n"
8331 "\"000001\"",
8332 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8333 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008334 "\"00000000\"\n"
8335 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008336 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008337}
8338
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008339TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8340 verifyFormat("void f() {\n"
8341 " return g() {}\n"
8342 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008343 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008344 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008345 "}");
8346}
8347
Manuel Klimek421147e2014-01-24 09:25:23 +00008348TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8349 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008350 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008351}
8352
Manuel Klimek13b97d82013-05-13 08:42:42 +00008353TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8354 verifyFormat("class X {\n"
8355 " void f() {\n"
8356 " }\n"
8357 "};",
8358 getLLVMStyleWithColumns(12));
8359}
8360
8361TEST_F(FormatTest, ConfigurableIndentWidth) {
8362 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8363 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008364 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008365 verifyFormat("void f() {\n"
8366 " someFunction();\n"
8367 " if (true) {\n"
8368 " f();\n"
8369 " }\n"
8370 "}",
8371 EightIndent);
8372 verifyFormat("class X {\n"
8373 " void f() {\n"
8374 " }\n"
8375 "};",
8376 EightIndent);
8377 verifyFormat("int x[] = {\n"
8378 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008379 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008380 EightIndent);
8381}
8382
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008383TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008384 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008385 "f();",
8386 getLLVMStyleWithColumns(8));
8387}
8388
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008389TEST_F(FormatTest, ConfigurableUseOfTab) {
8390 FormatStyle Tab = getLLVMStyleWithColumns(42);
8391 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008392 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008393 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008394
8395 EXPECT_EQ("if (aaaaaaaa && // q\n"
8396 " bb)\t\t// w\n"
8397 "\t;",
8398 format("if (aaaaaaaa &&// q\n"
8399 "bb)// w\n"
8400 ";",
8401 Tab));
8402 EXPECT_EQ("if (aaa && bbb) // w\n"
8403 "\t;",
8404 format("if(aaa&&bbb)// w\n"
8405 ";",
8406 Tab));
8407
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008408 verifyFormat("class X {\n"
8409 "\tvoid f() {\n"
8410 "\t\tsomeFunction(parameter1,\n"
8411 "\t\t\t parameter2);\n"
8412 "\t}\n"
8413 "};",
8414 Tab);
8415 verifyFormat("#define A \\\n"
8416 "\tvoid f() { \\\n"
8417 "\t\tsomeFunction( \\\n"
8418 "\t\t parameter1, \\\n"
8419 "\t\t parameter2); \\\n"
8420 "\t}",
8421 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008422
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008423 Tab.TabWidth = 4;
8424 Tab.IndentWidth = 8;
8425 verifyFormat("class TabWidth4Indent8 {\n"
8426 "\t\tvoid f() {\n"
8427 "\t\t\t\tsomeFunction(parameter1,\n"
8428 "\t\t\t\t\t\t\t parameter2);\n"
8429 "\t\t}\n"
8430 "};",
8431 Tab);
8432
8433 Tab.TabWidth = 4;
8434 Tab.IndentWidth = 4;
8435 verifyFormat("class TabWidth4Indent4 {\n"
8436 "\tvoid f() {\n"
8437 "\t\tsomeFunction(parameter1,\n"
8438 "\t\t\t\t\t parameter2);\n"
8439 "\t}\n"
8440 "};",
8441 Tab);
8442
8443 Tab.TabWidth = 8;
8444 Tab.IndentWidth = 4;
8445 verifyFormat("class TabWidth8Indent4 {\n"
8446 " void f() {\n"
8447 "\tsomeFunction(parameter1,\n"
8448 "\t\t parameter2);\n"
8449 " }\n"
8450 "};",
8451 Tab);
8452
Alexander Kornienko39856b72013-09-10 09:38:25 +00008453 Tab.TabWidth = 8;
8454 Tab.IndentWidth = 8;
8455 EXPECT_EQ("/*\n"
8456 "\t a\t\tcomment\n"
8457 "\t in multiple lines\n"
8458 " */",
8459 format(" /*\t \t \n"
8460 " \t \t a\t\tcomment\t \t\n"
8461 " \t \t in multiple lines\t\n"
8462 " \t */",
8463 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008464
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008465 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008466 verifyFormat("{\n"
8467 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8468 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8469 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8470 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8471 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8472 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008473 "};",
8474 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008475 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008476 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008477 "\ta2,\n"
8478 "\ta3\n"
8479 "};",
8480 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008481 EXPECT_EQ("if (aaaaaaaa && // q\n"
8482 " bb) // w\n"
8483 "\t;",
8484 format("if (aaaaaaaa &&// q\n"
8485 "bb)// w\n"
8486 ";",
8487 Tab));
8488 verifyFormat("class X {\n"
8489 "\tvoid f() {\n"
8490 "\t\tsomeFunction(parameter1,\n"
8491 "\t\t parameter2);\n"
8492 "\t}\n"
8493 "};",
8494 Tab);
8495 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008496 "\tQ(\n"
8497 "\t {\n"
8498 "\t\t int a;\n"
8499 "\t\t someFunction(aaaaaaaa,\n"
8500 "\t\t bbbbbbb);\n"
8501 "\t },\n"
8502 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008503 "}",
8504 Tab);
8505 EXPECT_EQ("{\n"
8506 "\t/* aaaa\n"
8507 "\t bbbb */\n"
8508 "}",
8509 format("{\n"
8510 "/* aaaa\n"
8511 " bbbb */\n"
8512 "}",
8513 Tab));
8514 EXPECT_EQ("{\n"
8515 "\t/*\n"
8516 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8517 "\t bbbbbbbbbbbbb\n"
8518 "\t*/\n"
8519 "}",
8520 format("{\n"
8521 "/*\n"
8522 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8523 "*/\n"
8524 "}",
8525 Tab));
8526 EXPECT_EQ("{\n"
8527 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8528 "\t// bbbbbbbbbbbbb\n"
8529 "}",
8530 format("{\n"
8531 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8532 "}",
8533 Tab));
8534 EXPECT_EQ("{\n"
8535 "\t/*\n"
8536 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8537 "\t bbbbbbbbbbbbb\n"
8538 "\t*/\n"
8539 "}",
8540 format("{\n"
8541 "\t/*\n"
8542 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8543 "\t*/\n"
8544 "}",
8545 Tab));
8546 EXPECT_EQ("{\n"
8547 "\t/*\n"
8548 "\n"
8549 "\t*/\n"
8550 "}",
8551 format("{\n"
8552 "\t/*\n"
8553 "\n"
8554 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008555 "}",
8556 Tab));
8557 EXPECT_EQ("{\n"
8558 "\t/*\n"
8559 " asdf\n"
8560 "\t*/\n"
8561 "}",
8562 format("{\n"
8563 "\t/*\n"
8564 " asdf\n"
8565 "\t*/\n"
8566 "}",
8567 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008568
8569 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008570 EXPECT_EQ("/*\n"
8571 " a\t\tcomment\n"
8572 " in multiple lines\n"
8573 " */",
8574 format(" /*\t \t \n"
8575 " \t \t a\t\tcomment\t \t\n"
8576 " \t \t in multiple lines\t\n"
8577 " \t */",
8578 Tab));
8579 EXPECT_EQ("/* some\n"
8580 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008581 format(" \t \t /* some\n"
8582 " \t \t comment */",
8583 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008584 EXPECT_EQ("int a; /* some\n"
8585 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008586 format(" \t \t int a; /* some\n"
8587 " \t \t comment */",
8588 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008589
Alexander Kornienko39856b72013-09-10 09:38:25 +00008590 EXPECT_EQ("int a; /* some\n"
8591 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008592 format(" \t \t int\ta; /* some\n"
8593 " \t \t comment */",
8594 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008595 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8596 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008597 format(" \t \t f(\"\t\t\"); /* some\n"
8598 " \t \t comment */",
8599 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008600 EXPECT_EQ("{\n"
8601 " /*\n"
8602 " * Comment\n"
8603 " */\n"
8604 " int i;\n"
8605 "}",
8606 format("{\n"
8607 "\t/*\n"
8608 "\t * Comment\n"
8609 "\t */\n"
8610 "\t int i;\n"
8611 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008612
8613 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8614 Tab.TabWidth = 8;
8615 Tab.IndentWidth = 8;
8616 EXPECT_EQ("if (aaaaaaaa && // q\n"
8617 " bb) // w\n"
8618 "\t;",
8619 format("if (aaaaaaaa &&// q\n"
8620 "bb)// w\n"
8621 ";",
8622 Tab));
8623 EXPECT_EQ("if (aaa && bbb) // w\n"
8624 "\t;",
8625 format("if(aaa&&bbb)// w\n"
8626 ";",
8627 Tab));
8628 verifyFormat("class X {\n"
8629 "\tvoid f() {\n"
8630 "\t\tsomeFunction(parameter1,\n"
8631 "\t\t\t parameter2);\n"
8632 "\t}\n"
8633 "};",
8634 Tab);
8635 verifyFormat("#define A \\\n"
8636 "\tvoid f() { \\\n"
8637 "\t\tsomeFunction( \\\n"
8638 "\t\t parameter1, \\\n"
8639 "\t\t parameter2); \\\n"
8640 "\t}",
8641 Tab);
8642 Tab.TabWidth = 4;
8643 Tab.IndentWidth = 8;
8644 verifyFormat("class TabWidth4Indent8 {\n"
8645 "\t\tvoid f() {\n"
8646 "\t\t\t\tsomeFunction(parameter1,\n"
8647 "\t\t\t\t\t\t\t parameter2);\n"
8648 "\t\t}\n"
8649 "};",
8650 Tab);
8651 Tab.TabWidth = 4;
8652 Tab.IndentWidth = 4;
8653 verifyFormat("class TabWidth4Indent4 {\n"
8654 "\tvoid f() {\n"
8655 "\t\tsomeFunction(parameter1,\n"
8656 "\t\t\t\t\t parameter2);\n"
8657 "\t}\n"
8658 "};",
8659 Tab);
8660 Tab.TabWidth = 8;
8661 Tab.IndentWidth = 4;
8662 verifyFormat("class TabWidth8Indent4 {\n"
8663 " void f() {\n"
8664 "\tsomeFunction(parameter1,\n"
8665 "\t\t parameter2);\n"
8666 " }\n"
8667 "};",
8668 Tab);
8669 Tab.TabWidth = 8;
8670 Tab.IndentWidth = 8;
8671 EXPECT_EQ("/*\n"
8672 "\t a\t\tcomment\n"
8673 "\t in multiple lines\n"
8674 " */",
8675 format(" /*\t \t \n"
8676 " \t \t a\t\tcomment\t \t\n"
8677 " \t \t in multiple lines\t\n"
8678 " \t */",
8679 Tab));
8680 verifyFormat("{\n"
8681 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8682 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8683 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8684 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8685 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8686 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8687 "};",
8688 Tab);
8689 verifyFormat("enum AA {\n"
8690 "\ta1, // Force multiple lines\n"
8691 "\ta2,\n"
8692 "\ta3\n"
8693 "};",
8694 Tab);
8695 EXPECT_EQ("if (aaaaaaaa && // q\n"
8696 " bb) // w\n"
8697 "\t;",
8698 format("if (aaaaaaaa &&// q\n"
8699 "bb)// w\n"
8700 ";",
8701 Tab));
8702 verifyFormat("class X {\n"
8703 "\tvoid f() {\n"
8704 "\t\tsomeFunction(parameter1,\n"
8705 "\t\t\t parameter2);\n"
8706 "\t}\n"
8707 "};",
8708 Tab);
8709 verifyFormat("{\n"
8710 "\tQ(\n"
8711 "\t {\n"
8712 "\t\t int a;\n"
8713 "\t\t someFunction(aaaaaaaa,\n"
8714 "\t\t\t\t bbbbbbb);\n"
8715 "\t },\n"
8716 "\t p);\n"
8717 "}",
8718 Tab);
8719 EXPECT_EQ("{\n"
8720 "\t/* aaaa\n"
8721 "\t bbbb */\n"
8722 "}",
8723 format("{\n"
8724 "/* aaaa\n"
8725 " bbbb */\n"
8726 "}",
8727 Tab));
8728 EXPECT_EQ("{\n"
8729 "\t/*\n"
8730 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8731 "\t bbbbbbbbbbbbb\n"
8732 "\t*/\n"
8733 "}",
8734 format("{\n"
8735 "/*\n"
8736 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8737 "*/\n"
8738 "}",
8739 Tab));
8740 EXPECT_EQ("{\n"
8741 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8742 "\t// bbbbbbbbbbbbb\n"
8743 "}",
8744 format("{\n"
8745 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8746 "}",
8747 Tab));
8748 EXPECT_EQ("{\n"
8749 "\t/*\n"
8750 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8751 "\t bbbbbbbbbbbbb\n"
8752 "\t*/\n"
8753 "}",
8754 format("{\n"
8755 "\t/*\n"
8756 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8757 "\t*/\n"
8758 "}",
8759 Tab));
8760 EXPECT_EQ("{\n"
8761 "\t/*\n"
8762 "\n"
8763 "\t*/\n"
8764 "}",
8765 format("{\n"
8766 "\t/*\n"
8767 "\n"
8768 "\t*/\n"
8769 "}",
8770 Tab));
8771 EXPECT_EQ("{\n"
8772 "\t/*\n"
8773 " asdf\n"
8774 "\t*/\n"
8775 "}",
8776 format("{\n"
8777 "\t/*\n"
8778 " asdf\n"
8779 "\t*/\n"
8780 "}",
8781 Tab));
8782 EXPECT_EQ("/*\n"
8783 "\t a\t\tcomment\n"
8784 "\t in multiple lines\n"
8785 " */",
8786 format(" /*\t \t \n"
8787 " \t \t a\t\tcomment\t \t\n"
8788 " \t \t in multiple lines\t\n"
8789 " \t */",
8790 Tab));
8791 EXPECT_EQ("/* some\n"
8792 " comment */",
8793 format(" \t \t /* some\n"
8794 " \t \t comment */",
8795 Tab));
8796 EXPECT_EQ("int a; /* some\n"
8797 " comment */",
8798 format(" \t \t int a; /* some\n"
8799 " \t \t comment */",
8800 Tab));
8801 EXPECT_EQ("int a; /* some\n"
8802 "comment */",
8803 format(" \t \t int\ta; /* some\n"
8804 " \t \t comment */",
8805 Tab));
8806 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8807 " comment */",
8808 format(" \t \t f(\"\t\t\"); /* some\n"
8809 " \t \t comment */",
8810 Tab));
8811 EXPECT_EQ("{\n"
8812 " /*\n"
8813 " * Comment\n"
8814 " */\n"
8815 " int i;\n"
8816 "}",
8817 format("{\n"
8818 "\t/*\n"
8819 "\t * Comment\n"
8820 "\t */\n"
8821 "\t int i;\n"
8822 "}"));
8823 Tab.AlignConsecutiveAssignments = true;
8824 Tab.AlignConsecutiveDeclarations = true;
8825 Tab.TabWidth = 4;
8826 Tab.IndentWidth = 4;
8827 verifyFormat("class Assign {\n"
8828 "\tvoid f() {\n"
8829 "\t\tint x = 123;\n"
8830 "\t\tint random = 4;\n"
8831 "\t\tstd::string alphabet =\n"
8832 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8833 "\t}\n"
8834 "};",
8835 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008836}
8837
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008838TEST_F(FormatTest, CalculatesOriginalColumn) {
8839 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8840 "q\"; /* some\n"
8841 " comment */",
8842 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8843 "q\"; /* some\n"
8844 " comment */",
8845 getLLVMStyle()));
8846 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8847 "/* some\n"
8848 " comment */",
8849 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8850 " /* some\n"
8851 " comment */",
8852 getLLVMStyle()));
8853 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8854 "qqq\n"
8855 "/* some\n"
8856 " comment */",
8857 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8858 "qqq\n"
8859 " /* some\n"
8860 " comment */",
8861 getLLVMStyle()));
8862 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8863 "wwww; /* some\n"
8864 " comment */",
8865 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8866 "wwww; /* some\n"
8867 " comment */",
8868 getLLVMStyle()));
8869}
8870
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008871TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008872 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008873 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008874
8875 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008876 " continue;",
8877 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008878 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008879 " continue;",
8880 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008881 verifyFormat("if(true)\n"
8882 " f();\n"
8883 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008884 " f();",
8885 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008886 verifyFormat("do {\n"
8887 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008888 "} while(something());",
8889 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008890 verifyFormat("switch(x) {\n"
8891 "default:\n"
8892 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008893 "}",
8894 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008895 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008896 verifyFormat("size_t x = sizeof(x);", NoSpace);
8897 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8898 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8899 verifyFormat("alignas(128) char a[128];", NoSpace);
8900 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8901 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8902 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008903 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008904 verifyFormat("T A::operator()();", NoSpace);
8905 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008906
8907 FormatStyle Space = getLLVMStyle();
8908 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8909
8910 verifyFormat("int f ();", Space);
8911 verifyFormat("void f (int a, T b) {\n"
8912 " while (true)\n"
8913 " continue;\n"
8914 "}",
8915 Space);
8916 verifyFormat("if (true)\n"
8917 " f ();\n"
8918 "else if (true)\n"
8919 " f ();",
8920 Space);
8921 verifyFormat("do {\n"
8922 " do_something ();\n"
8923 "} while (something ());",
8924 Space);
8925 verifyFormat("switch (x) {\n"
8926 "default:\n"
8927 " break;\n"
8928 "}",
8929 Space);
8930 verifyFormat("A::A () : a (1) {}", Space);
8931 verifyFormat("void f () __attribute__ ((asdf));", Space);
8932 verifyFormat("*(&a + 1);\n"
8933 "&((&a)[1]);\n"
8934 "a[(b + c) * d];\n"
8935 "(((a + 1) * 2) + 3) * 4;",
8936 Space);
8937 verifyFormat("#define A(x) x", Space);
8938 verifyFormat("#define A (x) x", Space);
8939 verifyFormat("#if defined(x)\n"
8940 "#endif",
8941 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008942 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008943 verifyFormat("size_t x = sizeof (x);", Space);
8944 verifyFormat("auto f (int x) -> decltype (x);", Space);
8945 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8946 verifyFormat("alignas (128) char a[128];", Space);
8947 verifyFormat("size_t x = alignof (MyType);", Space);
8948 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8949 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008950 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008951 verifyFormat("T A::operator() ();", Space);
8952 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008953}
8954
8955TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8956 FormatStyle Spaces = getLLVMStyle();
8957
8958 Spaces.SpacesInParentheses = true;
8959 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008960 verifyFormat("call();", Spaces);
8961 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008962 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8963 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008964 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008965 " continue;",
8966 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008967 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008968 " continue;",
8969 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008970 verifyFormat("if ( true )\n"
8971 " f();\n"
8972 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008973 " f();",
8974 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008975 verifyFormat("do {\n"
8976 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008977 "} while ( something() );",
8978 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008979 verifyFormat("switch ( x ) {\n"
8980 "default:\n"
8981 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008982 "}",
8983 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008984
8985 Spaces.SpacesInParentheses = false;
8986 Spaces.SpacesInCStyleCastParentheses = true;
8987 verifyFormat("Type *A = ( Type * )P;", Spaces);
8988 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8989 verifyFormat("x = ( int32 )y;", Spaces);
8990 verifyFormat("int a = ( int )(2.0f);", Spaces);
8991 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8992 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8993 verifyFormat("#define x (( int )-1)", Spaces);
8994
Daniel Jasper92e09822015-03-18 12:59:19 +00008995 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008996 Spaces.SpacesInParentheses = false;
8997 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008998 Spaces.SpacesInCStyleCastParentheses = true;
8999 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009000 verifyFormat("call( );", Spaces);
9001 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009002 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009003 " continue;",
9004 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009005 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009006 " continue;",
9007 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009008 verifyFormat("if (true)\n"
9009 " f( );\n"
9010 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009011 " f( );",
9012 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009013 verifyFormat("do {\n"
9014 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009015 "} while (something( ));",
9016 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009017 verifyFormat("switch (x) {\n"
9018 "default:\n"
9019 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009020 "}",
9021 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009022
Daniel Jasper92e09822015-03-18 12:59:19 +00009023 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009024 Spaces.SpaceAfterCStyleCast = true;
9025 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009026 verifyFormat("call( );", Spaces);
9027 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009028 verifyFormat("while (( bool ) 1)\n"
9029 " continue;",
9030 Spaces);
9031 verifyFormat("for (;;)\n"
9032 " continue;",
9033 Spaces);
9034 verifyFormat("if (true)\n"
9035 " f( );\n"
9036 "else if (true)\n"
9037 " f( );",
9038 Spaces);
9039 verifyFormat("do {\n"
9040 " do_something(( int ) i);\n"
9041 "} while (something( ));",
9042 Spaces);
9043 verifyFormat("switch (x) {\n"
9044 "default:\n"
9045 " break;\n"
9046 "}",
9047 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009048
9049 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009050 Spaces.SpacesInCStyleCastParentheses = false;
9051 Spaces.SpaceAfterCStyleCast = true;
9052 verifyFormat("while ((bool) 1)\n"
9053 " continue;",
9054 Spaces);
9055 verifyFormat("do {\n"
9056 " do_something((int) i);\n"
9057 "} while (something( ));",
9058 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009059}
9060
Daniel Jasperad981f82014-08-26 11:41:14 +00009061TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9062 verifyFormat("int a[5];");
9063 verifyFormat("a[3] += 42;");
9064
9065 FormatStyle Spaces = getLLVMStyle();
9066 Spaces.SpacesInSquareBrackets = true;
9067 // Lambdas unchanged.
9068 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9069 verifyFormat("return [i, args...] {};", Spaces);
9070
9071 // Not lambdas.
9072 verifyFormat("int a[ 5 ];", Spaces);
9073 verifyFormat("a[ 3 ] += 42;", Spaces);
9074 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9075 verifyFormat("double &operator[](int i) { return 0; }\n"
9076 "int i;",
9077 Spaces);
9078 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9079 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9080 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9081}
9082
Daniel Jasperd94bff32013-09-25 15:15:02 +00009083TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9084 verifyFormat("int a = 5;");
9085 verifyFormat("a += 42;");
9086 verifyFormat("a or_eq 8;");
9087
9088 FormatStyle Spaces = getLLVMStyle();
9089 Spaces.SpaceBeforeAssignmentOperators = false;
9090 verifyFormat("int a= 5;", Spaces);
9091 verifyFormat("a+= 42;", Spaces);
9092 verifyFormat("a or_eq 8;", Spaces);
9093}
9094
Daniel Jaspera44991332015-04-29 13:06:49 +00009095TEST_F(FormatTest, AlignConsecutiveAssignments) {
9096 FormatStyle Alignment = getLLVMStyle();
9097 Alignment.AlignConsecutiveAssignments = false;
9098 verifyFormat("int a = 5;\n"
9099 "int oneTwoThree = 123;",
9100 Alignment);
9101 verifyFormat("int a = 5;\n"
9102 "int oneTwoThree = 123;",
9103 Alignment);
9104
9105 Alignment.AlignConsecutiveAssignments = true;
9106 verifyFormat("int a = 5;\n"
9107 "int oneTwoThree = 123;",
9108 Alignment);
9109 verifyFormat("int a = method();\n"
9110 "int oneTwoThree = 133;",
9111 Alignment);
9112 verifyFormat("a &= 5;\n"
9113 "bcd *= 5;\n"
9114 "ghtyf += 5;\n"
9115 "dvfvdb -= 5;\n"
9116 "a /= 5;\n"
9117 "vdsvsv %= 5;\n"
9118 "sfdbddfbdfbb ^= 5;\n"
9119 "dvsdsv |= 5;\n"
9120 "int dsvvdvsdvvv = 123;",
9121 Alignment);
9122 verifyFormat("int i = 1, j = 10;\n"
9123 "something = 2000;",
9124 Alignment);
9125 verifyFormat("something = 2000;\n"
9126 "int i = 1, j = 10;\n",
9127 Alignment);
9128 verifyFormat("something = 2000;\n"
9129 "another = 911;\n"
9130 "int i = 1, j = 10;\n"
9131 "oneMore = 1;\n"
9132 "i = 2;",
9133 Alignment);
9134 verifyFormat("int a = 5;\n"
9135 "int one = 1;\n"
9136 "method();\n"
9137 "int oneTwoThree = 123;\n"
9138 "int oneTwo = 12;",
9139 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009140 verifyFormat("int oneTwoThree = 123;\n"
9141 "int oneTwo = 12;\n"
9142 "method();\n",
9143 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009144 verifyFormat("int oneTwoThree = 123; // comment\n"
9145 "int oneTwo = 12; // comment",
9146 Alignment);
9147 EXPECT_EQ("int a = 5;\n"
9148 "\n"
9149 "int oneTwoThree = 123;",
9150 format("int a = 5;\n"
9151 "\n"
9152 "int oneTwoThree= 123;",
9153 Alignment));
9154 EXPECT_EQ("int a = 5;\n"
9155 "int one = 1;\n"
9156 "\n"
9157 "int oneTwoThree = 123;",
9158 format("int a = 5;\n"
9159 "int one = 1;\n"
9160 "\n"
9161 "int oneTwoThree = 123;",
9162 Alignment));
9163 EXPECT_EQ("int a = 5;\n"
9164 "int one = 1;\n"
9165 "\n"
9166 "int oneTwoThree = 123;\n"
9167 "int oneTwo = 12;",
9168 format("int a = 5;\n"
9169 "int one = 1;\n"
9170 "\n"
9171 "int oneTwoThree = 123;\n"
9172 "int oneTwo = 12;",
9173 Alignment));
9174 Alignment.AlignEscapedNewlinesLeft = true;
9175 verifyFormat("#define A \\\n"
9176 " int aaaa = 12; \\\n"
9177 " int b = 23; \\\n"
9178 " int ccc = 234; \\\n"
9179 " int dddddddddd = 2345;",
9180 Alignment);
9181 Alignment.AlignEscapedNewlinesLeft = false;
9182 verifyFormat("#define A "
9183 " \\\n"
9184 " int aaaa = 12; "
9185 " \\\n"
9186 " int b = 23; "
9187 " \\\n"
9188 " int ccc = 234; "
9189 " \\\n"
9190 " int dddddddddd = 2345;",
9191 Alignment);
9192 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9193 "k = 4, int l = 5,\n"
9194 " int m = 6) {\n"
9195 " int j = 10;\n"
9196 " otherThing = 1;\n"
9197 "}",
9198 Alignment);
9199 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9200 " int i = 1;\n"
9201 " int j = 2;\n"
9202 " int big = 10000;\n"
9203 "}",
9204 Alignment);
9205 verifyFormat("class C {\n"
9206 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009207 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009208 " virtual void f() = 0;\n"
9209 "};",
9210 Alignment);
9211 verifyFormat("int i = 1;\n"
9212 "if (SomeType t = getSomething()) {\n"
9213 "}\n"
9214 "int j = 2;\n"
9215 "int big = 10000;",
9216 Alignment);
9217 verifyFormat("int j = 7;\n"
9218 "for (int k = 0; k < N; ++k) {\n"
9219 "}\n"
9220 "int j = 2;\n"
9221 "int big = 10000;\n"
9222 "}",
9223 Alignment);
9224 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9225 verifyFormat("int i = 1;\n"
9226 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9227 " = someLooooooooooooooooongFunction();\n"
9228 "int j = 2;",
9229 Alignment);
9230 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9231 verifyFormat("int i = 1;\n"
9232 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9233 " someLooooooooooooooooongFunction();\n"
9234 "int j = 2;",
9235 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009236
9237 verifyFormat("auto lambda = []() {\n"
9238 " auto i = 0;\n"
9239 " return 0;\n"
9240 "};\n"
9241 "int i = 0;\n"
9242 "auto v = type{\n"
9243 " i = 1, //\n"
9244 " (i = 2), //\n"
9245 " i = 3 //\n"
9246 "};",
9247 Alignment);
9248
Daniel Jaspera44991332015-04-29 13:06:49 +00009249 // FIXME: Should align all three assignments
9250 verifyFormat(
9251 "int i = 1;\n"
9252 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9253 " loooooooooooooooooooooongParameterB);\n"
9254 "int j = 2;",
9255 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009256
9257 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9258 " typename B = very_long_type_name_1,\n"
9259 " typename T_2 = very_long_type_name_2>\n"
9260 "auto foo() {}\n",
9261 Alignment);
9262 verifyFormat("int a, b = 1;\n"
9263 "int c = 2;\n"
9264 "int dd = 3;\n",
9265 Alignment);
9266 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9267 "float b[1][] = {{3.f}};\n",
9268 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009269}
9270
Daniel Jaspere12597c2015-10-01 10:06:54 +00009271TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9272 FormatStyle Alignment = getLLVMStyle();
9273 Alignment.AlignConsecutiveDeclarations = false;
9274 verifyFormat("float const a = 5;\n"
9275 "int oneTwoThree = 123;",
9276 Alignment);
9277 verifyFormat("int a = 5;\n"
9278 "float const oneTwoThree = 123;",
9279 Alignment);
9280
9281 Alignment.AlignConsecutiveDeclarations = true;
9282 verifyFormat("float const a = 5;\n"
9283 "int oneTwoThree = 123;",
9284 Alignment);
9285 verifyFormat("int a = method();\n"
9286 "float const oneTwoThree = 133;",
9287 Alignment);
9288 verifyFormat("int i = 1, j = 10;\n"
9289 "something = 2000;",
9290 Alignment);
9291 verifyFormat("something = 2000;\n"
9292 "int i = 1, j = 10;\n",
9293 Alignment);
9294 verifyFormat("float something = 2000;\n"
9295 "double another = 911;\n"
9296 "int i = 1, j = 10;\n"
9297 "const int *oneMore = 1;\n"
9298 "unsigned i = 2;",
9299 Alignment);
9300 verifyFormat("float a = 5;\n"
9301 "int one = 1;\n"
9302 "method();\n"
9303 "const double oneTwoThree = 123;\n"
9304 "const unsigned int oneTwo = 12;",
9305 Alignment);
9306 verifyFormat("int oneTwoThree{0}; // comment\n"
9307 "unsigned oneTwo; // comment",
9308 Alignment);
9309 EXPECT_EQ("float const a = 5;\n"
9310 "\n"
9311 "int oneTwoThree = 123;",
9312 format("float const a = 5;\n"
9313 "\n"
9314 "int oneTwoThree= 123;",
9315 Alignment));
9316 EXPECT_EQ("float a = 5;\n"
9317 "int one = 1;\n"
9318 "\n"
9319 "unsigned oneTwoThree = 123;",
9320 format("float a = 5;\n"
9321 "int one = 1;\n"
9322 "\n"
9323 "unsigned oneTwoThree = 123;",
9324 Alignment));
9325 EXPECT_EQ("float a = 5;\n"
9326 "int one = 1;\n"
9327 "\n"
9328 "unsigned oneTwoThree = 123;\n"
9329 "int oneTwo = 12;",
9330 format("float a = 5;\n"
9331 "int one = 1;\n"
9332 "\n"
9333 "unsigned oneTwoThree = 123;\n"
9334 "int oneTwo = 12;",
9335 Alignment));
9336 Alignment.AlignConsecutiveAssignments = true;
9337 verifyFormat("float something = 2000;\n"
9338 "double another = 911;\n"
9339 "int i = 1, j = 10;\n"
9340 "const int *oneMore = 1;\n"
9341 "unsigned i = 2;",
9342 Alignment);
9343 verifyFormat("int oneTwoThree = {0}; // comment\n"
9344 "unsigned oneTwo = 0; // comment",
9345 Alignment);
9346 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9347 " int const i = 1;\n"
9348 " int * j = 2;\n"
9349 " int big = 10000;\n"
9350 "\n"
9351 " unsigned oneTwoThree = 123;\n"
9352 " int oneTwo = 12;\n"
9353 " method();\n"
9354 " float k = 2;\n"
9355 " int ll = 10000;\n"
9356 "}",
9357 format("void SomeFunction(int parameter= 0) {\n"
9358 " int const i= 1;\n"
9359 " int *j=2;\n"
9360 " int big = 10000;\n"
9361 "\n"
9362 "unsigned oneTwoThree =123;\n"
9363 "int oneTwo = 12;\n"
9364 " method();\n"
9365 "float k= 2;\n"
9366 "int ll=10000;\n"
9367 "}",
9368 Alignment));
9369 Alignment.AlignConsecutiveAssignments = false;
9370 Alignment.AlignEscapedNewlinesLeft = true;
9371 verifyFormat("#define A \\\n"
9372 " int aaaa = 12; \\\n"
9373 " float b = 23; \\\n"
9374 " const int ccc = 234; \\\n"
9375 " unsigned dddddddddd = 2345;",
9376 Alignment);
9377 Alignment.AlignEscapedNewlinesLeft = false;
9378 Alignment.ColumnLimit = 30;
9379 verifyFormat("#define A \\\n"
9380 " int aaaa = 12; \\\n"
9381 " float b = 23; \\\n"
9382 " const int ccc = 234; \\\n"
9383 " int dddddddddd = 2345;",
9384 Alignment);
9385 Alignment.ColumnLimit = 80;
9386 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9387 "k = 4, int l = 5,\n"
9388 " int m = 6) {\n"
9389 " const int j = 10;\n"
9390 " otherThing = 1;\n"
9391 "}",
9392 Alignment);
9393 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9394 " int const i = 1;\n"
9395 " int * j = 2;\n"
9396 " int big = 10000;\n"
9397 "}",
9398 Alignment);
9399 verifyFormat("class C {\n"
9400 "public:\n"
9401 " int i = 1;\n"
9402 " virtual void f() = 0;\n"
9403 "};",
9404 Alignment);
9405 verifyFormat("float i = 1;\n"
9406 "if (SomeType t = getSomething()) {\n"
9407 "}\n"
9408 "const unsigned j = 2;\n"
9409 "int big = 10000;",
9410 Alignment);
9411 verifyFormat("float j = 7;\n"
9412 "for (int k = 0; k < N; ++k) {\n"
9413 "}\n"
9414 "unsigned j = 2;\n"
9415 "int big = 10000;\n"
9416 "}",
9417 Alignment);
9418 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9419 verifyFormat("float i = 1;\n"
9420 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9421 " = someLooooooooooooooooongFunction();\n"
9422 "int j = 2;",
9423 Alignment);
9424 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9425 verifyFormat("int i = 1;\n"
9426 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9427 " someLooooooooooooooooongFunction();\n"
9428 "int j = 2;",
9429 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009430
9431 Alignment.AlignConsecutiveAssignments = true;
9432 verifyFormat("auto lambda = []() {\n"
9433 " auto ii = 0;\n"
9434 " float j = 0;\n"
9435 " return 0;\n"
9436 "};\n"
9437 "int i = 0;\n"
9438 "float i2 = 0;\n"
9439 "auto v = type{\n"
9440 " i = 1, //\n"
9441 " (i = 2), //\n"
9442 " i = 3 //\n"
9443 "};",
9444 Alignment);
9445 Alignment.AlignConsecutiveAssignments = false;
9446
Daniel Jaspere12597c2015-10-01 10:06:54 +00009447 // FIXME: Should align all three declarations
9448 verifyFormat(
9449 "int i = 1;\n"
9450 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9451 " loooooooooooooooooooooongParameterB);\n"
9452 "int j = 2;",
9453 Alignment);
9454
9455 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9456 // We expect declarations and assignments to align, as long as it doesn't
9457 // exceed the column limit, starting a new alignemnt sequence whenever it
9458 // happens.
9459 Alignment.AlignConsecutiveAssignments = true;
9460 Alignment.ColumnLimit = 30;
9461 verifyFormat("float ii = 1;\n"
9462 "unsigned j = 2;\n"
9463 "int someVerylongVariable = 1;\n"
9464 "AnotherLongType ll = 123456;\n"
9465 "VeryVeryLongType k = 2;\n"
9466 "int myvar = 1;",
9467 Alignment);
9468 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009469 Alignment.AlignConsecutiveAssignments = false;
9470
9471 verifyFormat(
9472 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9473 " typename LongType, typename B>\n"
9474 "auto foo() {}\n",
9475 Alignment);
9476 verifyFormat("float a, b = 1;\n"
9477 "int c = 2;\n"
9478 "int dd = 3;\n",
9479 Alignment);
9480 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9481 "float b[1][] = {{3.f}};\n",
9482 Alignment);
9483 Alignment.AlignConsecutiveAssignments = true;
9484 verifyFormat("float a, b = 1;\n"
9485 "int c = 2;\n"
9486 "int dd = 3;\n",
9487 Alignment);
9488 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9489 "float b[1][] = {{3.f}};\n",
9490 Alignment);
9491 Alignment.AlignConsecutiveAssignments = false;
9492
9493 Alignment.ColumnLimit = 30;
9494 Alignment.BinPackParameters = false;
9495 verifyFormat("void foo(float a,\n"
9496 " float b,\n"
9497 " int c,\n"
9498 " uint32_t *d) {\n"
9499 " int * e = 0;\n"
9500 " float f = 0;\n"
9501 " double g = 0;\n"
9502 "}\n"
9503 "void bar(ino_t a,\n"
9504 " int b,\n"
9505 " uint32_t *c,\n"
9506 " bool d) {}\n",
9507 Alignment);
9508 Alignment.BinPackParameters = true;
9509 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009510}
9511
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009512TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009513 FormatStyle LinuxBraceStyle = getLLVMStyle();
9514 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009515 verifyFormat("namespace a\n"
9516 "{\n"
9517 "class A\n"
9518 "{\n"
9519 " void f()\n"
9520 " {\n"
9521 " if (true) {\n"
9522 " a();\n"
9523 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009524 " } else {\n"
9525 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009526 " }\n"
9527 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009528 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009529 "};\n"
9530 "struct B {\n"
9531 " int x;\n"
9532 "};\n"
9533 "}\n",
9534 LinuxBraceStyle);
9535 verifyFormat("enum X {\n"
9536 " Y = 0,\n"
9537 "}\n",
9538 LinuxBraceStyle);
9539 verifyFormat("struct S {\n"
9540 " int Type;\n"
9541 " union {\n"
9542 " int x;\n"
9543 " double y;\n"
9544 " } Value;\n"
9545 " class C\n"
9546 " {\n"
9547 " MyFavoriteType Value;\n"
9548 " } Class;\n"
9549 "}\n",
9550 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009551}
9552
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009553TEST_F(FormatTest, MozillaBraceBreaking) {
9554 FormatStyle MozillaBraceStyle = getLLVMStyle();
9555 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
9556 verifyFormat("namespace a {\n"
9557 "class A\n"
9558 "{\n"
9559 " void f()\n"
9560 " {\n"
9561 " if (true) {\n"
9562 " a();\n"
9563 " b();\n"
9564 " }\n"
9565 " }\n"
9566 " void g() { return; }\n"
9567 "};\n"
9568 "enum E\n"
9569 "{\n"
9570 " A,\n"
9571 " // foo\n"
9572 " B,\n"
9573 " C\n"
9574 "};\n"
9575 "struct B\n"
9576 "{\n"
9577 " int x;\n"
9578 "};\n"
9579 "}\n",
9580 MozillaBraceStyle);
9581 verifyFormat("struct S\n"
9582 "{\n"
9583 " int Type;\n"
9584 " union\n"
9585 " {\n"
9586 " int x;\n"
9587 " double y;\n"
9588 " } Value;\n"
9589 " class C\n"
9590 " {\n"
9591 " MyFavoriteType Value;\n"
9592 " } Class;\n"
9593 "}\n",
9594 MozillaBraceStyle);
9595}
9596
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009597TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009598 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9599 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009600 verifyFormat("namespace a {\n"
9601 "class A {\n"
9602 " void f()\n"
9603 " {\n"
9604 " if (true) {\n"
9605 " a();\n"
9606 " b();\n"
9607 " }\n"
9608 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009609 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009610 "};\n"
9611 "struct B {\n"
9612 " int x;\n"
9613 "};\n"
9614 "}\n",
9615 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009616
Daniel Jasperd9670872014-08-05 12:06:20 +00009617 verifyFormat("void foo()\n"
9618 "{\n"
9619 " if (a) {\n"
9620 " a();\n"
9621 " }\n"
9622 " else {\n"
9623 " b();\n"
9624 " }\n"
9625 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009626 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009627
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009628 verifyFormat("#ifdef _DEBUG\n"
9629 "int foo(int i = 0)\n"
9630 "#else\n"
9631 "int foo(int i = 5)\n"
9632 "#endif\n"
9633 "{\n"
9634 " return i;\n"
9635 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009636 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009637
9638 verifyFormat("void foo() {}\n"
9639 "void bar()\n"
9640 "#ifdef _DEBUG\n"
9641 "{\n"
9642 " foo();\n"
9643 "}\n"
9644 "#else\n"
9645 "{\n"
9646 "}\n"
9647 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009648 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009649
9650 verifyFormat("void foobar() { int i = 5; }\n"
9651 "#ifdef _DEBUG\n"
9652 "void bar() {}\n"
9653 "#else\n"
9654 "void bar() { foobar(); }\n"
9655 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009656 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009657}
9658
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009659TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009660 FormatStyle AllmanBraceStyle = getLLVMStyle();
9661 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009662 verifyFormat("namespace a\n"
9663 "{\n"
9664 "class A\n"
9665 "{\n"
9666 " void f()\n"
9667 " {\n"
9668 " if (true)\n"
9669 " {\n"
9670 " a();\n"
9671 " b();\n"
9672 " }\n"
9673 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009674 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009675 "};\n"
9676 "struct B\n"
9677 "{\n"
9678 " int x;\n"
9679 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009680 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009681 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009682
9683 verifyFormat("void f()\n"
9684 "{\n"
9685 " if (true)\n"
9686 " {\n"
9687 " a();\n"
9688 " }\n"
9689 " else if (false)\n"
9690 " {\n"
9691 " b();\n"
9692 " }\n"
9693 " else\n"
9694 " {\n"
9695 " c();\n"
9696 " }\n"
9697 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009698 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009699
9700 verifyFormat("void f()\n"
9701 "{\n"
9702 " for (int i = 0; i < 10; ++i)\n"
9703 " {\n"
9704 " a();\n"
9705 " }\n"
9706 " while (false)\n"
9707 " {\n"
9708 " b();\n"
9709 " }\n"
9710 " do\n"
9711 " {\n"
9712 " c();\n"
9713 " } while (false)\n"
9714 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009715 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009716
9717 verifyFormat("void f(int a)\n"
9718 "{\n"
9719 " switch (a)\n"
9720 " {\n"
9721 " case 0:\n"
9722 " break;\n"
9723 " case 1:\n"
9724 " {\n"
9725 " break;\n"
9726 " }\n"
9727 " case 2:\n"
9728 " {\n"
9729 " }\n"
9730 " break;\n"
9731 " default:\n"
9732 " break;\n"
9733 " }\n"
9734 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009735 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009736
9737 verifyFormat("enum X\n"
9738 "{\n"
9739 " Y = 0,\n"
9740 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009741 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009742 verifyFormat("enum X\n"
9743 "{\n"
9744 " Y = 0\n"
9745 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009746 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009747
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009748 verifyFormat("@interface BSApplicationController ()\n"
9749 "{\n"
9750 "@private\n"
9751 " id _extraIvar;\n"
9752 "}\n"
9753 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009754 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009755
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009756 verifyFormat("#ifdef _DEBUG\n"
9757 "int foo(int i = 0)\n"
9758 "#else\n"
9759 "int foo(int i = 5)\n"
9760 "#endif\n"
9761 "{\n"
9762 " return i;\n"
9763 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009764 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009765
9766 verifyFormat("void foo() {}\n"
9767 "void bar()\n"
9768 "#ifdef _DEBUG\n"
9769 "{\n"
9770 " foo();\n"
9771 "}\n"
9772 "#else\n"
9773 "{\n"
9774 "}\n"
9775 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009776 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009777
9778 verifyFormat("void foobar() { int i = 5; }\n"
9779 "#ifdef _DEBUG\n"
9780 "void bar() {}\n"
9781 "#else\n"
9782 "void bar() { foobar(); }\n"
9783 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009784 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009785
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009786 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009787 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009788 " // ...\n"
9789 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009790 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009791 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009792 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009793 " // ...\n"
9794 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009795 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009796 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009797 // .. or dict literals.
9798 verifyFormat("void f()\n"
9799 "{\n"
9800 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
9801 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009802 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009803 verifyFormat("int f()\n"
9804 "{ // comment\n"
9805 " return 42;\n"
9806 "}",
9807 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009808
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009809 AllmanBraceStyle.ColumnLimit = 19;
9810 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9811 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009812 verifyFormat("void f()\n"
9813 "{\n"
9814 " int i;\n"
9815 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009816 AllmanBraceStyle);
9817 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009818
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009819 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009820 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9821 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9822 verifyFormat("void f(bool b)\n"
9823 "{\n"
9824 " if (b)\n"
9825 " {\n"
9826 " return;\n"
9827 " }\n"
9828 "}\n",
9829 BreakBeforeBraceShortIfs);
9830 verifyFormat("void f(bool b)\n"
9831 "{\n"
9832 " if (b) return;\n"
9833 "}\n",
9834 BreakBeforeBraceShortIfs);
9835 verifyFormat("void f(bool b)\n"
9836 "{\n"
9837 " while (b)\n"
9838 " {\n"
9839 " return;\n"
9840 " }\n"
9841 "}\n",
9842 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009843}
9844
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009845TEST_F(FormatTest, GNUBraceBreaking) {
9846 FormatStyle GNUBraceStyle = getLLVMStyle();
9847 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9848 verifyFormat("namespace a\n"
9849 "{\n"
9850 "class A\n"
9851 "{\n"
9852 " void f()\n"
9853 " {\n"
9854 " int a;\n"
9855 " {\n"
9856 " int b;\n"
9857 " }\n"
9858 " if (true)\n"
9859 " {\n"
9860 " a();\n"
9861 " b();\n"
9862 " }\n"
9863 " }\n"
9864 " void g() { return; }\n"
9865 "}\n"
9866 "}",
9867 GNUBraceStyle);
9868
9869 verifyFormat("void f()\n"
9870 "{\n"
9871 " if (true)\n"
9872 " {\n"
9873 " a();\n"
9874 " }\n"
9875 " else if (false)\n"
9876 " {\n"
9877 " b();\n"
9878 " }\n"
9879 " else\n"
9880 " {\n"
9881 " c();\n"
9882 " }\n"
9883 "}\n",
9884 GNUBraceStyle);
9885
9886 verifyFormat("void f()\n"
9887 "{\n"
9888 " for (int i = 0; i < 10; ++i)\n"
9889 " {\n"
9890 " a();\n"
9891 " }\n"
9892 " while (false)\n"
9893 " {\n"
9894 " b();\n"
9895 " }\n"
9896 " do\n"
9897 " {\n"
9898 " c();\n"
9899 " }\n"
9900 " while (false);\n"
9901 "}\n",
9902 GNUBraceStyle);
9903
9904 verifyFormat("void f(int a)\n"
9905 "{\n"
9906 " switch (a)\n"
9907 " {\n"
9908 " case 0:\n"
9909 " break;\n"
9910 " case 1:\n"
9911 " {\n"
9912 " break;\n"
9913 " }\n"
9914 " case 2:\n"
9915 " {\n"
9916 " }\n"
9917 " break;\n"
9918 " default:\n"
9919 " break;\n"
9920 " }\n"
9921 "}\n",
9922 GNUBraceStyle);
9923
9924 verifyFormat("enum X\n"
9925 "{\n"
9926 " Y = 0,\n"
9927 "}\n",
9928 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009929
9930 verifyFormat("@interface BSApplicationController ()\n"
9931 "{\n"
9932 "@private\n"
9933 " id _extraIvar;\n"
9934 "}\n"
9935 "@end\n",
9936 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009937
9938 verifyFormat("#ifdef _DEBUG\n"
9939 "int foo(int i = 0)\n"
9940 "#else\n"
9941 "int foo(int i = 5)\n"
9942 "#endif\n"
9943 "{\n"
9944 " return i;\n"
9945 "}",
9946 GNUBraceStyle);
9947
9948 verifyFormat("void foo() {}\n"
9949 "void bar()\n"
9950 "#ifdef _DEBUG\n"
9951 "{\n"
9952 " foo();\n"
9953 "}\n"
9954 "#else\n"
9955 "{\n"
9956 "}\n"
9957 "#endif",
9958 GNUBraceStyle);
9959
9960 verifyFormat("void foobar() { int i = 5; }\n"
9961 "#ifdef _DEBUG\n"
9962 "void bar() {}\n"
9963 "#else\n"
9964 "void bar() { foobar(); }\n"
9965 "#endif",
9966 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009967}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009968
9969TEST_F(FormatTest, WebKitBraceBreaking) {
9970 FormatStyle WebKitBraceStyle = getLLVMStyle();
9971 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
9972 verifyFormat("namespace a {\n"
9973 "class A {\n"
9974 " void f()\n"
9975 " {\n"
9976 " if (true) {\n"
9977 " a();\n"
9978 " b();\n"
9979 " }\n"
9980 " }\n"
9981 " void g() { return; }\n"
9982 "};\n"
9983 "enum E {\n"
9984 " A,\n"
9985 " // foo\n"
9986 " B,\n"
9987 " C\n"
9988 "};\n"
9989 "struct B {\n"
9990 " int x;\n"
9991 "};\n"
9992 "}\n",
9993 WebKitBraceStyle);
9994 verifyFormat("struct S {\n"
9995 " int Type;\n"
9996 " union {\n"
9997 " int x;\n"
9998 " double y;\n"
9999 " } Value;\n"
10000 " class C {\n"
10001 " MyFavoriteType Value;\n"
10002 " } Class;\n"
10003 "};\n",
10004 WebKitBraceStyle);
10005}
10006
Manuel Klimekd5735502013-08-12 03:51:17 +000010007TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10008 verifyFormat("void f() {\n"
10009 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010010 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010011 " }\n"
10012 "}\n",
10013 getLLVMStyle());
10014}
10015
Daniel Jasper9613c812013-08-07 16:29:23 +000010016TEST_F(FormatTest, UnderstandsPragmas) {
10017 verifyFormat("#pragma omp reduction(| : var)");
10018 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010019
10020 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10021 "(including parentheses).",
10022 format("#pragma mark Any non-hyphenated or hyphenated string "
10023 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010024}
10025
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010026TEST_F(FormatTest, UnderstandPragmaOption) {
10027 verifyFormat("#pragma option -C -A");
10028
10029 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10030}
10031
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010032#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10033 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010034 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10035 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010036
10037TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010038 SmallVector<FormatStyle, 3> Styles;
10039 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010040
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010041 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010042 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10043 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10044 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010045
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010046 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010047 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10048 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10049 EXPECT_ALL_STYLES_EQUAL(Styles);
10050
Nico Weber514ecc82014-02-02 20:50:45 +000010051 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010052 EXPECT_TRUE(
10053 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10054 EXPECT_TRUE(
10055 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10056 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010057
Nico Weber514ecc82014-02-02 20:50:45 +000010058 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010059 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10060 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10061 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010062
10063 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010064 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10065 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10066 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010067
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010068 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010069 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10070 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10071 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010072
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010073 Styles[0] = getGNUStyle();
10074 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10075 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10076 EXPECT_ALL_STYLES_EQUAL(Styles);
10077
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010078 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10079}
10080
10081TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10082 SmallVector<FormatStyle, 8> Styles;
10083 Styles.resize(2);
10084
10085 Styles[0] = getGoogleStyle();
10086 Styles[1] = getLLVMStyle();
10087 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10088 EXPECT_ALL_STYLES_EQUAL(Styles);
10089
10090 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010091 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010092 Styles[1] = getLLVMStyle();
10093 Styles[1].Language = FormatStyle::LK_JavaScript;
10094 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10095
10096 Styles[2] = getLLVMStyle();
10097 Styles[2].Language = FormatStyle::LK_JavaScript;
10098 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10099 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010100 &Styles[2])
10101 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010102
10103 Styles[3] = getLLVMStyle();
10104 Styles[3].Language = FormatStyle::LK_JavaScript;
10105 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10106 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010107 &Styles[3])
10108 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010109
10110 Styles[4] = getLLVMStyle();
10111 Styles[4].Language = FormatStyle::LK_JavaScript;
10112 EXPECT_EQ(0, parseConfiguration("---\n"
10113 "BasedOnStyle: LLVM\n"
10114 "IndentWidth: 123\n"
10115 "---\n"
10116 "BasedOnStyle: Google\n"
10117 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010118 &Styles[4])
10119 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010120 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010121}
10122
Daniel Jasper91881d92014-09-29 08:07:46 +000010123#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010124 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010125 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010126 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010127 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010128 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010129
Daniel Jasper91881d92014-09-29 08:07:46 +000010130#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10131
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010132#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10133 Style.STRUCT.FIELD = false; \
10134 EXPECT_EQ(0, \
10135 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10136 .value()); \
10137 EXPECT_TRUE(Style.STRUCT.FIELD); \
10138 EXPECT_EQ(0, \
10139 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10140 .value()); \
10141 EXPECT_FALSE(Style.STRUCT.FIELD);
10142
10143#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10144 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10145
Daniel Jasper00853002014-09-16 16:22:30 +000010146#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10147 EXPECT_NE(VALUE, Style.FIELD); \
10148 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10149 EXPECT_EQ(VALUE, Style.FIELD)
10150
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010151TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010152 FormatStyle Style = {};
10153 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010154 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +000010155 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010156 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010157 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010158 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010159 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010160 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010161 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010162 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010163 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010164 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010165 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010166 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010167 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010168 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +000010169 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010170 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010171 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010172 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010173 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010174 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010175 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010176 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010177 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010178 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010179 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010180 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010181 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010182 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010183 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010184 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010185 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010186 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010187 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010188 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010189 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010190 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010191 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010192
10193 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10194 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10195 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10196 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10197 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10198 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10199 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10200 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
10201 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10202 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10203 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010204}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010205
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010206#undef CHECK_PARSE_BOOL
10207
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010208TEST_F(FormatTest, ParsesConfiguration) {
10209 FormatStyle Style = {};
10210 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010211 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010212 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10213 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010214 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010215 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10216 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010217 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10218 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010219 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10220 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10221 PenaltyReturnTypeOnItsOwnLine, 1234u);
10222 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10223 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010224 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010225 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010226 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010227
Daniel Jasper553d4872014-06-17 12:40:34 +000010228 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010229 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10230 FormatStyle::PAS_Left);
10231 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10232 FormatStyle::PAS_Right);
10233 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10234 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010235 // For backward compatibility:
10236 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10237 FormatStyle::PAS_Left);
10238 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10239 FormatStyle::PAS_Right);
10240 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10241 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010242
Alexander Kornienkod6538332013-05-07 15:32:14 +000010243 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010244 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10245 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010246 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10247 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10248 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10249
Daniel Jasperac043c92014-09-15 11:11:00 +000010250 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010251 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10252 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010253 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10254 FormatStyle::BOS_None);
10255 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10256 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010257 // For backward compatibility:
10258 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10259 FormatStyle::BOS_None);
10260 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10261 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010262
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010263 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10264 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10265 FormatStyle::BAS_Align);
10266 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10267 FormatStyle::BAS_DontAlign);
10268 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10269 FormatStyle::BAS_AlwaysBreak);
10270 // For backward compatibility:
10271 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10272 FormatStyle::BAS_DontAlign);
10273 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10274 FormatStyle::BAS_Align);
10275
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010276 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010277 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10278 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10279 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010280 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10281 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010282 // For backward compatibility:
10283 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10284 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010285
Daniel Jasperd74cf402014-04-08 12:46:38 +000010286 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010287 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10288 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10289 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10290 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010291 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10292 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010293 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10294 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010295 // For backward compatibility:
10296 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10297 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10298 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10299 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010300
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010301 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10302 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10303 FormatStyle::SBPO_Never);
10304 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10305 FormatStyle::SBPO_Always);
10306 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10307 FormatStyle::SBPO_ControlStatements);
10308 // For backward compatibility:
10309 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10310 FormatStyle::SBPO_Never);
10311 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10312 FormatStyle::SBPO_ControlStatements);
10313
Alexander Kornienkod6538332013-05-07 15:32:14 +000010314 Style.ColumnLimit = 123;
10315 FormatStyle BaseStyle = getLLVMStyle();
10316 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10317 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10318
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010319 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10320 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10321 FormatStyle::BS_Attach);
10322 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10323 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010324 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10325 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010326 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10327 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010328 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10329 FormatStyle::BS_Allman);
10330 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010331 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10332 FormatStyle::BS_WebKit);
10333 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10334 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010335
Zachary Turner448592e2015-12-18 22:20:15 +000010336 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10337 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10338 FormatStyle::RTBS_None);
10339 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10340 FormatStyle::RTBS_All);
10341 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010342 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010343 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10344 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10345 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10346 AlwaysBreakAfterReturnType,
10347 FormatStyle::RTBS_TopLevelDefinitions);
10348
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010349 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10350 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10351 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10352 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10353 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10354 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10355 AlwaysBreakAfterDefinitionReturnType,
10356 FormatStyle::DRTBS_TopLevel);
10357
Daniel Jasper65ee3472013-07-31 23:16:02 +000010358 Style.NamespaceIndentation = FormatStyle::NI_All;
10359 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10360 FormatStyle::NI_None);
10361 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10362 FormatStyle::NI_Inner);
10363 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10364 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010365
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010366 // FIXME: This is required because parsing a configuration simply overwrites
10367 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010368 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010369 std::vector<std::string> BoostForeach;
10370 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010371 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010372 std::vector<std::string> BoostAndQForeach;
10373 BoostAndQForeach.push_back("BOOST_FOREACH");
10374 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010375 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10376 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010377
10378 Style.IncludeCategories.clear();
10379 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10380 {".*", 1}};
10381 CHECK_PARSE("IncludeCategories:\n"
10382 " - Regex: abc/.*\n"
10383 " Priority: 2\n"
10384 " - Regex: .*\n"
10385 " Priority: 1",
10386 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010387 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010388}
10389
10390TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10391 FormatStyle Style = {};
10392 Style.Language = FormatStyle::LK_Cpp;
10393 CHECK_PARSE("Language: Cpp\n"
10394 "IndentWidth: 12",
10395 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010396 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10397 "IndentWidth: 34",
10398 &Style),
10399 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010400 EXPECT_EQ(12u, Style.IndentWidth);
10401 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10402 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10403
10404 Style.Language = FormatStyle::LK_JavaScript;
10405 CHECK_PARSE("Language: JavaScript\n"
10406 "IndentWidth: 12",
10407 IndentWidth, 12u);
10408 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010409 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10410 "IndentWidth: 34",
10411 &Style),
10412 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010413 EXPECT_EQ(23u, Style.IndentWidth);
10414 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10415 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10416
10417 CHECK_PARSE("BasedOnStyle: LLVM\n"
10418 "IndentWidth: 67",
10419 IndentWidth, 67u);
10420
10421 CHECK_PARSE("---\n"
10422 "Language: JavaScript\n"
10423 "IndentWidth: 12\n"
10424 "---\n"
10425 "Language: Cpp\n"
10426 "IndentWidth: 34\n"
10427 "...\n",
10428 IndentWidth, 12u);
10429
10430 Style.Language = FormatStyle::LK_Cpp;
10431 CHECK_PARSE("---\n"
10432 "Language: JavaScript\n"
10433 "IndentWidth: 12\n"
10434 "---\n"
10435 "Language: Cpp\n"
10436 "IndentWidth: 34\n"
10437 "...\n",
10438 IndentWidth, 34u);
10439 CHECK_PARSE("---\n"
10440 "IndentWidth: 78\n"
10441 "---\n"
10442 "Language: JavaScript\n"
10443 "IndentWidth: 56\n"
10444 "...\n",
10445 IndentWidth, 78u);
10446
10447 Style.ColumnLimit = 123;
10448 Style.IndentWidth = 234;
10449 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10450 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010451 EXPECT_FALSE(parseConfiguration("---\n"
10452 "IndentWidth: 456\n"
10453 "BreakBeforeBraces: Allman\n"
10454 "---\n"
10455 "Language: JavaScript\n"
10456 "IndentWidth: 111\n"
10457 "TabWidth: 111\n"
10458 "---\n"
10459 "Language: Cpp\n"
10460 "BreakBeforeBraces: Stroustrup\n"
10461 "TabWidth: 789\n"
10462 "...\n",
10463 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010464 EXPECT_EQ(123u, Style.ColumnLimit);
10465 EXPECT_EQ(456u, Style.IndentWidth);
10466 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10467 EXPECT_EQ(789u, Style.TabWidth);
10468
Rafael Espindola1f243172014-06-12 11:35:17 +000010469 EXPECT_EQ(parseConfiguration("---\n"
10470 "Language: JavaScript\n"
10471 "IndentWidth: 56\n"
10472 "---\n"
10473 "IndentWidth: 78\n"
10474 "...\n",
10475 &Style),
10476 ParseError::Error);
10477 EXPECT_EQ(parseConfiguration("---\n"
10478 "Language: JavaScript\n"
10479 "IndentWidth: 56\n"
10480 "---\n"
10481 "Language: JavaScript\n"
10482 "IndentWidth: 78\n"
10483 "...\n",
10484 &Style),
10485 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010486
10487 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10488}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010489
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010490#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010491
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010492TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10493 FormatStyle Style = {};
10494 Style.Language = FormatStyle::LK_JavaScript;
10495 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010496 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010497 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010498
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010499 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010500 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010501 "BasedOnStyle: Google\n"
10502 "---\n"
10503 "Language: JavaScript\n"
10504 "IndentWidth: 76\n"
10505 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010506 &Style)
10507 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010508 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010509 EXPECT_EQ(76u, Style.IndentWidth);
10510 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10511}
10512
Alexander Kornienkod6538332013-05-07 15:32:14 +000010513TEST_F(FormatTest, ConfigurationRoundTripTest) {
10514 FormatStyle Style = getLLVMStyle();
10515 std::string YAML = configurationAsText(Style);
10516 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010517 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010518 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10519 EXPECT_EQ(Style, ParsedStyle);
10520}
10521
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010522TEST_F(FormatTest, WorksFor8bitEncodings) {
10523 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10524 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10525 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10526 "\"\xef\xee\xf0\xf3...\"",
10527 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10528 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10529 "\xef\xee\xf0\xf3...\"",
10530 getLLVMStyleWithColumns(12)));
10531}
10532
Alexander Kornienko393e3082013-11-13 14:04:17 +000010533TEST_F(FormatTest, HandlesUTF8BOM) {
10534 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10535 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10536 format("\xef\xbb\xbf#include <iostream>"));
10537 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10538 format("\xef\xbb\xbf\n#include <iostream>"));
10539}
10540
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010541// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10542#if !defined(_MSC_VER)
10543
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010544TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10545 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10546 getLLVMStyleWithColumns(35));
10547 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010548 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010549 verifyFormat("// Однажды в студёную зимнюю пору...",
10550 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010551 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010552 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10553 getLLVMStyleWithColumns(39));
10554 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010555 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010556}
10557
10558TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010559 // Non-printable characters' width is currently considered to be the length in
10560 // bytes in UTF8. The characters can be displayed in very different manner
10561 // (zero-width, single width with a substitution glyph, expanded to their code
10562 // (e.g. "<8d>"), so there's no single correct way to handle them.
10563 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010564 "\"\xc2\x8d\";",
10565 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010566 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010567 "\"\xc2\x8d\";",
10568 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010569 EXPECT_EQ("\"Однажды, в \"\n"
10570 "\"студёную \"\n"
10571 "\"зимнюю \"\n"
10572 "\"пору,\"",
10573 format("\"Однажды, в студёную зимнюю пору,\"",
10574 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010575 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010576 "\"一 二 三 \"\n"
10577 "\"四 五六 \"\n"
10578 "\"七 八 九 \"\n"
10579 "\"十\"",
10580 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010581 EXPECT_EQ("\"一\t二 \"\n"
10582 "\"\t三 \"\n"
10583 "\"四 五\t六 \"\n"
10584 "\"\t七 \"\n"
10585 "\"八九十\tqq\"",
10586 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10587 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010588
10589 // UTF8 character in an escape sequence.
10590 EXPECT_EQ("\"aaaaaa\"\n"
10591 "\"\\\xC2\x8D\"",
10592 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010593}
10594
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010595TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10596 EXPECT_EQ("const char *sssss =\n"
10597 " \"一二三四五六七八\\\n"
10598 " 九 十\";",
10599 format("const char *sssss = \"一二三四五六七八\\\n"
10600 " 九 十\";",
10601 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010602}
10603
10604TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010605 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10606 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010607 EXPECT_EQ("// Я из лесу\n"
10608 "// вышел; был\n"
10609 "// сильный\n"
10610 "// мороз.",
10611 format("// Я из лесу вышел; был сильный мороз.",
10612 getLLVMStyleWithColumns(13)));
10613 EXPECT_EQ("// 一二三\n"
10614 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010615 "// 八 九\n"
10616 "// 十",
10617 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010618}
10619
10620TEST_F(FormatTest, SplitsUTF8BlockComments) {
10621 EXPECT_EQ("/* Гляжу,\n"
10622 " * поднимается\n"
10623 " * медленно в\n"
10624 " * гору\n"
10625 " * Лошадка,\n"
10626 " * везущая\n"
10627 " * хворосту\n"
10628 " * воз. */",
10629 format("/* Гляжу, поднимается медленно в гору\n"
10630 " * Лошадка, везущая хворосту воз. */",
10631 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010632 EXPECT_EQ(
10633 "/* 一二三\n"
10634 " * 四五六七\n"
10635 " * 八 九\n"
10636 " * 十 */",
10637 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010638 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10639 " * 𝕓𝕪𝕥𝕖\n"
10640 " * 𝖀𝕿𝕱-𝟠 */",
10641 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010642}
10643
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010644#endif // _MSC_VER
10645
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010646TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10647 FormatStyle Style = getLLVMStyle();
10648
10649 Style.ConstructorInitializerIndentWidth = 4;
10650 verifyFormat(
10651 "SomeClass::Constructor()\n"
10652 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10653 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10654 Style);
10655
10656 Style.ConstructorInitializerIndentWidth = 2;
10657 verifyFormat(
10658 "SomeClass::Constructor()\n"
10659 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10660 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10661 Style);
10662
10663 Style.ConstructorInitializerIndentWidth = 0;
10664 verifyFormat(
10665 "SomeClass::Constructor()\n"
10666 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10667 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10668 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010669 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10670 verifyFormat(
10671 "SomeLongTemplateVariableName<\n"
10672 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10673 Style);
10674 verifyFormat(
10675 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10676 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10677 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010678}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010679
Daniel Jasper00853002014-09-16 16:22:30 +000010680TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10681 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010682 Style.BreakConstructorInitializersBeforeComma = true;
10683 Style.ConstructorInitializerIndentWidth = 4;
10684 verifyFormat("SomeClass::Constructor()\n"
10685 " : a(a)\n"
10686 " , b(b)\n"
10687 " , c(c) {}",
10688 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010689 verifyFormat("SomeClass::Constructor()\n"
10690 " : a(a) {}",
10691 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010692
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010693 Style.ColumnLimit = 0;
10694 verifyFormat("SomeClass::Constructor()\n"
10695 " : a(a) {}",
10696 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010697 verifyFormat("SomeClass::Constructor() noexcept\n"
10698 " : a(a) {}",
10699 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010700 verifyFormat("SomeClass::Constructor()\n"
10701 " : a(a)\n"
10702 " , b(b)\n"
10703 " , c(c) {}",
10704 Style);
10705 verifyFormat("SomeClass::Constructor()\n"
10706 " : a(a) {\n"
10707 " foo();\n"
10708 " bar();\n"
10709 "}",
10710 Style);
10711
Daniel Jasperd74cf402014-04-08 12:46:38 +000010712 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010713 verifyFormat("SomeClass::Constructor()\n"
10714 " : a(a)\n"
10715 " , b(b)\n"
10716 " , c(c) {\n}",
10717 Style);
10718 verifyFormat("SomeClass::Constructor()\n"
10719 " : a(a) {\n}",
10720 Style);
10721
10722 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010723 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010724 Style.ConstructorInitializerIndentWidth = 2;
10725 verifyFormat("SomeClass::Constructor()\n"
10726 " : a(a)\n"
10727 " , b(b)\n"
10728 " , c(c) {}",
10729 Style);
10730
10731 Style.ConstructorInitializerIndentWidth = 0;
10732 verifyFormat("SomeClass::Constructor()\n"
10733 ": a(a)\n"
10734 ", b(b)\n"
10735 ", c(c) {}",
10736 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010737
10738 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10739 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010740 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10741 verifyFormat(
10742 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10743 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010744 verifyFormat(
10745 "SomeClass::Constructor()\n"
10746 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10747 Style);
10748 Style.ConstructorInitializerIndentWidth = 4;
10749 Style.ColumnLimit = 60;
10750 verifyFormat("SomeClass::Constructor()\n"
10751 " : aaaaaaaa(aaaaaaaa)\n"
10752 " , aaaaaaaa(aaaaaaaa)\n"
10753 " , aaaaaaaa(aaaaaaaa) {}",
10754 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010755}
10756
Daniel Jasper38efc132014-10-21 07:51:54 +000010757TEST_F(FormatTest, Destructors) {
10758 verifyFormat("void F(int &i) { i.~int(); }");
10759 verifyFormat("void F(int &i) { i->~int(); }");
10760}
10761
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010762TEST_F(FormatTest, FormatsWithWebKitStyle) {
10763 FormatStyle Style = getWebKitStyle();
10764
10765 // Don't indent in outer namespaces.
10766 verifyFormat("namespace outer {\n"
10767 "int i;\n"
10768 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010769 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010770 "} // namespace inner\n"
10771 "} // namespace outer\n"
10772 "namespace other_outer {\n"
10773 "int i;\n"
10774 "}",
10775 Style);
10776
10777 // Don't indent case labels.
10778 verifyFormat("switch (variable) {\n"
10779 "case 1:\n"
10780 "case 2:\n"
10781 " doSomething();\n"
10782 " break;\n"
10783 "default:\n"
10784 " ++variable;\n"
10785 "}",
10786 Style);
10787
10788 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010789 EXPECT_EQ("void f()\n"
10790 "{\n"
10791 " if (aaaaaaaaaaaaaaaa\n"
10792 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10793 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10794 " return;\n"
10795 "}",
10796 format("void f() {\n"
10797 "if (aaaaaaaaaaaaaaaa\n"
10798 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10799 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10800 "return;\n"
10801 "}",
10802 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010803
Daniel Jasper35995672014-04-29 14:05:20 +000010804 // Allow functions on a single line.
10805 verifyFormat("void f() { return; }", Style);
10806
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010807 // Constructor initializers are formatted one per line with the "," on the
10808 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010809 verifyFormat("Constructor()\n"
10810 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10811 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010812 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010813 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10814 "{\n"
10815 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010816 Style);
10817 verifyFormat("SomeClass::Constructor()\n"
10818 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010819 "{\n"
10820 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010821 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010822 EXPECT_EQ("SomeClass::Constructor()\n"
10823 " : a(a)\n"
10824 "{\n"
10825 "}",
10826 format("SomeClass::Constructor():a(a){}", Style));
10827 verifyFormat("SomeClass::Constructor()\n"
10828 " : a(a)\n"
10829 " , b(b)\n"
10830 " , c(c)\n"
10831 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010832 "}",
10833 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010834 verifyFormat("SomeClass::Constructor()\n"
10835 " : a(a)\n"
10836 "{\n"
10837 " foo();\n"
10838 " bar();\n"
10839 "}",
10840 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010841
Daniel Jasper65ee3472013-07-31 23:16:02 +000010842 // Access specifiers should be aligned left.
10843 verifyFormat("class C {\n"
10844 "public:\n"
10845 " int i;\n"
10846 "};",
10847 Style);
10848
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010849 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010850 verifyFormat("int a; // Do not\n"
10851 "double b; // align comments.",
10852 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010853
Daniel Jasper3219e432014-12-02 13:24:51 +000010854 // Do not align operands.
10855 EXPECT_EQ("ASSERT(aaaa\n"
10856 " || bbbb);",
10857 format("ASSERT ( aaaa\n||bbbb);", Style));
10858
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010859 // Accept input's line breaks.
10860 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10861 " || bbbbbbbbbbbbbbb) {\n"
10862 " i++;\n"
10863 "}",
10864 format("if (aaaaaaaaaaaaaaa\n"
10865 "|| bbbbbbbbbbbbbbb) { i++; }",
10866 Style));
10867 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10868 " i++;\n"
10869 "}",
10870 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010871
10872 // Don't automatically break all macro definitions (llvm.org/PR17842).
10873 verifyFormat("#define aNumber 10", Style);
10874 // However, generally keep the line breaks that the user authored.
10875 EXPECT_EQ("#define aNumber \\\n"
10876 " 10",
10877 format("#define aNumber \\\n"
10878 " 10",
10879 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010880
10881 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010882 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10883 " copyItems:YES];",
10884 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10885 "copyItems:YES];",
10886 Style));
10887 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10888 " copyItems:YES];",
10889 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10890 " copyItems:YES];",
10891 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010892 // FIXME: This does not seem right, there should be more indentation before
10893 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010894 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010895 " @\"a\",\n"
10896 " @\"a\"\n"
10897 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010898 " copyItems:YES];",
10899 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10900 " @\"a\",\n"
10901 " @\"a\"\n"
10902 " ]\n"
10903 " copyItems:YES];",
10904 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010905 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010906 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10907 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010908 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10909 " copyItems:YES];",
10910 Style));
10911
10912 verifyFormat("[self.a b:c c:d];", Style);
10913 EXPECT_EQ("[self.a b:c\n"
10914 " c:d];",
10915 format("[self.a b:c\n"
10916 "c:d];",
10917 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010918}
10919
Manuel Klimekffdeb592013-09-03 15:10:01 +000010920TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010921 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10922 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10923 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10924 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10925 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010926 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010927 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010928 verifyFormat("void f() {\n"
10929 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10930 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010931 verifyFormat("void f() {\n"
10932 " other(x.begin(), //\n"
10933 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000010934 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010935 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000010936 verifyFormat("SomeFunction([]() { // A cool function...\n"
10937 " return 43;\n"
10938 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000010939 EXPECT_EQ("SomeFunction([]() {\n"
10940 "#define A a\n"
10941 " return 43;\n"
10942 "});",
10943 format("SomeFunction([](){\n"
10944 "#define A a\n"
10945 "return 43;\n"
10946 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000010947 verifyFormat("void f() {\n"
10948 " SomeFunction([](decltype(x), A *a) {});\n"
10949 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010950 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10951 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000010952 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10953 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
10954 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000010955 verifyFormat("Constructor()\n"
10956 " : Field([] { // comment\n"
10957 " int i;\n"
10958 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000010959 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
10960 " return some_parameter.size();\n"
10961 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000010962 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
10963 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000010964 verifyFormat("int i = aaaaaa ? 1 //\n"
10965 " : [] {\n"
10966 " return 2; //\n"
10967 " }();");
10968 verifyFormat("llvm::errs() << \"number of twos is \"\n"
10969 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
10970 " return x == 2; // force break\n"
10971 " });");
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000010972 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n"
10973 " int iiiiiiiiiiii) {\n"
10974 " return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n"
10975 "});",
10976 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000010977 verifyFormat("SomeFunction({[&] {\n"
10978 " // comment\n"
10979 " },\n"
10980 " [&] {\n"
10981 " // comment\n"
10982 " }});");
10983 verifyFormat("SomeFunction({[&] {\n"
10984 " // comment\n"
10985 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000010986 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
10987 " [&]() { return true; },\n"
10988 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010989
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010990 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000010991 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000010992 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000010993 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
10994 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010995 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000010996 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010997 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
10998 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000010999 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011000 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11001 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011002 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011003 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011004 verifyFormat(
11005 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11006 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11007 " return aaaaaaaaaaaaaaaaa;\n"
11008 " });",
11009 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011010 verifyFormat("[]() //\n"
11011 " -> int {\n"
11012 " return 1; //\n"
11013 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011014
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011015 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011016 verifyFormat("SomeFunction(\n"
11017 " []() {\n"
11018 " int i = 42;\n"
11019 " return i;\n"
11020 " },\n"
11021 " []() {\n"
11022 " int j = 43;\n"
11023 " return j;\n"
11024 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011025
Daniel Jasperda18fd82014-06-10 06:39:03 +000011026 // More complex introducers.
11027 verifyFormat("return [i, args...] {};");
11028
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011029 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011030 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011031 verifyFormat("double &operator[](int i) { return 0; }\n"
11032 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011033 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011034 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011035 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011036
11037 // Other corner cases.
11038 verifyFormat("void f() {\n"
11039 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
11040 " );\n"
11041 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011042
11043 // Lambdas created through weird macros.
11044 verifyFormat("void f() {\n"
11045 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011046 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011047 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011048
11049 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11050 " doo_dah();\n"
11051 " doo_dah();\n"
11052 " })) {\n"
11053 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011054 verifyFormat("auto lambda = []() {\n"
11055 " int a = 2\n"
11056 "#if A\n"
11057 " + 2\n"
11058 "#endif\n"
11059 " ;\n"
11060 "};");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011061}
11062
Manuel Klimek516e0542013-09-04 13:25:30 +000011063TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011064 FormatStyle ShortBlocks = getLLVMStyle();
11065 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11066 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11067 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11068 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11069 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11070 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11071 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011072
Daniel Jasper76284682014-10-22 09:12:44 +000011073 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11074 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11075 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011076
Daniel Jasper76284682014-10-22 09:12:44 +000011077 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011078 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011079 "}];");
11080 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011081 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011082 "}]};");
11083 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011084 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011085 "}];");
11086 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011087 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011088 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011089 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011090 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011091 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011092 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011093 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011094
11095 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011096 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011097 "}];",
11098 getLLVMStyleWithColumns(60));
11099 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011100 " NSString *path = [self sessionFilePath];\n"
11101 " if (path) {\n"
11102 " // ...\n"
11103 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011104 "});");
11105 verifyFormat("[[SessionService sharedService]\n"
11106 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011107 " if (window) {\n"
11108 " [self windowDidLoad:window];\n"
11109 " } else {\n"
11110 " [self errorLoadingWindow];\n"
11111 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011112 " }];");
11113 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011114 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011115 "};\n",
11116 getLLVMStyleWithColumns(40));
11117 verifyFormat("[[SessionService sharedService]\n"
11118 " loadWindowWithCompletionBlock: //\n"
11119 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011120 " if (window) {\n"
11121 " [self windowDidLoad:window];\n"
11122 " } else {\n"
11123 " [self errorLoadingWindow];\n"
11124 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011125 " }];",
11126 getLLVMStyleWithColumns(60));
11127 verifyFormat("[myObject doSomethingWith:arg1\n"
11128 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011129 " // ...\n"
11130 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011131 " }\n"
11132 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011133 " // ...\n"
11134 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011135 " }\n"
11136 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011137 " // ...\n"
11138 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011139 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011140 verifyFormat("[myObject doSomethingWith:arg1\n"
11141 " firstBlock:-1\n"
11142 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011143 " // ...\n"
11144 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011145 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011146
11147 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011148 " @autoreleasepool {\n"
11149 " if (a) {\n"
11150 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011151 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011152 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011153 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011154 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011155 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11156 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011157
11158 FormatStyle FourIndent = getLLVMStyle();
11159 FourIndent.ObjCBlockIndentWidth = 4;
11160 verifyFormat("[operation setCompletionBlock:^{\n"
11161 " [self onOperationDone];\n"
11162 "}];",
11163 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011164}
11165
Daniel Jasper289afc02015-04-23 09:23:17 +000011166TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11167 FormatStyle ZeroColumn = getLLVMStyle();
11168 ZeroColumn.ColumnLimit = 0;
11169
11170 verifyFormat("[[SessionService sharedService] "
11171 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11172 " if (window) {\n"
11173 " [self windowDidLoad:window];\n"
11174 " } else {\n"
11175 " [self errorLoadingWindow];\n"
11176 " }\n"
11177 "}];",
11178 ZeroColumn);
11179 EXPECT_EQ("[[SessionService sharedService]\n"
11180 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11181 " if (window) {\n"
11182 " [self windowDidLoad:window];\n"
11183 " } else {\n"
11184 " [self errorLoadingWindow];\n"
11185 " }\n"
11186 " }];",
11187 format("[[SessionService sharedService]\n"
11188 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11189 " if (window) {\n"
11190 " [self windowDidLoad:window];\n"
11191 " } else {\n"
11192 " [self errorLoadingWindow];\n"
11193 " }\n"
11194 "}];",
11195 ZeroColumn));
11196 verifyFormat("[myObject doSomethingWith:arg1\n"
11197 " firstBlock:^(Foo *a) {\n"
11198 " // ...\n"
11199 " int i;\n"
11200 " }\n"
11201 " secondBlock:^(Bar *b) {\n"
11202 " // ...\n"
11203 " int i;\n"
11204 " }\n"
11205 " thirdBlock:^Foo(Bar *b) {\n"
11206 " // ...\n"
11207 " int i;\n"
11208 " }];",
11209 ZeroColumn);
11210 verifyFormat("f(^{\n"
11211 " @autoreleasepool {\n"
11212 " if (a) {\n"
11213 " g();\n"
11214 " }\n"
11215 " }\n"
11216 "});",
11217 ZeroColumn);
11218 verifyFormat("void (^largeBlock)(void) = ^{\n"
11219 " // ...\n"
11220 "};",
11221 ZeroColumn);
11222
11223 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11224 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011225 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011226 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11227 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11228 " int i;\n"
11229 "};",
11230 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11231}
11232
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011233TEST_F(FormatTest, SupportsCRLF) {
11234 EXPECT_EQ("int a;\r\n"
11235 "int b;\r\n"
11236 "int c;\r\n",
11237 format("int a;\r\n"
11238 " int b;\r\n"
11239 " int c;\r\n",
11240 getLLVMStyle()));
11241 EXPECT_EQ("int a;\r\n"
11242 "int b;\r\n"
11243 "int c;\r\n",
11244 format("int a;\r\n"
11245 " int b;\n"
11246 " int c;\r\n",
11247 getLLVMStyle()));
11248 EXPECT_EQ("int a;\n"
11249 "int b;\n"
11250 "int c;\n",
11251 format("int a;\r\n"
11252 " int b;\n"
11253 " int c;\n",
11254 getLLVMStyle()));
11255 EXPECT_EQ("\"aaaaaaa \"\r\n"
11256 "\"bbbbbbb\";\r\n",
11257 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11258 EXPECT_EQ("#define A \\\r\n"
11259 " b; \\\r\n"
11260 " c; \\\r\n"
11261 " d;\r\n",
11262 format("#define A \\\r\n"
11263 " b; \\\r\n"
11264 " c; d; \r\n",
11265 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011266
11267 EXPECT_EQ("/*\r\n"
11268 "multi line block comments\r\n"
11269 "should not introduce\r\n"
11270 "an extra carriage return\r\n"
11271 "*/\r\n",
11272 format("/*\r\n"
11273 "multi line block comments\r\n"
11274 "should not introduce\r\n"
11275 "an extra carriage return\r\n"
11276 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011277}
11278
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011279TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11280 verifyFormat("MY_CLASS(C) {\n"
11281 " int i;\n"
11282 " int j;\n"
11283 "};");
11284}
11285
Daniel Jasper6633ab82013-10-18 10:38:14 +000011286TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11287 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11288 TwoIndent.ContinuationIndentWidth = 2;
11289
11290 EXPECT_EQ("int i =\n"
11291 " longFunction(\n"
11292 " arg);",
11293 format("int i = longFunction(arg);", TwoIndent));
11294
11295 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11296 SixIndent.ContinuationIndentWidth = 6;
11297
11298 EXPECT_EQ("int i =\n"
11299 " longFunction(\n"
11300 " arg);",
11301 format("int i = longFunction(arg);", SixIndent));
11302}
11303
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011304TEST_F(FormatTest, SpacesInAngles) {
11305 FormatStyle Spaces = getLLVMStyle();
11306 Spaces.SpacesInAngles = true;
11307
11308 verifyFormat("static_cast< int >(arg);", Spaces);
11309 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11310 verifyFormat("f< int, float >();", Spaces);
11311 verifyFormat("template <> g() {}", Spaces);
11312 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011313 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11314 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11315 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011316
11317 Spaces.Standard = FormatStyle::LS_Cpp03;
11318 Spaces.SpacesInAngles = true;
11319 verifyFormat("A< A< int > >();", Spaces);
11320
11321 Spaces.SpacesInAngles = false;
11322 verifyFormat("A<A<int> >();", Spaces);
11323
11324 Spaces.Standard = FormatStyle::LS_Cpp11;
11325 Spaces.SpacesInAngles = true;
11326 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011327
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011328 Spaces.SpacesInAngles = false;
11329 verifyFormat("A<A<int>>();", Spaces);
11330}
11331
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011332TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11333 FormatStyle Style = getLLVMStyle();
11334 Style.SpaceAfterTemplateKeyword = false;
11335 verifyFormat("template<int> void foo();", Style);
11336}
11337
Jacques Pienaarfc275112015-02-18 23:48:37 +000011338TEST_F(FormatTest, TripleAngleBrackets) {
11339 verifyFormat("f<<<1, 1>>>();");
11340 verifyFormat("f<<<1, 1, 1, s>>>();");
11341 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011342 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011343 verifyFormat("f<param><<<1, 1>>>();");
11344 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011345 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011346 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11347 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011348 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11349 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011350}
11351
11352TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011353 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011354 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011355 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11356 "aaallvm::outs() <<");
11357 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11358 "aaaallvm::outs()\n <<");
11359}
11360
Manuel Klimek819788d2014-03-18 11:22:45 +000011361TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11362 std::string code = "#if A\n"
11363 "#if B\n"
11364 "a.\n"
11365 "#endif\n"
11366 " a = 1;\n"
11367 "#else\n"
11368 "#endif\n"
11369 "#if C\n"
11370 "#else\n"
11371 "#endif\n";
11372 EXPECT_EQ(code, format(code));
11373}
11374
Manuel Klimek68b03042014-04-14 09:14:11 +000011375TEST_F(FormatTest, HandleConflictMarkers) {
11376 // Git/SVN conflict markers.
11377 EXPECT_EQ("int a;\n"
11378 "void f() {\n"
11379 " callme(some(parameter1,\n"
11380 "<<<<<<< text by the vcs\n"
11381 " parameter2),\n"
11382 "||||||| text by the vcs\n"
11383 " parameter2),\n"
11384 " parameter3,\n"
11385 "======= text by the vcs\n"
11386 " parameter2, parameter3),\n"
11387 ">>>>>>> text by the vcs\n"
11388 " otherparameter);\n",
11389 format("int a;\n"
11390 "void f() {\n"
11391 " callme(some(parameter1,\n"
11392 "<<<<<<< text by the vcs\n"
11393 " parameter2),\n"
11394 "||||||| text by the vcs\n"
11395 " parameter2),\n"
11396 " parameter3,\n"
11397 "======= text by the vcs\n"
11398 " parameter2,\n"
11399 " parameter3),\n"
11400 ">>>>>>> text by the vcs\n"
11401 " otherparameter);\n"));
11402
11403 // Perforce markers.
11404 EXPECT_EQ("void f() {\n"
11405 " function(\n"
11406 ">>>> text by the vcs\n"
11407 " parameter,\n"
11408 "==== text by the vcs\n"
11409 " parameter,\n"
11410 "==== text by the vcs\n"
11411 " parameter,\n"
11412 "<<<< text by the vcs\n"
11413 " parameter);\n",
11414 format("void f() {\n"
11415 " function(\n"
11416 ">>>> text by the vcs\n"
11417 " parameter,\n"
11418 "==== text by the vcs\n"
11419 " parameter,\n"
11420 "==== text by the vcs\n"
11421 " parameter,\n"
11422 "<<<< text by the vcs\n"
11423 " parameter);\n"));
11424
11425 EXPECT_EQ("<<<<<<<\n"
11426 "|||||||\n"
11427 "=======\n"
11428 ">>>>>>>",
11429 format("<<<<<<<\n"
11430 "|||||||\n"
11431 "=======\n"
11432 ">>>>>>>"));
11433
11434 EXPECT_EQ("<<<<<<<\n"
11435 "|||||||\n"
11436 "int i;\n"
11437 "=======\n"
11438 ">>>>>>>",
11439 format("<<<<<<<\n"
11440 "|||||||\n"
11441 "int i;\n"
11442 "=======\n"
11443 ">>>>>>>"));
11444
11445 // FIXME: Handle parsing of macros around conflict markers correctly:
11446 EXPECT_EQ("#define Macro \\\n"
11447 "<<<<<<<\n"
11448 "Something \\\n"
11449 "|||||||\n"
11450 "Else \\\n"
11451 "=======\n"
11452 "Other \\\n"
11453 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011454 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011455 format("#define Macro \\\n"
11456 "<<<<<<<\n"
11457 " Something \\\n"
11458 "|||||||\n"
11459 " Else \\\n"
11460 "=======\n"
11461 " Other \\\n"
11462 ">>>>>>>\n"
11463 " End\n"
11464 "int i;\n"));
11465}
11466
Daniel Jasper471894432014-08-06 13:40:26 +000011467TEST_F(FormatTest, DisableRegions) {
11468 EXPECT_EQ("int i;\n"
11469 "// clang-format off\n"
11470 " int j;\n"
11471 "// clang-format on\n"
11472 "int k;",
11473 format(" int i;\n"
11474 " // clang-format off\n"
11475 " int j;\n"
11476 " // clang-format on\n"
11477 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011478 EXPECT_EQ("int i;\n"
11479 "/* clang-format off */\n"
11480 " int j;\n"
11481 "/* clang-format on */\n"
11482 "int k;",
11483 format(" int i;\n"
11484 " /* clang-format off */\n"
11485 " int j;\n"
11486 " /* clang-format on */\n"
11487 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011488
11489 // Don't reflow comments within disabled regions.
11490 EXPECT_EQ(
11491 "// clang-format off\n"
11492 "// long long long long long long line\n"
11493 "/* clang-format on */\n"
11494 "/* long long long\n"
11495 " * long long long\n"
11496 " * line */\n"
11497 "int i;\n"
11498 "/* clang-format off */\n"
11499 "/* long long long long long long line */\n",
11500 format("// clang-format off\n"
11501 "// long long long long long long line\n"
11502 "/* clang-format on */\n"
11503 "/* long long long long long long line */\n"
11504 "int i;\n"
11505 "/* clang-format off */\n"
11506 "/* long long long long long long line */\n",
11507 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011508}
11509
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011510TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11511 format("? ) =");
11512 verifyNoCrash("#define a\\\n /**/}");
11513}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011514
Daniel Jasper498f5582015-12-25 08:53:31 +000011515TEST_F(FormatTest, FormatsTableGenCode) {
11516 FormatStyle Style = getLLVMStyle();
11517 Style.Language = FormatStyle::LK_TableGen;
11518 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11519}
11520
Nico Weberb2673a12016-11-10 21:49:25 +000011521TEST_F(FormatTest, ArrayOfTemplates) {
11522 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11523 format("auto a = new unique_ptr<int > [ 10];"));
11524
11525 FormatStyle Spaces = getLLVMStyle();
11526 Spaces.SpacesInSquareBrackets = true;
11527 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11528 format("auto a = new unique_ptr<int > [10];", Spaces));
11529}
11530
11531TEST_F(FormatTest, ArrayAsTemplateType) {
11532 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11533 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11534
11535 FormatStyle Spaces = getLLVMStyle();
11536 Spaces.SpacesInSquareBrackets = true;
11537 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11538 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11539}
11540
Eric Liu547d8792016-03-24 13:22:42 +000011541TEST(FormatStyle, GetStyleOfFile) {
11542 vfs::InMemoryFileSystem FS;
11543 // Test 1: format file in the same directory.
11544 ASSERT_TRUE(
11545 FS.addFile("/a/.clang-format", 0,
11546 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11547 ASSERT_TRUE(
11548 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011549 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011550 ASSERT_TRUE((bool)Style1);
11551 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011552
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011553 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011554 ASSERT_TRUE(
11555 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011556 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011557 ASSERT_TRUE((bool)Style2);
11558 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011559
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011560 // Test 2.2: no format on 'none' fallback style.
11561 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11562 ASSERT_TRUE((bool)Style2);
11563 ASSERT_EQ(*Style2, getNoStyle());
11564
11565 // Test 2.3: format if config is found with no based style while fallback is
11566 // 'none'.
11567 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11568 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11569 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11570 ASSERT_TRUE((bool)Style2);
11571 ASSERT_EQ(*Style2, getLLVMStyle());
11572
11573 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11574 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11575 ASSERT_TRUE((bool)Style2);
11576 ASSERT_EQ(*Style2, getLLVMStyle());
11577
Eric Liu547d8792016-03-24 13:22:42 +000011578 // Test 3: format file in parent directory.
11579 ASSERT_TRUE(
11580 FS.addFile("/c/.clang-format", 0,
11581 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11582 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11583 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011584 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011585 ASSERT_TRUE((bool)Style3);
11586 ASSERT_EQ(*Style3, getGoogleStyle());
11587
11588 // Test 4: error on invalid fallback style
11589 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11590 ASSERT_FALSE((bool)Style4);
11591 llvm::consumeError(Style4.takeError());
11592
11593 // Test 5: error on invalid yaml on command line
11594 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11595 ASSERT_FALSE((bool)Style5);
11596 llvm::consumeError(Style5.takeError());
11597
11598 // Test 6: error on invalid style
11599 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11600 ASSERT_FALSE((bool)Style6);
11601 llvm::consumeError(Style6.takeError());
11602
11603 // Test 7: found config file, error on parsing it
11604 ASSERT_TRUE(
11605 FS.addFile("/d/.clang-format", 0,
11606 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11607 "InvalidKey: InvalidValue")));
11608 ASSERT_TRUE(
11609 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11610 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11611 ASSERT_FALSE((bool)Style7);
11612 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011613}
11614
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011615TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11616 // Column limit is 20.
11617 std::string Code = "Type *a =\n"
11618 " new Type();\n"
11619 "g(iiiii, 0, jjjjj,\n"
11620 " 0, kkkkk, 0, mm);\n"
11621 "int bad = format ;";
11622 std::string Expected = "auto a = new Type();\n"
11623 "g(iiiii, nullptr,\n"
11624 " jjjjj, nullptr,\n"
11625 " kkkkk, nullptr,\n"
11626 " mm);\n"
11627 "int bad = format ;";
11628 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011629 tooling::Replacements Replaces = toReplacements(
11630 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11631 "auto "),
11632 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11633 "nullptr"),
11634 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11635 "nullptr"),
11636 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11637 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011638
11639 format::FormatStyle Style = format::getLLVMStyle();
11640 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011641 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11642 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11643 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11644 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11645 EXPECT_TRUE(static_cast<bool>(Result));
11646 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011647}
11648
Eric Liubaf58c22016-05-18 13:43:48 +000011649TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11650 std::string Code = "#include \"a.h\"\n"
11651 "#include \"c.h\"\n"
11652 "\n"
11653 "int main() {\n"
11654 " return 0;\n"
11655 "}";
11656 std::string Expected = "#include \"a.h\"\n"
11657 "#include \"b.h\"\n"
11658 "#include \"c.h\"\n"
11659 "\n"
11660 "int main() {\n"
11661 " return 0;\n"
11662 "}";
11663 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011664 tooling::Replacements Replaces = toReplacements(
11665 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11666 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011667
11668 format::FormatStyle Style = format::getLLVMStyle();
11669 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011670 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11671 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11672 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11673 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11674 EXPECT_TRUE(static_cast<bool>(Result));
11675 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011676}
11677
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011678TEST_F(FormatTest, AllignTrailingComments) {
11679 EXPECT_EQ("#define MACRO(V) \\\n"
11680 " V(Rt2) /* one more char */ \\\n"
11681 " V(Rs) /* than here */ \\\n"
11682 "/* comment 3 */\n",
11683 format("#define MACRO(V)\\\n"
11684 "V(Rt2) /* one more char */ \\\n"
11685 "V(Rs) /* than here */ \\\n"
11686 "/* comment 3 */ \\\n",
11687 getLLVMStyleWithColumns(40)));
11688}
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011689} // end namespace
11690} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011691} // end namespace clang