blob: 390dd203704506beaf1e83d651f6ea8360bbe4c0 [file] [log] [blame]
Daniel Jasperf7935112012-12-03 18:12:45 +00001//===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Chandler Carruth320d9662012-12-04 09:45:34 +000010#include "clang/Format/Format.h"
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011
Eric Liu40ef2fb2016-08-01 10:16:37 +000012#include "../Tooling/ReplacementTest.h"
Manuel Klimekb12e5a52016-03-01 12:37:30 +000013#include "FormatTestUtils.h"
14
15#include "clang/Frontend/TextDiagnosticPrinter.h"
Chandler Carruth4b417452013-01-19 08:09:44 +000016#include "llvm/Support/Debug.h"
Eric Liu547d8792016-03-24 13:22:42 +000017#include "llvm/Support/MemoryBuffer.h"
Chandler Carruth4b417452013-01-19 08:09:44 +000018#include "gtest/gtest.h"
Manuel Klimek24998102013-01-16 14:55:28 +000019
Chandler Carruth10346662014-04-22 03:17:02 +000020#define DEBUG_TYPE "format-test"
21
Eric Liu40ef2fb2016-08-01 10:16:37 +000022using clang::tooling::ReplacementTest;
23using clang::tooling::toReplacements;
24
Daniel Jasperf7935112012-12-03 18:12:45 +000025namespace clang {
26namespace format {
Daniel Jasperd246a5a2015-06-15 15:25:11 +000027namespace {
Daniel Jasperf7935112012-12-03 18:12:45 +000028
Daniel Jaspera44991332015-04-29 13:06:49 +000029FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); }
Nico Weber514ecc82014-02-02 20:50:45 +000030
Daniel Jasperf7935112012-12-03 18:12:45 +000031class FormatTest : public ::testing::Test {
32protected:
Manuel Klimekec5c3db2015-05-07 12:26:30 +000033 enum IncompleteCheck {
34 IC_ExpectComplete,
35 IC_ExpectIncomplete,
36 IC_DoNotCheck
37 };
38
Daniel Jasperd246a5a2015-06-15 15:25:11 +000039 std::string format(llvm::StringRef Code,
40 const FormatStyle &Style = getLLVMStyle(),
Manuel Klimekec5c3db2015-05-07 12:26:30 +000041 IncompleteCheck CheckIncomplete = IC_ExpectComplete) {
Manuel Klimek24998102013-01-16 14:55:28 +000042 DEBUG(llvm::errs() << "---\n");
Manuel Klimek71814b42013-10-11 21:25:45 +000043 DEBUG(llvm::errs() << Code << "\n\n");
Daniel Jasperd246a5a2015-06-15 15:25:11 +000044 std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
Manuel Klimekec5c3db2015-05-07 12:26:30 +000045 bool IncompleteFormat = false;
46 tooling::Replacements Replaces =
47 reformat(Style, Code, Ranges, "<stdin>", &IncompleteFormat);
48 if (CheckIncomplete != IC_DoNotCheck) {
49 bool ExpectedIncompleteFormat = CheckIncomplete == IC_ExpectIncomplete;
50 EXPECT_EQ(ExpectedIncompleteFormat, IncompleteFormat) << Code << "\n\n";
51 }
Daniel Jasperec04c0d2013-05-16 10:40:07 +000052 ReplacementCount = Replaces.size();
Eric Liu4f8d9942016-07-11 13:53:12 +000053 auto Result = applyAllReplacements(Code, Replaces);
54 EXPECT_TRUE(static_cast<bool>(Result));
55 DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
56 return *Result;
Daniel Jasperf7935112012-12-03 18:12:45 +000057 }
58
Manuel Klimekb69e3c62013-01-02 18:33:23 +000059 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
60 FormatStyle Style = getLLVMStyle();
61 Style.ColumnLimit = ColumnLimit;
62 return Style;
63 }
64
Daniel Jasper1b750ed2013-01-14 16:24:39 +000065 FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
66 FormatStyle Style = getGoogleStyle();
67 Style.ColumnLimit = ColumnLimit;
68 return Style;
69 }
70
Manuel Klimekb69e3c62013-01-02 18:33:23 +000071 void verifyFormat(llvm::StringRef Code,
72 const FormatStyle &Style = getLLVMStyle()) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000073 EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
Daniel Jasperf7935112012-12-03 18:12:45 +000074 }
75
Manuel Klimekec5c3db2015-05-07 12:26:30 +000076 void verifyIncompleteFormat(llvm::StringRef Code,
77 const FormatStyle &Style = getLLVMStyle()) {
78 EXPECT_EQ(Code.str(),
79 format(test::messUp(Code), Style, IC_ExpectIncomplete));
80 }
81
Daniel Jasperf7935112012-12-03 18:12:45 +000082 void verifyGoogleFormat(llvm::StringRef Code) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000083 verifyFormat(Code, getGoogleStyle());
Daniel Jasperf7935112012-12-03 18:12:45 +000084 }
Daniel Jasper5b49f472013-01-23 12:10:53 +000085
86 void verifyIndependentOfContext(llvm::StringRef text) {
87 verifyFormat(text);
88 verifyFormat(llvm::Twine("void f() { " + text + " }").str());
89 }
Daniel Jasper7b038a22013-01-30 09:46:12 +000090
Daniel Jasper675b4f82015-01-19 10:51:23 +000091 /// \brief Verify that clang-format does not crash on the given input.
92 void verifyNoCrash(llvm::StringRef Code,
93 const FormatStyle &Style = getLLVMStyle()) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +000094 format(Code, Style, IC_DoNotCheck);
Daniel Jasper675b4f82015-01-19 10:51:23 +000095 }
96
Daniel Jasper7b038a22013-01-30 09:46:12 +000097 int ReplacementCount;
Daniel Jasperf7935112012-12-03 18:12:45 +000098};
99
Manuel Klimek52b15152013-01-09 15:25:02 +0000100TEST_F(FormatTest, MessUp) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +0000101 EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
102 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
103 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
104 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
105 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
Manuel Klimek52b15152013-01-09 15:25:02 +0000106}
107
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000108//===----------------------------------------------------------------------===//
109// Basic function tests.
110//===----------------------------------------------------------------------===//
111
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +0000112TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000113 EXPECT_EQ(";", format(";"));
114}
115
116TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
117 EXPECT_EQ("int i;", format(" int i;"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +0000118 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000119 EXPECT_EQ("int i;\nint j;", format(" int i; int j;"));
120 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;"));
121}
122
123TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
124 EXPECT_EQ("int i;", format("int\ni;"));
125}
126
127TEST_F(FormatTest, FormatsNestedBlockStatements) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000128 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000129}
130
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000131TEST_F(FormatTest, FormatsNestedCall) {
132 verifyFormat("Method(f1, f2(f3));");
133 verifyFormat("Method(f1(f2, f3()));");
Daniel Jasper48cb3b92013-01-13 08:19:51 +0000134 verifyFormat("Method(f1(f2, (f3())));");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000135}
136
Daniel Jasper14556742013-02-07 21:08:36 +0000137TEST_F(FormatTest, NestedNameSpecifiers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +0000138 verifyFormat("vector<::Type> v;");
Daniel Jasper14556742013-02-07 21:08:36 +0000139 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
Daniel Jasper11be8ac2013-08-28 07:07:07 +0000140 verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
Daniel Jasperf322eb52014-10-23 20:22:22 +0000141 verifyFormat("bool a = 2 < ::SomeFunction();");
Daniel Jasper736c14f2013-01-16 07:19:28 +0000142}
143
Daniel Jasper7b038a22013-01-30 09:46:12 +0000144TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
145 EXPECT_EQ("if (a) {\n"
146 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000147 "}",
148 format("if(a){f();}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000149 EXPECT_EQ(4, ReplacementCount);
150 EXPECT_EQ("if (a) {\n"
151 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000152 "}",
153 format("if (a) {\n"
154 " f();\n"
155 "}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000156 EXPECT_EQ(0, ReplacementCount);
Daniel Jasperd6e61882015-06-17 12:23:15 +0000157 EXPECT_EQ("/*\r\n"
158 "\r\n"
159 "*/\r\n",
160 format("/*\r\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +0000161 "\r\n"
162 "*/\r\n"));
Daniel Jasperd6e61882015-06-17 12:23:15 +0000163 EXPECT_EQ(0, ReplacementCount);
Daniel Jasper7b038a22013-01-30 09:46:12 +0000164}
165
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000166TEST_F(FormatTest, RemovesEmptyLines) {
167 EXPECT_EQ("class C {\n"
168 " int i;\n"
169 "};",
170 format("class C {\n"
171 " int i;\n"
172 "\n"
173 "};"));
174
Nico Weber34272652014-11-13 16:25:37 +0000175 // Don't remove empty lines at the start of namespaces or extern "C" blocks.
Daniel Jasper01b35482014-03-21 13:03:33 +0000176 EXPECT_EQ("namespace N {\n"
177 "\n"
178 "int i;\n"
179 "}",
180 format("namespace N {\n"
181 "\n"
182 "int i;\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000183 "}",
184 getGoogleStyle()));
Nico Weber34272652014-11-13 16:25:37 +0000185 EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
186 "\n"
187 "int i;\n"
188 "}",
189 format("extern /**/ \"C\" /**/ {\n"
190 "\n"
191 "int i;\n"
192 "}",
193 getGoogleStyle()));
194
195 // ...but do keep inlining and removing empty lines for non-block extern "C"
196 // functions.
197 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
198 EXPECT_EQ("extern \"C\" int f() {\n"
199 " int i = 42;\n"
200 " return i;\n"
201 "}",
202 format("extern \"C\" int f() {\n"
203 "\n"
204 " int i = 42;\n"
205 " return i;\n"
206 "}",
207 getGoogleStyle()));
Daniel Jasper01b35482014-03-21 13:03:33 +0000208
Daniel Jasper11164bd2014-03-21 12:58:53 +0000209 // Remove empty lines at the beginning and end of blocks.
210 EXPECT_EQ("void f() {\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000211 "\n"
212 " if (a) {\n"
213 "\n"
214 " f();\n"
215 " }\n"
216 "}",
217 format("void f() {\n"
218 "\n"
219 " if (a) {\n"
220 "\n"
221 " f();\n"
222 "\n"
223 " }\n"
224 "\n"
225 "}",
226 getLLVMStyle()));
227 EXPECT_EQ("void f() {\n"
Daniel Jasper11164bd2014-03-21 12:58:53 +0000228 " if (a) {\n"
229 " f();\n"
230 " }\n"
231 "}",
232 format("void f() {\n"
233 "\n"
234 " if (a) {\n"
235 "\n"
236 " f();\n"
237 "\n"
238 " }\n"
239 "\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000240 "}",
241 getGoogleStyle()));
Daniel Jasper11164bd2014-03-21 12:58:53 +0000242
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000243 // Don't remove empty lines in more complex control statements.
244 EXPECT_EQ("void f() {\n"
245 " if (a) {\n"
246 " f();\n"
247 "\n"
248 " } else if (b) {\n"
249 " f();\n"
250 " }\n"
251 "}",
252 format("void f() {\n"
253 " if (a) {\n"
254 " f();\n"
255 "\n"
256 " } else if (b) {\n"
257 " f();\n"
258 "\n"
259 " }\n"
260 "\n"
261 "}"));
262
263 // FIXME: This is slightly inconsistent.
264 EXPECT_EQ("namespace {\n"
265 "int i;\n"
266 "}",
267 format("namespace {\n"
268 "int i;\n"
269 "\n"
270 "}"));
271 EXPECT_EQ("namespace {\n"
272 "int i;\n"
273 "\n"
274 "} // namespace",
275 format("namespace {\n"
276 "int i;\n"
277 "\n"
278 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000279
280 FormatStyle Style = getLLVMStyle();
281 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
282 Style.MaxEmptyLinesToKeep = 2;
283 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
284 Style.BraceWrapping.AfterClass = true;
285 Style.BraceWrapping.AfterFunction = true;
286 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
287
288 EXPECT_EQ("class Foo\n"
289 "{\n"
290 " Foo() {}\n"
291 "\n"
292 " void funk() {}\n"
293 "};",
294 format("class Foo\n"
295 "{\n"
296 " Foo()\n"
297 " {\n"
298 " }\n"
299 "\n"
300 " void funk() {}\n"
301 "};",
302 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000303}
304
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000305TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000306 verifyFormat("x = (a) and (b);");
307 verifyFormat("x = (a) or (b);");
308 verifyFormat("x = (a) bitand (b);");
309 verifyFormat("x = (a) bitor (b);");
310 verifyFormat("x = (a) not_eq (b);");
311 verifyFormat("x = (a) and_eq (b);");
312 verifyFormat("x = (a) or_eq (b);");
313 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000314}
315
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000316//===----------------------------------------------------------------------===//
317// Tests for control statements.
318//===----------------------------------------------------------------------===//
319
Daniel Jaspercdd06622013-05-14 10:31:09 +0000320TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000321 verifyFormat("if (true)\n f();\ng();");
322 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000323 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000324
Daniel Jasper3a685df2013-05-16 12:12:21 +0000325 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000326 AllowsMergedIf.AlignEscapedNewlinesLeft = true;
Daniel Jasperced17f82013-01-16 15:44:34 +0000327 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
328 verifyFormat("if (a)\n"
329 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000330 " f();",
331 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000332 verifyFormat("{\n"
333 " if (a)\n"
334 " label:\n"
335 " f();\n"
336 "}",
337 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000338 verifyFormat("#define A \\\n"
339 " if (a) \\\n"
340 " label: \\\n"
341 " f()",
342 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000343 verifyFormat("if (a)\n"
344 " ;",
345 AllowsMergedIf);
346 verifyFormat("if (a)\n"
347 " if (b) return;",
348 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000349
Daniel Jasper3a685df2013-05-16 12:12:21 +0000350 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000351 " f();\n",
352 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000353 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000354 " f();",
355 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000356 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000357 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000358 "}",
359 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000360 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000361 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000362 "}",
363 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000364
365 AllowsMergedIf.ColumnLimit = 14;
366 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000367 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000368 " return;",
369 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000370
371 AllowsMergedIf.ColumnLimit = 13;
372 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000373}
374
Daniel Jasper3a685df2013-05-16 12:12:21 +0000375TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
376 FormatStyle AllowsMergedLoops = getLLVMStyle();
377 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
378 verifyFormat("while (true) continue;", AllowsMergedLoops);
379 verifyFormat("for (;;) continue;", AllowsMergedLoops);
380 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
381 verifyFormat("while (true)\n"
382 " ;",
383 AllowsMergedLoops);
384 verifyFormat("for (;;)\n"
385 " ;",
386 AllowsMergedLoops);
387 verifyFormat("for (;;)\n"
388 " for (;;) continue;",
389 AllowsMergedLoops);
390 verifyFormat("for (;;) // Can't merge this\n"
391 " continue;",
392 AllowsMergedLoops);
393 verifyFormat("for (;;) /* still don't merge */\n"
394 " continue;",
395 AllowsMergedLoops);
396}
397
Daniel Jasper17605d32014-05-14 09:33:35 +0000398TEST_F(FormatTest, FormatShortBracedStatements) {
399 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
400 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
401
402 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
403 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
404
405 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
406 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
407 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
408 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
409 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
410 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
411 verifyFormat("if (true) { //\n"
412 " f();\n"
413 "}",
414 AllowSimpleBracedStatements);
415 verifyFormat("if (true) {\n"
416 " f();\n"
417 " f();\n"
418 "}",
419 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000420 verifyFormat("if (true) {\n"
421 " f();\n"
422 "} else {\n"
423 " f();\n"
424 "}",
425 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000426
Daniel Jasperbd630732014-05-22 13:25:26 +0000427 verifyFormat("template <int> struct A2 {\n"
428 " struct B {};\n"
429 "};",
430 AllowSimpleBracedStatements);
431
Daniel Jasper17605d32014-05-14 09:33:35 +0000432 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
433 verifyFormat("if (true) {\n"
434 " f();\n"
435 "}",
436 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000437 verifyFormat("if (true) {\n"
438 " f();\n"
439 "} else {\n"
440 " f();\n"
441 "}",
442 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000443
444 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
445 verifyFormat("while (true) {\n"
446 " f();\n"
447 "}",
448 AllowSimpleBracedStatements);
449 verifyFormat("for (;;) {\n"
450 " f();\n"
451 "}",
452 AllowSimpleBracedStatements);
453}
454
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000455TEST_F(FormatTest, ParseIfElse) {
456 verifyFormat("if (true)\n"
457 " if (true)\n"
458 " if (true)\n"
459 " f();\n"
460 " else\n"
461 " g();\n"
462 " else\n"
463 " h();\n"
464 "else\n"
465 " i();");
466 verifyFormat("if (true)\n"
467 " if (true)\n"
468 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000469 " if (true)\n"
470 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000471 " } else {\n"
472 " g();\n"
473 " }\n"
474 " else\n"
475 " h();\n"
476 "else {\n"
477 " i();\n"
478 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000479 verifyFormat("void f() {\n"
480 " if (a) {\n"
481 " } else {\n"
482 " }\n"
483 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000484}
485
486TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000487 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000488 verifyFormat("if (a)\n"
489 " f();\n"
490 "else if (b)\n"
491 " g();\n"
492 "else\n"
493 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000494 verifyFormat("if (a) {\n"
495 " f();\n"
496 "}\n"
497 "// or else ..\n"
498 "else {\n"
499 " g()\n"
500 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000501
502 verifyFormat("if (a) {\n"
503 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
504 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
505 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000506 verifyFormat("if (a) {\n"
507 "} else if (\n"
508 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
509 "}",
510 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000511}
512
Daniel Jasperf7935112012-12-03 18:12:45 +0000513TEST_F(FormatTest, FormatsForLoop) {
514 verifyFormat(
515 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000516 " ++VeryVeryLongLoopVariable)\n"
517 " ;");
518 verifyFormat("for (;;)\n"
519 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000520 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000521 verifyFormat("for (;;) {\n"
522 " f();\n"
523 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000524 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000525
526 verifyFormat(
527 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
528 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000529 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000530
531 verifyFormat(
532 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000533 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000534 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
535 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000536 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000537 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
538 " I = FD->getDeclsInPrototypeScope().begin(),\n"
539 " E = FD->getDeclsInPrototypeScope().end();\n"
540 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000541 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
542 " I = Container.begin(),\n"
543 " E = Container.end();\n"
544 " I != E; ++I) {\n}",
545 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000546
Daniel Jasper48c62f92013-01-28 17:30:17 +0000547 verifyFormat(
548 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
549 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000550 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
551 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000552 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000553 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
554 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
555 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000556 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
557 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
558 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000559 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
560 " aaaaaaaaaa);\n"
561 " iter; ++iter) {\n"
562 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000563 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
564 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
565 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
566 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000567
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000568 FormatStyle NoBinPacking = getLLVMStyle();
569 NoBinPacking.BinPackParameters = false;
570 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
571 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
572 " aaaaaaaaaaaaaaaa,\n"
573 " aaaaaaaaaaaaaaaa,\n"
574 " aaaaaaaaaaaaaaaa);\n"
575 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
576 "}",
577 NoBinPacking);
578 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000579 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
580 " E = UnwrappedLines.end();\n"
581 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000582 " ++I) {\n}",
583 NoBinPacking);
Daniel Jasperf7935112012-12-03 18:12:45 +0000584}
585
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000586TEST_F(FormatTest, RangeBasedForLoops) {
587 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
588 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
589 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
590 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000591 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
592 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000593 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
594 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000595}
596
Daniel Jaspere1e43192014-04-01 12:55:11 +0000597TEST_F(FormatTest, ForEachLoops) {
598 verifyFormat("void f() {\n"
599 " foreach (Item *item, itemlist) {}\n"
600 " Q_FOREACH (Item *item, itemlist) {}\n"
601 " BOOST_FOREACH (Item *item, itemlist) {}\n"
602 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
603 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000604
605 // As function-like macros.
606 verifyFormat("#define foreach(x, y)\n"
607 "#define Q_FOREACH(x, y)\n"
608 "#define BOOST_FOREACH(x, y)\n"
609 "#define UNKNOWN_FOREACH(x, y)\n");
610
611 // Not as function-like macros.
612 verifyFormat("#define foreach (x, y)\n"
613 "#define Q_FOREACH (x, y)\n"
614 "#define BOOST_FOREACH (x, y)\n"
615 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000616}
617
Daniel Jasperf7935112012-12-03 18:12:45 +0000618TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000619 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000620 verifyFormat("while (true)\n"
621 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000622 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000623 verifyFormat("while () {\n"
624 " f();\n"
625 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000626}
627
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000628TEST_F(FormatTest, FormatsDoWhile) {
629 verifyFormat("do {\n"
630 " do_something();\n"
631 "} while (something());");
632 verifyFormat("do\n"
633 " do_something();\n"
634 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000635}
636
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000637TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000638 verifyFormat("switch (x) {\n"
639 "case 1:\n"
640 " f();\n"
641 " break;\n"
642 "case kFoo:\n"
643 "case ns::kBar:\n"
644 "case kBaz:\n"
645 " break;\n"
646 "default:\n"
647 " g();\n"
648 " break;\n"
649 "}");
650 verifyFormat("switch (x) {\n"
651 "case 1: {\n"
652 " f();\n"
653 " break;\n"
654 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000655 "case 2: {\n"
656 " break;\n"
657 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000658 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000659 verifyFormat("switch (x) {\n"
660 "case 1: {\n"
661 " f();\n"
662 " {\n"
663 " g();\n"
664 " h();\n"
665 " }\n"
666 " break;\n"
667 "}\n"
668 "}");
669 verifyFormat("switch (x) {\n"
670 "case 1: {\n"
671 " f();\n"
672 " if (foo) {\n"
673 " g();\n"
674 " h();\n"
675 " }\n"
676 " break;\n"
677 "}\n"
678 "}");
679 verifyFormat("switch (x) {\n"
680 "case 1: {\n"
681 " f();\n"
682 " g();\n"
683 "} break;\n"
684 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000685 verifyFormat("switch (test)\n"
686 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000687 verifyFormat("switch (x) {\n"
688 "default: {\n"
689 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000690 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000691 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000692 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000693 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000694 "// if 1, do f()\n"
695 "case 1:\n"
696 " f();\n"
697 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000698 verifyFormat("switch (x) {\n"
699 "case 1:\n"
700 " // Do amazing stuff\n"
701 " {\n"
702 " f();\n"
703 " g();\n"
704 " }\n"
705 " break;\n"
706 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000707 verifyFormat("#define A \\\n"
708 " switch (x) { \\\n"
709 " case a: \\\n"
710 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000711 " }",
712 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000713 verifyFormat("#define OPERATION_CASE(name) \\\n"
714 " case OP_name: \\\n"
715 " return operations::Operation##name\n",
716 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000717 verifyFormat("switch (x) {\n"
718 "case 1:;\n"
719 "default:;\n"
720 " int i;\n"
721 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000722
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000723 verifyGoogleFormat("switch (x) {\n"
724 " case 1:\n"
725 " f();\n"
726 " break;\n"
727 " case kFoo:\n"
728 " case ns::kBar:\n"
729 " case kBaz:\n"
730 " break;\n"
731 " default:\n"
732 " g();\n"
733 " break;\n"
734 "}");
735 verifyGoogleFormat("switch (x) {\n"
736 " case 1: {\n"
737 " f();\n"
738 " break;\n"
739 " }\n"
740 "}");
741 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000742 " ;");
743
744 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
745 " case OP_name: \\\n"
746 " return operations::Operation##name\n");
747 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
748 " // Get the correction operation class.\n"
749 " switch (OpCode) {\n"
750 " CASE(Add);\n"
751 " CASE(Subtract);\n"
752 " default:\n"
753 " return operations::Unknown;\n"
754 " }\n"
755 "#undef OPERATION_CASE\n"
756 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000757 verifyFormat("DEBUG({\n"
758 " switch (x) {\n"
759 " case A:\n"
760 " f();\n"
761 " break;\n"
762 " // On B:\n"
763 " case B:\n"
764 " g();\n"
765 " break;\n"
766 " }\n"
767 "});");
Daniel Jasper031e2402014-04-28 07:48:36 +0000768 verifyFormat("switch (a) {\n"
769 "case (b):\n"
770 " return;\n"
771 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000772
773 verifyFormat("switch (a) {\n"
774 "case some_namespace::\n"
775 " some_constant:\n"
776 " return;\n"
777 "}",
778 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000779}
780
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000781TEST_F(FormatTest, CaseRanges) {
782 verifyFormat("switch (x) {\n"
783 "case 'A' ... 'Z':\n"
784 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000785 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000786 " break;\n"
787 "}");
788}
789
Daniel Jasperb87899b2014-09-10 13:11:45 +0000790TEST_F(FormatTest, ShortCaseLabels) {
791 FormatStyle Style = getLLVMStyle();
792 Style.AllowShortCaseLabelsOnASingleLine = true;
793 verifyFormat("switch (a) {\n"
794 "case 1: x = 1; break;\n"
795 "case 2: return;\n"
796 "case 3:\n"
797 "case 4:\n"
798 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +0000799 "case 6: // comment\n"
800 " return;\n"
801 "case 7:\n"
802 " // comment\n"
803 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +0000804 "case 8:\n"
805 " x = 8; // comment\n"
806 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000807 "default: y = 1; break;\n"
808 "}",
809 Style);
810 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +0000811 "#if FOO\n"
812 "case 0: return 0;\n"
813 "#endif\n"
814 "}",
815 Style);
816 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000817 "case 1: {\n"
818 "}\n"
819 "case 2: {\n"
820 " return;\n"
821 "}\n"
822 "case 3: {\n"
823 " x = 1;\n"
824 " return;\n"
825 "}\n"
826 "case 4:\n"
827 " if (x)\n"
828 " return;\n"
829 "}",
830 Style);
831 Style.ColumnLimit = 21;
832 verifyFormat("switch (a) {\n"
833 "case 1: x = 1; break;\n"
834 "case 2: return;\n"
835 "case 3:\n"
836 "case 4:\n"
837 "case 5: return;\n"
838 "default:\n"
839 " y = 1;\n"
840 " break;\n"
841 "}",
842 Style);
843}
844
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000845TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000846 verifyFormat("void f() {\n"
847 " some_code();\n"
848 "test_label:\n"
849 " some_other_code();\n"
850 " {\n"
851 " some_more_code();\n"
852 " another_label:\n"
853 " some_more_code();\n"
854 " }\n"
855 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +0000856 verifyFormat("{\n"
857 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000858 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +0000859 " some_other_code();\n"
860 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000861 verifyFormat("{\n"
862 " some_code();\n"
863 "test_label:;\n"
864 " int i = 0;\n"
865 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000866}
867
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000868//===----------------------------------------------------------------------===//
869// Tests for comments.
870//===----------------------------------------------------------------------===//
871
872TEST_F(FormatTest, UnderstandsSingleLineComments) {
Daniel Jasper55213652013-03-22 10:01:29 +0000873 verifyFormat("//* */");
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000874 verifyFormat("// line 1\n"
875 "// line 2\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000876 "void f() {}\n");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000877
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000878 verifyFormat("void f() {\n"
879 " // Doesn't do anything\n"
880 "}");
Daniel Jasper185de242013-07-11 13:48:16 +0000881 verifyFormat("SomeObject\n"
882 " // Calling someFunction on SomeObject\n"
883 " .someFunction();");
Daniel Jaspera0407742014-02-11 10:08:11 +0000884 verifyFormat("auto result = SomeObject\n"
885 " // Calling someFunction on SomeObject\n"
886 " .someFunction();");
Daniel Jasperaa701fa2013-01-18 08:44:07 +0000887 verifyFormat("void f(int i, // some comment (probably for i)\n"
888 " int j, // some comment (probably for j)\n"
Daniel Jasper942ee722013-01-13 16:10:20 +0000889 " int k); // some comment (probably for k)");
890 verifyFormat("void f(int i,\n"
891 " // some comment (probably for j)\n"
892 " int j,\n"
893 " // some comment (probably for k)\n"
894 " int k);");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000895
Daniel Jasperaa701fa2013-01-18 08:44:07 +0000896 verifyFormat("int i // This is a fancy variable\n"
897 " = 5; // with nicely aligned comment.");
898
899 verifyFormat("// Leading comment.\n"
900 "int a; // Trailing comment.");
901 verifyFormat("int a; // Trailing comment\n"
902 " // on 2\n"
903 " // or 3 lines.\n"
904 "int b;");
905 verifyFormat("int a; // Trailing comment\n"
906 "\n"
907 "// Leading comment.\n"
908 "int b;");
909 verifyFormat("int a; // Comment.\n"
910 " // More details.\n"
911 "int bbbb; // Another comment.");
912 verifyFormat(
913 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
914 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // comment\n"
915 "int cccccccccccccccccccccccccccccc; // comment\n"
916 "int ddd; // looooooooooooooooooooooooong comment\n"
917 "int aaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
918 "int bbbbbbbbbbbbbbbbbbbbb; // comment\n"
919 "int ccccccccccccccccccc; // comment");
920
Daniel Jasper997b08c2013-01-18 09:19:33 +0000921 verifyFormat("#include \"a\" // comment\n"
922 "#include \"a/b/c\" // comment");
923 verifyFormat("#include <a> // comment\n"
924 "#include <a/b/c> // comment");
Daniel Jasper98857842013-10-30 13:54:53 +0000925 EXPECT_EQ("#include \"a\" // comment\n"
Manuel Klimek5c24cca2013-05-23 10:56:37 +0000926 "#include \"a/b/c\" // comment",
927 format("#include \\\n"
928 " \"a\" // comment\n"
929 "#include \"a/b/c\" // comment"));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000930
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000931 verifyFormat("enum E {\n"
932 " // comment\n"
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000933 " VAL_A, // comment\n"
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000934 " VAL_B\n"
935 "};");
Daniel Jaspere25509f2012-12-17 11:29:41 +0000936
Krasimir Georgiev753625b2017-01-31 13:32:38 +0000937 EXPECT_EQ("enum A {\n"
938 " // line a\n"
939 " a,\n"
940 " b, // line b\n"
941 "\n"
942 " // line c\n"
943 " c\n"
944 "};",
945 format("enum A {\n"
946 " // line a\n"
947 " a,\n"
948 " b, // line b\n"
949 "\n"
950 " // line c\n"
951 " c\n"
952 "};",
953 getLLVMStyleWithColumns(20)));
954
Daniel Jaspere25509f2012-12-17 11:29:41 +0000955 verifyFormat(
956 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000957 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // Trailing comment");
Daniel Jasperd8bb2db2013-01-09 09:33:39 +0000958 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
959 " // Comment inside a statement.\n"
960 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper4281c5a2014-10-07 14:45:34 +0000961 verifyFormat("SomeFunction(a,\n"
962 " // comment\n"
963 " b + x);");
964 verifyFormat("SomeFunction(a, a,\n"
965 " // comment\n"
966 " b + x);");
Daniel Jasper38396592013-02-06 15:23:09 +0000967 verifyFormat(
968 "bool aaaaaaaaaaaaa = // comment\n"
969 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
970 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Manuel Klimekc74d2922013-01-07 08:54:53 +0000971
Daniel Jasper525264c2013-02-13 19:25:54 +0000972 verifyFormat("int aaaa; // aaaaa\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000973 "int aa; // aaaaaaa",
974 getLLVMStyleWithColumns(20));
Daniel Jasper525264c2013-02-13 19:25:54 +0000975
Daniel Jasper304a9862013-01-21 22:49:20 +0000976 EXPECT_EQ("void f() { // This does something ..\n"
977 "}\n"
978 "int a; // This is unrelated",
979 format("void f() { // This does something ..\n"
980 " }\n"
981 "int a; // This is unrelated"));
Daniel Jasper251b3c92013-07-01 11:22:57 +0000982 EXPECT_EQ("class C {\n"
983 " void f() { // This does something ..\n"
984 " } // awesome..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +0000985 "\n"
Daniel Jasper251b3c92013-07-01 11:22:57 +0000986 " int a; // This is unrelated\n"
987 "};",
988 format("class C{void f() { // This does something ..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +0000989 " } // awesome..\n"
990 " \n"
Daniel Jasper251b3c92013-07-01 11:22:57 +0000991 "int a; // This is unrelated\n"
992 "};"));
Daniel Jasper304a9862013-01-21 22:49:20 +0000993
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000994 EXPECT_EQ("int i; // single line trailing comment",
Manuel Klimekc74d2922013-01-07 08:54:53 +0000995 format("int i;\\\n// single line trailing comment"));
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000996
997 verifyGoogleFormat("int a; // Trailing comment.");
Daniel Jasperddaa9be2013-01-29 19:41:55 +0000998
999 verifyFormat("someFunction(anotherFunction( // Force break.\n"
1000 " parameter));");
Daniel Jaspera885dbe2013-02-05 09:34:14 +00001001
1002 verifyGoogleFormat("#endif // HEADER_GUARD");
Daniel Jasperf79f9352013-02-06 22:04:05 +00001003
1004 verifyFormat("const char *test[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001005 " // A\n"
1006 " \"aaaa\",\n"
1007 " // B\n"
1008 " \"aaaaa\"};");
Daniel Jaspereef30492013-02-11 12:36:37 +00001009 verifyGoogleFormat(
1010 "aaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001011 " aaaaaaaaaaaaaaaaaaaaaa); // 81_cols_with_this_comment");
Alexander Kornienkob1be9d62013-04-03 12:38:53 +00001012 EXPECT_EQ("D(a, {\n"
1013 " // test\n"
1014 " int a;\n"
1015 "});",
1016 format("D(a, {\n"
1017 "// test\n"
1018 "int a;\n"
1019 "});"));
Manuel Klimekc5730802013-05-23 11:42:52 +00001020
1021 EXPECT_EQ("lineWith(); // comment\n"
1022 "// at start\n"
1023 "otherLine();",
1024 format("lineWith(); // comment\n"
1025 "// at start\n"
1026 "otherLine();"));
1027 EXPECT_EQ("lineWith(); // comment\n"
Daniel Jasperbb37a2f2016-02-01 11:20:55 +00001028 "/*\n"
1029 " * at start */\n"
1030 "otherLine();",
1031 format("lineWith(); // comment\n"
1032 "/*\n"
1033 " * at start */\n"
1034 "otherLine();"));
1035 EXPECT_EQ("lineWith(); // comment\n"
Manuel Klimekc5730802013-05-23 11:42:52 +00001036 " // at start\n"
1037 "otherLine();",
1038 format("lineWith(); // comment\n"
1039 " // at start\n"
1040 "otherLine();"));
Manuel Klimekb27375f2013-05-23 19:54:43 +00001041
1042 EXPECT_EQ("lineWith(); // comment\n"
1043 "// at start\n"
1044 "otherLine(); // comment",
1045 format("lineWith(); // comment\n"
1046 "// at start\n"
1047 "otherLine(); // comment"));
Manuel Klimek75ef31f2013-05-23 20:46:07 +00001048 EXPECT_EQ("lineWith();\n"
1049 "// at start\n"
1050 "otherLine(); // comment",
1051 format("lineWith();\n"
1052 " // at start\n"
1053 "otherLine(); // comment"));
1054 EXPECT_EQ("// first\n"
1055 "// at start\n"
1056 "otherLine(); // comment",
1057 format("// first\n"
1058 " // at start\n"
1059 "otherLine(); // comment"));
1060 EXPECT_EQ("f();\n"
1061 "// first\n"
1062 "// at start\n"
1063 "otherLine(); // comment",
1064 format("f();\n"
1065 "// first\n"
1066 " // at start\n"
1067 "otherLine(); // comment"));
Daniel Jasper0e93cdb2013-11-08 23:31:14 +00001068 verifyFormat("f(); // comment\n"
1069 "// first\n"
1070 "// at start\n"
1071 "otherLine();");
1072 EXPECT_EQ("f(); // comment\n"
1073 "// first\n"
1074 "// at start\n"
1075 "otherLine();",
1076 format("f(); // comment\n"
1077 "// first\n"
1078 " // at start\n"
1079 "otherLine();"));
1080 EXPECT_EQ("f(); // comment\n"
1081 " // first\n"
1082 "// at start\n"
1083 "otherLine();",
1084 format("f(); // comment\n"
1085 " // first\n"
1086 "// at start\n"
1087 "otherLine();"));
Daniel Jasper49532102015-01-07 14:00:11 +00001088 EXPECT_EQ("void f() {\n"
1089 " lineWith(); // comment\n"
1090 " // at start\n"
1091 "}",
1092 format("void f() {\n"
1093 " lineWith(); // comment\n"
1094 " // at start\n"
1095 "}"));
Benjamin Kramerdab50462016-01-11 16:27:16 +00001096 EXPECT_EQ("int xy; // a\n"
1097 "int z; // b",
1098 format("int xy; // a\n"
1099 "int z; //b"));
1100 EXPECT_EQ("int xy; // a\n"
1101 "int z; // bb",
1102 format("int xy; // a\n"
1103 "int z; //bb",
1104 getLLVMStyleWithColumns(12)));
Daniel Jasper66935022014-04-27 10:03:19 +00001105
Daniel Jaspera44991332015-04-29 13:06:49 +00001106 verifyFormat("#define A \\\n"
1107 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1108 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1109 getLLVMStyleWithColumns(60));
Daniel Jasper66935022014-04-27 10:03:19 +00001110 verifyFormat(
1111 "#define A \\\n"
1112 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1113 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1114 getLLVMStyleWithColumns(61));
Daniel Jasper8acf8222014-05-07 09:23:05 +00001115
1116 verifyFormat("if ( // This is some comment\n"
1117 " x + 3) {\n"
1118 "}");
1119 EXPECT_EQ("if ( // This is some comment\n"
1120 " // spanning two lines\n"
1121 " x + 3) {\n"
1122 "}",
1123 format("if( // This is some comment\n"
1124 " // spanning two lines\n"
1125 " x + 3) {\n"
1126 "}"));
Daniel Jasper9b79efb2015-01-19 11:49:32 +00001127
1128 verifyNoCrash("/\\\n/");
1129 verifyNoCrash("/\\\n* */");
Daniel Jasper62c78f52015-05-06 08:58:57 +00001130 // The 0-character somehow makes the lexer return a proper comment.
1131 verifyNoCrash(StringRef("/*\\\0\n/", 6));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001132}
1133
Daniel Jasper14e58e52014-03-21 11:58:45 +00001134TEST_F(FormatTest, KeepsParameterWithTrailingCommentsOnTheirOwnLine) {
1135 EXPECT_EQ("SomeFunction(a,\n"
1136 " b, // comment\n"
1137 " c);",
1138 format("SomeFunction(a,\n"
1139 " b, // comment\n"
1140 " c);"));
Daniel Jasper28df0a32014-03-21 12:15:40 +00001141 EXPECT_EQ("SomeFunction(a, b,\n"
1142 " // comment\n"
1143 " c);",
1144 format("SomeFunction(a,\n"
1145 " b,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001146 " // comment\n"
Daniel Jasper28df0a32014-03-21 12:15:40 +00001147 " c);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001148 EXPECT_EQ("SomeFunction(a, b, // comment (unclear relation)\n"
1149 " c);",
1150 format("SomeFunction(a, b, // comment (unclear relation)\n"
1151 " c);"));
1152 EXPECT_EQ("SomeFunction(a, // comment\n"
1153 " b,\n"
1154 " c); // comment",
1155 format("SomeFunction(a, // comment\n"
1156 " b,\n"
1157 " c); // comment"));
Daniel Jasper35e41222016-11-29 09:40:01 +00001158 EXPECT_EQ("aaaaaaaaaa(aaaa(aaaa,\n"
1159 " aaaa), //\n"
1160 " aaaa, bbbbb);",
1161 format("aaaaaaaaaa(aaaa(aaaa,\n"
1162 "aaaa), //\n"
1163 "aaaa, bbbbb);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001164}
1165
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001166TEST_F(FormatTest, RemovesTrailingWhitespaceOfComments) {
1167 EXPECT_EQ("// comment", format("// comment "));
1168 EXPECT_EQ("int aaaaaaa, bbbbbbb; // comment",
1169 format("int aaaaaaa, bbbbbbb; // comment ",
1170 getLLVMStyleWithColumns(33)));
Alexander Kornienko9ab4a772013-09-06 17:24:54 +00001171 EXPECT_EQ("// comment\\\n", format("// comment\\\n \t \v \f "));
1172 EXPECT_EQ("// comment \\\n", format("// comment \\\n \t \v \f "));
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001173}
1174
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001175TEST_F(FormatTest, UnderstandsBlockComments) {
Nico Weber8084cff2013-06-26 00:15:19 +00001176 verifyFormat("f(/*noSpaceAfterParameterNamingComment=*/true);");
Daniel Jasper2b2c9672016-05-08 18:14:01 +00001177 verifyFormat("void f() { g(/*aaa=*/x, /*bbb=*/!y, /*c=*/::c); }");
Daniel Jasper38c82402013-11-29 09:27:43 +00001178 EXPECT_EQ("f(aaaaaaaaaaaaaaaaaaaaaaaaa, /* Trailing comment for aa... */\n"
1179 " bbbbbbbbbbbbbbbbbbbbbbbbb);",
1180 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \\\n"
1181 "/* Trailing comment for aa... */\n"
1182 " bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001183 EXPECT_EQ(
1184 "f(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1185 " /* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);",
1186 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \n"
1187 "/* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper61a40782013-06-06 16:08:57 +00001188 EXPECT_EQ(
1189 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1190 " aaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001191 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001192 "}",
1193 format("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1194 " aaaaaaaaaaaaaaaaaa ,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001195 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001196 "}"));
Daniel Jasper99302ed2016-05-27 08:59:34 +00001197 verifyFormat("f(/* aaaaaaaaaaaaaaaaaa = */\n"
1198 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperddaa9be2013-01-29 19:41:55 +00001199
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00001200 FormatStyle NoBinPacking = getLLVMStyle();
1201 NoBinPacking.BinPackParameters = false;
1202 verifyFormat("aaaaaaaa(/* parameter 1 */ aaaaaa,\n"
1203 " /* parameter 2 */ aaaaaa,\n"
1204 " /* parameter 3 */ aaaaaa,\n"
1205 " /* parameter 4 */ aaaaaa);",
1206 NoBinPacking);
Daniel Jasper03b1bc72014-03-28 15:06:01 +00001207
1208 // Aligning block comments in macros.
1209 verifyGoogleFormat("#define A \\\n"
1210 " int i; /*a*/ \\\n"
1211 " int jjj; /*b*/");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001212}
1213
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001214TEST_F(FormatTest, AlignsBlockComments) {
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001215 EXPECT_EQ("/*\n"
1216 " * Really multi-line\n"
1217 " * comment.\n"
1218 " */\n"
1219 "void f() {}",
1220 format(" /*\n"
1221 " * Really multi-line\n"
1222 " * comment.\n"
1223 " */\n"
1224 " void f() {}"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001225 EXPECT_EQ("class C {\n"
1226 " /*\n"
1227 " * Another multi-line\n"
1228 " * comment.\n"
1229 " */\n"
1230 " void f() {}\n"
1231 "};",
1232 format("class C {\n"
1233 "/*\n"
1234 " * Another multi-line\n"
1235 " * comment.\n"
1236 " */\n"
1237 "void f() {}\n"
1238 "};"));
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001239 EXPECT_EQ("/*\n"
1240 " 1. This is a comment with non-trivial formatting.\n"
1241 " 1.1. We have to indent/outdent all lines equally\n"
1242 " 1.1.1. to keep the formatting.\n"
1243 " */",
1244 format(" /*\n"
1245 " 1. This is a comment with non-trivial formatting.\n"
1246 " 1.1. We have to indent/outdent all lines equally\n"
1247 " 1.1.1. to keep the formatting.\n"
1248 " */"));
1249 EXPECT_EQ("/*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001250 "Don't try to outdent if there's not enough indentation.\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001251 "*/",
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001252 format(" /*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001253 " Don't try to outdent if there's not enough indentation.\n"
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001254 " */"));
Manuel Klimek281dcbe2013-05-28 08:55:01 +00001255
1256 EXPECT_EQ("int i; /* Comment with empty...\n"
1257 " *\n"
1258 " * line. */",
1259 format("int i; /* Comment with empty...\n"
1260 " *\n"
1261 " * line. */"));
Alexander Kornienko67d9c8c2014-04-17 16:12:46 +00001262 EXPECT_EQ("int foobar = 0; /* comment */\n"
1263 "int bar = 0; /* multiline\n"
1264 " comment 1 */\n"
1265 "int baz = 0; /* multiline\n"
1266 " comment 2 */\n"
1267 "int bzz = 0; /* multiline\n"
1268 " comment 3 */",
1269 format("int foobar = 0; /* comment */\n"
1270 "int bar = 0; /* multiline\n"
1271 " comment 1 */\n"
1272 "int baz = 0; /* multiline\n"
1273 " comment 2 */\n"
1274 "int bzz = 0; /* multiline\n"
1275 " comment 3 */"));
1276 EXPECT_EQ("int foobar = 0; /* comment */\n"
1277 "int bar = 0; /* multiline\n"
1278 " comment */\n"
1279 "int baz = 0; /* multiline\n"
1280 "comment */",
1281 format("int foobar = 0; /* comment */\n"
1282 "int bar = 0; /* multiline\n"
1283 "comment */\n"
1284 "int baz = 0; /* multiline\n"
1285 "comment */"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001286}
1287
Daniel Jaspera0a50392015-12-01 13:28:53 +00001288TEST_F(FormatTest, CommentReflowingCanBeTurnedOff) {
1289 FormatStyle Style = getLLVMStyleWithColumns(20);
1290 Style.ReflowComments = false;
1291 verifyFormat("// aaaaaaaaa aaaaaaaaaa aaaaaaaaaa", Style);
1292 verifyFormat("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa */", Style);
1293}
1294
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001295TEST_F(FormatTest, CorrectlyHandlesLengthOfBlockComments) {
1296 EXPECT_EQ("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1297 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */",
1298 format("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1299 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */"));
Alexander Kornienkoaa620e12013-07-01 13:42:42 +00001300 EXPECT_EQ(
1301 "void ffffffffffff(\n"
1302 " int aaaaaaaa, int bbbbbbbb,\n"
1303 " int cccccccccccc) { /*\n"
1304 " aaaaaaaaaa\n"
1305 " aaaaaaaaaaaaa\n"
1306 " bbbbbbbbbbbbbb\n"
1307 " bbbbbbbbbb\n"
1308 " */\n"
1309 "}",
1310 format("void ffffffffffff(int aaaaaaaa, int bbbbbbbb, int cccccccccccc)\n"
1311 "{ /*\n"
1312 " aaaaaaaaaa aaaaaaaaaaaaa\n"
1313 " bbbbbbbbbbbbbb bbbbbbbbbb\n"
1314 " */\n"
1315 "}",
1316 getLLVMStyleWithColumns(40)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001317}
1318
Alexander Kornienko94042342013-07-16 23:47:22 +00001319TEST_F(FormatTest, DontBreakNonTrailingBlockComments) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00001320 EXPECT_EQ("void ffffffffff(\n"
1321 " int aaaaa /* test */);",
Alexander Kornienko94042342013-07-16 23:47:22 +00001322 format("void ffffffffff(int aaaaa /* test */);",
1323 getLLVMStyleWithColumns(35)));
1324}
1325
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001326TEST_F(FormatTest, SplitsLongCxxComments) {
1327 EXPECT_EQ("// A comment that\n"
1328 "// doesn't fit on\n"
1329 "// one line",
1330 format("// A comment that doesn't fit on one line",
1331 getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001332 EXPECT_EQ("/// A comment that\n"
1333 "/// doesn't fit on\n"
1334 "/// one line",
1335 format("/// A comment that doesn't fit on one line",
1336 getLLVMStyleWithColumns(20)));
1337 EXPECT_EQ("//! A comment that\n"
1338 "//! doesn't fit on\n"
1339 "//! one line",
1340 format("//! A comment that doesn't fit on one line",
1341 getLLVMStyleWithColumns(20)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00001342 EXPECT_EQ("// a b c d\n"
1343 "// e f g\n"
1344 "// h i j k",
Daniel Jaspera44991332015-04-29 13:06:49 +00001345 format("// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
1346 EXPECT_EQ(
1347 "// a b c d\n"
1348 "// e f g\n"
1349 "// h i j k",
1350 format("\\\n// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001351 EXPECT_EQ("if (true) // A comment that\n"
1352 " // doesn't fit on\n"
1353 " // one line",
1354 format("if (true) // A comment that doesn't fit on one line ",
1355 getLLVMStyleWithColumns(30)));
1356 EXPECT_EQ("// Don't_touch_leading_whitespace",
1357 format("// Don't_touch_leading_whitespace",
1358 getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001359 EXPECT_EQ("// Add leading\n"
1360 "// whitespace",
1361 format("//Add leading whitespace", getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001362 EXPECT_EQ("/// Add leading\n"
1363 "/// whitespace",
1364 format("///Add leading whitespace", getLLVMStyleWithColumns(20)));
1365 EXPECT_EQ("//! Add leading\n"
1366 "//! whitespace",
1367 format("//!Add leading whitespace", getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001368 EXPECT_EQ("// whitespace", format("//whitespace", getLLVMStyle()));
1369 EXPECT_EQ("// Even if it makes the line exceed the column\n"
1370 "// limit",
1371 format("//Even if it makes the line exceed the column limit",
1372 getLLVMStyleWithColumns(51)));
1373 EXPECT_EQ("//--But not here", format("//--But not here", getLLVMStyle()));
Krasimir Georgievb796ceb2017-01-31 15:40:15 +00001374 EXPECT_EQ("/// line 1\n"
1375 "// add leading whitespace",
1376 format("/// line 1\n"
1377 "//add leading whitespace",
1378 getLLVMStyleWithColumns(30)));
1379 EXPECT_EQ("/// line 1\n"
1380 "/// line 2\n"
1381 "//! line 3\n"
1382 "//! line 4\n"
1383 "//! line 5\n"
1384 "// line 6\n"
1385 "// line 7",
1386 format("///line 1\n"
1387 "///line 2\n"
1388 "//! line 3\n"
1389 "//!line 4\n"
1390 "//!line 5\n"
1391 "// line 6\n"
1392 "//line 7", getLLVMStyleWithColumns(20)));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001393
1394 EXPECT_EQ("// aa bb cc dd",
1395 format("// aa bb cc dd ",
1396 getLLVMStyleWithColumns(15)));
1397
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001398 EXPECT_EQ("// A comment before\n"
1399 "// a macro\n"
1400 "// definition\n"
1401 "#define a b",
1402 format("// A comment before a macro definition\n"
1403 "#define a b",
1404 getLLVMStyleWithColumns(20)));
Daniel Jaspere068ac72014-10-27 17:13:59 +00001405 EXPECT_EQ("void ffffff(\n"
1406 " int aaaaaaaaa, // wwww\n"
1407 " int bbbbbbbbbb, // xxxxxxx\n"
1408 " // yyyyyyyyyy\n"
1409 " int c, int d, int e) {}",
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001410 format("void ffffff(\n"
1411 " int aaaaaaaaa, // wwww\n"
Daniel Jasper19a541e2013-12-19 16:45:34 +00001412 " int bbbbbbbbbb, // xxxxxxx yyyyyyyyyy\n"
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001413 " int c, int d, int e) {}",
1414 getLLVMStyleWithColumns(40)));
Alexander Kornienkob93062e2013-06-20 13:58:37 +00001415 EXPECT_EQ("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1416 format("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1417 getLLVMStyleWithColumns(20)));
Alexander Kornienko3abbb8a2013-11-12 17:30:49 +00001418 EXPECT_EQ(
1419 "#define XXX // a b c d\n"
1420 " // e f g h",
1421 format("#define XXX // a b c d e f g h", getLLVMStyleWithColumns(22)));
1422 EXPECT_EQ(
1423 "#define XXX // q w e r\n"
1424 " // t y u i",
1425 format("#define XXX //q w e r t y u i", getLLVMStyleWithColumns(22)));
Krasimir Georgieve518e0b2017-01-30 21:00:01 +00001426 EXPECT_EQ("{\n"
1427 " //\n"
1428 " //\\\n"
1429 " // long 1 2 3 4\n"
1430 " // 5\n"
1431 "}",
1432 format("{\n"
1433 " //\n"
1434 " //\\\n"
1435 " // long 1 2 3 4 5\n"
1436 "}",
1437 getLLVMStyleWithColumns(20)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001438}
Manuel Klimek9043c742013-05-27 15:23:34 +00001439
Alexander Kornienko4504f932014-03-10 13:14:56 +00001440TEST_F(FormatTest, PreservesHangingIndentInCxxComments) {
1441 EXPECT_EQ("// A comment\n"
1442 "// that doesn't\n"
1443 "// fit on one\n"
1444 "// line",
1445 format("// A comment that doesn't fit on one line",
1446 getLLVMStyleWithColumns(20)));
1447 EXPECT_EQ("/// A comment\n"
1448 "/// that doesn't\n"
1449 "/// fit on one\n"
1450 "/// line",
1451 format("/// A comment that doesn't fit on one line",
1452 getLLVMStyleWithColumns(20)));
1453}
1454
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001455TEST_F(FormatTest, DontSplitLineCommentsWithEscapedNewlines) {
1456 EXPECT_EQ("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1457 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1458 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1459 format("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1460 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1461 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
1462 EXPECT_EQ("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1463 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1464 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1465 format("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1466 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1467 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1468 getLLVMStyleWithColumns(50)));
1469 // FIXME: One day we might want to implement adjustment of leading whitespace
1470 // of the consecutive lines in this kind of comment:
Daniel Jasper4355e7f2014-07-09 07:50:33 +00001471 EXPECT_EQ("double\n"
1472 " a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1473 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1474 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1475 format("double a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1476 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1477 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001478 getLLVMStyleWithColumns(49)));
1479}
1480
Alexander Kornienkoce9161a2014-01-02 15:13:14 +00001481TEST_F(FormatTest, DontSplitLineCommentsWithPragmas) {
1482 FormatStyle Pragmas = getLLVMStyleWithColumns(30);
1483 Pragmas.CommentPragmas = "^ IWYU pragma:";
1484 EXPECT_EQ(
1485 "// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb",
1486 format("// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb", Pragmas));
1487 EXPECT_EQ(
1488 "/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */",
1489 format("/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */", Pragmas));
1490}
1491
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001492TEST_F(FormatTest, PriorityOfCommentBreaking) {
Daniel Jasper2739af32013-08-28 10:03:58 +00001493 EXPECT_EQ("if (xxx ==\n"
1494 " yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001495 " zzz)\n"
1496 " q();",
1497 format("if (xxx == yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
1498 " zzz) q();",
1499 getLLVMStyleWithColumns(40)));
1500 EXPECT_EQ("if (xxxxxxxxxx ==\n"
1501 " yyy && // aaaaaa bbbbbbbb cccc\n"
1502 " zzz)\n"
1503 " q();",
1504 format("if (xxxxxxxxxx == yyy && // aaaaaa bbbbbbbb cccc\n"
1505 " zzz) q();",
1506 getLLVMStyleWithColumns(40)));
1507 EXPECT_EQ("if (xxxxxxxxxx &&\n"
1508 " yyy || // aaaaaa bbbbbbbb cccc\n"
1509 " zzz)\n"
1510 " q();",
1511 format("if (xxxxxxxxxx && yyy || // aaaaaa bbbbbbbb cccc\n"
1512 " zzz) q();",
1513 getLLVMStyleWithColumns(40)));
Daniel Jasper19a541e2013-12-19 16:45:34 +00001514 EXPECT_EQ("fffffffff(\n"
1515 " &xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1516 " zzz);",
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001517 format("fffffffff(&xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1518 " zzz);",
1519 getLLVMStyleWithColumns(40)));
Manuel Klimek9043c742013-05-27 15:23:34 +00001520}
1521
1522TEST_F(FormatTest, MultiLineCommentsInDefines) {
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001523 EXPECT_EQ("#define A(x) /* \\\n"
1524 " a comment \\\n"
1525 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001526 " f();",
1527 format("#define A(x) /* \\\n"
1528 " a comment \\\n"
1529 " inside */ \\\n"
1530 " f();",
1531 getLLVMStyleWithColumns(17)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001532 EXPECT_EQ("#define A( \\\n"
1533 " x) /* \\\n"
1534 " a comment \\\n"
1535 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001536 " f();",
1537 format("#define A( \\\n"
1538 " x) /* \\\n"
1539 " a comment \\\n"
1540 " inside */ \\\n"
1541 " f();",
1542 getLLVMStyleWithColumns(17)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001543}
1544
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001545TEST_F(FormatTest, ParsesCommentsAdjacentToPPDirectives) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001546 EXPECT_EQ("namespace {}\n// Test\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001547 format("namespace {}\n // Test\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001548 EXPECT_EQ("namespace {}\n/* Test */\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001549 format("namespace {}\n /* Test */\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001550 EXPECT_EQ("namespace {}\n/* Test */ #define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001551 format("namespace {}\n /* Test */ #define A"));
1552}
1553
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001554TEST_F(FormatTest, SplitsLongLinesInComments) {
1555 EXPECT_EQ("/* This is a long\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001556 " * comment that\n"
1557 " * doesn't\n"
1558 " * fit on one line.\n"
1559 " */",
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001560 format("/* "
1561 "This is a long "
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001562 "comment that "
1563 "doesn't "
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001564 "fit on one line. */",
1565 getLLVMStyleWithColumns(20)));
Daniel Jaspera44991332015-04-29 13:06:49 +00001566 EXPECT_EQ(
1567 "/* a b c d\n"
1568 " * e f g\n"
1569 " * h i j k\n"
1570 " */",
1571 format("/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
1572 EXPECT_EQ(
1573 "/* a b c d\n"
1574 " * e f g\n"
1575 " * h i j k\n"
1576 " */",
1577 format("\\\n/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001578 EXPECT_EQ("/*\n"
1579 "This is a long\n"
1580 "comment that doesn't\n"
1581 "fit on one line.\n"
1582 "*/",
1583 format("/*\n"
1584 "This is a long "
1585 "comment that doesn't "
1586 "fit on one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001587 "*/",
1588 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001589 EXPECT_EQ("/*\n"
1590 " * This is a long\n"
1591 " * comment that\n"
1592 " * doesn't fit on\n"
1593 " * one line.\n"
1594 " */",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001595 format("/* \n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001596 " * This is a long "
1597 " comment that "
1598 " doesn't fit on "
1599 " one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001600 " */",
1601 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001602 EXPECT_EQ("/*\n"
1603 " * This_is_a_comment_with_words_that_dont_fit_on_one_line\n"
1604 " * so_it_should_be_broken\n"
1605 " * wherever_a_space_occurs\n"
1606 " */",
1607 format("/*\n"
1608 " * This_is_a_comment_with_words_that_dont_fit_on_one_line "
1609 " so_it_should_be_broken "
1610 " wherever_a_space_occurs \n"
1611 " */",
1612 getLLVMStyleWithColumns(20)));
1613 EXPECT_EQ("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001614 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001615 " */",
1616 format("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001617 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001618 " */",
1619 getLLVMStyleWithColumns(20)));
1620 EXPECT_EQ("{\n"
1621 " /*\n"
1622 " This is another\n"
1623 " long comment that\n"
1624 " doesn't fit on one\n"
1625 " line 1234567890\n"
1626 " */\n"
1627 "}",
1628 format("{\n"
1629 "/*\n"
1630 "This is another "
1631 " long comment that "
1632 " doesn't fit on one"
1633 " line 1234567890\n"
1634 "*/\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001635 "}",
1636 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001637 EXPECT_EQ("{\n"
1638 " /*\n"
1639 " * This i s\n"
1640 " * another comment\n"
1641 " * t hat doesn' t\n"
1642 " * fit on one l i\n"
1643 " * n e\n"
1644 " */\n"
1645 "}",
1646 format("{\n"
1647 "/*\n"
1648 " * This i s"
1649 " another comment"
1650 " t hat doesn' t"
1651 " fit on one l i"
1652 " n e\n"
1653 " */\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001654 "}",
1655 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001656 EXPECT_EQ("/*\n"
1657 " * This is a long\n"
1658 " * comment that\n"
1659 " * doesn't fit on\n"
1660 " * one line\n"
1661 " */",
1662 format(" /*\n"
1663 " * This is a long comment that doesn't fit on one line\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001664 " */",
1665 getLLVMStyleWithColumns(20)));
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001666 EXPECT_EQ("{\n"
1667 " if (something) /* This is a\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001668 " long\n"
1669 " comment */\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001670 " ;\n"
1671 "}",
1672 format("{\n"
1673 " if (something) /* This is a long comment */\n"
1674 " ;\n"
1675 "}",
1676 getLLVMStyleWithColumns(30)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001677
1678 EXPECT_EQ("/* A comment before\n"
1679 " * a macro\n"
1680 " * definition */\n"
1681 "#define a b",
1682 format("/* A comment before a macro definition */\n"
1683 "#define a b",
1684 getLLVMStyleWithColumns(20)));
1685
1686 EXPECT_EQ("/* some comment\n"
1687 " * a comment\n"
1688 "* that we break\n"
1689 " * another comment\n"
1690 "* we have to break\n"
1691 "* a left comment\n"
1692 " */",
1693 format(" /* some comment\n"
1694 " * a comment that we break\n"
1695 " * another comment we have to break\n"
1696 "* a left comment\n"
1697 " */",
1698 getLLVMStyleWithColumns(20)));
1699
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00001700 EXPECT_EQ("/**\n"
1701 " * multiline block\n"
1702 " * comment\n"
1703 " *\n"
1704 " */",
1705 format("/**\n"
1706 " * multiline block comment\n"
1707 " *\n"
1708 " */",
1709 getLLVMStyleWithColumns(20)));
1710
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001711 EXPECT_EQ("/*\n"
1712 "\n"
1713 "\n"
1714 " */\n",
1715 format(" /* \n"
1716 " \n"
1717 " \n"
1718 " */\n"));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001719
1720 EXPECT_EQ("/* a a */",
1721 format("/* a a */", getLLVMStyleWithColumns(15)));
1722 EXPECT_EQ("/* a a bc */",
1723 format("/* a a bc */", getLLVMStyleWithColumns(15)));
1724 EXPECT_EQ("/* aaa aaa\n"
1725 " * aaaaa */",
1726 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
1727 EXPECT_EQ("/* aaa aaa\n"
1728 " * aaaaa */",
1729 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001730}
1731
1732TEST_F(FormatTest, SplitsLongLinesInCommentsInPreprocessor) {
1733 EXPECT_EQ("#define X \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001734 " /* \\\n"
1735 " Test \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001736 " Macro comment \\\n"
1737 " with a long \\\n"
1738 " line \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001739 " */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001740 " A + B",
1741 format("#define X \\\n"
1742 " /*\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001743 " Test\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001744 " Macro comment with a long line\n"
1745 " */ \\\n"
1746 " A + B",
1747 getLLVMStyleWithColumns(20)));
1748 EXPECT_EQ("#define X \\\n"
1749 " /* Macro comment \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001750 " with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001751 " line */ \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001752 " A + B",
1753 format("#define X \\\n"
1754 " /* Macro comment with a long\n"
1755 " line */ \\\n"
1756 " A + B",
1757 getLLVMStyleWithColumns(20)));
1758 EXPECT_EQ("#define X \\\n"
1759 " /* Macro comment \\\n"
1760 " * with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001761 " * line */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001762 " A + B",
1763 format("#define X \\\n"
1764 " /* Macro comment with a long line */ \\\n"
1765 " A + B",
1766 getLLVMStyleWithColumns(20)));
1767}
1768
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001769TEST_F(FormatTest, CommentsInStaticInitializers) {
1770 EXPECT_EQ(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001771 "static SomeType type = {aaaaaaaaaaaaaaaaaaaa, /* comment */\n"
1772 " aaaaaaaaaaaaaaaaaaaa /* comment */,\n"
1773 " /* comment */ aaaaaaaaaaaaaaaaaaaa,\n"
1774 " aaaaaaaaaaaaaaaaaaaa, // comment\n"
1775 " aaaaaaaaaaaaaaaaaaaa};",
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001776 format("static SomeType type = { aaaaaaaaaaaaaaaaaaaa , /* comment */\n"
1777 " aaaaaaaaaaaaaaaaaaaa /* comment */ ,\n"
1778 " /* comment */ aaaaaaaaaaaaaaaaaaaa ,\n"
1779 " aaaaaaaaaaaaaaaaaaaa , // comment\n"
1780 " aaaaaaaaaaaaaaaaaaaa };"));
Chandler Carruthf8b72662014-03-02 12:37:31 +00001781 verifyFormat("static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1782 " bbbbbbbbbbb, ccccccccccc};");
1783 verifyFormat("static SomeType type = {aaaaaaaaaaa,\n"
1784 " // comment for bb....\n"
1785 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001786 verifyGoogleFormat(
Daniel Jaspere5777d22013-05-23 10:15:45 +00001787 "static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1788 " bbbbbbbbbbb, ccccccccccc};");
1789 verifyGoogleFormat("static SomeType type = {aaaaaaaaaaa,\n"
1790 " // comment for bb....\n"
1791 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001792
Chandler Carruthf8b72662014-03-02 12:37:31 +00001793 verifyFormat("S s = {{a, b, c}, // Group #1\n"
1794 " {d, e, f}, // Group #2\n"
1795 " {g, h, i}}; // Group #3");
1796 verifyFormat("S s = {{// Group #1\n"
1797 " a, b, c},\n"
1798 " {// Group #2\n"
1799 " d, e, f},\n"
1800 " {// Group #3\n"
1801 " g, h, i}};");
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001802
1803 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001804 " // Some comment\n"
1805 " a,\n"
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001806 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001807 " // Comment after empty line\n"
1808 " b}",
Daniel Jasperfb5e2412013-02-26 13:10:34 +00001809 format("S s = {\n"
1810 " // Some comment\n"
1811 " a,\n"
1812 " \n"
1813 " // Comment after empty line\n"
1814 " b\n"
1815 "}"));
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001816 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001817 " /* Some comment */\n"
1818 " a,\n"
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001819 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001820 " /* Comment after empty line */\n"
1821 " b}",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001822 format("S s = {\n"
1823 " /* Some comment */\n"
1824 " a,\n"
1825 " \n"
1826 " /* Comment after empty line */\n"
1827 " b\n"
1828 "}"));
Daniel Jaspera400cab2013-02-28 15:04:12 +00001829 verifyFormat("const uint8_t aaaaaaaaaaaaaaaaaaaaaa[0] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001830 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1831 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1832 " 0x00, 0x00, 0x00, 0x00}; // comment\n");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001833}
1834
Krasimir Georgiev84321612017-01-30 19:18:55 +00001835TEST_F(FormatTest, LineCommentsAfterRightBrace) {
1836 EXPECT_EQ("if (true) { // comment about branch\n"
1837 " // comment about f\n"
1838 " f();\n"
1839 "}",
1840 format("if (true) { // comment about branch\n"
1841 " // comment about f\n"
1842 " f();\n"
1843 "}",
1844 getLLVMStyleWithColumns(80)));
1845 EXPECT_EQ("if (1) { // if line 1\n"
1846 " // if line 2\n"
1847 " // if line 3\n"
1848 " // f line 1\n"
1849 " // f line 2\n"
1850 " f();\n"
1851 "} else { // else line 1\n"
1852 " // else line 2\n"
1853 " // else line 3\n"
1854 " // g line 1\n"
1855 " g();\n"
1856 "}",
1857 format("if (1) { // if line 1\n"
1858 " // if line 2\n"
1859 " // if line 3\n"
1860 " // f line 1\n"
1861 " // f line 2\n"
1862 " f();\n"
1863 "} else { // else line 1\n"
1864 " // else line 2\n"
1865 " // else line 3\n"
1866 " // g line 1\n"
1867 " g();\n"
1868 "}"));
1869 EXPECT_EQ("do { // line 1\n"
1870 " // line 2\n"
1871 " // line 3\n"
1872 " f();\n"
1873 "} while (true);",
1874 format("do { // line 1\n"
1875 " // line 2\n"
1876 " // line 3\n"
1877 " f();\n"
1878 "} while (true);",
1879 getLLVMStyleWithColumns(80)));
1880 EXPECT_EQ("while (a < b) { // line 1\n"
1881 " // line 2\n"
1882 " // line 3\n"
1883 " f();\n"
1884 "}",
1885 format("while (a < b) {// line 1\n"
1886 " // line 2\n"
1887 " // line 3\n"
1888 " f();\n"
1889 "}",
1890 getLLVMStyleWithColumns(80)));
1891}
1892
Krasimir Georgiev91834222017-01-25 13:58:58 +00001893TEST_F(FormatTest, ReflowsComments) {
1894 // Break a long line and reflow with the full next line.
1895 EXPECT_EQ("// long long long\n"
1896 "// long long",
1897 format("// long long long long\n"
1898 "// long",
1899 getLLVMStyleWithColumns(20)));
1900
1901 // Keep the trailing newline while reflowing.
1902 EXPECT_EQ("// long long long\n"
1903 "// long long\n",
1904 format("// long long long long\n"
1905 "// long\n",
1906 getLLVMStyleWithColumns(20)));
1907
1908 // Break a long line and reflow with a part of the next line.
1909 EXPECT_EQ("// long long long\n"
1910 "// long long\n"
1911 "// long_long",
1912 format("// long long long long\n"
1913 "// long long_long",
1914 getLLVMStyleWithColumns(20)));
1915
1916 // Break but do not reflow if the first word from the next line is too long.
1917 EXPECT_EQ("// long long long\n"
1918 "// long\n"
1919 "// long_long_long\n",
1920 format("// long long long long\n"
1921 "// long_long_long\n",
1922 getLLVMStyleWithColumns(20)));
1923
1924 // Don't break or reflow short lines.
1925 verifyFormat("// long\n"
1926 "// long long long lo\n"
1927 "// long long long lo\n"
1928 "// long",
1929 getLLVMStyleWithColumns(20));
1930
1931 // Keep prefixes and decorations while reflowing.
1932 EXPECT_EQ("/// long long long\n"
1933 "/// long long\n",
1934 format("/// long long long long\n"
1935 "/// long\n",
1936 getLLVMStyleWithColumns(20)));
1937 EXPECT_EQ("//! long long long\n"
1938 "//! long long\n",
1939 format("//! long long long long\n"
1940 "//! long\n",
1941 getLLVMStyleWithColumns(20)));
1942 EXPECT_EQ("/* long long long\n"
1943 " * long long */",
1944 format("/* long long long long\n"
1945 " * long */",
1946 getLLVMStyleWithColumns(20)));
1947
1948 // Don't bring leading whitespace up while reflowing.
1949 EXPECT_EQ("/* long long long\n"
1950 " * long long long\n"
1951 " */",
1952 format("/* long long long long\n"
1953 " * long long\n"
1954 " */",
1955 getLLVMStyleWithColumns(20)));
1956
1957 // Reflow the last line of a block comment with its trailing '*/'.
1958 EXPECT_EQ("/* long long long\n"
1959 " long long */",
1960 format("/* long long long long\n"
1961 " long */",
1962 getLLVMStyleWithColumns(20)));
1963
1964 // Reflow two short lines; keep the postfix of the last one.
1965 EXPECT_EQ("/* long long long\n"
1966 " * long long long */",
1967 format("/* long long long long\n"
1968 " * long\n"
1969 " * long */",
1970 getLLVMStyleWithColumns(20)));
1971
1972 // Put the postfix of the last short reflow line on a newline if it doesn't
1973 // fit.
1974 EXPECT_EQ("/* long long long\n"
1975 " * long long longg\n"
1976 " */",
1977 format("/* long long long long\n"
1978 " * long\n"
1979 " * longg */",
1980 getLLVMStyleWithColumns(20)));
1981
Krasimir Georgievaf1b9622017-01-31 14:31:44 +00001982 // Reflow lines with leading whitespace.
1983 EXPECT_EQ("{\n"
1984 " /*\n"
1985 " * long long long\n"
1986 " * long long long\n"
1987 " * long long long\n"
1988 " */\n"
1989 "}",
1990 format("{\n"
1991 "/*\n"
1992 " * long long long long\n"
1993 " * long\n"
1994 " * long long long long\n"
1995 " */\n"
1996 "}",
1997 getLLVMStyleWithColumns(20)));
1998
Krasimir Georgiev91834222017-01-25 13:58:58 +00001999 // Break single line block comments that are first in the line with ' *'
2000 // decoration.
2001 EXPECT_EQ("/* long long long\n"
2002 " * long */",
2003 format("/* long long long long */", getLLVMStyleWithColumns(20)));
2004
2005 // Break single line block comment that are not first in the line with ' '
2006 // decoration.
2007 EXPECT_EQ("int i; /* long long\n"
2008 " long */",
2009 format("int i; /* long long long */", getLLVMStyleWithColumns(20)));
2010
2011 // Reflow a line that goes just over the column limit.
2012 EXPECT_EQ("// long long long\n"
2013 "// lon long",
2014 format("// long long long lon\n"
2015 "// long",
2016 getLLVMStyleWithColumns(20)));
2017
2018 // Stop reflowing if the next line has a different indentation than the
2019 // previous line.
2020 EXPECT_EQ("// long long long\n"
2021 "// long\n"
2022 "// long long\n"
2023 "// long",
2024 format("// long long long long\n"
2025 "// long long\n"
2026 "// long",
2027 getLLVMStyleWithColumns(20)));
2028
2029 // Reflow into the last part of a really long line that has been broken into
2030 // multiple lines.
2031 EXPECT_EQ("// long long long\n"
2032 "// long long long\n"
2033 "// long long long\n",
2034 format("// long long long long long long long long\n"
2035 "// long\n",
2036 getLLVMStyleWithColumns(20)));
2037
2038 // Break the first line, then reflow the beginning of the second and third
2039 // line up.
2040 EXPECT_EQ("// long long long\n"
2041 "// lon1 lon2 lon2\n"
2042 "// lon2 lon3 lon3",
2043 format("// long long long lon1\n"
2044 "// lon2 lon2 lon2\n"
2045 "// lon3 lon3",
2046 getLLVMStyleWithColumns(20)));
2047
2048 // Reflow the beginning of the second line, then break the rest.
2049 EXPECT_EQ("// long long long\n"
2050 "// lon1 lon2 lon2\n"
2051 "// lon2 lon2 lon2\n"
2052 "// lon3",
2053 format("// long long long lon1\n"
2054 "// lon2 lon2 lon2 lon2 lon2 lon3",
2055 getLLVMStyleWithColumns(20)));
2056
2057 // Shrink the first line, then reflow the second line up.
2058 EXPECT_EQ("// long long long", format("// long long\n"
2059 "// long",
2060 getLLVMStyleWithColumns(20)));
2061
2062 // Don't shrink leading whitespace.
2063 EXPECT_EQ("int i; /// a",
2064 format("int i; /// a", getLLVMStyleWithColumns(20)));
2065
2066 // Shrink trailing whitespace if there is no postfix and reflow.
2067 EXPECT_EQ("// long long long\n"
2068 "// long long",
2069 format("// long long long long \n"
2070 "// long",
2071 getLLVMStyleWithColumns(20)));
2072
2073 // Shrink trailing whitespace to a single one if there is postfix.
2074 EXPECT_EQ("/* long long long */",
2075 format("/* long long long */", getLLVMStyleWithColumns(20)));
2076
2077 // Break a block comment postfix if exceeding the line limit.
2078 EXPECT_EQ("/* long\n"
2079 " */",
2080 format("/* long */", getLLVMStyleWithColumns(20)));
2081
2082 // Reflow indented comments.
2083 EXPECT_EQ("{\n"
2084 " // long long long\n"
2085 " // long long\n"
2086 " int i; /* long lon\n"
2087 " g long\n"
2088 " */\n"
2089 "}",
2090 format("{\n"
2091 " // long long long long\n"
2092 " // long\n"
2093 " int i; /* long lon g\n"
2094 " long */\n"
2095 "}",
2096 getLLVMStyleWithColumns(20)));
2097
2098 // Don't realign trailing comments after reflow has happened.
2099 EXPECT_EQ("// long long long\n"
2100 "// long long\n"
2101 "long i; // long",
2102 format("// long long long long\n"
2103 "// long\n"
2104 "long i; // long",
2105 getLLVMStyleWithColumns(20)));
2106 EXPECT_EQ("// long long long\n"
2107 "// longng long long\n"
2108 "// long lo",
2109 format("// long long long longng\n"
2110 "// long long long\n"
2111 "// lo",
2112 getLLVMStyleWithColumns(20)));
2113
2114 // Reflow lines after a broken line.
2115 EXPECT_EQ("int a; // Trailing\n"
2116 " // comment on\n"
2117 " // 2 or 3\n"
2118 " // lines.\n",
2119 format("int a; // Trailing comment\n"
2120 " // on 2\n"
2121 " // or 3\n"
2122 " // lines.\n",
2123 getLLVMStyleWithColumns(20)));
2124 EXPECT_EQ("/// This long line\n"
2125 "/// gets reflown.\n",
2126 format("/// This long line gets\n"
2127 "/// reflown.\n",
2128 getLLVMStyleWithColumns(20)));
2129 EXPECT_EQ("//! This long line\n"
2130 "//! gets reflown.\n",
2131 format(" //! This long line gets\n"
2132 " //! reflown.\n",
2133 getLLVMStyleWithColumns(20)));
2134 EXPECT_EQ("/* This long line\n"
2135 " * gets reflown.\n"
2136 " */\n",
2137 format("/* This long line gets\n"
2138 " * reflown.\n"
2139 " */\n",
2140 getLLVMStyleWithColumns(20)));
2141
2142 // Reflow after indentation makes a line too long.
2143 EXPECT_EQ("{\n"
2144 " // long long long\n"
2145 " // lo long\n"
2146 "}\n",
2147 format("{\n"
2148 "// long long long lo\n"
2149 "// long\n"
2150 "}\n",
2151 getLLVMStyleWithColumns(20)));
2152
2153 // Break and reflow multiple lines.
2154 EXPECT_EQ("/*\n"
2155 " * Reflow the end of\n"
2156 " * line by 11 22 33\n"
2157 " * 4.\n"
2158 " */\n",
2159 format("/*\n"
2160 " * Reflow the end of line\n"
2161 " * by\n"
2162 " * 11\n"
2163 " * 22\n"
2164 " * 33\n"
2165 " * 4.\n"
2166 " */\n",
2167 getLLVMStyleWithColumns(20)));
2168 EXPECT_EQ("/// First line gets\n"
2169 "/// broken. Second\n"
2170 "/// line gets\n"
2171 "/// reflown and\n"
2172 "/// broken. Third\n"
2173 "/// gets reflown.\n",
2174 format("/// First line gets broken.\n"
2175 "/// Second line gets reflown and broken.\n"
2176 "/// Third gets reflown.\n",
2177 getLLVMStyleWithColumns(20)));
2178 EXPECT_EQ("int i; // first long\n"
2179 " // long snd\n"
2180 " // long.\n",
2181 format("int i; // first long long\n"
2182 " // snd long.\n",
2183 getLLVMStyleWithColumns(20)));
2184 EXPECT_EQ("{\n"
2185 " // first long line\n"
2186 " // line second\n"
2187 " // long line line\n"
2188 " // third long line\n"
2189 " // line\n"
2190 "}\n",
2191 format("{\n"
2192 " // first long line line\n"
2193 " // second long line line\n"
2194 " // third long line line\n"
2195 "}\n",
2196 getLLVMStyleWithColumns(20)));
2197 EXPECT_EQ("int i; /* first line\n"
2198 " * second\n"
2199 " * line third\n"
2200 " * line\n"
2201 " */",
2202 format("int i; /* first line\n"
2203 " * second line\n"
2204 " * third line\n"
2205 " */",
2206 getLLVMStyleWithColumns(20)));
2207
2208 // Reflow the last two lines of a section that starts with a line having
2209 // different indentation.
2210 EXPECT_EQ(
2211 "// long\n"
2212 "// long long long\n"
2213 "// long long",
2214 format("// long\n"
2215 "// long long long long\n"
2216 "// long",
2217 getLLVMStyleWithColumns(20)));
2218
2219 // Keep the block comment endling '*/' while reflowing.
2220 EXPECT_EQ("/* Long long long\n"
2221 " * line short */\n",
2222 format("/* Long long long line\n"
2223 " * short */\n",
2224 getLLVMStyleWithColumns(20)));
2225
2226 // Don't reflow between separate blocks of comments.
2227 EXPECT_EQ("/* First comment\n"
2228 " * block will */\n"
2229 "/* Snd\n"
2230 " */\n",
2231 format("/* First comment block\n"
2232 " * will */\n"
2233 "/* Snd\n"
2234 " */\n",
2235 getLLVMStyleWithColumns(20)));
2236
2237 // Don't reflow across blank comment lines.
2238 EXPECT_EQ("int i; // This long\n"
2239 " // line gets\n"
2240 " // broken.\n"
Krasimir Georgiev13dbaa02017-02-01 10:10:04 +00002241 " //\n"
Krasimir Georgiev91834222017-01-25 13:58:58 +00002242 " // keep.\n",
2243 format("int i; // This long line gets broken.\n"
2244 " // \n"
2245 " // keep.\n",
2246 getLLVMStyleWithColumns(20)));
2247 EXPECT_EQ("{\n"
2248 " /// long long long\n"
2249 " /// long long\n"
2250 " ///\n"
2251 " /// long\n"
2252 "}",
2253 format("{\n"
2254 " /// long long long long\n"
2255 " /// long\n"
2256 " ///\n"
2257 " /// long\n"
2258 "}",
2259 getLLVMStyleWithColumns(20)));
2260 EXPECT_EQ("//! long long long\n"
2261 "//! long\n"
2262 "\n"
2263 "//! long",
2264 format("//! long long long long\n"
2265 "\n"
2266 "//! long",
2267 getLLVMStyleWithColumns(20)));
2268 EXPECT_EQ("/* long long long\n"
2269 " long\n"
2270 "\n"
2271 " long */",
2272 format("/* long long long long\n"
2273 "\n"
2274 " long */",
2275 getLLVMStyleWithColumns(20)));
2276 EXPECT_EQ("/* long long long\n"
2277 " * long\n"
2278 " *\n"
2279 " * long */",
2280 format("/* long long long long\n"
2281 " *\n"
2282 " * long */",
2283 getLLVMStyleWithColumns(20)));
2284
2285 // Don't reflow lines having content that is a single character.
2286 EXPECT_EQ("// long long long\n"
2287 "// long\n"
2288 "// l",
2289 format("// long long long long\n"
2290 "// l",
2291 getLLVMStyleWithColumns(20)));
2292
2293 // Don't reflow lines starting with two punctuation characters.
2294 EXPECT_EQ("// long long long\n"
2295 "// long\n"
2296 "// ... --- ...",
2297 format(
2298 "// long long long long\n"
2299 "// ... --- ...",
2300 getLLVMStyleWithColumns(20)));
Krasimir Georgiev8f62cf72017-01-31 11:38:02 +00002301
2302 // Don't reflow lines starting with '@'.
2303 EXPECT_EQ("// long long long\n"
2304 "// long\n"
2305 "// @param arg",
2306 format("// long long long long\n"
2307 "// @param arg",
2308 getLLVMStyleWithColumns(20)));
2309
Krasimir Georgiev91834222017-01-25 13:58:58 +00002310 // Reflow lines that have a non-punctuation character among their first 2
2311 // characters.
2312 EXPECT_EQ("// long long long\n"
2313 "// long 'long'",
2314 format(
2315 "// long long long long\n"
2316 "// 'long'",
2317 getLLVMStyleWithColumns(20)));
2318
2319 // Don't reflow between separate blocks of comments.
2320 EXPECT_EQ("/* First comment\n"
2321 " * block will */\n"
2322 "/* Snd\n"
2323 " */\n",
2324 format("/* First comment block\n"
2325 " * will */\n"
2326 "/* Snd\n"
2327 " */\n",
2328 getLLVMStyleWithColumns(20)));
2329
2330 // Don't reflow lines having different indentation.
2331 EXPECT_EQ("// long long long\n"
2332 "// long\n"
2333 "// long",
2334 format("// long long long long\n"
2335 "// long",
2336 getLLVMStyleWithColumns(20)));
2337
2338 // Don't break or reflow after implicit string literals.
2339 verifyFormat("#include <t> // l l l\n"
2340 " // l",
2341 getLLVMStyleWithColumns(20));
2342
2343 // Don't break or reflow comments on import lines.
2344 EXPECT_EQ("#include \"t\" /* l l l\n"
2345 " * l */",
2346 format("#include \"t\" /* l l l\n"
2347 " * l */",
2348 getLLVMStyleWithColumns(20)));
2349
2350 // Don't reflow between different trailing comment sections.
2351 EXPECT_EQ("int i; // long long\n"
2352 " // long\n"
2353 "int j; // long long\n"
2354 " // long\n",
2355 format("int i; // long long long\n"
2356 "int j; // long long long\n",
2357 getLLVMStyleWithColumns(20)));
2358
2359 // Don't reflow if the first word on the next line is longer than the
2360 // available space at current line.
2361 EXPECT_EQ("int i; // trigger\n"
2362 " // reflow\n"
2363 " // longsec\n",
2364 format("int i; // trigger reflow\n"
2365 " // longsec\n",
2366 getLLVMStyleWithColumns(20)));
2367
2368 // Keep empty comment lines.
2369 EXPECT_EQ("/**/", format(" /**/", getLLVMStyleWithColumns(20)));
2370 EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
2371 EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
2372 EXPECT_EQ("//", format(" // ", getLLVMStyleWithColumns(20)));
2373 EXPECT_EQ("///", format(" /// ", getLLVMStyleWithColumns(20)));
2374}
2375
Alexander Kornienkof2e02122013-05-24 18:24:24 +00002376TEST_F(FormatTest, IgnoresIf0Contents) {
2377 EXPECT_EQ("#if 0\n"
2378 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
2379 "#endif\n"
2380 "void f() {}",
2381 format("#if 0\n"
2382 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
2383 "#endif\n"
2384 "void f( ) { }"));
2385 EXPECT_EQ("#if false\n"
2386 "void f( ) { }\n"
2387 "#endif\n"
2388 "void g() {}\n",
2389 format("#if false\n"
2390 "void f( ) { }\n"
2391 "#endif\n"
2392 "void g( ) { }\n"));
2393 EXPECT_EQ("enum E {\n"
2394 " One,\n"
2395 " Two,\n"
2396 "#if 0\n"
2397 "Three,\n"
2398 " Four,\n"
2399 "#endif\n"
2400 " Five\n"
2401 "};",
2402 format("enum E {\n"
2403 " One,Two,\n"
2404 "#if 0\n"
2405 "Three,\n"
2406 " Four,\n"
2407 "#endif\n"
2408 " Five};"));
2409 EXPECT_EQ("enum F {\n"
2410 " One,\n"
2411 "#if 1\n"
2412 " Two,\n"
2413 "#if 0\n"
2414 "Three,\n"
2415 " Four,\n"
2416 "#endif\n"
2417 " Five\n"
2418 "#endif\n"
2419 "};",
2420 format("enum F {\n"
2421 "One,\n"
2422 "#if 1\n"
2423 "Two,\n"
2424 "#if 0\n"
2425 "Three,\n"
2426 " Four,\n"
2427 "#endif\n"
2428 "Five\n"
2429 "#endif\n"
2430 "};"));
2431 EXPECT_EQ("enum G {\n"
2432 " One,\n"
2433 "#if 0\n"
2434 "Two,\n"
2435 "#else\n"
2436 " Three,\n"
2437 "#endif\n"
2438 " Four\n"
2439 "};",
2440 format("enum G {\n"
2441 "One,\n"
2442 "#if 0\n"
2443 "Two,\n"
2444 "#else\n"
2445 "Three,\n"
2446 "#endif\n"
2447 "Four\n"
2448 "};"));
2449 EXPECT_EQ("enum H {\n"
2450 " One,\n"
2451 "#if 0\n"
2452 "#ifdef Q\n"
2453 "Two,\n"
2454 "#else\n"
2455 "Three,\n"
2456 "#endif\n"
2457 "#endif\n"
2458 " Four\n"
2459 "};",
2460 format("enum H {\n"
2461 "One,\n"
2462 "#if 0\n"
2463 "#ifdef Q\n"
2464 "Two,\n"
2465 "#else\n"
2466 "Three,\n"
2467 "#endif\n"
2468 "#endif\n"
2469 "Four\n"
2470 "};"));
2471 EXPECT_EQ("enum I {\n"
2472 " One,\n"
2473 "#if /* test */ 0 || 1\n"
2474 "Two,\n"
2475 "Three,\n"
2476 "#endif\n"
2477 " Four\n"
2478 "};",
2479 format("enum I {\n"
2480 "One,\n"
2481 "#if /* test */ 0 || 1\n"
2482 "Two,\n"
2483 "Three,\n"
2484 "#endif\n"
2485 "Four\n"
2486 "};"));
2487 EXPECT_EQ("enum J {\n"
2488 " One,\n"
2489 "#if 0\n"
2490 "#if 0\n"
2491 "Two,\n"
2492 "#else\n"
2493 "Three,\n"
2494 "#endif\n"
2495 "Four,\n"
2496 "#endif\n"
2497 " Five\n"
2498 "};",
2499 format("enum J {\n"
2500 "One,\n"
2501 "#if 0\n"
2502 "#if 0\n"
2503 "Two,\n"
2504 "#else\n"
2505 "Three,\n"
2506 "#endif\n"
2507 "Four,\n"
2508 "#endif\n"
2509 "Five\n"
2510 "};"));
Alexander Kornienkof2e02122013-05-24 18:24:24 +00002511}
2512
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002513//===----------------------------------------------------------------------===//
2514// Tests for classes, namespaces, etc.
2515//===----------------------------------------------------------------------===//
2516
2517TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002518 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002519}
2520
2521TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
2522 verifyFormat("class A {\n"
2523 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00002524 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002525 "protected:\n"
2526 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002527 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002528 "};");
2529 verifyGoogleFormat("class A {\n"
2530 " public:\n"
2531 " protected:\n"
2532 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002533 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002534 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00002535 verifyFormat("class A {\n"
2536 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002537 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00002538 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002539 " void f2() {}\n"
2540 "protected slots:\n"
2541 " void f3() {}\n"
2542 "protected Q_SLOTS:\n"
2543 " void f4() {}\n"
2544 "private slots:\n"
2545 " void f5() {}\n"
2546 "private Q_SLOTS:\n"
2547 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00002548 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002549 " void g1();\n"
2550 "Q_SIGNALS:\n"
2551 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00002552 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00002553
2554 // Don't interpret 'signals' the wrong way.
2555 verifyFormat("signals.set();");
2556 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00002557 verifyFormat("{\n"
2558 " signals.set(); // This needs indentation.\n"
2559 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00002560 verifyFormat("void f() {\n"
2561 "label:\n"
2562 " signals.baz();\n"
2563 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002564}
2565
Alexander Kornienkofd433362013-03-27 17:08:02 +00002566TEST_F(FormatTest, SeparatesLogicalBlocks) {
2567 EXPECT_EQ("class A {\n"
2568 "public:\n"
2569 " void f();\n"
2570 "\n"
2571 "private:\n"
2572 " void g() {}\n"
2573 " // test\n"
2574 "protected:\n"
2575 " int h;\n"
2576 "};",
2577 format("class A {\n"
2578 "public:\n"
2579 "void f();\n"
2580 "private:\n"
2581 "void g() {}\n"
2582 "// test\n"
2583 "protected:\n"
2584 "int h;\n"
2585 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00002586 EXPECT_EQ("class A {\n"
2587 "protected:\n"
2588 "public:\n"
2589 " void f();\n"
2590 "};",
2591 format("class A {\n"
2592 "protected:\n"
2593 "\n"
2594 "public:\n"
2595 "\n"
2596 " void f();\n"
2597 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00002598
2599 // Even ensure proper spacing inside macros.
2600 EXPECT_EQ("#define B \\\n"
2601 " class A { \\\n"
2602 " protected: \\\n"
2603 " public: \\\n"
2604 " void f(); \\\n"
2605 " };",
2606 format("#define B \\\n"
2607 " class A { \\\n"
2608 " protected: \\\n"
2609 " \\\n"
2610 " public: \\\n"
2611 " \\\n"
2612 " void f(); \\\n"
2613 " };",
2614 getGoogleStyle()));
2615 // But don't remove empty lines after macros ending in access specifiers.
2616 EXPECT_EQ("#define A private:\n"
2617 "\n"
2618 "int i;",
2619 format("#define A private:\n"
2620 "\n"
2621 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00002622}
2623
Daniel Jasper83193602013-04-05 17:22:09 +00002624TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002625 verifyFormat("class A : public B {};");
2626 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002627
2628 verifyFormat(
2629 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002630 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00002631 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
2632 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002633 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002634 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002635 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002636 verifyFormat("class AAAAAAAAAAAA : public B,\n"
2637 " public C,\n"
2638 " public D,\n"
2639 " public E,\n"
2640 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002641 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00002642
2643 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002644 " ReallyReallyLongClassName {\n"
2645 " int i;\n"
2646 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00002647 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00002648 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
2649 " aaaaaaaaaaaaaaaa> {};");
2650 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
2651 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
2652 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00002653 verifyFormat("template <class R, class C>\n"
2654 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
2655 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00002656 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00002657}
2658
Manuel Klimek28cacc72013-01-07 18:10:23 +00002659TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002660 verifyFormat("class A {\n} a, b;");
2661 verifyFormat("struct A {\n} a, b;");
2662 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00002663}
2664
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002665TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002666 verifyFormat("enum {\n"
2667 " Zero,\n"
2668 " One = 1,\n"
2669 " Two = One + 1,\n"
2670 " Three = (One + Two),\n"
2671 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2672 " Five = (One, Two, Three, Four, 5)\n"
2673 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002674 verifyGoogleFormat("enum {\n"
2675 " Zero,\n"
2676 " One = 1,\n"
2677 " Two = One + 1,\n"
2678 " Three = (One + Two),\n"
2679 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2680 " Five = (One, Two, Three, Four, 5)\n"
2681 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002682 verifyFormat("enum Enum {};");
2683 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002684 verifyFormat("enum X E {} d;");
2685 verifyFormat("enum __attribute__((...)) E {} d;");
2686 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00002687 verifyFormat("enum {\n"
2688 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002689 "};",
2690 getLLVMStyleWithColumns(30));
2691
2692 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00002693 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002694
2695 EXPECT_EQ("enum KeepEmptyLines {\n"
2696 " ONE,\n"
2697 "\n"
2698 " TWO,\n"
2699 "\n"
2700 " THREE\n"
2701 "}",
2702 format("enum KeepEmptyLines {\n"
2703 " ONE,\n"
2704 "\n"
2705 " TWO,\n"
2706 "\n"
2707 "\n"
2708 " THREE\n"
2709 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00002710 verifyFormat("enum E { // comment\n"
2711 " ONE,\n"
2712 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00002713 "};\n"
2714 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002715 // Not enums.
2716 verifyFormat("enum X f() {\n"
2717 " a();\n"
2718 " return 42;\n"
2719 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00002720 verifyFormat("enum X Type::f() {\n"
2721 " a();\n"
2722 " return 42;\n"
2723 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002724 verifyFormat("enum ::X f() {\n"
2725 " a();\n"
2726 " return 42;\n"
2727 "}");
2728 verifyFormat("enum ns::X f() {\n"
2729 " a();\n"
2730 " return 42;\n"
2731 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002732}
2733
Daniel Jasperb7150872013-08-30 10:10:19 +00002734TEST_F(FormatTest, FormatsEnumsWithErrors) {
2735 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002736 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002737 " Two = 1;\n"
2738 "};");
2739 verifyFormat("namespace n {\n"
2740 "enum Type {\n"
2741 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002742 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002743 " int i;\n"
2744 "}\n"
2745 "void g() {}");
2746}
2747
Daniel Jasper2b41a822013-08-20 12:42:50 +00002748TEST_F(FormatTest, FormatsEnumStruct) {
2749 verifyFormat("enum struct {\n"
2750 " Zero,\n"
2751 " One = 1,\n"
2752 " Two = One + 1,\n"
2753 " Three = (One + Two),\n"
2754 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2755 " Five = (One, Two, Three, Four, 5)\n"
2756 "};");
2757 verifyFormat("enum struct Enum {};");
2758 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002759 verifyFormat("enum struct X E {} d;");
2760 verifyFormat("enum struct __attribute__((...)) E {} d;");
2761 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002762 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
2763}
2764
2765TEST_F(FormatTest, FormatsEnumClass) {
2766 verifyFormat("enum class {\n"
2767 " Zero,\n"
2768 " One = 1,\n"
2769 " Two = One + 1,\n"
2770 " Three = (One + Two),\n"
2771 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2772 " Five = (One, Two, Three, Four, 5)\n"
2773 "};");
2774 verifyFormat("enum class Enum {};");
2775 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002776 verifyFormat("enum class X E {} d;");
2777 verifyFormat("enum class __attribute__((...)) E {} d;");
2778 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002779 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
2780}
2781
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002782TEST_F(FormatTest, FormatsEnumTypes) {
2783 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002784 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002785 " B\n"
2786 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00002787 verifyFormat("enum X : int { A, B };");
2788 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002789}
2790
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002791TEST_F(FormatTest, FormatsNSEnums) {
2792 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
2793 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
2794 " // Information about someDecentlyLongValue.\n"
2795 " someDecentlyLongValue,\n"
2796 " // Information about anotherDecentlyLongValue.\n"
2797 " anotherDecentlyLongValue,\n"
2798 " // Information about aThirdDecentlyLongValue.\n"
2799 " aThirdDecentlyLongValue\n"
2800 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00002801 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
2802 " a = 1,\n"
2803 " b = 2,\n"
2804 " c = 3,\n"
2805 "};");
2806 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
2807 " a = 1,\n"
2808 " b = 2,\n"
2809 " c = 3,\n"
2810 "};");
2811 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
2812 " a = 1,\n"
2813 " b = 2,\n"
2814 " c = 3,\n"
2815 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002816}
2817
Nico Weber7769a902013-01-14 05:49:49 +00002818TEST_F(FormatTest, FormatsBitfields) {
2819 verifyFormat("struct Bitfields {\n"
2820 " unsigned sClass : 8;\n"
2821 " unsigned ValueKind : 2;\n"
2822 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00002823 verifyFormat("struct A {\n"
2824 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
2825 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
2826 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00002827 verifyFormat("struct MyStruct {\n"
2828 " uchar data;\n"
2829 " uchar : 8;\n"
2830 " uchar : 8;\n"
2831 " uchar other;\n"
2832 "};");
Nico Weber7769a902013-01-14 05:49:49 +00002833}
2834
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002835TEST_F(FormatTest, FormatsNamespaces) {
2836 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002837 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002838 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002839 "}");
2840 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002841 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002842 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002843 "}");
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002844 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002845 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002846 "void f() { f(); }\n"
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002847 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002848 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002849 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002850 "void f() { f(); }");
Manuel Klimek046b9302013-02-06 16:08:09 +00002851
2852 // This code is more common than we thought; if we
2853 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002854 // its own line, which is undesirable.
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002855 verifyFormat("namespace {};");
Manuel Klimek046b9302013-02-06 16:08:09 +00002856 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002857 "class A {};\n"
Manuel Klimek046b9302013-02-06 16:08:09 +00002858 "};");
Daniel Jasper251b3c92013-07-01 11:22:57 +00002859
2860 verifyFormat("namespace {\n"
2861 "int SomeVariable = 0; // comment\n"
2862 "} // namespace");
2863 EXPECT_EQ("#ifndef HEADER_GUARD\n"
2864 "#define HEADER_GUARD\n"
2865 "namespace my_namespace {\n"
2866 "int i;\n"
2867 "} // my_namespace\n"
2868 "#endif // HEADER_GUARD",
2869 format("#ifndef HEADER_GUARD\n"
2870 " #define HEADER_GUARD\n"
2871 " namespace my_namespace {\n"
2872 "int i;\n"
2873 "} // my_namespace\n"
2874 "#endif // HEADER_GUARD"));
Daniel Jasper65ee3472013-07-31 23:16:02 +00002875
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00002876 EXPECT_EQ("namespace A::B {\n"
2877 "class C {};\n"
2878 "}",
2879 format("namespace A::B {\n"
2880 "class C {};\n"
2881 "}"));
2882
Daniel Jasper65ee3472013-07-31 23:16:02 +00002883 FormatStyle Style = getLLVMStyle();
2884 Style.NamespaceIndentation = FormatStyle::NI_All;
2885 EXPECT_EQ("namespace out {\n"
2886 " int i;\n"
2887 " namespace in {\n"
2888 " int i;\n"
2889 " } // namespace\n"
2890 "} // namespace",
2891 format("namespace out {\n"
2892 "int i;\n"
2893 "namespace in {\n"
2894 "int i;\n"
2895 "} // namespace\n"
2896 "} // namespace",
2897 Style));
2898
2899 Style.NamespaceIndentation = FormatStyle::NI_Inner;
2900 EXPECT_EQ("namespace out {\n"
2901 "int i;\n"
2902 "namespace in {\n"
2903 " int i;\n"
2904 "} // namespace\n"
2905 "} // namespace",
2906 format("namespace out {\n"
2907 "int i;\n"
2908 "namespace in {\n"
2909 "int i;\n"
2910 "} // namespace\n"
2911 "} // namespace",
2912 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002913}
2914
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002915TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00002916
Daniel Jasper40aacf42013-03-14 13:45:21 +00002917TEST_F(FormatTest, FormatsInlineASM) {
2918 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00002919 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00002920 verifyFormat(
2921 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2922 " \"cpuid\\n\\t\"\n"
2923 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00002924 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00002925 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00002926 EXPECT_EQ(
2927 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002928 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002929 " mov edx,[that] // vtable in edx\n"
2930 " mov eax,methodIndex\n"
2931 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002932 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002933 "}",
2934 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2935 " __asm {\n"
2936 " mov edx,[that] // vtable in edx\n"
2937 " mov eax,methodIndex\n"
2938 " call [edx][eax*4] // stdcall\n"
2939 " }\n"
2940 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00002941 EXPECT_EQ("_asm {\n"
2942 " xor eax, eax;\n"
2943 " cpuid;\n"
2944 "}",
2945 format("_asm {\n"
2946 " xor eax, eax;\n"
2947 " cpuid;\n"
2948 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00002949 verifyFormat("void function() {\n"
2950 " // comment\n"
2951 " asm(\"\");\n"
2952 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00002953 EXPECT_EQ("__asm {\n"
2954 "}\n"
2955 "int i;",
2956 format("__asm {\n"
2957 "}\n"
2958 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00002959}
2960
Nico Weberd5650bd2013-01-07 16:36:17 +00002961TEST_F(FormatTest, FormatTryCatch) {
2962 verifyFormat("try {\n"
2963 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002964 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002965 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002966 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002967 " exit(42);\n"
2968 "}");
2969
2970 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00002971 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002972 " return 5;\n"
2973 "}");
2974 verifyFormat("class A {\n"
2975 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002976 " A() try : a(0) {\n"
2977 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002978 " throw;\n"
2979 " }\n"
2980 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00002981
2982 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002983 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00002984}
2985
Nico Weberfac23712015-02-04 15:26:27 +00002986TEST_F(FormatTest, FormatSEHTryCatch) {
2987 verifyFormat("__try {\n"
2988 " int a = b * c;\n"
2989 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2990 " // Do nothing.\n"
2991 "}");
2992
2993 verifyFormat("__try {\n"
2994 " int a = b * c;\n"
2995 "} __finally {\n"
2996 " // Do nothing.\n"
2997 "}");
2998
2999 verifyFormat("DEBUG({\n"
3000 " __try {\n"
3001 " } __finally {\n"
3002 " }\n"
3003 "});\n");
3004}
3005
Daniel Jasper04a71a42014-05-08 11:58:24 +00003006TEST_F(FormatTest, IncompleteTryCatchBlocks) {
3007 verifyFormat("try {\n"
3008 " f();\n"
3009 "} catch {\n"
3010 " g();\n"
3011 "}");
3012 verifyFormat("try {\n"
3013 " f();\n"
3014 "} catch (A a) MACRO(x) {\n"
3015 " g();\n"
3016 "} catch (B b) MACRO(x) {\n"
3017 " g();\n"
3018 "}");
3019}
3020
3021TEST_F(FormatTest, FormatTryCatchBraceStyles) {
3022 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00003023 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
3024 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00003025 Style.BreakBeforeBraces = BraceStyle;
3026 verifyFormat("try {\n"
3027 " // something\n"
3028 "} catch (...) {\n"
3029 " // something\n"
3030 "}",
3031 Style);
3032 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00003033 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
3034 verifyFormat("try {\n"
3035 " // something\n"
3036 "}\n"
3037 "catch (...) {\n"
3038 " // something\n"
3039 "}",
3040 Style);
Nico Weberfac23712015-02-04 15:26:27 +00003041 verifyFormat("__try {\n"
3042 " // something\n"
3043 "}\n"
3044 "__finally {\n"
3045 " // something\n"
3046 "}",
3047 Style);
Nico Weber33381f52015-02-07 01:57:32 +00003048 verifyFormat("@try {\n"
3049 " // something\n"
3050 "}\n"
3051 "@finally {\n"
3052 " // something\n"
3053 "}",
3054 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00003055 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3056 verifyFormat("try\n"
3057 "{\n"
3058 " // something\n"
3059 "}\n"
3060 "catch (...)\n"
3061 "{\n"
3062 " // something\n"
3063 "}",
3064 Style);
3065 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
3066 verifyFormat("try\n"
3067 " {\n"
3068 " // something\n"
3069 " }\n"
3070 "catch (...)\n"
3071 " {\n"
3072 " // something\n"
3073 " }",
3074 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00003075 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
3076 Style.BraceWrapping.BeforeCatch = true;
3077 verifyFormat("try {\n"
3078 " // something\n"
3079 "}\n"
3080 "catch (...) {\n"
3081 " // something\n"
3082 "}",
3083 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00003084}
3085
Daniel Jaspere25509f2012-12-17 11:29:41 +00003086TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003087 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00003088
Daniel Jaspera44991332015-04-29 13:06:49 +00003089 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
3090 " 100000000, "
3091 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00003092
Daniel Jasper473c62c2013-05-17 09:35:01 +00003093 // Here, everything other than the "}" would fit on a line.
3094 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003095 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00003096 EXPECT_EQ("S s = {a,\n"
3097 "\n"
3098 " b};",
3099 format("S s = {\n"
3100 " a,\n"
3101 "\n"
3102 " b\n"
3103 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00003104
3105 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
3106 // line. However, the formatting looks a bit off and this probably doesn't
3107 // happen often in practice.
3108 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003109 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00003110 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00003111}
3112
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003113TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003114 verifyFormat("const struct A a = {.a = 1, .b = 2};");
3115 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
3116 " .bbbbbbbbbb = 2,\n"
3117 " .cccccccccc = 3,\n"
3118 " .dddddddddd = 4,\n"
3119 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003120 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003121 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
3122 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
3123 " .ccccccccccccccccccccccccccc = 3,\n"
3124 " .ddddddddddddddddddddddddddd = 4,\n"
3125 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003126
3127 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
3128}
3129
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003130TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003131 verifyFormat("static A x = {{{}}};\n");
3132 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
3133 " {init1, init2, init3, init4}}};",
3134 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00003135
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003136 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003137 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
3138 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
3139 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
3140 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00003141 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00003142 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
3143 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
3144 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00003145 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
3146 " {rect.fRight - rect.fLeft, rect.fBottom - "
3147 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003148
Daniel Jasper8a8ce242013-01-31 14:59:26 +00003149 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00003150 "SomeArrayOfSomeType a = {\n"
3151 " {{1, 2, 3},\n"
3152 " {1, 2, 3},\n"
3153 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
3154 " 333333333333333333333333333333},\n"
3155 " {1, 2, 3},\n"
3156 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00003157 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00003158 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00003159 " {{1, 2, 3}},\n"
3160 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00003161 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
3162 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00003163 " {{1, 2, 3}},\n"
3164 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00003165
Daniel Jaspera44991332015-04-29 13:06:49 +00003166 verifyFormat("struct {\n"
3167 " unsigned bit;\n"
3168 " const char *const name;\n"
3169 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
3170 " {kOsWin, \"Windows\"},\n"
3171 " {kOsLinux, \"Linux\"},\n"
3172 " {kOsCrOS, \"Chrome OS\"}};");
3173 verifyFormat("struct {\n"
3174 " unsigned bit;\n"
3175 " const char *const name;\n"
3176 "} kBitsToOs[] = {\n"
3177 " {kOsMac, \"Mac\"},\n"
3178 " {kOsWin, \"Windows\"},\n"
3179 " {kOsLinux, \"Linux\"},\n"
3180 " {kOsCrOS, \"Chrome OS\"},\n"
3181 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003182}
3183
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003184TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
3185 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3186 " \\\n"
3187 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
3188}
3189
Daniel Jasperda16db32013-01-07 10:48:50 +00003190TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00003191 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
3192 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00003193
3194 // Do break defaulted and deleted functions.
3195 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
3196 " default;",
3197 getLLVMStyleWithColumns(40));
3198 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
3199 " delete;",
3200 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00003201}
3202
3203TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
3204 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
3205 getLLVMStyleWithColumns(40));
3206 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
3207 getLLVMStyleWithColumns(40));
3208 EXPECT_EQ("#define Q \\\n"
3209 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
3210 " \"aaaaaaaa.cpp\"",
3211 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
3212 getLLVMStyleWithColumns(40)));
3213}
3214
3215TEST_F(FormatTest, UnderstandsLinePPDirective) {
3216 EXPECT_EQ("# 123 \"A string literal\"",
3217 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00003218}
3219
Manuel Klimek591b5802013-01-31 15:58:48 +00003220TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00003221 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00003222 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003223}
3224
3225TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
3226 EXPECT_EQ("#line 42 \"test\"\n",
3227 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003228 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
3229 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003230}
3231
3232TEST_F(FormatTest, EndOfFileEndsPPDirective) {
3233 EXPECT_EQ("#line 42 \"test\"",
3234 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003235 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003236}
3237
Daniel Jasper877615c2013-10-11 19:45:02 +00003238TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
3239 verifyFormat("#define A \\x20");
3240 verifyFormat("#define A \\ x20");
3241 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
3242 verifyFormat("#define A ''");
3243 verifyFormat("#define A ''qqq");
3244 verifyFormat("#define A `qqq");
3245 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00003246 EXPECT_EQ("const char *c = STRINGIFY(\n"
3247 "\\na : b);",
3248 format("const char * c = STRINGIFY(\n"
3249 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00003250
3251 verifyFormat("a\r\\");
3252 verifyFormat("a\v\\");
3253 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00003254}
3255
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003256TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003257 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
3258 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003259 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003260 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00003261 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00003262
3263 verifyFormat("#define A A\n#define A A");
3264 verifyFormat("#define A(X) A\n#define A A");
3265
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003266 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
3267 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003268}
3269
3270TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00003271 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003272 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003273 "#define A( \\\n"
3274 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003275 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00003276 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00003277 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003278 " #include \"a.h\"\n"
3279 "#define A(A,\\\n"
3280 " B)\n"
3281 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00003282 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003283 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003284}
3285
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003286TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00003287
3288TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
3289 EXPECT_EQ("#define A \\\n"
3290 " c; \\\n"
3291 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003292 "f;",
3293 format("#define A c; e;\n"
3294 "f;",
3295 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00003296}
3297
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003298TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00003299
Manuel Klimek1abf7892013-01-04 23:34:14 +00003300TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00003301 EXPECT_EQ("int x,\n"
3302 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003303 " y;",
3304 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00003305}
3306
Manuel Klimek09e07972013-01-05 21:34:55 +00003307TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00003308 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00003309 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00003310 verifyFormat("#define A \\\n"
3311 " { \\\n"
3312 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003313 " }",
3314 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00003315
3316 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003317 " void function##X()",
3318 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00003319
3320 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003321 " void a##b##c()",
3322 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00003323
Daniel Jasper39825ea2013-01-14 15:40:57 +00003324 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00003325}
3326
Manuel Klimekd053c5b2013-01-23 14:37:36 +00003327TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00003328 EXPECT_EQ("#define A (x)", format("#define A (x)"));
3329 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00003330}
3331
Manuel Klimek0c137952013-02-11 12:33:24 +00003332TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
3333 EXPECT_EQ("#define A b;", format("#define A \\\n"
3334 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003335 " b;",
3336 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003337 EXPECT_EQ("#define A \\\n"
3338 " \\\n"
3339 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003340 " b;",
3341 format("#define A \\\n"
3342 " \\\n"
3343 " a; \\\n"
3344 " b;",
3345 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003346 EXPECT_EQ("#define A \\\n"
3347 " a; \\\n"
3348 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003349 " b;",
3350 format("#define A \\\n"
3351 " a; \\\n"
3352 " \\\n"
3353 " b;",
3354 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003355}
3356
Daniel Jasper00475962013-02-19 17:14:38 +00003357TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003358 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00003359 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00003360 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00003361 " case 2\n",
3362 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00003363 verifyFormat("#define MACRO(a) \\\n"
3364 " if (a) \\\n"
3365 " f(); \\\n"
3366 " else \\\n"
3367 " g()",
3368 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00003369 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003370 verifyIncompleteFormat("#define STR(x) #x\n"
3371 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00003372 verifyFormat("#pragma omp threadprivate( \\\n"
3373 " y)), // expected-warning",
3374 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00003375 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00003376 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003377 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00003378 "#define b \\\n"
3379 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003380 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003381 "a",
3382 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00003383 verifyFormat("#define A \\\n"
3384 " { \\\n"
3385 " {\n"
3386 "#define B \\\n"
3387 " } \\\n"
3388 " }",
3389 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00003390 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00003391 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00003392 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00003393 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00003394}
3395
Daniel Jasper40e19212013-05-29 13:16:10 +00003396TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
3397 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
3398 EXPECT_EQ("class A : public QObject {\n"
3399 " Q_OBJECT\n"
3400 "\n"
3401 " A() {}\n"
3402 "};",
3403 format("class A : public QObject {\n"
3404 " Q_OBJECT\n"
3405 "\n"
3406 " A() {\n}\n"
3407 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00003408 EXPECT_EQ("MACRO\n"
3409 "/*static*/ int i;",
3410 format("MACRO\n"
3411 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00003412 EXPECT_EQ("SOME_MACRO\n"
3413 "namespace {\n"
3414 "void f();\n"
3415 "}",
3416 format("SOME_MACRO\n"
3417 " namespace {\n"
3418 "void f( );\n"
3419 "}"));
Daniel Jasper40e19212013-05-29 13:16:10 +00003420 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00003421 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
3422 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00003423 // Only if everything is upper case.
3424 EXPECT_EQ("class A : public QObject {\n"
3425 " Q_Object A() {}\n"
3426 "};",
3427 format("class A : public QObject {\n"
3428 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00003429 " A() {\n}\n"
3430 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00003431
3432 // Only if the next line can actually start an unwrapped line.
3433 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
3434 format("SOME_WEIRD_LOG_MACRO\n"
3435 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00003436
3437 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00003438 "(n, buffers))\n",
3439 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00003440}
3441
Alexander Kornienkode644272013-04-08 22:16:06 +00003442TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
3443 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3444 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3445 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003446 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00003447 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3448 "int *createScopDetectionPass() { return 0; }",
3449 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3450 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3451 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
3452 " class X {};\n"
3453 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3454 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003455 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
3456 // braces, so that inner block is indented one level more.
3457 EXPECT_EQ("int q() {\n"
3458 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3459 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3460 " IPC_END_MESSAGE_MAP()\n"
3461 "}",
3462 format("int q() {\n"
3463 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3464 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3465 " IPC_END_MESSAGE_MAP()\n"
3466 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00003467
Daniel Jasper352dae12014-01-03 11:50:46 +00003468 // Same inside macros.
3469 EXPECT_EQ("#define LIST(L) \\\n"
3470 " L(A) \\\n"
3471 " L(B) \\\n"
3472 " L(C)",
3473 format("#define LIST(L) \\\n"
3474 " L(A) \\\n"
3475 " L(B) \\\n"
3476 " L(C)",
3477 getGoogleStyle()));
3478
Daniel Jasper545c6522013-09-17 09:26:07 +00003479 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003480 EXPECT_EQ("int q() {\n"
3481 " f(x);\n"
3482 " f(x) {}\n"
3483 " f(x)->g();\n"
3484 " f(x)->*g();\n"
3485 " f(x).g();\n"
3486 " f(x) = x;\n"
3487 " f(x) += x;\n"
3488 " f(x) -= x;\n"
3489 " f(x) *= x;\n"
3490 " f(x) /= x;\n"
3491 " f(x) %= x;\n"
3492 " f(x) &= x;\n"
3493 " f(x) |= x;\n"
3494 " f(x) ^= x;\n"
3495 " f(x) >>= x;\n"
3496 " f(x) <<= x;\n"
3497 " f(x)[y].z();\n"
3498 " LOG(INFO) << x;\n"
3499 " ifstream(x) >> x;\n"
3500 "}\n",
3501 format("int q() {\n"
3502 " f(x)\n;\n"
3503 " f(x)\n {}\n"
3504 " f(x)\n->g();\n"
3505 " f(x)\n->*g();\n"
3506 " f(x)\n.g();\n"
3507 " f(x)\n = x;\n"
3508 " f(x)\n += x;\n"
3509 " f(x)\n -= x;\n"
3510 " f(x)\n *= x;\n"
3511 " f(x)\n /= x;\n"
3512 " f(x)\n %= x;\n"
3513 " f(x)\n &= x;\n"
3514 " f(x)\n |= x;\n"
3515 " f(x)\n ^= x;\n"
3516 " f(x)\n >>= x;\n"
3517 " f(x)\n <<= x;\n"
3518 " f(x)\n[y].z();\n"
3519 " LOG(INFO)\n << x;\n"
3520 " ifstream(x)\n >> x;\n"
3521 "}\n"));
3522 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003523 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003524 " if (1) {\n"
3525 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003526 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003527 " while (1) {\n"
3528 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003529 " F(x)\n"
3530 " G(x);\n"
3531 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003532 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003533 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003534 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003535 " }\n"
3536 "}\n",
3537 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003538 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003539 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003540 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003541 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003542 "F(x)\n"
3543 "G(x);\n"
3544 "F(x)\n"
3545 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003546 "}\n"));
3547 EXPECT_EQ("class A {\n"
3548 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00003549 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003550 " A(X x)\n" // FIXME: function-level try blocks are broken.
3551 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003552 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003553 " }\n"
3554 "};",
3555 format("class A {\n"
3556 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00003557 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003558 " A(X x)\n"
3559 " try : t(0) {} catch (...) {}\n"
3560 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00003561 EXPECT_EQ("class SomeClass {\n"
3562 "public:\n"
3563 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3564 "};",
3565 format("class SomeClass {\n"
3566 "public:\n"
3567 " SomeClass()\n"
3568 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3569 "};"));
3570 EXPECT_EQ("class SomeClass {\n"
3571 "public:\n"
3572 " SomeClass()\n"
3573 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3574 "};",
3575 format("class SomeClass {\n"
3576 "public:\n"
3577 " SomeClass()\n"
3578 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3579 "};",
3580 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00003581
3582 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00003583}
3584
Manuel Klimek4fe43002013-05-22 12:51:29 +00003585TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
3586 verifyFormat("#define A \\\n"
3587 " f({ \\\n"
3588 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003589 " });",
3590 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00003591}
3592
Manuel Klimekef2cfb12013-01-05 22:14:16 +00003593TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
3594 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
3595}
3596
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003597TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003598 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003599}
3600
Manuel Klimek1058d982013-01-06 20:07:31 +00003601TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3602 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
3603 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3604 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
3605 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3606}
Manuel Klimek1abf7892013-01-04 23:34:14 +00003607
Daniel Jaspere2408e32015-05-06 11:16:43 +00003608TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003609 EXPECT_EQ(
3610 "#define A \\\n int i; \\\n int j;",
3611 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003612 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00003613 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003614 EXPECT_EQ("/* \\ \\ \\\n*/", format("\\\n/* \\ \\ \\\n*/"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00003615 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003616}
3617
Alexander Kornienko00691cf2015-01-12 13:11:12 +00003618TEST_F(FormatTest, DontCrashOnBlockComments) {
3619 EXPECT_EQ(
3620 "int xxxxxxxxx; /* "
3621 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\n"
3622 "zzzzzz\n"
3623 "0*/",
3624 format("int xxxxxxxxx; /* "
3625 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzz\n"
3626 "0*/"));
3627}
3628
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003629TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3630 verifyFormat("#define A \\\n"
3631 " int v( \\\n"
3632 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003633 " int i;",
3634 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003635}
3636
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003637TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00003638 EXPECT_EQ(
3639 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3640 " \\\n"
3641 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3642 "\n"
3643 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3644 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3645 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
3646 "\\\n"
3647 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3648 " \n"
3649 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3650 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003651}
3652
Manuel Klimek52b15152013-01-09 15:25:02 +00003653TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3654 EXPECT_EQ("int\n"
3655 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003656 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003657 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003658 verifyFormat("functionCallTo(\n"
3659 " someOtherFunction(\n"
3660 " withSomeParameters, whichInSequence,\n"
3661 " areLongerThanALine(andAnotherCall,\n"
3662 "#define A B\n"
3663 " withMoreParamters,\n"
3664 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003665 " andMoreParameters),\n"
3666 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003667 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00003668 verifyFormat("Foo::Foo()\n"
3669 "#ifdef BAR\n"
3670 " : baz(0)\n"
3671 "#endif\n"
3672 "{\n"
3673 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00003674 verifyFormat("void f() {\n"
3675 " if (true)\n"
3676 "#ifdef A\n"
3677 " f(42);\n"
3678 " x();\n"
3679 "#else\n"
3680 " g();\n"
3681 " x();\n"
3682 "#endif\n"
3683 "}");
3684 verifyFormat("void f(param1, param2,\n"
3685 " param3,\n"
3686 "#ifdef A\n"
3687 " param4(param5,\n"
3688 "#ifdef A1\n"
3689 " param6,\n"
3690 "#ifdef A2\n"
3691 " param7),\n"
3692 "#else\n"
3693 " param8),\n"
3694 " param9,\n"
3695 "#endif\n"
3696 " param10,\n"
3697 "#endif\n"
3698 " param11)\n"
3699 "#else\n"
3700 " param12)\n"
3701 "#endif\n"
3702 "{\n"
3703 " x();\n"
3704 "}",
3705 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00003706 verifyFormat("#if 1\n"
3707 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003708 verifyFormat("#if 1\n"
3709 "#endif\n"
3710 "#if 1\n"
3711 "#else\n"
3712 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00003713 verifyFormat("DEBUG({\n"
3714 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3715 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3716 "});\n"
3717 "#if a\n"
3718 "#else\n"
3719 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00003720
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003721 verifyIncompleteFormat("void f(\n"
3722 "#if A\n"
3723 " );\n"
3724 "#else\n"
3725 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00003726}
3727
Manuel Klimek14bd9172014-01-29 08:49:02 +00003728TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3729 verifyFormat("#endif\n"
3730 "#if B");
3731}
3732
Manuel Klimek88033d72013-10-21 08:11:15 +00003733TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3734 FormatStyle SingleLine = getLLVMStyle();
3735 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00003736 verifyFormat("#if 0\n"
3737 "#elif 1\n"
3738 "#endif\n"
3739 "void foo() {\n"
3740 " if (test) foo2();\n"
3741 "}",
3742 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00003743}
3744
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003745TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00003746 verifyFormat("functionCall({ int i; });");
3747 verifyFormat("functionCall({\n"
3748 " int i;\n"
3749 " int j;\n"
3750 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00003751 verifyFormat("functionCall(\n"
3752 " {\n"
3753 " int i;\n"
3754 " int j;\n"
3755 " },\n"
3756 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00003757 verifyFormat("functionA(functionB({\n"
3758 " int i;\n"
3759 " int j;\n"
3760 " }),\n"
3761 " aaaa, bbbb, cccc);");
3762 verifyFormat("functionCall(\n"
3763 " {\n"
3764 " int i;\n"
3765 " int j;\n"
3766 " },\n"
3767 " aaaa, bbbb, // comment\n"
3768 " cccc);");
3769 verifyFormat("functionA(functionB({\n"
3770 " int i;\n"
3771 " int j;\n"
3772 " }),\n"
3773 " aaaa, bbbb, // comment\n"
3774 " cccc);");
3775 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3776 verifyFormat("functionCall(aaaa, bbbb, {\n"
3777 " int i;\n"
3778 " int j;\n"
3779 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00003780 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00003781 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00003782 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003783 " int i; // break\n"
3784 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00003785 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3786 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003787 verifyFormat("DEBUG({\n"
3788 " if (a)\n"
3789 " f();\n"
3790 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003791}
3792
3793TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003794 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003795 "int i;",
3796 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003797}
3798
3799TEST_F(FormatTest, LayoutNestedBlocks) {
3800 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3801 " struct s {\n"
3802 " int i;\n"
3803 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003804 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003805 " for (int i = 0; i < 10; ++i)\n"
3806 " return;\n"
3807 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003808 verifyFormat("call(parameter, {\n"
3809 " something();\n"
3810 " // Comment using all columns.\n"
3811 " somethingelse();\n"
3812 "});",
3813 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00003814 verifyFormat("DEBUG( //\n"
3815 " { f(); }, a);");
3816 verifyFormat("DEBUG( //\n"
3817 " {\n"
3818 " f(); //\n"
3819 " },\n"
3820 " a);");
3821
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003822 EXPECT_EQ("call(parameter, {\n"
3823 " something();\n"
3824 " // Comment too\n"
3825 " // looooooooooong.\n"
3826 " somethingElse();\n"
3827 "});",
3828 format("call(parameter, {\n"
3829 " something();\n"
3830 " // Comment too looooooooooong.\n"
3831 " somethingElse();\n"
3832 "});",
3833 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003834 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003835 EXPECT_EQ("DEBUG({ // comment\n"
3836 " int i;\n"
3837 "});",
3838 format("DEBUG({ // comment\n"
3839 "int i;\n"
3840 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003841 EXPECT_EQ("DEBUG({\n"
3842 " int i;\n"
3843 "\n"
3844 " // comment\n"
3845 " int j;\n"
3846 "});",
3847 format("DEBUG({\n"
3848 " int i;\n"
3849 "\n"
3850 " // comment\n"
3851 " int j;\n"
3852 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003853
3854 verifyFormat("DEBUG({\n"
3855 " if (a)\n"
3856 " return;\n"
3857 "});");
3858 verifyGoogleFormat("DEBUG({\n"
3859 " if (a) return;\n"
3860 "});");
3861 FormatStyle Style = getGoogleStyle();
3862 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003863 verifyFormat("Debug(aaaaa,\n"
3864 " {\n"
3865 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3866 " },\n"
3867 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003868 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003869
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003870 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3871
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003872 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003873}
3874
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003875TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3876 EXPECT_EQ("#define MACRO() \\\n"
3877 " Debug(aaa, /* force line break */ \\\n"
3878 " { \\\n"
3879 " int i; \\\n"
3880 " int j; \\\n"
3881 " })",
3882 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3883 " { int i; int j; })",
3884 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003885
3886 EXPECT_EQ("#define A \\\n"
3887 " [] { \\\n"
3888 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3889 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3890 " }",
3891 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3892 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3893 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003894}
3895
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003896TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3897 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003898 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003899 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003900}
3901
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003902TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3903 FormatStyle Style = getLLVMStyle();
3904 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3905 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3906 verifyFormat("FOO_BEGIN\n"
3907 " FOO_ENTRY\n"
3908 "FOO_END", Style);
3909 verifyFormat("FOO_BEGIN\n"
3910 " NESTED_FOO_BEGIN\n"
3911 " NESTED_FOO_ENTRY\n"
3912 " NESTED_FOO_END\n"
3913 "FOO_END", Style);
3914 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3915 " int x;\n"
3916 " x = 1;\n"
3917 "FOO_END(Baz)", Style);
3918}
3919
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003920//===----------------------------------------------------------------------===//
3921// Line break tests.
3922//===----------------------------------------------------------------------===//
3923
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003924TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003925 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003926 "void f() {\n"
3927 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3928 " parameter, parameter, parameter)),\n"
3929 " SecondLongCall(parameter));\n"
3930 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003931 verifyFormat(
3932 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3933 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3934 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3935 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3936 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003937 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3938 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3939 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3940 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003941 verifyFormat(
3942 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3943 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3944 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3945 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003946 verifyFormat("int a = bbbb && ccc &&\n"
3947 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003948 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003949 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003950}
3951
Daniel Jasperd69fc772013-05-08 14:12:04 +00003952TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3953 verifyFormat(
3954 "bool aaaaaaa =\n"
3955 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3956 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003957 verifyFormat(
3958 "bool aaaaaaa =\n"
3959 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3960 " bbbbbbbb();");
3961
Daniel Jasperd69fc772013-05-08 14:12:04 +00003962 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3963 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3964 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003965 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3966 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3967 " ccccccccc == ddddddddddd;");
3968 verifyFormat(
3969 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3970 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3971 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003972
3973 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3974 " aaaaaa) &&\n"
3975 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003976 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3977 " aaaaaa) >>\n"
3978 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003979 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003980 " SourceMgr.getSpellingColumnNumber(\n"
3981 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3982 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003983
Daniel Jasper68d888c2013-06-03 08:42:05 +00003984 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3985 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3986 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003987 verifyFormat("b = a &&\n"
3988 " // Comment\n"
3989 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003990
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003991 // If the LHS of a comparison is not a binary expression itself, the
3992 // additional linebreak confuses many people.
3993 verifyFormat(
3994 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3995 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3996 "}");
3997 verifyFormat(
3998 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3999 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4000 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00004001 verifyFormat(
4002 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
4003 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4004 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00004005 // Even explicit parentheses stress the precedence enough to make the
4006 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00004007 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4008 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4009 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00004010 // This cases is borderline, but with the indentation it is still readable.
4011 verifyFormat(
4012 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4013 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4014 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
4015 "}",
4016 getLLVMStyleWithColumns(75));
4017
4018 // If the LHS is a binary expression, we should still use the additional break
4019 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00004020 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4021 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4022 " 5) {\n"
4023 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00004024
Daniel Jasper571f1af2013-05-14 20:39:56 +00004025 FormatStyle OnePerLine = getLLVMStyle();
4026 OnePerLine.BinPackParameters = false;
4027 verifyFormat(
4028 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4029 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4030 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
4031 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00004032
4033 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
4034 " .aaa(aaaaaaaaaaaaa) *\n"
4035 " aaaaaaa +\n"
4036 " aaaaaaa;",
4037 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00004038}
4039
Daniel Jasper6bee6822013-04-08 20:33:42 +00004040TEST_F(FormatTest, ExpressionIndentation) {
4041 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4042 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4043 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4044 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4045 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4046 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
4047 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4048 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
4049 " ccccccccccccccccccccccccccccccccccccccccc;");
4050 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4051 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4052 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4053 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4054 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4055 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4056 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4057 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4058 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4059 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4060 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4061 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00004062 verifyFormat("if () {\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004063 "} else if (aaaaa && bbbbb > // break\n"
4064 " ccccc) {\n"
4065 "}");
4066 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00004067 "} else if (aaaaa &&\n"
4068 " bbbbb > // break\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004069 " ccccc &&\n"
4070 " ddddd) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00004071 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00004072
4073 // Presence of a trailing comment used to change indentation of b.
4074 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
4075 " b;\n"
4076 "return aaaaaaaaaaaaaaaaaaa +\n"
4077 " b; //",
4078 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00004079}
4080
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004081TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
4082 // Not sure what the best system is here. Like this, the LHS can be found
4083 // immediately above an operator (everything with the same or a higher
4084 // indent). The RHS is aligned right of the operator and so compasses
4085 // everything until something with the same indent as the operator is found.
4086 // FIXME: Is this a good system?
4087 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00004088 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004089 verifyFormat(
4090 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004091 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4092 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4093 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4094 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4095 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004096 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004097 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4098 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004099 Style);
4100 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004101 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4102 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004103 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4104 Style);
4105 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004106 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4107 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004108 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4109 Style);
4110 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4111 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004112 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4113 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004114 Style);
4115 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004116 "} else if (aaaaa\n"
4117 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004118 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004119 "}",
4120 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00004121 verifyFormat("return (a)\n"
4122 " // comment\n"
4123 " + b;",
4124 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004125 verifyFormat(
4126 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4127 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4128 " + cc;",
4129 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00004130
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00004131 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4132 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4133 Style);
4134
Daniel Jasper9e5ede02013-11-08 19:56:28 +00004135 // Forced by comments.
4136 verifyFormat(
4137 "unsigned ContentSize =\n"
4138 " sizeof(int16_t) // DWARF ARange version number\n"
4139 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4140 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
4141 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00004142
4143 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
4144 " == boost::fusion::at_c<1>(iiii).second;",
4145 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00004146
4147 Style.ColumnLimit = 60;
4148 verifyFormat("zzzzzzzzzz\n"
4149 " = bbbbbbbbbbbbbbbbb\n"
4150 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
4151 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004152}
4153
Daniel Jasper3219e432014-12-02 13:24:51 +00004154TEST_F(FormatTest, NoOperandAlignment) {
4155 FormatStyle Style = getLLVMStyle();
4156 Style.AlignOperands = false;
4157 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00004158 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4159 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4160 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4161 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4162 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4163 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4164 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4165 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4166 " > ccccccccccccccccccccccccccccccccccccccccc;",
4167 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004168
4169 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4170 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4171 " + cc;",
4172 Style);
4173 verifyFormat("int a = aa\n"
4174 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004175 " * cccccccccccccccccccccccccccccccccccc;\n",
Daniel Jasper3219e432014-12-02 13:24:51 +00004176 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00004177
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004178 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00004179 verifyFormat("return (a > b\n"
4180 " // comment1\n"
4181 " // comment2\n"
4182 " || c);",
4183 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004184}
4185
Daniel Jasperac043c92014-09-15 11:11:00 +00004186TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
4187 FormatStyle Style = getLLVMStyle();
4188 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4189 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4190 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00004191 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4192 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00004193}
4194
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004195TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004196 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004197 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
4198 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004199 verifyFormat("Constructor()\n"
4200 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004201 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004202 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004203 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004204 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004205
Daniel Jasper7b259cd2015-08-27 11:59:31 +00004206 verifyFormat("template <typename T>\n"
4207 "Constructor() : Initializer(FitsOnTheLine) {}",
4208 getLLVMStyleWithColumns(45));
4209
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004210 verifyFormat(
4211 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004212 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004213
4214 verifyFormat(
4215 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004216 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004217 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004218 verifyFormat(
4219 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004220 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004221 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00004222 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4223 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4224 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004225
4226 verifyFormat("Constructor()\n"
4227 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4228 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4229 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004230 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004231
Daniel Jasper65585ed2013-01-28 13:31:35 +00004232 verifyFormat("Constructor()\n"
4233 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004234 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00004235
Daniel Jasper62e68172013-02-25 15:59:54 +00004236 verifyFormat("Constructor(int Parameter = 0)\n"
4237 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4238 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00004239 verifyFormat("Constructor()\n"
4240 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4241 "}",
4242 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00004243 verifyFormat("Constructor()\n"
4244 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4245 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00004246
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004247 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00004248 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004249 verifyFormat("Constructor()\n"
4250 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4251 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
4252 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004253
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004254 FormatStyle OnePerLine = getLLVMStyle();
4255 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00004256 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004257 verifyFormat("SomeClass::Constructor()\n"
4258 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4259 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004260 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004261 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004262 verifyFormat("SomeClass::Constructor()\n"
4263 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4264 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004265 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004266 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004267 verifyFormat("MyClass::MyClass(int var)\n"
4268 " : some_var_(var), // 4 space indent\n"
4269 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004270 "}",
4271 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00004272 verifyFormat("Constructor()\n"
4273 " : aaaaa(aaaaaa),\n"
4274 " aaaaa(aaaaaa),\n"
4275 " aaaaa(aaaaaa),\n"
4276 " aaaaa(aaaaaa),\n"
4277 " aaaaa(aaaaaa) {}",
4278 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00004279 verifyFormat("Constructor()\n"
4280 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4281 " aaaaaaaaaaaaaaaaaaaaaa) {}",
4282 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00004283 OnePerLine.BinPackParameters = false;
4284 verifyFormat(
4285 "Constructor()\n"
4286 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4287 " aaaaaaaaaaa().aaa(),\n"
4288 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4289 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00004290 OnePerLine.ColumnLimit = 60;
4291 verifyFormat("Constructor()\n"
4292 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
4293 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4294 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00004295
4296 EXPECT_EQ("Constructor()\n"
4297 " : // Comment forcing unwanted break.\n"
4298 " aaaa(aaaa) {}",
4299 format("Constructor() :\n"
4300 " // Comment forcing unwanted break.\n"
4301 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004302}
4303
4304TEST_F(FormatTest, MemoizationTests) {
4305 // This breaks if the memoization lookup does not take \c Indent and
4306 // \c LastSpace into account.
4307 verifyFormat(
4308 "extern CFRunLoopTimerRef\n"
4309 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
4310 " CFTimeInterval interval, CFOptionFlags flags,\n"
4311 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00004312 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004313
4314 // Deep nesting somewhat works around our memoization.
4315 verifyFormat(
4316 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4317 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4318 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4319 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4320 " aaaaa())))))))))))))))))))))))))))))))))))))));",
4321 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00004322 verifyFormat(
4323 "aaaaa(\n"
4324 " aaaaa,\n"
4325 " aaaaa(\n"
4326 " aaaaa,\n"
4327 " aaaaa(\n"
4328 " aaaaa,\n"
4329 " aaaaa(\n"
4330 " aaaaa,\n"
4331 " aaaaa(\n"
4332 " aaaaa,\n"
4333 " aaaaa(\n"
4334 " aaaaa,\n"
4335 " aaaaa(\n"
4336 " aaaaa,\n"
4337 " aaaaa(\n"
4338 " aaaaa,\n"
4339 " aaaaa(\n"
4340 " aaaaa,\n"
4341 " aaaaa(\n"
4342 " aaaaa,\n"
4343 " aaaaa(\n"
4344 " aaaaa,\n"
4345 " aaaaa(\n"
4346 " aaaaa,\n"
4347 " aaaaa))))))))))));",
4348 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00004349 verifyFormat(
4350 "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"
4351 " a),\n"
4352 " a),\n"
4353 " a),\n"
4354 " a),\n"
4355 " a),\n"
4356 " a),\n"
4357 " a),\n"
4358 " a),\n"
4359 " a),\n"
4360 " a),\n"
4361 " a),\n"
4362 " a),\n"
4363 " a),\n"
4364 " a),\n"
4365 " a),\n"
4366 " a),\n"
4367 " a)",
4368 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00004369
4370 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004371 FormatStyle OnePerLine = getLLVMStyle();
4372 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004373 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00004374 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00004375 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00004376 for (unsigned i = 0, e = 80; i != e; ++i) {
4377 input += " a,\n";
4378 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004379 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004380 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004381}
4382
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004383TEST_F(FormatTest, BreaksAsHighAsPossible) {
4384 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004385 "void f() {\n"
4386 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
4387 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
4388 " f();\n"
4389 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00004390 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004391 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004392}
4393
Daniel Jasper6728fc12013-04-11 14:29:13 +00004394TEST_F(FormatTest, BreaksFunctionDeclarations) {
4395 // Principially, we break function declarations in a certain order:
4396 // 1) break amongst arguments.
4397 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
4398 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004399 verifyFormat("template <class TemplateIt>\n"
4400 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
4401 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00004402
4403 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00004404 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004405 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004406 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004407 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004408
4409 // 3) break after (.
4410 verifyFormat(
4411 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00004412 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
4413 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004414
4415 // 4) break before after nested name specifiers.
4416 verifyFormat(
4417 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004418 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
4419 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004420 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004421
4422 // However, there are exceptions, if a sufficient amount of lines can be
4423 // saved.
4424 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
4425 // more adjusting.
4426 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4427 " Cccccccccccccc cccccccccc,\n"
4428 " Cccccccccccccc cccccccccc,\n"
4429 " Cccccccccccccc cccccccccc,\n"
4430 " Cccccccccccccc cccccccccc);");
4431 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004432 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004433 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4434 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4435 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004436 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004437 verifyFormat(
4438 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4439 " Cccccccccccccc cccccccccc,\n"
4440 " Cccccccccccccc cccccccccc,\n"
4441 " Cccccccccccccc cccccccccc,\n"
4442 " Cccccccccccccc cccccccccc,\n"
4443 " Cccccccccccccc cccccccccc,\n"
4444 " Cccccccccccccc cccccccccc);");
4445 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4446 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4447 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4448 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4449 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00004450
4451 // Break after multi-line parameters.
4452 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4453 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4454 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4455 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00004456 verifyFormat("void SomeLoooooooooooongFunction(\n"
4457 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
4458 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4459 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004460
4461 // Treat overloaded operators like other functions.
4462 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4463 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00004464 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4465 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00004466 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4467 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
4468 verifyGoogleFormat(
4469 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
4470 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004471 verifyGoogleFormat(
4472 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
4473 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00004474 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4475 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4476 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
4477 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00004478 verifyGoogleFormat(
4479 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
4480 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4481 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00004482 verifyGoogleFormat(
4483 "template <typename T>\n"
4484 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4485 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
4486 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00004487
4488 FormatStyle Style = getLLVMStyle();
4489 Style.PointerAlignment = FormatStyle::PAS_Left;
4490 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4491 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
4492 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004493 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
4494 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4495 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00004496}
4497
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004498TEST_F(FormatTest, TrailingReturnType) {
4499 verifyFormat("auto foo() -> int;\n");
4500 verifyFormat("struct S {\n"
4501 " auto bar() const -> int;\n"
4502 "};");
4503 verifyFormat("template <size_t Order, typename T>\n"
4504 "auto load_img(const std::string &filename)\n"
4505 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00004506 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
4507 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00004508 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00004509 verifyFormat("template <typename T>\n"
4510 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
4511 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00004512
4513 // Not trailing return types.
4514 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004515}
4516
Daniel Jasper5be31f72013-05-21 09:16:31 +00004517TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004518 // Avoid breaking before trailing 'const' or other trailing annotations, if
4519 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00004520 FormatStyle Style = getGoogleStyle();
4521 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00004522 verifyFormat("void someLongFunction(\n"
4523 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00004524 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00004525 verifyFormat("LoooooongReturnType\n"
4526 "someLoooooooongFunction() const {}",
4527 getLLVMStyleWithColumns(47));
4528 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
4529 " const {}",
4530 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004531 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4532 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
4533 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4534 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
4535 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4536 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00004537 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
4538 " aaaaaaaaaaa aaaaa) const override;");
4539 verifyGoogleFormat(
4540 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4541 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004542
Daniel Jasper5550de62014-02-17 07:57:46 +00004543 // Even if the first parameter has to be wrapped.
4544 verifyFormat("void someLongFunction(\n"
4545 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004546 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00004547 verifyFormat("void someLongFunction(\n"
4548 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004549 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00004550 verifyFormat("void someLongFunction(\n"
4551 " int someLongParameter) override {}",
4552 Style);
4553 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004554 " int someLongParameter) OVERRIDE {}",
4555 Style);
4556 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004557 " int someLongParameter) final {}",
4558 Style);
4559 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004560 " int someLongParameter) FINAL {}",
4561 Style);
4562 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004563 " int parameter) const override {}",
4564 Style);
4565
Daniel Jaspere3f907f2014-06-02 09:52:08 +00004566 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
4567 verifyFormat("void someLongFunction(\n"
4568 " int someLongParameter) const\n"
4569 "{\n"
4570 "}",
4571 Style);
4572
Daniel Jasper5550de62014-02-17 07:57:46 +00004573 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004574 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
4575 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4576 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00004577
4578 // Breaking before function-like trailing annotations is fine to keep them
4579 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00004580 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4581 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4582 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4583 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4584 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4585 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00004586 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4587 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00004588 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004589
4590 verifyFormat(
4591 "void aaaaaaaaaaaaaaaaaa()\n"
4592 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4593 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
4594 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4595 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004596 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004597 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004598 " GUARDED_BY(aaaaaaaaaaaa);");
4599 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004600 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004601 " GUARDED_BY(aaaaaaaaaaaa);");
4602 verifyGoogleFormat(
4603 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4604 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004605 verifyGoogleFormat(
4606 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4607 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004608}
4609
Daniel Jasperf090f032015-05-18 09:47:22 +00004610TEST_F(FormatTest, FunctionAnnotations) {
4611 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004612 "int OldFunction(const string &parameter) {}");
4613 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004614 "string OldFunction(const string &parameter) {}");
4615 verifyFormat("template <typename T>\n"
4616 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4617 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004618
4619 // Not function annotations.
4620 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4621 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004622 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4623 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004624 verifyFormat("MACRO(abc).function() // wrap\n"
4625 " << abc;");
4626 verifyFormat("MACRO(abc)->function() // wrap\n"
4627 " << abc;");
4628 verifyFormat("MACRO(abc)::function() // wrap\n"
4629 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004630}
4631
Daniel Jasperf7935112012-12-03 18:12:45 +00004632TEST_F(FormatTest, BreaksDesireably) {
4633 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4634 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004635 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004636 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4637 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4638 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004639
4640 verifyFormat(
4641 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004642 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004643
4644 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4645 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4646 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004647
4648 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004649 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4650 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4651 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004652 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4653 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004654
4655 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4656 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4657
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004658 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004659 "void f() {\n"
4660 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4661 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4662 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004663 verifyFormat(
4664 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4665 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4666 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004667 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4668 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4669 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004670 "aaaaaa(aaa,\n"
4671 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00004672 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4673 " aaaa);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004674 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4675 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4676 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004677
Daniel Jasper739b85f2015-06-29 10:42:59 +00004678 // Indent consistently independent of call expression and unary operator.
4679 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4680 " dddddddddddddddddddddddddddddd));");
4681 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4682 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004683 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004684 " dddddddddddddddddddddddddddddd));");
4685
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004686 // This test case breaks on an incorrect memoization, i.e. an optimization not
4687 // taking into account the StopAt value.
4688 verifyFormat(
4689 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004690 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4691 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4692 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004693
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004694 verifyFormat("{\n {\n {\n"
4695 " Annotation.SpaceRequiredBefore =\n"
4696 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4697 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4698 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004699
4700 // Break on an outer level if there was a break on an inner level.
4701 EXPECT_EQ("f(g(h(a, // comment\n"
4702 " b, c),\n"
4703 " d, e),\n"
4704 " x, y);",
4705 format("f(g(h(a, // comment\n"
4706 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004707
4708 // Prefer breaking similar line breaks.
4709 verifyFormat(
4710 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4711 " NSTrackingMouseEnteredAndExited |\n"
4712 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004713}
4714
Daniel Jasper18210d72014-10-09 09:52:05 +00004715TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4716 FormatStyle NoBinPacking = getGoogleStyle();
4717 NoBinPacking.BinPackParameters = false;
4718 NoBinPacking.BinPackArguments = true;
4719 verifyFormat("void f() {\n"
4720 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4721 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4722 "}",
4723 NoBinPacking);
4724 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4725 " int aaaaaaaaaaaaaaaaaaaa,\n"
4726 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4727 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004728
Daniel Jasper00693b082016-01-09 15:56:47 +00004729 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4730 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4731 " vector<int> bbbbbbbbbbbbbbb);",
4732 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004733 // FIXME: This behavior difference is probably not wanted. However, currently
4734 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4735 // template arguments from BreakBeforeParameter being set because of the
4736 // one-per-line formatting.
4737 verifyFormat(
4738 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4739 " aaaaaaaaaa> aaaaaaaaaa);",
4740 NoBinPacking);
4741 verifyFormat(
4742 "void fffffffffff(\n"
4743 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4744 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004745}
4746
Daniel Jasper9278eb92013-01-16 14:59:02 +00004747TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004748 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004749 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004750 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004751 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4752 " aaaaaaaaaaaaaaaaaaaa,\n"
4753 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4754 NoBinPacking);
4755 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4756 " aaaaaaaaaaaaa,\n"
4757 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4758 NoBinPacking);
4759 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004760 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4761 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4762 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4763 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004764 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4765 NoBinPacking);
4766 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4767 " .aaaaaaaaaaaaaaaaaa();",
4768 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004769 verifyFormat("void f() {\n"
4770 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4771 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4772 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004773 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004774
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004775 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004776 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4777 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004778 " aaaaaaaaaaaa);",
4779 NoBinPacking);
4780 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004781 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4782 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004783 " test);",
4784 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004785
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004786 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4787 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004788 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4789 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004790 NoBinPacking);
4791 verifyFormat("a(\"a\"\n"
4792 " \"a\",\n"
4793 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004794
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004795 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004796 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004797 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004798 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004799 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004800 verifyFormat(
4801 "void f() {\n"
4802 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4803 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004804 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004805 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004806 verifyFormat(
4807 "template <class SomeType, class SomeOtherType>\n"
4808 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4809 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004810}
4811
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004812TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4813 FormatStyle Style = getLLVMStyleWithColumns(15);
4814 Style.ExperimentalAutoDetectBinPacking = true;
4815 EXPECT_EQ("aaa(aaaa,\n"
4816 " aaaa,\n"
4817 " aaaa);\n"
4818 "aaa(aaaa,\n"
4819 " aaaa,\n"
4820 " aaaa);",
4821 format("aaa(aaaa,\n" // one-per-line
4822 " aaaa,\n"
4823 " aaaa );\n"
4824 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4825 Style));
4826 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4827 " aaaa);\n"
4828 "aaa(aaaa, aaaa,\n"
4829 " aaaa);",
4830 format("aaa(aaaa, aaaa,\n" // bin-packed
4831 " aaaa );\n"
4832 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4833 Style));
4834}
4835
Daniel Jasper04468962013-01-18 10:56:38 +00004836TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004837 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4838 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4839 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4840 " .StartsWith(\".init\", ORDER_INIT)\n"
4841 " .StartsWith(\".fini\", ORDER_FINI)\n"
4842 " .StartsWith(\".hash\", ORDER_HASH)\n"
4843 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004844
Daniel Jaspereb50c672013-02-15 20:33:06 +00004845 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004846 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004847 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004848 "aaaaaaa->aaaaaaa\n"
4849 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4850 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004851 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004852 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004853 "aaaaaaa->aaaaaaa\n"
4854 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4855 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4856 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004857 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004858 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004859 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004860 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4861 " aaaaaa->aaaaaaaaaaaa()\n"
4862 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004863 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004864 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004865 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004866 "void f() {\n"
4867 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004868 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004869 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004870 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004871 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004872 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004873 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004874 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004875 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004876 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004877 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004878 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004879
4880 verifyFormat(
4881 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4882 verifyFormat("aaaaaaaaaaaaaaa()\n"
4883 " .aaaaaaaaaaaaaaa()\n"
4884 " .aaaaaaaaaaaaaaa()\n"
4885 " .aaaaaaaaaaaaaaa()\n"
4886 " .aaaaaaaaaaaaaaa();");
4887 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4888 " .aaaaaaaaaaaaaaa()\n"
4889 " .aaaaaaaaaaaaaaa()\n"
4890 " .aaaaaaaaaaaaaaa();");
4891 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4892 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4893 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004894 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4895 " ->aaaaaaaaaaaaaae(0)\n"
4896 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004897
Daniel Jasper775954b2015-04-24 10:08:09 +00004898 // Don't linewrap after very short segments.
4899 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4900 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4901 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4902 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4903 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4904 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4905 verifyFormat("aaa()\n"
4906 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4907 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4908 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4909
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004910 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4911 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4912 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4913 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4914 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004915 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004916
Daniel Jaspera41aa532014-09-19 08:01:25 +00004917 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004918 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4919 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004920
4921 // Prefer not to create "hanging" indents.
4922 verifyFormat(
4923 "return !soooooooooooooome_map\n"
4924 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4925 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004926 verifyFormat(
4927 "return aaaaaaaaaaaaaaaa\n"
4928 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4929 " .aaaa(aaaaaaaaaaaaaa);");
4930 // No hanging indent here.
4931 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4932 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4933 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4934 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004935 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4936 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4937 getLLVMStyleWithColumns(60));
4938 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4939 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4940 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4941 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004942 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4943 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4944 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004945}
4946
Daniel Jasperde5c2072012-12-24 00:13:23 +00004947TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4948 verifyFormat(
4949 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004950 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004951 verifyFormat(
4952 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4953 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4954
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004955 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004956 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004957 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4958 " ccccccccccccccccccccccccc) {\n}");
4959
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004960 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004961 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004962 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4963 " ccccccccccccccccccccccccc) {\n}");
4964
Daniel Jasperde5c2072012-12-24 00:13:23 +00004965 verifyFormat(
4966 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004967 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004968 verifyFormat(
4969 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4970 " ccccccccccccccccccccccccc) {\n}");
4971
Daniel Jasper400adc62013-02-08 15:28:42 +00004972 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4973 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4974 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4975 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004976 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4977 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4978 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4979 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4980
Daniel Jasper400adc62013-02-08 15:28:42 +00004981 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4982 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4983 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004984 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4985 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4986 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004987}
4988
Daniel Jasper43b65482013-01-23 12:27:43 +00004989TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004990 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004991 "unsigned Cost =\n"
4992 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4993 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004994 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004995 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4996 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004997
4998 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004999 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
5000 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00005001 verifyFormat("unsigned OriginalStartColumn =\n"
5002 " SourceMgr.getSpellingColumnNumber(\n"
5003 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
5004 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00005005}
5006
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005007TEST_F(FormatTest, AlignsAfterAssignments) {
5008 verifyFormat(
5009 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00005010 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005011 verifyFormat(
5012 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00005013 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005014 verifyFormat(
5015 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00005016 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005017 verifyFormat(
5018 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00005019 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00005020 verifyFormat(
5021 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5022 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5023 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005024}
5025
5026TEST_F(FormatTest, AlignsAfterReturn) {
5027 verifyFormat(
5028 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5029 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
5030 verifyFormat(
5031 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5032 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00005033 verifyFormat(
5034 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005035 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00005036 verifyFormat(
5037 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005038 " aaaaaaaaaaaaaaaaaaaaaa());");
5039 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5040 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5041 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5042 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
5043 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00005044 verifyFormat("return\n"
5045 " // true if code is one of a or b.\n"
5046 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005047}
5048
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005049TEST_F(FormatTest, AlignsAfterOpenBracket) {
5050 verifyFormat(
5051 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5052 " aaaaaaaaa aaaaaaa) {}");
5053 verifyFormat(
5054 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5055 " aaaaaaaaaaa aaaaaaaaa);");
5056 verifyFormat(
5057 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5058 " aaaaaaaaaaaaaaaaaaaaa));");
5059 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005060 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00005061 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5062 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
5063 Style);
5064 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5065 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
5066 Style);
5067 verifyFormat("SomeLongVariableName->someFunction(\n"
5068 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
5069 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005070 verifyFormat(
5071 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5072 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5073 Style);
5074 verifyFormat(
5075 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5076 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5077 Style);
5078 verifyFormat(
5079 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5080 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5081 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005082
Daniel Jasper2a9f7202016-02-08 09:52:54 +00005083 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
5084 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
5085 " b));",
5086 Style);
5087
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005088 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5089 Style.BinPackArguments = false;
5090 Style.BinPackParameters = false;
5091 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5092 " aaaaaaaaaaa aaaaaaaa,\n"
5093 " aaaaaaaaa aaaaaaa,\n"
5094 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5095 Style);
5096 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5097 " aaaaaaaaaaa aaaaaaaaa,\n"
5098 " aaaaaaaaaaa aaaaaaaaa,\n"
5099 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5100 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00005101 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
5102 " aaaaaaaaaaaaaaa,\n"
5103 " aaaaaaaaaaaaaaaaaaaaa,\n"
5104 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005105 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00005106 verifyFormat(
5107 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
5108 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5109 Style);
5110 verifyFormat(
5111 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
5112 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5113 Style);
5114 verifyFormat(
5115 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5116 " aaaaaaaaaaaaaaaaaaaaa(\n"
5117 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
5118 " aaaaaaaaaaaaaaaa);",
5119 Style);
5120 verifyFormat(
5121 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5122 " aaaaaaaaaaaaaaaaaaaaa(\n"
5123 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
5124 " aaaaaaaaaaaaaaaa);",
5125 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005126}
5127
Daniel Jasper3219e432014-12-02 13:24:51 +00005128TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
5129 FormatStyle Style = getLLVMStyleWithColumns(40);
5130 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5131 " bbbbbbbbbbbbbbbbbbbbbb);",
5132 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005133 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00005134 Style.AlignOperands = false;
5135 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5136 " bbbbbbbbbbbbbbbbbbbbbb);",
5137 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005138 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00005139 Style.AlignOperands = true;
5140 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5141 " bbbbbbbbbbbbbbbbbbbbbb);",
5142 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005143 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00005144 Style.AlignOperands = false;
5145 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5146 " bbbbbbbbbbbbbbbbbbbbbb);",
5147 Style);
5148}
5149
Daniel Jasper399d24b2013-01-09 07:06:56 +00005150TEST_F(FormatTest, BreaksConditionalExpressions) {
5151 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005152 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5153 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5154 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5155 verifyFormat(
5156 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005157 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5158 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00005159 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005160 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5161 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5162 verifyFormat(
5163 "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005164 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5165 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005166 verifyFormat(
5167 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
5168 " : aaaaaaaaaaaaa);");
5169 verifyFormat(
5170 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00005171 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005172 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5173 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005174 verifyFormat(
5175 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5176 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5177 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005178 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5179 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5180 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5181 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5182 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5183 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5184 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5185 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5186 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5187 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5188 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5189 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005190 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5191 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5192 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5193 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5194 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00005195 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5196 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5197 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005198 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5199 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5200 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5201 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00005202 verifyFormat(
5203 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5204 " ? aaaaaaaaaaaaaaa\n"
5205 " : aaaaaaaaaaaaaaa;");
5206 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005207 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00005208 " ? b\n"
5209 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00005210 verifyFormat("return aaaa == bbbb\n"
5211 " // comment\n"
5212 " ? aaaa\n"
5213 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005214 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005215 " format(TheLine.First,\n"
5216 " IndentForLevel[TheLine.Level] >= 0\n"
5217 " ? IndentForLevel[TheLine.Level]\n"
5218 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005219 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005220 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00005221 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5222 " ? aaaaaaaaaaaaaaa\n"
5223 " : bbbbbbbbbbbbbbb //\n"
5224 " ? ccccccccccccccc\n"
5225 " : ddddddddddddddd;");
5226 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5227 " ? aaaaaaaaaaaaaaa\n"
5228 " : (bbbbbbbbbbbbbbb //\n"
5229 " ? ccccccccccccccc\n"
5230 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005231 verifyFormat(
5232 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5233 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5234 " aaaaaaaaaaaaaaaaaaaaa +\n"
5235 " aaaaaaaaaaaaaaaaaaaaa\n"
5236 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00005237 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005238 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5239 " : aaaaaaaaaaaaaaaaaaaaaa\n"
5240 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00005241
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005242 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00005243 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005244 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00005245 "void f() {\n"
5246 " g(aaa,\n"
5247 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5248 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5249 " ? aaaaaaaaaaaaaaa\n"
5250 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005251 "}",
5252 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005253 verifyFormat(
5254 "void f() {\n"
5255 " g(aaa,\n"
5256 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5257 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5258 " ?: aaaaaaaaaaaaaaa);\n"
5259 "}",
5260 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00005261
5262 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
5263 " // comment.\n"
5264 " ccccccccccccccccccccccccccccccccccccccc\n"
5265 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5266 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00005267
5268 // Assignments in conditional expressions. Apparently not uncommon :-(.
5269 verifyFormat("return a != b\n"
5270 " // comment\n"
5271 " ? a = b\n"
5272 " : a = b;");
5273 verifyFormat("return a != b\n"
5274 " // comment\n"
5275 " ? a = a != b\n"
5276 " // comment\n"
5277 " ? a = b\n"
5278 " : a\n"
5279 " : a;\n");
5280 verifyFormat("return a != b\n"
5281 " // comment\n"
5282 " ? a\n"
5283 " : a = a != b\n"
5284 " // comment\n"
5285 " ? a = b\n"
5286 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00005287}
5288
Daniel Jasper165b29e2013-11-08 00:57:11 +00005289TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
5290 FormatStyle Style = getLLVMStyle();
5291 Style.BreakBeforeTernaryOperators = false;
5292 Style.ColumnLimit = 70;
5293 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005294 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5295 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5296 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5297 Style);
5298 verifyFormat(
5299 "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005300 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5301 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005302 Style);
5303 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005304 "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5305 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5306 Style);
5307 verifyFormat(
5308 "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005309 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5310 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005311 Style);
5312 verifyFormat(
5313 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
5314 " aaaaaaaaaaaaa);",
5315 Style);
5316 verifyFormat(
5317 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5318 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5319 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5320 " aaaaaaaaaaaaa);",
5321 Style);
5322 verifyFormat(
5323 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5324 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5325 " aaaaaaaaaaaaa);",
5326 Style);
5327 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5328 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5329 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5330 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5331 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5332 Style);
5333 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5334 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5335 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5336 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5337 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5338 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5339 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5340 Style);
5341 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5342 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
5343 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5344 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5345 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5346 Style);
5347 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5348 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5349 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5350 Style);
5351 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00005352 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00005353 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5354 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5355 Style);
5356 verifyFormat(
5357 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5358 " aaaaaaaaaaaaaaa :\n"
5359 " aaaaaaaaaaaaaaa;",
5360 Style);
5361 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5362 " aaaaaaaaa ?\n"
5363 " b :\n"
5364 " c);",
5365 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00005366 verifyFormat("unsigned Indent =\n"
5367 " format(TheLine.First,\n"
5368 " IndentForLevel[TheLine.Level] >= 0 ?\n"
5369 " IndentForLevel[TheLine.Level] :\n"
5370 " TheLine * 2,\n"
5371 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
5372 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005373 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5374 " aaaaaaaaaaaaaaa :\n"
5375 " bbbbbbbbbbbbbbb ? //\n"
5376 " ccccccccccccccc :\n"
5377 " ddddddddddddddd;",
5378 Style);
5379 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5380 " aaaaaaaaaaaaaaa :\n"
5381 " (bbbbbbbbbbbbbbb ? //\n"
5382 " ccccccccccccccc :\n"
5383 " ddddddddddddddd);",
5384 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00005385 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5386 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
5387 " ccccccccccccccccccccccccccc;",
5388 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00005389 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5390 " aaaaa :\n"
5391 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
5392 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005393}
5394
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005395TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
5396 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
5397 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
5398 verifyFormat("bool a = true, b = false;");
5399
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005400 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005401 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005402 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00005403 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005404 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00005405 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005406 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00005407 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00005408 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
5409 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
5410 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5411 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
5412 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
5413 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005414
Daniel Jasperbea1ab42015-03-01 18:55:26 +00005415 FormatStyle Style = getGoogleStyle();
5416 Style.PointerAlignment = FormatStyle::PAS_Left;
5417 Style.DerivePointerAlignment = false;
5418 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5419 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
5420 " *b = bbbbbbbbbbbbbbbbbbb;",
5421 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00005422 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5423 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
5424 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00005425 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00005426 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005427}
5428
Nico Weber4a5030c2013-01-12 01:28:06 +00005429TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
5430 verifyFormat("arr[foo ? bar : baz];");
5431 verifyFormat("f()[foo ? bar : baz];");
5432 verifyFormat("(a + b)[foo ? bar : baz];");
5433 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
5434}
5435
Daniel Jasperf7935112012-12-03 18:12:45 +00005436TEST_F(FormatTest, AlignsStringLiterals) {
5437 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
5438 " \"short literal\");");
5439 verifyFormat(
5440 "looooooooooooooooooooooooongFunction(\n"
5441 " \"short literal\"\n"
5442 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005443 verifyFormat("someFunction(\"Always break between multi-line\"\n"
5444 " \" string literals\",\n"
5445 " and, other, parameters);");
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005446 EXPECT_EQ("fun + \"1243\" /* comment */\n"
5447 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005448 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00005449 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005450 getLLVMStyleWithColumns(28)));
5451 EXPECT_EQ(
5452 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5453 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
5454 " \"aaaaaaaaaaaaaaaa\";",
5455 format("aaaaaa ="
5456 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
5457 "aaaaaaaaaaaaaaaaaaaaa\" "
5458 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005459 verifyFormat("a = a + \"a\"\n"
5460 " \"a\"\n"
5461 " \"a\";");
5462 verifyFormat("f(\"a\", \"b\"\n"
5463 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005464
5465 verifyFormat(
5466 "#define LL_FORMAT \"ll\"\n"
5467 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
5468 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00005469
5470 verifyFormat("#define A(X) \\\n"
5471 " \"aaaaa\" #X \"bbbbbb\" \\\n"
5472 " \"ccccc\"",
5473 getLLVMStyleWithColumns(23));
5474 verifyFormat("#define A \"def\"\n"
5475 "f(\"abc\" A \"ghi\"\n"
5476 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005477
5478 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005479 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005480 verifyFormat("#define A(X) \\\n"
5481 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
5482 " L\"ccccc\"",
5483 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00005484
5485 verifyFormat("f(@\"a\"\n"
5486 " @\"b\");");
5487 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00005488 " @\"b\"\n"
5489 " @\"c\";");
5490 verifyFormat("NSString s = @\"a\"\n"
5491 " \"b\"\n"
5492 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00005493}
5494
Zachary Turner448592e2015-12-18 22:20:15 +00005495TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005496 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005497 // No declarations or definitions should be moved to own line.
5498 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
5499 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005500 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005501 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005502 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005503 "int f() { return 1; }\n"
5504 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005505 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00005506
5507 // All declarations and definitions should have the return type moved to its
5508 // own
5509 // line.
5510 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
5511 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005512 " int\n"
5513 " f() {\n"
5514 " return 1;\n"
5515 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005516 " int\n"
5517 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005518 "};\n"
5519 "int\n"
5520 "f() {\n"
5521 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005522 "}\n"
5523 "int\n"
5524 "g();\n",
5525 Style);
5526
5527 // Top-level definitions, and no kinds of declarations should have the
5528 // return type moved to its own line.
5529 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
5530 verifyFormat("class B {\n"
5531 " int f() { return 1; }\n"
5532 " int g();\n"
5533 "};\n"
5534 "int\n"
5535 "f() {\n"
5536 " return 1;\n"
5537 "}\n"
5538 "int g();\n",
5539 Style);
5540
5541 // Top-level definitions and declarations should have the return type moved
5542 // to its own line.
5543 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
5544 verifyFormat("class C {\n"
5545 " int f() { return 1; }\n"
5546 " int g();\n"
5547 "};\n"
5548 "int\n"
5549 "f() {\n"
5550 " return 1;\n"
5551 "}\n"
5552 "int\n"
5553 "g();\n",
5554 Style);
5555
5556 // All definitions should have the return type moved to its own line, but no
5557 // kinds of declarations.
5558 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5559 verifyFormat("class D {\n"
5560 " int\n"
5561 " f() {\n"
5562 " return 1;\n"
5563 " }\n"
5564 " int g();\n"
5565 "};\n"
5566 "int\n"
5567 "f() {\n"
5568 " return 1;\n"
5569 "}\n"
5570 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005571 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005572 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005573 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005574 " return \"\";\n"
5575 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005576 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005577 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005578 verifyFormat("template <class T>\n"
5579 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005580 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005581 " return NULL;\n"
5582 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005583 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005584 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00005585 verifyFormat("class C {\n"
5586 " int\n"
5587 " operator+() {\n"
5588 " return 1;\n"
5589 " }\n"
5590 " int\n"
5591 " operator()() {\n"
5592 " return 1;\n"
5593 " }\n"
5594 "};\n",
5595 Style);
5596 verifyFormat("void\n"
5597 "A::operator()() {}\n"
5598 "void\n"
5599 "A::operator>>() {}\n"
5600 "void\n"
5601 "A::operator+() {}\n",
5602 Style);
5603 verifyFormat("void *operator new(std::size_t s);", // No break here.
5604 Style);
5605 verifyFormat("void *\n"
5606 "operator new(std::size_t s) {}",
5607 Style);
5608 verifyFormat("void *\n"
5609 "operator delete[](void *ptr) {}",
5610 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005611 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005612 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005613 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005614 "{\n"
5615 " return \"\";\n"
5616 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005617 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005618 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005619 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005620 "T *\n" // Problem here: no line break
5621 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005622 "{\n"
5623 " return NULL;\n"
5624 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005625 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005626 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005627}
5628
Alexander Kornienko58611712013-07-04 12:02:44 +00005629TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5630 FormatStyle NoBreak = getLLVMStyle();
5631 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5632 FormatStyle Break = getLLVMStyle();
5633 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005634 verifyFormat("aaaa = \"bbbb\"\n"
5635 " \"cccc\";",
5636 NoBreak);
5637 verifyFormat("aaaa =\n"
5638 " \"bbbb\"\n"
5639 " \"cccc\";",
5640 Break);
5641 verifyFormat("aaaa(\"bbbb\"\n"
5642 " \"cccc\");",
5643 NoBreak);
5644 verifyFormat("aaaa(\n"
5645 " \"bbbb\"\n"
5646 " \"cccc\");",
5647 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005648 verifyFormat("aaaa(qqq, \"bbbb\"\n"
5649 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005650 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005651 verifyFormat("aaaa(qqq,\n"
5652 " \"bbbb\"\n"
5653 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005654 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005655 verifyFormat("aaaa(qqq,\n"
5656 " L\"bbbb\"\n"
5657 " L\"cccc\");",
5658 Break);
Daniel Jasper21f7dea2017-02-01 09:23:39 +00005659 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5660 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005661 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005662 verifyFormat("string s = someFunction(\n"
5663 " \"abc\"\n"
5664 " \"abc\");",
5665 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005666
Daniel Jasper3251fff2014-06-10 06:27:23 +00005667 // As we break before unary operators, breaking right after them is bad.
5668 verifyFormat("string foo = abc ? \"x\"\n"
5669 " \"blah blah blah blah blah blah\"\n"
5670 " : \"y\";",
5671 Break);
5672
Daniel Jasperc834c702013-07-17 15:38:19 +00005673 // Don't break if there is no column gain.
5674 verifyFormat("f(\"aaaa\"\n"
5675 " \"bbbb\");",
5676 Break);
5677
5678 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005679 EXPECT_EQ("x = \"a\\\n"
5680 "b\\\n"
5681 "c\";",
5682 format("x = \"a\\\n"
5683 "b\\\n"
5684 "c\";",
5685 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005686 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005687 " \"a\\\n"
5688 "b\\\n"
5689 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005690 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005691 "b\\\n"
5692 "c\";",
5693 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005694
5695 // Exempt ObjC strings for now.
5696 EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005697 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005698 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005699 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005700 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005701
5702 Break.ColumnLimit = 0;
5703 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005704}
5705
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005706TEST_F(FormatTest, AlignsPipes) {
5707 verifyFormat(
5708 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5709 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5710 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5711 verifyFormat(
5712 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5713 " << aaaaaaaaaaaaaaaaaaaa;");
5714 verifyFormat(
5715 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5716 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5717 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005718 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5719 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5720 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005721 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5722 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5723 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5724 verifyFormat(
5725 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5726 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5727 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005728 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5729 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5730 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5731 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005732 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5733 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005734 verifyFormat(
5735 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5736 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005737
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005738 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5739 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005740 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5741 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5742 " aaaaaaaaaaaaaaaaaaaaa)\n"
5743 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005744 verifyFormat("LOG_IF(aaa == //\n"
5745 " bbb)\n"
5746 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005747
Daniel Jasper467ddb12013-08-12 12:58:05 +00005748 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005749 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5750 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005751 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5752 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5753 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005754 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5755 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005756 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5757 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5758 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5759 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5760 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5761 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5762 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005763
Daniel Jasperc238c872013-04-02 14:33:13 +00005764 verifyFormat(
5765 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5766 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005767
5768 // Incomplete string literal.
5769 EXPECT_EQ("llvm::errs() << \"\n"
5770 " << a;",
5771 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005772
5773 verifyFormat("void f() {\n"
5774 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5775 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5776 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005777
5778 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005779 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5780 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5781 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005782
5783 // Handle '\n'.
5784 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5785 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5786 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5787 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5788 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5789 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5790 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005791}
5792
Daniel Jasper7209bb92016-12-13 11:16:42 +00005793TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5794 verifyFormat("return out << \"somepacket = {\\n\"\n"
5795 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5796 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5797 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5798 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5799 " << \"}\";");
5800
5801 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5802 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5803 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5804 verifyFormat(
5805 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5806 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5807 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5808 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5809 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5810 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5811 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5812 verifyFormat(
5813 "void f() {\n"
5814 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5815 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5816 "}");
5817
5818 // Breaking before the first "<<" is generally not desirable.
5819 verifyFormat(
5820 "llvm::errs()\n"
5821 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5822 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5823 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5824 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5825 getLLVMStyleWithColumns(70));
5826 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5827 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5828 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5829 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5830 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5831 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5832 getLLVMStyleWithColumns(70));
5833
5834 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5835 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5836 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5837 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5838 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5839 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005840 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5841 " (aaaa + aaaa);",
5842 getLLVMStyleWithColumns(40));
5843 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5844 " (aaaaaaa + aaaaa));",
5845 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005846 verifyFormat(
5847 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5848 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5849 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005850}
5851
Daniel Jasperf7935112012-12-03 18:12:45 +00005852TEST_F(FormatTest, UnderstandsEquals) {
5853 verifyFormat(
5854 "aaaaaaaaaaaaaaaaa =\n"
5855 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5856 verifyFormat(
5857 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005858 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005859 verifyFormat(
5860 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005861 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005862 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005863 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5864 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005865
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005866 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5867 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005868}
5869
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005870TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005871 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5872 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005873
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005874 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5875 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005876
5877 verifyFormat(
5878 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5879 " Parameter2);");
5880
5881 verifyFormat(
5882 "ShortObject->shortFunction(\n"
5883 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5884 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5885
5886 verifyFormat("loooooooooooooongFunction(\n"
5887 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5888
5889 verifyFormat(
5890 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5891 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5892
Daniel Jasper687af3b2013-02-14 14:26:07 +00005893 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5894 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005895 verifyFormat("void f() {\n"
5896 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5897 " .Times(2)\n"
5898 " .WillRepeatedly(Return(SomeValue));\n"
5899 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005900 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5901 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005902 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005903 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5904 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005905 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005906 verifyFormat("void f() {\n"
5907 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5908 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5909 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005910 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5911 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5912 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5913 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5914 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005915 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5916 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5917 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5918 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5919 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005920
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005921 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005922 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005923 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005924 verifyFormat(
5925 "aaaaaaaaaaa->aaaaaaaaa(\n"
5926 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5927 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005928
5929 verifyFormat(
5930 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5931 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005932 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5933 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5934 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5935 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005936
Daniel Jasper9b334242013-03-15 14:57:30 +00005937 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005938 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5939 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005940
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005941 FormatStyle NoBinPacking = getLLVMStyle();
5942 NoBinPacking.BinPackParameters = false;
5943 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5944 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5945 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5946 " aaaaaaaaaaaaaaaaaaa,\n"
5947 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5948 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005949
5950 // If there is a subsequent call, change to hanging indentation.
5951 verifyFormat(
5952 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5953 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5954 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5955 verifyFormat(
5956 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5957 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005958 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5959 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5960 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5961 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5962 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5963 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005964}
5965
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005966TEST_F(FormatTest, WrapsTemplateDeclarations) {
5967 verifyFormat("template <typename T>\n"
5968 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005969 verifyFormat("template <typename T>\n"
5970 "// T should be one of {A, B}.\n"
5971 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005972 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005973 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005974 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005975 verifyFormat("template <typename T>\n"
5976 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5977 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005978 verifyFormat(
5979 "template <typename T>\n"
5980 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5981 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005982 verifyFormat(
5983 "template <typename T>\n"
5984 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5985 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5986 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005987 verifyFormat("template <typename T>\n"
5988 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005989 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005990 verifyFormat(
5991 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5992 " typename T4 = char>\n"
5993 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005994 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5995 " template <typename> class cccccccccccccccccccccc,\n"
5996 " typename ddddddddddddd>\n"
5997 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005998 verifyFormat(
5999 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
6000 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00006001
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006002 verifyFormat("void f() {\n"
6003 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
6004 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
6005 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00006006
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00006007 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00006008 verifyFormat("template <typename T> void f();");
6009 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006010 verifyFormat(
6011 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6012 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6013 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
6014 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6015 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6016 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
6017 " bbbbbbbbbbbbbbbbbbbbbbbb);",
6018 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00006019 EXPECT_EQ("static_cast<A< //\n"
6020 " B> *>(\n"
6021 "\n"
6022 " );",
6023 format("static_cast<A<//\n"
6024 " B>*>(\n"
6025 "\n"
6026 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00006027 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6028 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00006029
6030 FormatStyle AlwaysBreak = getLLVMStyle();
6031 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
6032 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
6033 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
6034 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
6035 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6036 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
6037 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
6038 verifyFormat("template <template <typename> class Fooooooo,\n"
6039 " template <typename> class Baaaaaaar>\n"
6040 "struct C {};",
6041 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00006042 verifyFormat("template <typename T> // T can be A, B or C.\n"
6043 "struct C {};",
6044 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00006045 verifyFormat("template <enum E> class A {\n"
6046 "public:\n"
6047 " E *f();\n"
6048 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00006049}
6050
Daniel Jasper45797022013-01-25 10:57:27 +00006051TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
6052 verifyFormat(
6053 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6054 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6055 verifyFormat(
6056 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6057 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6058 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
6059
Daniel Jasper0f0234e2013-05-08 10:00:18 +00006060 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00006061 verifyFormat(
6062 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6063 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00006064 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00006065
Daniel Jasper45797022013-01-25 10:57:27 +00006066 verifyFormat(
6067 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00006068 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00006069
6070 // Breaking at nested name specifiers is generally not desirable.
6071 verifyFormat(
6072 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6073 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00006074
6075 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00006076 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
6077 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6078 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00006079 " aaaaaaaaaaaaaaaaaaaaa);",
6080 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00006081
6082 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6083 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6084 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00006085}
6086
Daniel Jasperf7935112012-12-03 18:12:45 +00006087TEST_F(FormatTest, UnderstandsTemplateParameters) {
6088 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006089 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006090 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
6091 verifyFormat("bool x = a < 1 || 2 > a;");
6092 verifyFormat("bool x = 5 < f<int>();");
6093 verifyFormat("bool x = f<int>() > 5;");
6094 verifyFormat("bool x = 5 < a<int>::x;");
6095 verifyFormat("bool x = a < 4 ? a > 2 : false;");
6096 verifyFormat("bool x = f() ? a < 2 : a > 2;");
6097
6098 verifyGoogleFormat("A<A<int>> a;");
6099 verifyGoogleFormat("A<A<A<int>>> a;");
6100 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006101 verifyGoogleFormat("A<A<int> > a;");
6102 verifyGoogleFormat("A<A<A<int> > > a;");
6103 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00006104 verifyGoogleFormat("A<::A<int>> a;");
6105 verifyGoogleFormat("A<::A> a;");
6106 verifyGoogleFormat("A< ::A> a;");
6107 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006108 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
6109 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00006110 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
6111 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006112 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
6113 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006114
Nico Weber7533b4d2014-09-24 17:17:32 +00006115 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
6116
Daniel Jasperf7935112012-12-03 18:12:45 +00006117 verifyFormat("test >> a >> b;");
6118 verifyFormat("test << a >> b;");
6119
6120 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006121 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00006122 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00006123 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
6124 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00006125 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00006126 verifyFormat("f(a.operator()<A>());");
6127 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6128 " .template operator()<A>());",
6129 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00006130
6131 // Not template parameters.
6132 verifyFormat("return a < b && c > d;");
6133 verifyFormat("void f() {\n"
6134 " while (a < b && c > d) {\n"
6135 " }\n"
6136 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006137 verifyFormat("template <typename... Types>\n"
6138 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00006139
6140 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6141 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
6142 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00006143 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00006144 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00006145 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00006146}
6147
Malcolm Parsons6af3f142016-11-03 16:57:30 +00006148TEST_F(FormatTest, BitshiftOperatorWidth) {
6149 EXPECT_EQ("int a = 1 << 2; /* foo\n"
6150 " bar */",
6151 format("int a=1<<2; /* foo\n"
6152 " bar */"));
6153
6154 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
6155 " bar */",
6156 format("int b =256>>1 ; /* foo\n"
6157 " bar */"));
6158}
6159
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006160TEST_F(FormatTest, UnderstandsBinaryOperators) {
6161 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00006162 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00006163}
6164
6165TEST_F(FormatTest, UnderstandsPointersToMembers) {
6166 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006167 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006168 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006169 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006170 verifyFormat("void f() {\n"
6171 " (a->*f)();\n"
6172 " a->*x;\n"
6173 " (a.*f)();\n"
6174 " ((*a).*f)();\n"
6175 " a.*x;\n"
6176 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00006177 verifyFormat("void f() {\n"
6178 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
6179 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
6180 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00006181 verifyFormat(
6182 "(aaaaaaaaaa->*bbbbbbb)(\n"
6183 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006184 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006185 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006186 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006187}
6188
Daniel Jasper8dd40472012-12-21 09:41:31 +00006189TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00006190 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00006191 verifyFormat("f(-1, -2, -3);");
6192 verifyFormat("a[-1] = 5;");
6193 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006194 verifyFormat("if (i == -1) {\n}");
6195 verifyFormat("if (i != -1) {\n}");
6196 verifyFormat("if (i > -1) {\n}");
6197 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00006198 verifyFormat("++(a->f());");
6199 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00006200 verifyFormat("(a->f())++;");
6201 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006202 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00006203
6204 verifyFormat("a-- > b;");
6205 verifyFormat("b ? -a : c;");
6206 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006207 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00006208 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006209 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00006210
6211 verifyFormat("return -1;");
6212 verifyFormat("switch (a) {\n"
6213 "case -1:\n"
6214 " break;\n"
6215 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00006216 verifyFormat("#define X -1");
6217 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00006218
Chandler Carruthf8b72662014-03-02 12:37:31 +00006219 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
6220 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00006221
6222 verifyFormat("int a = /* confusing comment */ -1;");
6223 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
6224 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006225}
6226
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006227TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00006228 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006229 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00006230 "}");
6231 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00006232 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00006233 verifyFormat("*aaa = aaaaaaa( // break\n"
6234 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00006235}
6236
Daniel Jasper8863ada2013-08-26 08:10:17 +00006237TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00006238 verifyFormat("bool operator<();");
6239 verifyFormat("bool operator>();");
6240 verifyFormat("bool operator=();");
6241 verifyFormat("bool operator==();");
6242 verifyFormat("bool operator!=();");
6243 verifyFormat("int operator+();");
6244 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00006245 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006246 verifyFormat("bool operator();");
6247 verifyFormat("bool operator()();");
6248 verifyFormat("bool operator[]();");
6249 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006250 verifyFormat("operator int();");
6251 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006252 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006253 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006254 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006255 verifyFormat("void *operator new(std::size_t size);");
6256 verifyFormat("void *operator new[](std::size_t size);");
6257 verifyFormat("void operator delete(void *ptr);");
6258 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00006259 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
6260 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00006261 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00006262 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006263
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006264 verifyFormat(
6265 "ostream &operator<<(ostream &OutputStream,\n"
6266 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00006267 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
6268 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
6269 " return left.group < right.group;\n"
6270 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00006271 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00006272 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006273
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006274 verifyGoogleFormat("operator void*();");
6275 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00006276 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00006277
6278 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00006279 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
6280 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006281}
6282
Daniel Jasper1c220482015-02-25 10:30:06 +00006283TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00006284 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
6285 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
6286 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
6287 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
6288 verifyFormat("Deleted &operator=(const Deleted &) &;");
6289 verifyFormat("Deleted &operator=(const Deleted &) &&;");
6290 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
6291 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
6292 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
6293 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
6294 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00006295 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00006296 verifyFormat("template <typename T>\n"
6297 "void F(T) && = delete;",
6298 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00006299
Daniel Jasperaf642c62015-08-25 13:40:51 +00006300 FormatStyle AlignLeft = getLLVMStyle();
6301 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00006302 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00006303 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
6304 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
6305 AlignLeft);
6306 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
6307 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006308 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
6309 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
6310 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
6311 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00006312 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00006313
6314 FormatStyle Spaces = getLLVMStyle();
6315 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006316 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
6317 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
6318 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
6319 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006320
6321 Spaces.SpacesInCStyleCastParentheses = false;
6322 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006323 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
6324 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
6325 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
6326 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006327}
6328
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006329TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00006330 verifyFormat("void f() {\n"
6331 " A *a = new A;\n"
6332 " A *a = new (placement) A;\n"
6333 " delete a;\n"
6334 " delete (A *)a;\n"
6335 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00006336 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6337 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00006338 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6339 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6340 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00006341 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006342}
6343
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006344TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006345 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006346 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006347 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006348 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006349 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006350 verifyIndependentOfContext("int a = b * 10;");
6351 verifyIndependentOfContext("int a = 10 * b;");
6352 verifyIndependentOfContext("int a = b * c;");
6353 verifyIndependentOfContext("int a += b * c;");
6354 verifyIndependentOfContext("int a -= b * c;");
6355 verifyIndependentOfContext("int a *= b * c;");
6356 verifyIndependentOfContext("int a /= b * c;");
6357 verifyIndependentOfContext("int a = *b;");
6358 verifyIndependentOfContext("int a = *b * c;");
6359 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00006360 verifyIndependentOfContext("int a = b * (10);");
6361 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006362 verifyIndependentOfContext("return 10 * b;");
6363 verifyIndependentOfContext("return *b * *c;");
6364 verifyIndependentOfContext("return a & ~b;");
6365 verifyIndependentOfContext("f(b ? *c : *d);");
6366 verifyIndependentOfContext("int a = b ? *c : *d;");
6367 verifyIndependentOfContext("*b = a;");
6368 verifyIndependentOfContext("a * ~b;");
6369 verifyIndependentOfContext("a * !b;");
6370 verifyIndependentOfContext("a * +b;");
6371 verifyIndependentOfContext("a * -b;");
6372 verifyIndependentOfContext("a * ++b;");
6373 verifyIndependentOfContext("a * --b;");
6374 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00006375 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006376 verifyIndependentOfContext("f() * b;");
6377 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006378 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006379 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00006380 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006381 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00006382 verifyIndependentOfContext("return sizeof(int **);");
6383 verifyIndependentOfContext("return sizeof(int ******);");
6384 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00006385 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006386 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00006387 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00006388 verifyGoogleFormat("return sizeof(int**);");
6389 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
6390 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006391 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00006392 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00006393 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00006394 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00006395 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00006396 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00006397 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00006398 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00006399 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00006400 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00006401 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00006402 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00006403 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00006404 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00006405 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00006406 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00006407 verifyFormat("void f(const MyOverride &override);");
6408 verifyFormat("void f(const MyFinal &final);");
6409 verifyIndependentOfContext("bool a = f() && override.f();");
6410 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00006411
Daniel Jasper5b49f472013-01-23 12:10:53 +00006412 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00006413
Daniel Jasper5b49f472013-01-23 12:10:53 +00006414 verifyIndependentOfContext("A<int *> a;");
6415 verifyIndependentOfContext("A<int **> a;");
6416 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00006417 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006418 verifyIndependentOfContext(
6419 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006420 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00006421 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00006422 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00006423 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00006424 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00006425
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00006426 verifyFormat(
6427 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6428 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6429
Daniel Jasper1f5d6372016-06-13 14:45:12 +00006430 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00006431 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00006432 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006433 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00006434 verifyGoogleFormat("A<int*> a;");
6435 verifyGoogleFormat("A<int**> a;");
6436 verifyGoogleFormat("A<int*, int*> a;");
6437 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006438 verifyGoogleFormat("f(b ? *c : *d);");
6439 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00006440 verifyGoogleFormat("Type* t = **x;");
6441 verifyGoogleFormat("Type* t = *++*x;");
6442 verifyGoogleFormat("*++*x;");
6443 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
6444 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006445 verifyGoogleFormat(
6446 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00006447 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00006448 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
6449 verifyGoogleFormat("template <typename T>\n"
6450 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00006451
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006452 FormatStyle Left = getLLVMStyle();
6453 Left.PointerAlignment = FormatStyle::PAS_Left;
6454 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00006455 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00006456 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006457
Daniel Jasper5b49f472013-01-23 12:10:53 +00006458 verifyIndependentOfContext("a = *(x + y);");
6459 verifyIndependentOfContext("a = &(x + y);");
6460 verifyIndependentOfContext("*(x + y).call();");
6461 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006462 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00006463
Daniel Jasper5b49f472013-01-23 12:10:53 +00006464 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00006465 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00006466 "int *MyValues = {\n"
6467 " *A, // Operator detection might be confused by the '{'\n"
6468 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00006469 "};");
Nico Weber80a82762013-01-17 17:17:19 +00006470
Daniel Jasper5b49f472013-01-23 12:10:53 +00006471 verifyIndependentOfContext("if (int *a = &b)");
6472 verifyIndependentOfContext("if (int &a = *b)");
6473 verifyIndependentOfContext("if (a & b[i])");
6474 verifyIndependentOfContext("if (a::b::c::d & b[i])");
6475 verifyIndependentOfContext("if (*b[i])");
6476 verifyIndependentOfContext("if (int *a = (&b))");
6477 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00006478 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00006479 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00006480 verifyFormat("void f() {\n"
6481 " for (const int &v : Values) {\n"
6482 " }\n"
6483 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006484 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
6485 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00006486 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00006487
Daniel Jaspera98da3d2013-11-07 19:56:07 +00006488 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006489 verifyFormat("#define MACRO \\\n"
6490 " int *i = a * b; \\\n"
6491 " void f(a *b);",
6492 getLLVMStyleWithColumns(19));
6493
Daniel Jasper97b89482013-03-13 07:49:51 +00006494 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006495 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006496 verifyIndependentOfContext("T **t = new T *;");
6497 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00006498 verifyGoogleFormat("A = new SomeType*[Length]();");
6499 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006500 verifyGoogleFormat("T** t = new T*;");
6501 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006502
Daniel Jasper990ff972013-05-07 14:17:18 +00006503 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006504 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00006505 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00006506 verifyFormat("STATIC_ASSERT((a & b) == 0);");
6507 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006508 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006509 "typename t::if<x && y>::type f() {}");
6510 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006511 verifyFormat("vector<int *> v;");
6512 verifyFormat("vector<int *const> v;");
6513 verifyFormat("vector<int *const **const *> v;");
6514 verifyFormat("vector<int *volatile> v;");
6515 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006516 verifyFormat("foo<b && false>();");
6517 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00006518 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00006519 verifyFormat(
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006520 "template <class T, class = typename std::enable_if<\n"
6521 " std::is_integral<T>::value &&\n"
6522 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
6523 "void F();",
6524 getLLVMStyleWithColumns(70));
6525 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00006526 "template <class T,\n"
6527 " class = typename std::enable_if<\n"
6528 " std::is_integral<T>::value &&\n"
Daniel Jasper21f7dea2017-02-01 09:23:39 +00006529 " (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
6530 " class U>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006531 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00006532 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006533 verifyFormat(
6534 "template <class T,\n"
6535 " class = typename ::std::enable_if<\n"
6536 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6537 "void F();",
6538 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006539
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006540 verifyIndependentOfContext("MACRO(int *i);");
6541 verifyIndependentOfContext("MACRO(auto *a);");
6542 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006543 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006544 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006545 // FIXME: Is there a way to make this work?
6546 // verifyIndependentOfContext("MACRO(A *a);");
6547
Daniel Jasper32ccb032014-06-23 07:36:18 +00006548 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006549 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006550
Daniel Jasper866468a2014-04-14 13:15:29 +00006551 EXPECT_EQ("#define OP(x) \\\n"
6552 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6553 " return s << a.DebugString(); \\\n"
6554 " }",
6555 format("#define OP(x) \\\n"
6556 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6557 " return s << a.DebugString(); \\\n"
6558 " }",
6559 getLLVMStyleWithColumns(50)));
6560
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006561 // FIXME: We cannot handle this case yet; we might be able to figure out that
6562 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006563 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006564
6565 FormatStyle PointerMiddle = getLLVMStyle();
6566 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6567 verifyFormat("delete *x;", PointerMiddle);
6568 verifyFormat("int * x;", PointerMiddle);
6569 verifyFormat("template <int * y> f() {}", PointerMiddle);
6570 verifyFormat("int * f(int * a) {}", PointerMiddle);
6571 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6572 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6573 verifyFormat("A<int *> a;", PointerMiddle);
6574 verifyFormat("A<int **> a;", PointerMiddle);
6575 verifyFormat("A<int *, int *> a;", PointerMiddle);
6576 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006577 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6578 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006579 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006580
6581 // Member function reference qualifiers aren't binary operators.
6582 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006583 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006584 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006585 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006586 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006587 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006588}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006589
Daniel Jasperee6d6502013-07-17 20:25:02 +00006590TEST_F(FormatTest, UnderstandsAttributes) {
6591 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006592 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6593 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006594 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006595 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006596 verifyFormat("__attribute__((nodebug)) void\n"
6597 "foo() {}\n",
6598 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006599}
6600
Daniel Jasper10cd5812013-05-06 06:35:44 +00006601TEST_F(FormatTest, UnderstandsEllipsis) {
6602 verifyFormat("int printf(const char *fmt, ...);");
6603 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006604 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6605
6606 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006607 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006608 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006609}
6610
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006611TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006612 EXPECT_EQ("int *a;\n"
6613 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006614 "int *a;",
6615 format("int *a;\n"
6616 "int* a;\n"
6617 "int *a;",
6618 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006619 EXPECT_EQ("int* a;\n"
6620 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006621 "int* a;",
6622 format("int* a;\n"
6623 "int* a;\n"
6624 "int *a;",
6625 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006626 EXPECT_EQ("int *a;\n"
6627 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006628 "int *a;",
6629 format("int *a;\n"
6630 "int * a;\n"
6631 "int * a;",
6632 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006633 EXPECT_EQ("auto x = [] {\n"
6634 " int *a;\n"
6635 " int *a;\n"
6636 " int *a;\n"
6637 "};",
6638 format("auto x=[]{int *a;\n"
6639 "int * a;\n"
6640 "int * a;};",
6641 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006642}
6643
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006644TEST_F(FormatTest, UnderstandsRvalueReferences) {
6645 verifyFormat("int f(int &&a) {}");
6646 verifyFormat("int f(int a, char &&b) {}");
6647 verifyFormat("void f() { int &&a = b; }");
6648 verifyGoogleFormat("int f(int a, char&& b) {}");
6649 verifyGoogleFormat("void f() { int&& a = b; }");
6650
Daniel Jasper1eff9082013-05-27 16:36:33 +00006651 verifyIndependentOfContext("A<int &&> a;");
6652 verifyIndependentOfContext("A<int &&, int &&> a;");
6653 verifyGoogleFormat("A<int&&> a;");
6654 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006655
6656 // Not rvalue references:
6657 verifyFormat("template <bool B, bool C> class A {\n"
6658 " static_assert(B && C, \"Something is wrong\");\n"
6659 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006660 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6661 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006662 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006663}
6664
Manuel Klimekc1237a82013-01-23 14:08:21 +00006665TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6666 verifyFormat("void f() {\n"
6667 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006668 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006669 "}",
6670 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006671}
6672
Daniel Jasperef906a92013-01-13 08:01:36 +00006673TEST_F(FormatTest, FormatsCasts) {
6674 verifyFormat("Type *A = static_cast<Type *>(P);");
6675 verifyFormat("Type *A = (Type *)P;");
6676 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6677 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006678 verifyFormat("int a = (int)2.0f;");
6679 verifyFormat("x[(int32)y];");
6680 verifyFormat("x = (int32)y;");
6681 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6682 verifyFormat("int a = (int)*b;");
6683 verifyFormat("int a = (int)2.0f;");
6684 verifyFormat("int a = (int)~0;");
6685 verifyFormat("int a = (int)++a;");
6686 verifyFormat("int a = (int)sizeof(int);");
6687 verifyFormat("int a = (int)+2;");
6688 verifyFormat("my_int a = (my_int)2.0f;");
6689 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006690 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006691 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006692 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006693 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006694 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006695
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006696 verifyFormat("void f() { my_int a = (my_int)*b; }");
6697 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6698 verifyFormat("my_int a = (my_int)~0;");
6699 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006700 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006701 verifyFormat("my_int a = (my_int)1;");
6702 verifyFormat("my_int a = (my_int *)1;");
6703 verifyFormat("my_int a = (const my_int)-1;");
6704 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006705 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006706 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006707 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006708 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006709
6710 // FIXME: single value wrapped with paren will be treated as cast.
6711 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006712
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006713 verifyFormat("{ (void)F; }");
6714
Daniel Jasper998cabc2013-07-18 14:46:07 +00006715 // Don't break after a cast's
6716 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6717 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6718 " bbbbbbbbbbbbbbbbbbbbbb);");
6719
Daniel Jasperef906a92013-01-13 08:01:36 +00006720 // These are not casts.
6721 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006722 verifyFormat("f(foo)->b;");
6723 verifyFormat("f(foo).b;");
6724 verifyFormat("f(foo)(b);");
6725 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006726 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006727 verifyFormat("(*funptr)(foo)[4];");
6728 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006729 verifyFormat("void f(int *);");
6730 verifyFormat("void f(int *) = 0;");
6731 verifyFormat("void f(SmallVector<int>) {}");
6732 verifyFormat("void f(SmallVector<int>);");
6733 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006734 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006735 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006736 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006737 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6738 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006739 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006740
Daniel Jasperba0bda92013-02-23 08:07:18 +00006741 // These are not casts, but at some point were confused with casts.
6742 verifyFormat("virtual void foo(int *) override;");
6743 verifyFormat("virtual void foo(char &) const;");
6744 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006745 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006746 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006747 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006748 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006749
6750 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6751 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006752 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006753 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006754 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6755 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6756 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006757}
6758
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006759TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006760 verifyFormat("A<bool()> a;");
6761 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006762 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006763 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006764 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006765 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006766 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006767 verifyFormat("template <class CallbackClass>\n"
6768 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006769
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006770 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6771 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006772 verifyGoogleFormat(
6773 "template <class CallbackClass>\n"
6774 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006775
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006776 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006777 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006778 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006779 verifyFormat("some_var = function(*some_pointer_var)[0];");
6780 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006781 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006782 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006783}
6784
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006785TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6786 verifyFormat("A (*foo_)[6];");
6787 verifyFormat("vector<int> (*foo_)[6];");
6788}
6789
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006790TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6791 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6792 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6793 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6794 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006795 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6796 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006797
6798 // Different ways of ()-initializiation.
6799 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6800 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6801 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6802 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6803 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6804 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006805 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6806 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006807}
6808
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006809TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006810 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006811 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006812 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006813 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006814 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006815 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006816 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6817 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006818 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6819 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006820 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6821 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006822 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6823 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006824 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6825 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006826 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6827 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6828 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6829 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006830 FormatStyle Indented = getLLVMStyle();
6831 Indented.IndentWrappedFunctionNames = true;
6832 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6833 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6834 Indented);
6835 verifyFormat(
6836 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6837 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6838 Indented);
6839 verifyFormat(
6840 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6841 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6842 Indented);
6843 verifyFormat(
6844 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6845 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6846 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006847
6848 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006849 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6850 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6851 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006852
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006853 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006854 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006855 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006856 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6857 " SourceLocation L, IdentifierIn *II,\n"
6858 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006859 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006860 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006861 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006862 " const SomeType<string, SomeOtherTemplateParameter>\n"
6863 " &ReallyReallyLongParameterName,\n"
6864 " const SomeType<string, SomeOtherTemplateParameter>\n"
6865 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006866 verifyFormat("template <typename A>\n"
6867 "SomeLoooooooooooooooooooooongType<\n"
6868 " typename some_namespace::SomeOtherType<A>::Type>\n"
6869 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006870
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006871 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006872 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6873 " aaaaaaaaaaaaaaaaaaaaaaa;");
6874 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006875 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6876 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006877 verifyGoogleFormat(
6878 "some_namespace::LongReturnType\n"
6879 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006880 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006881
6882 verifyGoogleFormat("template <typename T>\n"
6883 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006884 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006885 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6886 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006887
6888 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006889 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6890 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006891 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6892 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6893 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6894 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6895 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6896 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6897 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006898}
6899
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006900TEST_F(FormatTest, FormatsArrays) {
6901 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6902 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006903 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6904 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006905 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6906 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006907 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6908 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6909 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6910 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6911 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6912 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6913 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6914 verifyFormat(
6915 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6916 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6917 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006918 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6919 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006920
6921 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6922 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006923 verifyFormat(
6924 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6925 " .aaaaaaa[0]\n"
6926 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006927 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006928
6929 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006930
6931 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6932 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006933}
6934
Daniel Jaspere9de2602012-12-06 09:56:08 +00006935TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6936 verifyFormat("(a)->b();");
6937 verifyFormat("--a;");
6938}
6939
Daniel Jasper8b529712012-12-04 13:02:32 +00006940TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006941 verifyFormat("#include <string>\n"
6942 "#include <a/b/c.h>\n"
6943 "#include \"a/b/string\"\n"
6944 "#include \"string.h\"\n"
6945 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006946 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006947 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006948 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006949 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006950 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006951 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
6952 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006953 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6954 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006955
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006956 verifyFormat("#import <string>");
6957 verifyFormat("#import <a/b/c.h>");
6958 verifyFormat("#import \"a/b/string\"");
6959 verifyFormat("#import \"string.h\"");
6960 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006961 verifyFormat("#if __has_include(<strstream>)\n"
6962 "#include <strstream>\n"
6963 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006964
Daniel Jasper343643b2014-08-13 08:29:18 +00006965 verifyFormat("#define MY_IMPORT <a/b>");
6966
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006967 // Protocol buffer definition or missing "#".
6968 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6969 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006970
6971 FormatStyle Style = getLLVMStyle();
6972 Style.AlwaysBreakBeforeMultilineStrings = true;
6973 Style.ColumnLimit = 0;
6974 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006975
6976 // But 'import' might also be a regular C++ namespace.
6977 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6978 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006979}
6980
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006981//===----------------------------------------------------------------------===//
6982// Error recovery tests.
6983//===----------------------------------------------------------------------===//
6984
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006985TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006986 FormatStyle NoBinPacking = getLLVMStyle();
6987 NoBinPacking.BinPackParameters = false;
6988 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6989 " double *min_x,\n"
6990 " double *max_x,\n"
6991 " double *min_y,\n"
6992 " double *max_y,\n"
6993 " double *min_z,\n"
6994 " double *max_z, ) {}",
6995 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006996}
6997
Daniel Jasper83a54d22013-01-10 09:26:47 +00006998TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006999 verifyFormat("void f() { return; }\n42");
7000 verifyFormat("void f() {\n"
7001 " if (0)\n"
7002 " return;\n"
7003 "}\n"
7004 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00007005 verifyFormat("void f() { return }\n42");
7006 verifyFormat("void f() {\n"
7007 " if (0)\n"
7008 " return\n"
7009 "}\n"
7010 "42");
7011}
7012
7013TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
7014 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
7015 EXPECT_EQ("void f() {\n"
7016 " if (a)\n"
7017 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007018 "}",
7019 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00007020 EXPECT_EQ("namespace N {\n"
7021 "void f()\n"
7022 "}",
7023 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00007024 EXPECT_EQ("namespace N {\n"
7025 "void f() {}\n"
7026 "void g()\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007027 "}",
7028 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00007029}
7030
Daniel Jasper2df93312013-01-09 10:16:05 +00007031TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
7032 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00007033 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007034 " b;",
7035 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00007036 verifyFormat("function(\n"
7037 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007038 " LoooooooooooongArgument);\n",
7039 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00007040}
7041
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007042TEST_F(FormatTest, IncorrectAccessSpecifier) {
7043 verifyFormat("public:");
7044 verifyFormat("class A {\n"
7045 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007046 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007047 "};");
7048 verifyFormat("public\n"
7049 "int qwerty;");
7050 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007051 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007052 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007053 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007054 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007055 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007056}
Daniel Jasperf7935112012-12-03 18:12:45 +00007057
Daniel Jasper291f9362013-03-20 15:58:10 +00007058TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
7059 verifyFormat("{");
7060 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00007061 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00007062}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007063
7064TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007065 verifyFormat("do {\n}");
7066 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007067 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007068 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007069 "wheeee(fun);");
7070 verifyFormat("do {\n"
7071 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00007072 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007073}
7074
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007075TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00007076 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007077 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007078 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007079 verifyFormat("while {\n foo;\n foo();\n}");
7080 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00007081}
7082
Daniel Jasperc0880a92013-01-04 18:52:56 +00007083TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007084 verifyIncompleteFormat("namespace {\n"
7085 "class Foo { Foo (\n"
7086 "};\n"
7087 "} // comment");
Daniel Jasperc0880a92013-01-04 18:52:56 +00007088}
7089
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007090TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007091 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007092 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
7093 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007094 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007095
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007096 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007097 " {\n"
7098 " breakme(\n"
7099 " qwe);\n"
7100 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007101 format("{\n"
7102 " {\n"
7103 " breakme(qwe);\n"
7104 "}\n",
7105 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007106}
7107
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00007108TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007109 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007110 " avariable,\n"
7111 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007112 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00007113}
7114
Manuel Klimek762dd182013-01-21 10:07:49 +00007115TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007116 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00007117}
7118
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007119TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007120 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00007121 verifyFormat("vector<int> x{\n"
7122 " 1, 2, 3, 4,\n"
7123 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007124 verifyFormat("vector<T> x{{}, {}, {}, {}};");
7125 verifyFormat("f({1, 2});");
7126 verifyFormat("auto v = Foo{-1};");
7127 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
7128 verifyFormat("Class::Class : member{1, 2, 3} {}");
7129 verifyFormat("new vector<int>{1, 2, 3};");
7130 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00007131 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007132 verifyFormat("return {arg1, arg2};");
7133 verifyFormat("return {arg1, SomeType{parameter}};");
7134 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
7135 verifyFormat("new T{arg1, arg2};");
7136 verifyFormat("f(MyMap[{composite, key}]);");
7137 verifyFormat("class Class {\n"
7138 " T member = {arg1, arg2};\n"
7139 "};");
7140 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00007141 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
7142 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00007143
Daniel Jasper438059e2014-05-22 12:11:13 +00007144 verifyFormat("int foo(int i) { return fo1{}(i); }");
7145 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007146 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00007147 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00007148 verifyFormat("Node n{1, Node{1000}, //\n"
7149 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00007150 verifyFormat("Aaaa aaaaaaa{\n"
7151 " {\n"
7152 " aaaa,\n"
7153 " },\n"
7154 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00007155 verifyFormat("class C : public D {\n"
7156 " SomeClass SC{2};\n"
7157 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00007158 verifyFormat("class C : public A {\n"
7159 " class D : public B {\n"
7160 " void f() { int i{2}; }\n"
7161 " };\n"
7162 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00007163 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00007164
Daniel Jaspere4ada022016-12-13 10:05:03 +00007165 // Cases where distinguising braced lists and blocks is hard.
7166 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
7167 verifyFormat("void f() {\n"
7168 " return; // comment\n"
7169 "}\n"
7170 "SomeType t;");
7171 verifyFormat("void f() {\n"
7172 " if (a) {\n"
7173 " f();\n"
7174 " }\n"
7175 "}\n"
7176 "SomeType t;");
7177
Daniel Jasper08434342015-05-26 07:26:26 +00007178 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007179 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00007180 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007181 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
7182 " bbbbb,\n"
7183 " ccccc,\n"
7184 " ddddd,\n"
7185 " eeeee,\n"
7186 " ffffff,\n"
7187 " ggggg,\n"
7188 " hhhhhh,\n"
7189 " iiiiii,\n"
7190 " jjjjjj,\n"
7191 " kkkkkk};",
7192 NoBinPacking);
7193 verifyFormat("const Aaaaaa aaaaa = {\n"
7194 " aaaaa,\n"
7195 " bbbbb,\n"
7196 " ccccc,\n"
7197 " ddddd,\n"
7198 " eeeee,\n"
7199 " ffffff,\n"
7200 " ggggg,\n"
7201 " hhhhhh,\n"
7202 " iiiiii,\n"
7203 " jjjjjj,\n"
7204 " kkkkkk,\n"
7205 "};",
7206 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00007207 verifyFormat(
7208 "const Aaaaaa aaaaa = {\n"
7209 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
7210 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
7211 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
7212 "};",
7213 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007214
Chandler Carruthf8b72662014-03-02 12:37:31 +00007215 // FIXME: The alignment of these trailing comments might be bad. Then again,
7216 // this might be utterly useless in real code.
7217 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00007218 " : some_value{ //\n"
7219 " aaaaaaa, //\n"
7220 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00007221
Chandler Carruthf8b72662014-03-02 12:37:31 +00007222 // In braced lists, the first comment is always assumed to belong to the
7223 // first element. Thus, it can be moved to the next or previous line as
7224 // appropriate.
7225 EXPECT_EQ("function({// First element:\n"
7226 " 1,\n"
7227 " // Second element:\n"
7228 " 2});",
7229 format("function({\n"
7230 " // First element:\n"
7231 " 1,\n"
7232 " // Second element:\n"
7233 " 2});"));
7234 EXPECT_EQ("std::vector<int> MyNumbers{\n"
7235 " // First element:\n"
7236 " 1,\n"
7237 " // Second element:\n"
7238 " 2};",
7239 format("std::vector<int> MyNumbers{// First element:\n"
7240 " 1,\n"
7241 " // Second element:\n"
7242 " 2};",
7243 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00007244 // A trailing comma should still lead to an enforced line break.
7245 EXPECT_EQ("vector<int> SomeVector = {\n"
7246 " // aaa\n"
7247 " 1, 2,\n"
7248 "};",
7249 format("vector<int> SomeVector = { // aaa\n"
7250 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00007251
Chandler Carruthf8b72662014-03-02 12:37:31 +00007252 FormatStyle ExtraSpaces = getLLVMStyle();
7253 ExtraSpaces.Cpp11BracedListStyle = false;
7254 ExtraSpaces.ColumnLimit = 75;
7255 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
7256 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
7257 verifyFormat("f({ 1, 2 });", ExtraSpaces);
7258 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
7259 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
7260 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
7261 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
7262 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
7263 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
7264 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
7265 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
7266 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
7267 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
7268 verifyFormat("class Class {\n"
7269 " T member = { arg1, arg2 };\n"
7270 "};",
7271 ExtraSpaces);
7272 verifyFormat(
7273 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7274 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
7275 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
7276 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
7277 ExtraSpaces);
7278 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00007279 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007280 ExtraSpaces);
7281 verifyFormat(
7282 "someFunction(OtherParam,\n"
7283 " BracedList{ // comment 1 (Forcing interesting break)\n"
7284 " param1, param2,\n"
7285 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00007286 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007287 ExtraSpaces);
7288 verifyFormat(
7289 "std::this_thread::sleep_for(\n"
7290 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
7291 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00007292 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00007293 " aaaaaaa,\n"
7294 " aaaaaaaaaa,\n"
7295 " aaaaa,\n"
7296 " aaaaaaaaaaaaaaa,\n"
7297 " aaa,\n"
7298 " aaaaaaaaaa,\n"
7299 " a,\n"
7300 " aaaaaaaaaaaaaaaaaaaaa,\n"
7301 " aaaaaaaaaaaa,\n"
7302 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
7303 " aaaaaaa,\n"
7304 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007305 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00007306}
7307
Daniel Jasper33b909c2013-10-25 14:29:37 +00007308TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007309 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7310 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7311 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7312 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7313 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7314 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007315 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007316 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00007317 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007318 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7319 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007320 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007321 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7322 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7323 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
7324 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7325 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7326 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7327 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007328 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007329 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7330 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007331 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7332 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7333 " // Separating comment.\n"
7334 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
7335 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7336 " // Leading comment\n"
7337 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7338 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007339 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7340 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007341 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00007342 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7343 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007344 getLLVMStyleWithColumns(38));
7345 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007346 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
7347 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007348 verifyFormat(
7349 "static unsigned SomeValues[10][3] = {\n"
7350 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
7351 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
7352 verifyFormat("static auto fields = new vector<string>{\n"
7353 " \"aaaaaaaaaaaaa\",\n"
7354 " \"aaaaaaaaaaaaa\",\n"
7355 " \"aaaaaaaaaaaa\",\n"
7356 " \"aaaaaaaaaaaaaa\",\n"
7357 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7358 " \"aaaaaaaaaaaa\",\n"
7359 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7360 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00007361 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
7362 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
7363 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
7364 " 3, cccccccccccccccccccccc};",
7365 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00007366
7367 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00007368 verifyFormat("vector<int> x = {\n"
7369 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
7370 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00007371 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00007372 verifyFormat("vector<int> x = {\n"
7373 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00007374 "};",
7375 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00007376 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7377 " 1, 1, 1, 1,\n"
7378 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00007379 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007380
Daniel Jasper60c27072015-05-13 08:16:00 +00007381 // Trailing comment in the first line.
7382 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
7383 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
7384 " 111111111, 222222222, 3333333333, 444444444, //\n"
7385 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00007386 // Trailing comment in the last line.
7387 verifyFormat("int aaaaa[] = {\n"
7388 " 1, 2, 3, // comment\n"
7389 " 4, 5, 6 // comment\n"
7390 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00007391
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007392 // With nested lists, we should either format one item per line or all nested
7393 // lists one on line.
7394 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007395 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
7396 " {aaaaaaaaaaaaaaaaaaa},\n"
7397 " {aaaaaaaaaaaaaaaaaaaaa},\n"
7398 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00007399 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00007400 verifyFormat(
7401 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007402 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
7403 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
7404 " {aaa, aaa},\n"
7405 " {aaa, aaa},\n"
7406 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
7407 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7408 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00007409
7410 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007411 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
7412 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00007413
7414 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00007415
Daniel Jaspereb65e912015-12-21 18:31:15 +00007416 // No braced initializer here.
7417 verifyFormat("void f() {\n"
7418 " struct Dummy {};\n"
7419 " f(v);\n"
7420 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00007421
7422 // Long lists should be formatted in columns even if they are nested.
7423 verifyFormat(
7424 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7425 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7426 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7427 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7428 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7429 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00007430
7431 // Allow "single-column" layout even if that violates the column limit. There
7432 // isn't going to be a better way.
7433 verifyFormat("std::vector<int> a = {\n"
7434 " aaaaaaaa,\n"
7435 " aaaaaaaa,\n"
7436 " aaaaaaaa,\n"
7437 " aaaaaaaa,\n"
7438 " aaaaaaaaaa,\n"
7439 " aaaaaaaa,\n"
7440 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
7441 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00007442 verifyFormat("vector<int> aaaa = {\n"
7443 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7444 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7445 " aaaaaa.aaaaaaa,\n"
7446 " aaaaaa.aaaaaaa,\n"
7447 " aaaaaa.aaaaaaa,\n"
7448 " aaaaaa.aaaaaaa,\n"
7449 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007450
7451 // Don't create hanging lists.
Daniel Jasper21f7dea2017-02-01 09:23:39 +00007452 verifyFormat("someFunction(Param, {List1, List2,\n"
7453 " List3});",
7454 getLLVMStyleWithColumns(35));
7455 verifyFormat("someFunction(Param, Param,\n"
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007456 " {List1, List2,\n"
7457 " List3});",
7458 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00007459 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
7460 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007461}
7462
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007463TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007464 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00007465 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007466
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007467 verifyFormat("void f() { return 42; }");
7468 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007469 " return 42;\n"
7470 "}",
7471 DoNotMerge);
7472 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007473 " // Comment\n"
7474 "}");
7475 verifyFormat("{\n"
7476 "#error {\n"
7477 " int a;\n"
7478 "}");
7479 verifyFormat("{\n"
7480 " int a;\n"
7481 "#error {\n"
7482 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00007483 verifyFormat("void f() {} // comment");
7484 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00007485 verifyFormat("void f() {\n"
7486 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007487 DoNotMerge);
7488 verifyFormat("void f() {\n"
7489 " int a;\n"
7490 "} // comment",
7491 DoNotMerge);
7492 verifyFormat("void f() {\n"
7493 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00007494 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007495
7496 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7497 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7498
7499 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7500 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007501 verifyFormat("class C {\n"
7502 " C()\n"
7503 " : iiiiiiii(nullptr),\n"
7504 " kkkkkkk(nullptr),\n"
7505 " mmmmmmm(nullptr),\n"
7506 " nnnnnnn(nullptr) {}\n"
7507 "};",
7508 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007509
7510 FormatStyle NoColumnLimit = getLLVMStyle();
7511 NoColumnLimit.ColumnLimit = 0;
7512 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7513 EXPECT_EQ("class C {\n"
7514 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007515 "};",
7516 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007517 EXPECT_EQ("A()\n"
7518 " : b(0) {\n"
7519 "}",
7520 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7521
7522 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007523 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7524 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007525 EXPECT_EQ("A()\n"
7526 " : b(0) {\n"
7527 "}",
7528 format("A():b(0){}", DoNotMergeNoColumnLimit));
7529 EXPECT_EQ("A()\n"
7530 " : b(0) {\n"
7531 "}",
7532 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007533
7534 verifyFormat("#define A \\\n"
7535 " void f() { \\\n"
7536 " int i; \\\n"
7537 " }",
7538 getLLVMStyleWithColumns(20));
7539 verifyFormat("#define A \\\n"
7540 " void f() { int i; }",
7541 getLLVMStyleWithColumns(21));
7542 verifyFormat("#define A \\\n"
7543 " void f() { \\\n"
7544 " int i; \\\n"
7545 " } \\\n"
7546 " int j;",
7547 getLLVMStyleWithColumns(22));
7548 verifyFormat("#define A \\\n"
7549 " void f() { int i; } \\\n"
7550 " int j;",
7551 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007552}
7553
Daniel Jasperd74cf402014-04-08 12:46:38 +00007554TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7555 FormatStyle MergeInlineOnly = getLLVMStyle();
7556 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7557 verifyFormat("class C {\n"
7558 " int f() { return 42; }\n"
7559 "};",
7560 MergeInlineOnly);
7561 verifyFormat("int f() {\n"
7562 " return 42;\n"
7563 "}",
7564 MergeInlineOnly);
7565}
7566
Manuel Klimeke01bab52013-01-15 13:38:33 +00007567TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7568 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007569 verifyFormat("struct foo a = {bar};\nint n;");
7570 verifyFormat("class foo a = {bar};\nint n;");
7571 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007572
7573 // Elaborate types inside function definitions.
7574 verifyFormat("struct foo f() {}\nint n;");
7575 verifyFormat("class foo f() {}\nint n;");
7576 verifyFormat("union foo f() {}\nint n;");
7577
7578 // Templates.
7579 verifyFormat("template <class X> void f() {}\nint n;");
7580 verifyFormat("template <struct X> void f() {}\nint n;");
7581 verifyFormat("template <union X> void f() {}\nint n;");
7582
7583 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007584 verifyFormat("struct {\n} n;");
7585 verifyFormat(
7586 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007587 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007588 verifyFormat("class MACRO Z {\n} n;");
7589 verifyFormat("class MACRO(X) Z {\n} n;");
7590 verifyFormat("class __attribute__(X) Z {\n} n;");
7591 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007592 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007593 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007594 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7595 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007596
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007597 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007598 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007599
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007600 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007601 verifyFormat(
7602 "template <typename F>\n"
7603 "Matcher(const Matcher<F> &Other,\n"
7604 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7605 " !is_same<F, T>::value>::type * = 0)\n"
7606 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7607
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007608 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007609 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007610 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007611
7612 // FIXME:
7613 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007614 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007615
Manuel Klimeke01bab52013-01-15 13:38:33 +00007616 // Elaborate types where incorrectly parsing the structural element would
7617 // break the indent.
7618 verifyFormat("if (true)\n"
7619 " class X x;\n"
7620 "else\n"
7621 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007622
7623 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007624 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007625}
7626
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007627TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007628 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7629 format("#error Leave all white!!!!! space* alone!\n"));
7630 EXPECT_EQ(
7631 "#warning Leave all white!!!!! space* alone!\n",
7632 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007633 EXPECT_EQ("#error 1", format(" # error 1"));
7634 EXPECT_EQ("#warning 1", format(" # warning 1"));
7635}
7636
Daniel Jasper4431aa92013-04-23 13:54:04 +00007637TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007638 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007639 verifyFormat("#if (AAAA && BBBB)");
7640 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007641 // FIXME: Come up with a better indentation for #elif.
7642 verifyFormat(
7643 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7644 " defined(BBBBBBBB)\n"
7645 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7646 " defined(BBBBBBBB)\n"
7647 "#endif",
7648 getLLVMStyleWithColumns(65));
7649}
7650
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007651TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7652 FormatStyle AllowsMergedIf = getGoogleStyle();
7653 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7654 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7655 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007656 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7657 EXPECT_EQ("if (true) return 42;",
7658 format("if (true)\nreturn 42;", AllowsMergedIf));
7659 FormatStyle ShortMergedIf = AllowsMergedIf;
7660 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007661 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007662 " if (true) return 42;",
7663 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007664 verifyFormat("#define A \\\n"
7665 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007666 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007667 "#define B",
7668 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007669 verifyFormat("#define A \\\n"
7670 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007671 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007672 "g();",
7673 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007674 verifyFormat("{\n"
7675 "#ifdef A\n"
7676 " // Comment\n"
7677 " if (true) continue;\n"
7678 "#endif\n"
7679 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007680 " if (true) continue;\n"
7681 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007682 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007683 ShortMergedIf.ColumnLimit = 29;
7684 verifyFormat("#define A \\\n"
7685 " if (aaaaaaaaaa) return 1; \\\n"
7686 " return 2;",
7687 ShortMergedIf);
7688 ShortMergedIf.ColumnLimit = 28;
7689 verifyFormat("#define A \\\n"
7690 " if (aaaaaaaaaa) \\\n"
7691 " return 1; \\\n"
7692 " return 2;",
7693 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007694}
7695
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007696TEST_F(FormatTest, BlockCommentsInControlLoops) {
7697 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7698 " f();\n"
7699 "}");
7700 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7701 " f();\n"
7702 "} /* another comment */ else /* comment #3 */ {\n"
7703 " g();\n"
7704 "}");
7705 verifyFormat("while (0) /* a comment in a strange place */ {\n"
7706 " f();\n"
7707 "}");
7708 verifyFormat("for (;;) /* a comment in a strange place */ {\n"
7709 " f();\n"
7710 "}");
7711 verifyFormat("do /* a comment in a strange place */ {\n"
7712 " f();\n"
7713 "} /* another comment */ while (0);");
7714}
7715
7716TEST_F(FormatTest, BlockComments) {
7717 EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
7718 format("/* *//* */ /* */\n/* *//* */ /* */"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007719 EXPECT_EQ("/* */ a /* */ b;", format(" /* */ a/* */ b;"));
Daniel Jaspera49393f2013-08-28 09:07:32 +00007720 EXPECT_EQ("#define A /*123*/ \\\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007721 " b\n"
7722 "/* */\n"
7723 "someCall(\n"
7724 " parameter);",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00007725 format("#define A /*123*/ b\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007726 "/* */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007727 "someCall(parameter);",
7728 getLLVMStyleWithColumns(15)));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007729
7730 EXPECT_EQ("#define A\n"
7731 "/* */ someCall(\n"
7732 " parameter);",
7733 format("#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007734 "/* */someCall(parameter);",
7735 getLLVMStyleWithColumns(15)));
Daniel Jasper51fb2b22013-05-30 06:40:07 +00007736 EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007737 EXPECT_EQ("/*\n"
7738 "*\n"
7739 " * aaaaaa\n"
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00007740 " * aaaaaa\n"
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007741 "*/",
7742 format("/*\n"
7743 "*\n"
7744 " * aaaaaa aaaaaa\n"
7745 "*/",
7746 getLLVMStyleWithColumns(10)));
Daniel Jasperce257f22013-05-30 17:27:48 +00007747 EXPECT_EQ("/*\n"
7748 "**\n"
7749 "* aaaaaa\n"
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007750 "*aaaaaa\n"
Daniel Jasperce257f22013-05-30 17:27:48 +00007751 "*/",
7752 format("/*\n"
7753 "**\n"
7754 "* aaaaaa aaaaaa\n"
7755 "*/",
7756 getLLVMStyleWithColumns(10)));
Daniel Jasperacadc8e2016-06-08 09:45:08 +00007757 EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7758 " /* line 1\n"
7759 " bbbbbbbbbbbb */\n"
7760 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7761 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7762 " /* line 1\n"
7763 " bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7764 getLLVMStyleWithColumns(50)));
Daniel Jasper1f140982013-02-04 07:32:14 +00007765
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007766 FormatStyle NoBinPacking = getLLVMStyle();
7767 NoBinPacking.BinPackParameters = false;
Daniel Jasper1f140982013-02-04 07:32:14 +00007768 EXPECT_EQ("someFunction(1, /* comment 1 */\n"
7769 " 2, /* comment 2 */\n"
7770 " 3, /* comment 3 */\n"
Daniel Jasper14e40ec2013-02-04 08:34:57 +00007771 " aaaa,\n"
7772 " bbbb);",
Daniel Jasper1f140982013-02-04 07:32:14 +00007773 format("someFunction (1, /* comment 1 */\n"
7774 " 2, /* comment 2 */ \n"
7775 " 3, /* comment 3 */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007776 "aaaa, bbbb );",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007777 NoBinPacking));
Daniel Jasper38396592013-02-06 15:23:09 +00007778 verifyFormat(
7779 "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7780 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7781 EXPECT_EQ(
7782 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7783 " aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7784 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
7785 format(
7786 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7787 " aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7788 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
Daniel Jasper94f0e132013-02-06 20:07:35 +00007789 EXPECT_EQ(
7790 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7791 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7792 "int cccccccccccccccccccccccccccccc; /* comment */\n",
7793 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7794 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7795 "int cccccccccccccccccccccccccccccc; /* comment */\n"));
Daniel Jasper022612d2013-07-01 09:34:09 +00007796
7797 verifyFormat("void f(int * /* unused */) {}");
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007798
7799 EXPECT_EQ("/*\n"
7800 " **\n"
7801 " */",
7802 format("/*\n"
7803 " **\n"
7804 " */"));
7805 EXPECT_EQ("/*\n"
7806 " *q\n"
7807 " */",
7808 format("/*\n"
7809 " *q\n"
7810 " */"));
7811 EXPECT_EQ("/*\n"
7812 " * q\n"
7813 " */",
7814 format("/*\n"
7815 " * q\n"
7816 " */"));
7817 EXPECT_EQ("/*\n"
7818 " **/",
7819 format("/*\n"
7820 " **/"));
7821 EXPECT_EQ("/*\n"
7822 " ***/",
7823 format("/*\n"
7824 " ***/"));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007825}
7826
Manuel Klimek82b836a2013-02-06 16:40:56 +00007827TEST_F(FormatTest, BlockCommentsInMacros) {
7828 EXPECT_EQ("#define A \\\n"
7829 " { \\\n"
7830 " /* one line */ \\\n"
7831 " someCall();",
7832 format("#define A { \\\n"
7833 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007834 " someCall();",
7835 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007836 EXPECT_EQ("#define A \\\n"
7837 " { \\\n"
7838 " /* previous */ \\\n"
7839 " /* one line */ \\\n"
7840 " someCall();",
7841 format("#define A { \\\n"
7842 " /* previous */ \\\n"
7843 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007844 " someCall();",
7845 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007846}
7847
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007848TEST_F(FormatTest, BlockCommentsAtEndOfLine) {
7849 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007850 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007851 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007852 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007853 "};",
7854 getLLVMStyleWithColumns(15)));
7855 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007856 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007857 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007858 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007859 "};",
7860 getLLVMStyleWithColumns(15)));
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007861 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007862 " 1111 /* a\n"
Krasimir Georgiev91834222017-01-25 13:58:58 +00007863 " */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007864 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007865 format("a = {1111 /* a */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007866 "};",
7867 getLLVMStyleWithColumns(15)));
7868}
7869
Manuel Klimek82b836a2013-02-06 16:40:56 +00007870TEST_F(FormatTest, IndentLineCommentsInStartOfBlockAtEndOfFile) {
Manuel Klimek82b836a2013-02-06 16:40:56 +00007871 verifyFormat("{\n"
Marianne Mailhot-Sarrasin03137c62016-04-14 14:56:49 +00007872 " // a\n"
7873 " // b");
Manuel Klimek82b836a2013-02-06 16:40:56 +00007874}
7875
Manuel Klimekd33516e2013-01-23 10:09:28 +00007876TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007877 verifyFormat("void f(int *a);");
7878 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007879 verifyFormat("class A {\n void f(int *a);\n};");
7880 verifyFormat("class A {\n int *a;\n};");
7881 verifyFormat("namespace a {\n"
7882 "namespace b {\n"
7883 "class A {\n"
7884 " void f() {}\n"
7885 " int *a;\n"
7886 "};\n"
7887 "}\n"
7888 "}");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007889}
7890
Manuel Klimekd33516e2013-01-23 10:09:28 +00007891TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7892 verifyFormat("while");
7893 verifyFormat("operator");
7894}
7895
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007896TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7897 // This code would be painfully slow to format if we didn't skip it.
7898 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
7899 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7900 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7901 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7902 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7903 "A(1, 1)\n"
7904 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7905 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7906 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7907 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7908 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7909 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7910 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7911 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7912 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7913 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7914 // Deeply nested part is untouched, rest is formatted.
7915 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7916 format(std::string("int i;\n") + Code + "int j;\n",
7917 getLLVMStyle(), IC_ExpectIncomplete));
7918}
7919
Nico Weber7e6a7a12013-01-08 17:56:31 +00007920//===----------------------------------------------------------------------===//
7921// Objective-C tests.
7922//===----------------------------------------------------------------------===//
7923
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007924TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7925 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7926 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7927 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007928 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007929 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7930 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7931 format("-(NSInteger)Method3:(id)anObject;"));
7932 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7933 format("-(NSInteger)Method4:(id)anObject;"));
7934 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7935 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7936 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7937 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007938 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7939 "forAllCells:(BOOL)flag;",
7940 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7941 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007942
7943 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007944 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7945 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007946 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7947 " inRange:(NSRange)range\n"
7948 " outRange:(NSRange)out_range\n"
7949 " outRange1:(NSRange)out_range1\n"
7950 " outRange2:(NSRange)out_range2\n"
7951 " outRange3:(NSRange)out_range3\n"
7952 " outRange4:(NSRange)out_range4\n"
7953 " outRange5:(NSRange)out_range5\n"
7954 " outRange6:(NSRange)out_range6\n"
7955 " outRange7:(NSRange)out_range7\n"
7956 " outRange8:(NSRange)out_range8\n"
7957 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007958
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007959 // When the function name has to be wrapped.
7960 FormatStyle Style = getLLVMStyle();
7961 Style.IndentWrappedFunctionNames = false;
7962 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7963 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7964 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7965 "}",
7966 Style);
7967 Style.IndentWrappedFunctionNames = true;
7968 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7969 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7970 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7971 "}",
7972 Style);
7973
Nico Weberd6f962f2013-01-10 20:18:33 +00007974 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007975 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007976 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7977 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007978 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007979
Daniel Jasper37194282013-05-28 08:33:00 +00007980 verifyFormat("- (int (*)())foo:(int (*)())f;");
7981 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007982
7983 // If there's no return type (very rare in practice!), LLVM and Google style
7984 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007985 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007986 verifyFormat("- foo:(int)f;");
7987 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007988}
7989
Nico Weber0588b502013-02-07 00:19:29 +00007990
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007991TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007992 EXPECT_EQ("\"some text \"\n"
7993 "\"other\";",
7994 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007995 EXPECT_EQ("\"some text \"\n"
7996 "\"other\";",
7997 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007998 EXPECT_EQ(
7999 "#define A \\\n"
8000 " \"some \" \\\n"
8001 " \"text \" \\\n"
8002 " \"other\";",
8003 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
8004 EXPECT_EQ(
8005 "#define A \\\n"
8006 " \"so \" \\\n"
8007 " \"text \" \\\n"
8008 " \"other\";",
8009 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
8010
8011 EXPECT_EQ("\"some text\"",
8012 format("\"some text\"", getLLVMStyleWithColumns(1)));
8013 EXPECT_EQ("\"some text\"",
8014 format("\"some text\"", getLLVMStyleWithColumns(11)));
8015 EXPECT_EQ("\"some \"\n"
8016 "\"text\"",
8017 format("\"some text\"", getLLVMStyleWithColumns(10)));
8018 EXPECT_EQ("\"some \"\n"
8019 "\"text\"",
8020 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00008021 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008022 "\" tex\"\n"
8023 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008024 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00008025 EXPECT_EQ("\"some\"\n"
8026 "\" tex\"\n"
8027 "\" and\"",
8028 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
8029 EXPECT_EQ("\"some\"\n"
8030 "\"/tex\"\n"
8031 "\"/and\"",
8032 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008033
8034 EXPECT_EQ("variable =\n"
8035 " \"long string \"\n"
8036 " \"literal\";",
8037 format("variable = \"long string literal\";",
8038 getLLVMStyleWithColumns(20)));
8039
8040 EXPECT_EQ("variable = f(\n"
8041 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00008042 " \"literal\",\n"
8043 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00008044 " loooooooooooooooooooong);",
8045 format("variable = f(\"long string literal\", short, "
8046 "loooooooooooooooooooong);",
8047 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008048
Daniel Jaspera44991332015-04-29 13:06:49 +00008049 EXPECT_EQ(
8050 "f(g(\"long string \"\n"
8051 " \"literal\"),\n"
8052 " b);",
8053 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008054 EXPECT_EQ("f(g(\"long string \"\n"
8055 " \"literal\",\n"
8056 " a),\n"
8057 " b);",
8058 format("f(g(\"long string literal\", a), b);",
8059 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008060 EXPECT_EQ(
8061 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00008062 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008063 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
8064 EXPECT_EQ("f(\"one two three four five six \"\n"
8065 " \"seven\".split(\n"
8066 " really_looooong_variable));",
8067 format("f(\"one two three four five six seven\"."
8068 "split(really_looooong_variable));",
8069 getLLVMStyleWithColumns(33)));
8070
8071 EXPECT_EQ("f(\"some \"\n"
8072 " \"text\",\n"
8073 " other);",
8074 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00008075
8076 // Only break as a last resort.
8077 verifyFormat(
8078 "aaaaaaaaaaaaaaaaaaaa(\n"
8079 " aaaaaaaaaaaaaaaaaaaa,\n"
8080 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00008081
Daniel Jaspera44991332015-04-29 13:06:49 +00008082 EXPECT_EQ("\"splitmea\"\n"
8083 "\"trandomp\"\n"
8084 "\"oint\"",
8085 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00008086
Daniel Jaspera44991332015-04-29 13:06:49 +00008087 EXPECT_EQ("\"split/\"\n"
8088 "\"pathat/\"\n"
8089 "\"slashes\"",
8090 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008091
Daniel Jaspera44991332015-04-29 13:06:49 +00008092 EXPECT_EQ("\"split/\"\n"
8093 "\"pathat/\"\n"
8094 "\"slashes\"",
8095 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00008096 EXPECT_EQ("\"split at \"\n"
8097 "\"spaces/at/\"\n"
8098 "\"slashes.at.any$\"\n"
8099 "\"non-alphanumeric%\"\n"
8100 "\"1111111111characte\"\n"
8101 "\"rs\"",
8102 format("\"split at "
8103 "spaces/at/"
8104 "slashes.at."
8105 "any$non-"
8106 "alphanumeric%"
8107 "1111111111characte"
8108 "rs\"",
8109 getLLVMStyleWithColumns(20)));
8110
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008111 // Verify that splitting the strings understands
8112 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00008113 EXPECT_EQ(
8114 "aaaaaaaaaaaa(\n"
8115 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8116 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8117 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8118 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8119 "aaaaaaaaaaaaaaaaaaaaaa\");",
8120 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00008121 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8122 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8123 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8124 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8125 "aaaaaaaaaaaaaaaaaaaaaa\";",
8126 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00008127 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8128 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8129 format("llvm::outs() << "
8130 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8131 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00008132 EXPECT_EQ("ffff(\n"
8133 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8134 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8135 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8136 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8137 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008138
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008139 FormatStyle Style = getLLVMStyleWithColumns(12);
8140 Style.BreakStringLiterals = false;
8141 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8142
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008143 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
8144 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00008145 EXPECT_EQ("#define A \\\n"
8146 " \"some \" \\\n"
8147 " \"text \" \\\n"
8148 " \"other\";",
8149 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008150}
8151
Manuel Klimek9e321992015-07-28 15:50:24 +00008152TEST_F(FormatTest, FullyRemoveEmptyLines) {
8153 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8154 NoEmptyLines.MaxEmptyLinesToKeep = 0;
8155 EXPECT_EQ("int i = a(b());",
8156 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8157}
8158
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008159TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8160 EXPECT_EQ(
8161 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8162 "(\n"
8163 " \"x\t\");",
8164 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8165 "aaaaaaa("
8166 "\"x\t\");"));
8167}
8168
Daniel Jasper174b0122014-01-09 14:18:12 +00008169TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00008170 EXPECT_EQ(
8171 "u8\"utf8 string \"\n"
8172 "u8\"literal\";",
8173 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8174 EXPECT_EQ(
8175 "u\"utf16 string \"\n"
8176 "u\"literal\";",
8177 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8178 EXPECT_EQ(
8179 "U\"utf32 string \"\n"
8180 "U\"literal\";",
8181 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8182 EXPECT_EQ("L\"wide string \"\n"
8183 "L\"literal\";",
8184 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00008185 EXPECT_EQ("@\"NSString \"\n"
8186 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00008187 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00008188
8189 // This input makes clang-format try to split the incomplete unicode escape
8190 // sequence, which used to lead to a crasher.
8191 verifyNoCrash(
8192 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8193 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008194}
8195
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00008196TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8197 FormatStyle Style = getGoogleStyleWithColumns(15);
8198 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8199 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8200 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8201 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8202 EXPECT_EQ("u8R\"x(raw literal)x\";",
8203 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008204}
8205
8206TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8207 FormatStyle Style = getLLVMStyleWithColumns(20);
8208 EXPECT_EQ(
8209 "_T(\"aaaaaaaaaaaaaa\")\n"
8210 "_T(\"aaaaaaaaaaaaaa\")\n"
8211 "_T(\"aaaaaaaaaaaa\")",
8212 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
8213 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
8214 " _T(\"aaaaaa\"),\n"
8215 " z);",
8216 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8217
8218 // FIXME: Handle embedded spaces in one iteration.
8219 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8220 // "_T(\"aaaaaaaaaaaaa\")\n"
8221 // "_T(\"aaaaaaaaaaaaa\")\n"
8222 // "_T(\"a\")",
8223 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8224 // getLLVMStyleWithColumns(20)));
8225 EXPECT_EQ(
8226 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8227 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008228 EXPECT_EQ("f(\n"
8229 "#if !TEST\n"
8230 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8231 "#endif\n"
8232 " );",
8233 format("f(\n"
8234 "#if !TEST\n"
8235 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8236 "#endif\n"
8237 ");"));
8238 EXPECT_EQ("f(\n"
8239 "\n"
8240 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8241 format("f(\n"
8242 "\n"
8243 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008244}
8245
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008246TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008247 EXPECT_EQ(
8248 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8249 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8250 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8251 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8252 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8253 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8254}
8255
8256TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8257 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008258 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008259 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8260 "multiline raw string literal xxxxxxxxxxxxxx\n"
8261 ")x\",\n"
8262 " a),\n"
8263 " b);",
8264 format("fffffffffff(g(R\"x(\n"
8265 "multiline raw string literal xxxxxxxxxxxxxx\n"
8266 ")x\", a), b);",
8267 getGoogleStyleWithColumns(20)));
8268 EXPECT_EQ("fffffffffff(\n"
8269 " g(R\"x(qqq\n"
8270 "multiline raw string literal xxxxxxxxxxxxxx\n"
8271 ")x\",\n"
8272 " a),\n"
8273 " b);",
8274 format("fffffffffff(g(R\"x(qqq\n"
8275 "multiline raw string literal xxxxxxxxxxxxxx\n"
8276 ")x\", a), b);",
8277 getGoogleStyleWithColumns(20)));
8278
8279 EXPECT_EQ("fffffffffff(R\"x(\n"
8280 "multiline raw string literal xxxxxxxxxxxxxx\n"
8281 ")x\");",
8282 format("fffffffffff(R\"x(\n"
8283 "multiline raw string literal xxxxxxxxxxxxxx\n"
8284 ")x\");",
8285 getGoogleStyleWithColumns(20)));
8286 EXPECT_EQ("fffffffffff(R\"x(\n"
8287 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008288 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008289 format("fffffffffff(R\"x(\n"
8290 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008291 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008292 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008293 EXPECT_EQ("fffffffffff(\n"
8294 " R\"x(\n"
8295 "multiline raw string literal xxxxxxxxxxxxxx\n"
8296 ")x\" +\n"
8297 " bbbbbb);",
8298 format("fffffffffff(\n"
8299 " R\"x(\n"
8300 "multiline raw string literal xxxxxxxxxxxxxx\n"
8301 ")x\" + bbbbbb);",
8302 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008303}
8304
Alexander Kornienkobe633902013-06-14 11:46:10 +00008305TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008306 verifyFormat("string a = \"unterminated;");
8307 EXPECT_EQ("function(\"unterminated,\n"
8308 " OtherParameter);",
8309 format("function( \"unterminated,\n"
8310 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008311}
8312
8313TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008314 FormatStyle Style = getLLVMStyle();
8315 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008316 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008317 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008318}
8319
Daniel Jaspera44991332015-04-29 13:06:49 +00008320TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008321
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008322TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8323 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8324 " \"ddeeefff\");",
8325 format("someFunction(\"aaabbbcccdddeeefff\");",
8326 getLLVMStyleWithColumns(25)));
8327 EXPECT_EQ("someFunction1234567890(\n"
8328 " \"aaabbbcccdddeeefff\");",
8329 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8330 getLLVMStyleWithColumns(26)));
8331 EXPECT_EQ("someFunction1234567890(\n"
8332 " \"aaabbbcccdddeeeff\"\n"
8333 " \"f\");",
8334 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8335 getLLVMStyleWithColumns(25)));
8336 EXPECT_EQ("someFunction1234567890(\n"
8337 " \"aaabbbcccdddeeeff\"\n"
8338 " \"f\");",
8339 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8340 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008341 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8342 " \"ddde \"\n"
8343 " \"efff\");",
8344 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008345 getLLVMStyleWithColumns(25)));
8346 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8347 " \"ddeeefff\");",
8348 format("someFunction(\"aaabbbccc ddeeefff\");",
8349 getLLVMStyleWithColumns(25)));
8350 EXPECT_EQ("someFunction1234567890(\n"
8351 " \"aaabb \"\n"
8352 " \"cccdddeeefff\");",
8353 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8354 getLLVMStyleWithColumns(25)));
8355 EXPECT_EQ("#define A \\\n"
8356 " string s = \\\n"
8357 " \"123456789\" \\\n"
8358 " \"0\"; \\\n"
8359 " int i;",
8360 format("#define A string s = \"1234567890\"; int i;",
8361 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008362 // FIXME: Put additional penalties on breaking at non-whitespace locations.
8363 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8364 " \"dddeeeff\"\n"
8365 " \"f\");",
8366 format("someFunction(\"aaabbbcc dddeeefff\");",
8367 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008368}
8369
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008370TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008371 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8372 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008373 EXPECT_EQ("\"test\"\n"
8374 "\"\\n\"",
8375 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8376 EXPECT_EQ("\"tes\\\\\"\n"
8377 "\"n\"",
8378 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8379 EXPECT_EQ("\"\\\\\\\\\"\n"
8380 "\"\\n\"",
8381 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008382 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008383 EXPECT_EQ("\"\\uff01\"\n"
8384 "\"test\"",
8385 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8386 EXPECT_EQ("\"\\Uff01ff02\"",
8387 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8388 EXPECT_EQ("\"\\x000000000001\"\n"
8389 "\"next\"",
8390 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8391 EXPECT_EQ("\"\\x000000000001next\"",
8392 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8393 EXPECT_EQ("\"\\x000000000001\"",
8394 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8395 EXPECT_EQ("\"test\"\n"
8396 "\"\\000000\"\n"
8397 "\"000001\"",
8398 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8399 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008400 "\"00000000\"\n"
8401 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008402 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008403}
8404
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008405TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8406 verifyFormat("void f() {\n"
8407 " return g() {}\n"
8408 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008409 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008410 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008411 "}");
8412}
8413
Manuel Klimek421147e2014-01-24 09:25:23 +00008414TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8415 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008416 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008417}
8418
Manuel Klimek13b97d82013-05-13 08:42:42 +00008419TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8420 verifyFormat("class X {\n"
8421 " void f() {\n"
8422 " }\n"
8423 "};",
8424 getLLVMStyleWithColumns(12));
8425}
8426
8427TEST_F(FormatTest, ConfigurableIndentWidth) {
8428 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8429 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008430 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008431 verifyFormat("void f() {\n"
8432 " someFunction();\n"
8433 " if (true) {\n"
8434 " f();\n"
8435 " }\n"
8436 "}",
8437 EightIndent);
8438 verifyFormat("class X {\n"
8439 " void f() {\n"
8440 " }\n"
8441 "};",
8442 EightIndent);
8443 verifyFormat("int x[] = {\n"
8444 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008445 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008446 EightIndent);
8447}
8448
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008449TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008450 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008451 "f();",
8452 getLLVMStyleWithColumns(8));
8453}
8454
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008455TEST_F(FormatTest, ConfigurableUseOfTab) {
8456 FormatStyle Tab = getLLVMStyleWithColumns(42);
8457 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008458 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008459 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008460
8461 EXPECT_EQ("if (aaaaaaaa && // q\n"
8462 " bb)\t\t// w\n"
8463 "\t;",
8464 format("if (aaaaaaaa &&// q\n"
8465 "bb)// w\n"
8466 ";",
8467 Tab));
8468 EXPECT_EQ("if (aaa && bbb) // w\n"
8469 "\t;",
8470 format("if(aaa&&bbb)// w\n"
8471 ";",
8472 Tab));
8473
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008474 verifyFormat("class X {\n"
8475 "\tvoid f() {\n"
8476 "\t\tsomeFunction(parameter1,\n"
8477 "\t\t\t parameter2);\n"
8478 "\t}\n"
8479 "};",
8480 Tab);
8481 verifyFormat("#define A \\\n"
8482 "\tvoid f() { \\\n"
8483 "\t\tsomeFunction( \\\n"
8484 "\t\t parameter1, \\\n"
8485 "\t\t parameter2); \\\n"
8486 "\t}",
8487 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008488
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008489 Tab.TabWidth = 4;
8490 Tab.IndentWidth = 8;
8491 verifyFormat("class TabWidth4Indent8 {\n"
8492 "\t\tvoid f() {\n"
8493 "\t\t\t\tsomeFunction(parameter1,\n"
8494 "\t\t\t\t\t\t\t parameter2);\n"
8495 "\t\t}\n"
8496 "};",
8497 Tab);
8498
8499 Tab.TabWidth = 4;
8500 Tab.IndentWidth = 4;
8501 verifyFormat("class TabWidth4Indent4 {\n"
8502 "\tvoid f() {\n"
8503 "\t\tsomeFunction(parameter1,\n"
8504 "\t\t\t\t\t parameter2);\n"
8505 "\t}\n"
8506 "};",
8507 Tab);
8508
8509 Tab.TabWidth = 8;
8510 Tab.IndentWidth = 4;
8511 verifyFormat("class TabWidth8Indent4 {\n"
8512 " void f() {\n"
8513 "\tsomeFunction(parameter1,\n"
8514 "\t\t parameter2);\n"
8515 " }\n"
8516 "};",
8517 Tab);
8518
Alexander Kornienko39856b72013-09-10 09:38:25 +00008519 Tab.TabWidth = 8;
8520 Tab.IndentWidth = 8;
8521 EXPECT_EQ("/*\n"
8522 "\t a\t\tcomment\n"
8523 "\t in multiple lines\n"
8524 " */",
8525 format(" /*\t \t \n"
8526 " \t \t a\t\tcomment\t \t\n"
8527 " \t \t in multiple lines\t\n"
8528 " \t */",
8529 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008530
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008531 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008532 verifyFormat("{\n"
8533 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8534 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8535 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8536 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8537 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8538 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008539 "};",
8540 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008541 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008542 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008543 "\ta2,\n"
8544 "\ta3\n"
8545 "};",
8546 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008547 EXPECT_EQ("if (aaaaaaaa && // q\n"
8548 " bb) // w\n"
8549 "\t;",
8550 format("if (aaaaaaaa &&// q\n"
8551 "bb)// w\n"
8552 ";",
8553 Tab));
8554 verifyFormat("class X {\n"
8555 "\tvoid f() {\n"
8556 "\t\tsomeFunction(parameter1,\n"
8557 "\t\t parameter2);\n"
8558 "\t}\n"
8559 "};",
8560 Tab);
8561 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008562 "\tQ(\n"
8563 "\t {\n"
8564 "\t\t int a;\n"
8565 "\t\t someFunction(aaaaaaaa,\n"
8566 "\t\t bbbbbbb);\n"
8567 "\t },\n"
8568 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008569 "}",
8570 Tab);
8571 EXPECT_EQ("{\n"
8572 "\t/* aaaa\n"
8573 "\t bbbb */\n"
8574 "}",
8575 format("{\n"
8576 "/* aaaa\n"
8577 " bbbb */\n"
8578 "}",
8579 Tab));
8580 EXPECT_EQ("{\n"
8581 "\t/*\n"
8582 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8583 "\t bbbbbbbbbbbbb\n"
8584 "\t*/\n"
8585 "}",
8586 format("{\n"
8587 "/*\n"
8588 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8589 "*/\n"
8590 "}",
8591 Tab));
8592 EXPECT_EQ("{\n"
8593 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8594 "\t// bbbbbbbbbbbbb\n"
8595 "}",
8596 format("{\n"
8597 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8598 "}",
8599 Tab));
8600 EXPECT_EQ("{\n"
8601 "\t/*\n"
8602 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8603 "\t bbbbbbbbbbbbb\n"
8604 "\t*/\n"
8605 "}",
8606 format("{\n"
8607 "\t/*\n"
8608 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8609 "\t*/\n"
8610 "}",
8611 Tab));
8612 EXPECT_EQ("{\n"
8613 "\t/*\n"
8614 "\n"
8615 "\t*/\n"
8616 "}",
8617 format("{\n"
8618 "\t/*\n"
8619 "\n"
8620 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008621 "}",
8622 Tab));
8623 EXPECT_EQ("{\n"
8624 "\t/*\n"
8625 " asdf\n"
8626 "\t*/\n"
8627 "}",
8628 format("{\n"
8629 "\t/*\n"
8630 " asdf\n"
8631 "\t*/\n"
8632 "}",
8633 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008634
8635 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008636 EXPECT_EQ("/*\n"
8637 " a\t\tcomment\n"
8638 " in multiple lines\n"
8639 " */",
8640 format(" /*\t \t \n"
8641 " \t \t a\t\tcomment\t \t\n"
8642 " \t \t in multiple lines\t\n"
8643 " \t */",
8644 Tab));
8645 EXPECT_EQ("/* some\n"
8646 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008647 format(" \t \t /* some\n"
8648 " \t \t comment */",
8649 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008650 EXPECT_EQ("int a; /* some\n"
8651 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008652 format(" \t \t int a; /* some\n"
8653 " \t \t comment */",
8654 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008655
Alexander Kornienko39856b72013-09-10 09:38:25 +00008656 EXPECT_EQ("int a; /* some\n"
8657 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008658 format(" \t \t int\ta; /* some\n"
8659 " \t \t comment */",
8660 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008661 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8662 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008663 format(" \t \t f(\"\t\t\"); /* some\n"
8664 " \t \t comment */",
8665 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008666 EXPECT_EQ("{\n"
8667 " /*\n"
8668 " * Comment\n"
8669 " */\n"
8670 " int i;\n"
8671 "}",
8672 format("{\n"
8673 "\t/*\n"
8674 "\t * Comment\n"
8675 "\t */\n"
8676 "\t int i;\n"
8677 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008678
8679 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8680 Tab.TabWidth = 8;
8681 Tab.IndentWidth = 8;
8682 EXPECT_EQ("if (aaaaaaaa && // q\n"
8683 " bb) // w\n"
8684 "\t;",
8685 format("if (aaaaaaaa &&// q\n"
8686 "bb)// w\n"
8687 ";",
8688 Tab));
8689 EXPECT_EQ("if (aaa && bbb) // w\n"
8690 "\t;",
8691 format("if(aaa&&bbb)// w\n"
8692 ";",
8693 Tab));
8694 verifyFormat("class X {\n"
8695 "\tvoid f() {\n"
8696 "\t\tsomeFunction(parameter1,\n"
8697 "\t\t\t parameter2);\n"
8698 "\t}\n"
8699 "};",
8700 Tab);
8701 verifyFormat("#define A \\\n"
8702 "\tvoid f() { \\\n"
8703 "\t\tsomeFunction( \\\n"
8704 "\t\t parameter1, \\\n"
8705 "\t\t parameter2); \\\n"
8706 "\t}",
8707 Tab);
8708 Tab.TabWidth = 4;
8709 Tab.IndentWidth = 8;
8710 verifyFormat("class TabWidth4Indent8 {\n"
8711 "\t\tvoid f() {\n"
8712 "\t\t\t\tsomeFunction(parameter1,\n"
8713 "\t\t\t\t\t\t\t parameter2);\n"
8714 "\t\t}\n"
8715 "};",
8716 Tab);
8717 Tab.TabWidth = 4;
8718 Tab.IndentWidth = 4;
8719 verifyFormat("class TabWidth4Indent4 {\n"
8720 "\tvoid f() {\n"
8721 "\t\tsomeFunction(parameter1,\n"
8722 "\t\t\t\t\t parameter2);\n"
8723 "\t}\n"
8724 "};",
8725 Tab);
8726 Tab.TabWidth = 8;
8727 Tab.IndentWidth = 4;
8728 verifyFormat("class TabWidth8Indent4 {\n"
8729 " void f() {\n"
8730 "\tsomeFunction(parameter1,\n"
8731 "\t\t parameter2);\n"
8732 " }\n"
8733 "};",
8734 Tab);
8735 Tab.TabWidth = 8;
8736 Tab.IndentWidth = 8;
8737 EXPECT_EQ("/*\n"
8738 "\t a\t\tcomment\n"
8739 "\t in multiple lines\n"
8740 " */",
8741 format(" /*\t \t \n"
8742 " \t \t a\t\tcomment\t \t\n"
8743 " \t \t in multiple lines\t\n"
8744 " \t */",
8745 Tab));
8746 verifyFormat("{\n"
8747 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8748 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8749 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8750 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8751 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8752 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8753 "};",
8754 Tab);
8755 verifyFormat("enum AA {\n"
8756 "\ta1, // Force multiple lines\n"
8757 "\ta2,\n"
8758 "\ta3\n"
8759 "};",
8760 Tab);
8761 EXPECT_EQ("if (aaaaaaaa && // q\n"
8762 " bb) // w\n"
8763 "\t;",
8764 format("if (aaaaaaaa &&// q\n"
8765 "bb)// w\n"
8766 ";",
8767 Tab));
8768 verifyFormat("class X {\n"
8769 "\tvoid f() {\n"
8770 "\t\tsomeFunction(parameter1,\n"
8771 "\t\t\t parameter2);\n"
8772 "\t}\n"
8773 "};",
8774 Tab);
8775 verifyFormat("{\n"
8776 "\tQ(\n"
8777 "\t {\n"
8778 "\t\t int a;\n"
8779 "\t\t someFunction(aaaaaaaa,\n"
8780 "\t\t\t\t bbbbbbb);\n"
8781 "\t },\n"
8782 "\t p);\n"
8783 "}",
8784 Tab);
8785 EXPECT_EQ("{\n"
8786 "\t/* aaaa\n"
8787 "\t bbbb */\n"
8788 "}",
8789 format("{\n"
8790 "/* aaaa\n"
8791 " bbbb */\n"
8792 "}",
8793 Tab));
8794 EXPECT_EQ("{\n"
8795 "\t/*\n"
8796 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8797 "\t bbbbbbbbbbbbb\n"
8798 "\t*/\n"
8799 "}",
8800 format("{\n"
8801 "/*\n"
8802 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8803 "*/\n"
8804 "}",
8805 Tab));
8806 EXPECT_EQ("{\n"
8807 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8808 "\t// bbbbbbbbbbbbb\n"
8809 "}",
8810 format("{\n"
8811 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8812 "}",
8813 Tab));
8814 EXPECT_EQ("{\n"
8815 "\t/*\n"
8816 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8817 "\t bbbbbbbbbbbbb\n"
8818 "\t*/\n"
8819 "}",
8820 format("{\n"
8821 "\t/*\n"
8822 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8823 "\t*/\n"
8824 "}",
8825 Tab));
8826 EXPECT_EQ("{\n"
8827 "\t/*\n"
8828 "\n"
8829 "\t*/\n"
8830 "}",
8831 format("{\n"
8832 "\t/*\n"
8833 "\n"
8834 "\t*/\n"
8835 "}",
8836 Tab));
8837 EXPECT_EQ("{\n"
8838 "\t/*\n"
8839 " asdf\n"
8840 "\t*/\n"
8841 "}",
8842 format("{\n"
8843 "\t/*\n"
8844 " asdf\n"
8845 "\t*/\n"
8846 "}",
8847 Tab));
8848 EXPECT_EQ("/*\n"
8849 "\t a\t\tcomment\n"
8850 "\t in multiple lines\n"
8851 " */",
8852 format(" /*\t \t \n"
8853 " \t \t a\t\tcomment\t \t\n"
8854 " \t \t in multiple lines\t\n"
8855 " \t */",
8856 Tab));
8857 EXPECT_EQ("/* some\n"
8858 " comment */",
8859 format(" \t \t /* some\n"
8860 " \t \t comment */",
8861 Tab));
8862 EXPECT_EQ("int a; /* some\n"
8863 " comment */",
8864 format(" \t \t int a; /* some\n"
8865 " \t \t comment */",
8866 Tab));
8867 EXPECT_EQ("int a; /* some\n"
8868 "comment */",
8869 format(" \t \t int\ta; /* some\n"
8870 " \t \t comment */",
8871 Tab));
8872 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8873 " comment */",
8874 format(" \t \t f(\"\t\t\"); /* some\n"
8875 " \t \t comment */",
8876 Tab));
8877 EXPECT_EQ("{\n"
8878 " /*\n"
8879 " * Comment\n"
8880 " */\n"
8881 " int i;\n"
8882 "}",
8883 format("{\n"
8884 "\t/*\n"
8885 "\t * Comment\n"
8886 "\t */\n"
8887 "\t int i;\n"
8888 "}"));
8889 Tab.AlignConsecutiveAssignments = true;
8890 Tab.AlignConsecutiveDeclarations = true;
8891 Tab.TabWidth = 4;
8892 Tab.IndentWidth = 4;
8893 verifyFormat("class Assign {\n"
8894 "\tvoid f() {\n"
8895 "\t\tint x = 123;\n"
8896 "\t\tint random = 4;\n"
8897 "\t\tstd::string alphabet =\n"
8898 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8899 "\t}\n"
8900 "};",
8901 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008902}
8903
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008904TEST_F(FormatTest, CalculatesOriginalColumn) {
8905 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8906 "q\"; /* some\n"
8907 " comment */",
8908 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8909 "q\"; /* some\n"
8910 " comment */",
8911 getLLVMStyle()));
8912 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8913 "/* some\n"
8914 " comment */",
8915 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8916 " /* some\n"
8917 " comment */",
8918 getLLVMStyle()));
8919 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8920 "qqq\n"
8921 "/* some\n"
8922 " comment */",
8923 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8924 "qqq\n"
8925 " /* some\n"
8926 " comment */",
8927 getLLVMStyle()));
8928 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8929 "wwww; /* some\n"
8930 " comment */",
8931 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8932 "wwww; /* some\n"
8933 " comment */",
8934 getLLVMStyle()));
8935}
8936
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008937TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008938 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008939 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008940
8941 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008942 " continue;",
8943 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008944 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008945 " continue;",
8946 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008947 verifyFormat("if(true)\n"
8948 " f();\n"
8949 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008950 " f();",
8951 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008952 verifyFormat("do {\n"
8953 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008954 "} while(something());",
8955 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008956 verifyFormat("switch(x) {\n"
8957 "default:\n"
8958 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008959 "}",
8960 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008961 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008962 verifyFormat("size_t x = sizeof(x);", NoSpace);
8963 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8964 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8965 verifyFormat("alignas(128) char a[128];", NoSpace);
8966 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8967 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8968 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008969 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008970 verifyFormat("T A::operator()();", NoSpace);
8971 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008972
8973 FormatStyle Space = getLLVMStyle();
8974 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8975
8976 verifyFormat("int f ();", Space);
8977 verifyFormat("void f (int a, T b) {\n"
8978 " while (true)\n"
8979 " continue;\n"
8980 "}",
8981 Space);
8982 verifyFormat("if (true)\n"
8983 " f ();\n"
8984 "else if (true)\n"
8985 " f ();",
8986 Space);
8987 verifyFormat("do {\n"
8988 " do_something ();\n"
8989 "} while (something ());",
8990 Space);
8991 verifyFormat("switch (x) {\n"
8992 "default:\n"
8993 " break;\n"
8994 "}",
8995 Space);
8996 verifyFormat("A::A () : a (1) {}", Space);
8997 verifyFormat("void f () __attribute__ ((asdf));", Space);
8998 verifyFormat("*(&a + 1);\n"
8999 "&((&a)[1]);\n"
9000 "a[(b + c) * d];\n"
9001 "(((a + 1) * 2) + 3) * 4;",
9002 Space);
9003 verifyFormat("#define A(x) x", Space);
9004 verifyFormat("#define A (x) x", Space);
9005 verifyFormat("#if defined(x)\n"
9006 "#endif",
9007 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00009008 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00009009 verifyFormat("size_t x = sizeof (x);", Space);
9010 verifyFormat("auto f (int x) -> decltype (x);", Space);
9011 verifyFormat("int f (T x) noexcept (x.create ());", Space);
9012 verifyFormat("alignas (128) char a[128];", Space);
9013 verifyFormat("size_t x = alignof (MyType);", Space);
9014 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
9015 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00009016 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00009017 verifyFormat("T A::operator() ();", Space);
9018 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009019}
9020
9021TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
9022 FormatStyle Spaces = getLLVMStyle();
9023
9024 Spaces.SpacesInParentheses = 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 Jasper74331d42015-10-26 12:08:47 +00009028 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
9029 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009030 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009031 " continue;",
9032 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009033 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009034 " continue;",
9035 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009036 verifyFormat("if ( true )\n"
9037 " f();\n"
9038 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009039 " f();",
9040 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009041 verifyFormat("do {\n"
9042 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009043 "} while ( something() );",
9044 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009045 verifyFormat("switch ( x ) {\n"
9046 "default:\n"
9047 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009048 "}",
9049 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009050
9051 Spaces.SpacesInParentheses = false;
9052 Spaces.SpacesInCStyleCastParentheses = true;
9053 verifyFormat("Type *A = ( Type * )P;", Spaces);
9054 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
9055 verifyFormat("x = ( int32 )y;", Spaces);
9056 verifyFormat("int a = ( int )(2.0f);", Spaces);
9057 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
9058 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
9059 verifyFormat("#define x (( int )-1)", Spaces);
9060
Daniel Jasper92e09822015-03-18 12:59:19 +00009061 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00009062 Spaces.SpacesInParentheses = false;
9063 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009064 Spaces.SpacesInCStyleCastParentheses = true;
9065 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009066 verifyFormat("call( );", Spaces);
9067 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009068 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009069 " continue;",
9070 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009071 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009072 " continue;",
9073 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009074 verifyFormat("if (true)\n"
9075 " f( );\n"
9076 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009077 " f( );",
9078 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009079 verifyFormat("do {\n"
9080 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009081 "} while (something( ));",
9082 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009083 verifyFormat("switch (x) {\n"
9084 "default:\n"
9085 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009086 "}",
9087 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009088
Daniel Jasper92e09822015-03-18 12:59:19 +00009089 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009090 Spaces.SpaceAfterCStyleCast = true;
9091 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009092 verifyFormat("call( );", Spaces);
9093 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009094 verifyFormat("while (( bool ) 1)\n"
9095 " continue;",
9096 Spaces);
9097 verifyFormat("for (;;)\n"
9098 " continue;",
9099 Spaces);
9100 verifyFormat("if (true)\n"
9101 " f( );\n"
9102 "else if (true)\n"
9103 " f( );",
9104 Spaces);
9105 verifyFormat("do {\n"
9106 " do_something(( int ) i);\n"
9107 "} while (something( ));",
9108 Spaces);
9109 verifyFormat("switch (x) {\n"
9110 "default:\n"
9111 " break;\n"
9112 "}",
9113 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009114
9115 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009116 Spaces.SpacesInCStyleCastParentheses = false;
9117 Spaces.SpaceAfterCStyleCast = true;
9118 verifyFormat("while ((bool) 1)\n"
9119 " continue;",
9120 Spaces);
9121 verifyFormat("do {\n"
9122 " do_something((int) i);\n"
9123 "} while (something( ));",
9124 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009125}
9126
Daniel Jasperad981f82014-08-26 11:41:14 +00009127TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9128 verifyFormat("int a[5];");
9129 verifyFormat("a[3] += 42;");
9130
9131 FormatStyle Spaces = getLLVMStyle();
9132 Spaces.SpacesInSquareBrackets = true;
9133 // Lambdas unchanged.
9134 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9135 verifyFormat("return [i, args...] {};", Spaces);
9136
9137 // Not lambdas.
9138 verifyFormat("int a[ 5 ];", Spaces);
9139 verifyFormat("a[ 3 ] += 42;", Spaces);
9140 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9141 verifyFormat("double &operator[](int i) { return 0; }\n"
9142 "int i;",
9143 Spaces);
9144 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9145 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9146 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9147}
9148
Daniel Jasperd94bff32013-09-25 15:15:02 +00009149TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9150 verifyFormat("int a = 5;");
9151 verifyFormat("a += 42;");
9152 verifyFormat("a or_eq 8;");
9153
9154 FormatStyle Spaces = getLLVMStyle();
9155 Spaces.SpaceBeforeAssignmentOperators = false;
9156 verifyFormat("int a= 5;", Spaces);
9157 verifyFormat("a+= 42;", Spaces);
9158 verifyFormat("a or_eq 8;", Spaces);
9159}
9160
Daniel Jaspera44991332015-04-29 13:06:49 +00009161TEST_F(FormatTest, AlignConsecutiveAssignments) {
9162 FormatStyle Alignment = getLLVMStyle();
9163 Alignment.AlignConsecutiveAssignments = false;
9164 verifyFormat("int a = 5;\n"
9165 "int oneTwoThree = 123;",
9166 Alignment);
9167 verifyFormat("int a = 5;\n"
9168 "int oneTwoThree = 123;",
9169 Alignment);
9170
9171 Alignment.AlignConsecutiveAssignments = true;
9172 verifyFormat("int a = 5;\n"
9173 "int oneTwoThree = 123;",
9174 Alignment);
9175 verifyFormat("int a = method();\n"
9176 "int oneTwoThree = 133;",
9177 Alignment);
9178 verifyFormat("a &= 5;\n"
9179 "bcd *= 5;\n"
9180 "ghtyf += 5;\n"
9181 "dvfvdb -= 5;\n"
9182 "a /= 5;\n"
9183 "vdsvsv %= 5;\n"
9184 "sfdbddfbdfbb ^= 5;\n"
9185 "dvsdsv |= 5;\n"
9186 "int dsvvdvsdvvv = 123;",
9187 Alignment);
9188 verifyFormat("int i = 1, j = 10;\n"
9189 "something = 2000;",
9190 Alignment);
9191 verifyFormat("something = 2000;\n"
9192 "int i = 1, j = 10;\n",
9193 Alignment);
9194 verifyFormat("something = 2000;\n"
9195 "another = 911;\n"
9196 "int i = 1, j = 10;\n"
9197 "oneMore = 1;\n"
9198 "i = 2;",
9199 Alignment);
9200 verifyFormat("int a = 5;\n"
9201 "int one = 1;\n"
9202 "method();\n"
9203 "int oneTwoThree = 123;\n"
9204 "int oneTwo = 12;",
9205 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009206 verifyFormat("int oneTwoThree = 123;\n"
9207 "int oneTwo = 12;\n"
9208 "method();\n",
9209 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009210 verifyFormat("int oneTwoThree = 123; // comment\n"
9211 "int oneTwo = 12; // comment",
9212 Alignment);
9213 EXPECT_EQ("int a = 5;\n"
9214 "\n"
9215 "int oneTwoThree = 123;",
9216 format("int a = 5;\n"
9217 "\n"
9218 "int oneTwoThree= 123;",
9219 Alignment));
9220 EXPECT_EQ("int a = 5;\n"
9221 "int one = 1;\n"
9222 "\n"
9223 "int oneTwoThree = 123;",
9224 format("int a = 5;\n"
9225 "int one = 1;\n"
9226 "\n"
9227 "int oneTwoThree = 123;",
9228 Alignment));
9229 EXPECT_EQ("int a = 5;\n"
9230 "int one = 1;\n"
9231 "\n"
9232 "int oneTwoThree = 123;\n"
9233 "int oneTwo = 12;",
9234 format("int a = 5;\n"
9235 "int one = 1;\n"
9236 "\n"
9237 "int oneTwoThree = 123;\n"
9238 "int oneTwo = 12;",
9239 Alignment));
9240 Alignment.AlignEscapedNewlinesLeft = true;
9241 verifyFormat("#define A \\\n"
9242 " int aaaa = 12; \\\n"
9243 " int b = 23; \\\n"
9244 " int ccc = 234; \\\n"
9245 " int dddddddddd = 2345;",
9246 Alignment);
9247 Alignment.AlignEscapedNewlinesLeft = false;
9248 verifyFormat("#define A "
9249 " \\\n"
9250 " int aaaa = 12; "
9251 " \\\n"
9252 " int b = 23; "
9253 " \\\n"
9254 " int ccc = 234; "
9255 " \\\n"
9256 " int dddddddddd = 2345;",
9257 Alignment);
9258 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9259 "k = 4, int l = 5,\n"
9260 " int m = 6) {\n"
9261 " int j = 10;\n"
9262 " otherThing = 1;\n"
9263 "}",
9264 Alignment);
9265 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9266 " int i = 1;\n"
9267 " int j = 2;\n"
9268 " int big = 10000;\n"
9269 "}",
9270 Alignment);
9271 verifyFormat("class C {\n"
9272 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009273 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009274 " virtual void f() = 0;\n"
9275 "};",
9276 Alignment);
9277 verifyFormat("int i = 1;\n"
9278 "if (SomeType t = getSomething()) {\n"
9279 "}\n"
9280 "int j = 2;\n"
9281 "int big = 10000;",
9282 Alignment);
9283 verifyFormat("int j = 7;\n"
9284 "for (int k = 0; k < N; ++k) {\n"
9285 "}\n"
9286 "int j = 2;\n"
9287 "int big = 10000;\n"
9288 "}",
9289 Alignment);
9290 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9291 verifyFormat("int i = 1;\n"
9292 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9293 " = someLooooooooooooooooongFunction();\n"
9294 "int j = 2;",
9295 Alignment);
9296 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9297 verifyFormat("int i = 1;\n"
9298 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9299 " someLooooooooooooooooongFunction();\n"
9300 "int j = 2;",
9301 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009302
9303 verifyFormat("auto lambda = []() {\n"
9304 " auto i = 0;\n"
9305 " return 0;\n"
9306 "};\n"
9307 "int i = 0;\n"
9308 "auto v = type{\n"
9309 " i = 1, //\n"
9310 " (i = 2), //\n"
9311 " i = 3 //\n"
9312 "};",
9313 Alignment);
9314
Daniel Jaspera44991332015-04-29 13:06:49 +00009315 // FIXME: Should align all three assignments
9316 verifyFormat(
9317 "int i = 1;\n"
9318 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9319 " loooooooooooooooooooooongParameterB);\n"
9320 "int j = 2;",
9321 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009322
9323 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9324 " typename B = very_long_type_name_1,\n"
9325 " typename T_2 = very_long_type_name_2>\n"
9326 "auto foo() {}\n",
9327 Alignment);
9328 verifyFormat("int a, b = 1;\n"
9329 "int c = 2;\n"
9330 "int dd = 3;\n",
9331 Alignment);
9332 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9333 "float b[1][] = {{3.f}};\n",
9334 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009335}
9336
Daniel Jaspere12597c2015-10-01 10:06:54 +00009337TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9338 FormatStyle Alignment = getLLVMStyle();
9339 Alignment.AlignConsecutiveDeclarations = false;
9340 verifyFormat("float const a = 5;\n"
9341 "int oneTwoThree = 123;",
9342 Alignment);
9343 verifyFormat("int a = 5;\n"
9344 "float const oneTwoThree = 123;",
9345 Alignment);
9346
9347 Alignment.AlignConsecutiveDeclarations = true;
9348 verifyFormat("float const a = 5;\n"
9349 "int oneTwoThree = 123;",
9350 Alignment);
9351 verifyFormat("int a = method();\n"
9352 "float const oneTwoThree = 133;",
9353 Alignment);
9354 verifyFormat("int i = 1, j = 10;\n"
9355 "something = 2000;",
9356 Alignment);
9357 verifyFormat("something = 2000;\n"
9358 "int i = 1, j = 10;\n",
9359 Alignment);
9360 verifyFormat("float something = 2000;\n"
9361 "double another = 911;\n"
9362 "int i = 1, j = 10;\n"
9363 "const int *oneMore = 1;\n"
9364 "unsigned i = 2;",
9365 Alignment);
9366 verifyFormat("float a = 5;\n"
9367 "int one = 1;\n"
9368 "method();\n"
9369 "const double oneTwoThree = 123;\n"
9370 "const unsigned int oneTwo = 12;",
9371 Alignment);
9372 verifyFormat("int oneTwoThree{0}; // comment\n"
9373 "unsigned oneTwo; // comment",
9374 Alignment);
9375 EXPECT_EQ("float const a = 5;\n"
9376 "\n"
9377 "int oneTwoThree = 123;",
9378 format("float const a = 5;\n"
9379 "\n"
9380 "int oneTwoThree= 123;",
9381 Alignment));
9382 EXPECT_EQ("float a = 5;\n"
9383 "int one = 1;\n"
9384 "\n"
9385 "unsigned oneTwoThree = 123;",
9386 format("float a = 5;\n"
9387 "int one = 1;\n"
9388 "\n"
9389 "unsigned oneTwoThree = 123;",
9390 Alignment));
9391 EXPECT_EQ("float a = 5;\n"
9392 "int one = 1;\n"
9393 "\n"
9394 "unsigned oneTwoThree = 123;\n"
9395 "int oneTwo = 12;",
9396 format("float a = 5;\n"
9397 "int one = 1;\n"
9398 "\n"
9399 "unsigned oneTwoThree = 123;\n"
9400 "int oneTwo = 12;",
9401 Alignment));
9402 Alignment.AlignConsecutiveAssignments = true;
9403 verifyFormat("float something = 2000;\n"
9404 "double another = 911;\n"
9405 "int i = 1, j = 10;\n"
9406 "const int *oneMore = 1;\n"
9407 "unsigned i = 2;",
9408 Alignment);
9409 verifyFormat("int oneTwoThree = {0}; // comment\n"
9410 "unsigned oneTwo = 0; // comment",
9411 Alignment);
9412 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9413 " int const i = 1;\n"
9414 " int * j = 2;\n"
9415 " int big = 10000;\n"
9416 "\n"
9417 " unsigned oneTwoThree = 123;\n"
9418 " int oneTwo = 12;\n"
9419 " method();\n"
9420 " float k = 2;\n"
9421 " int ll = 10000;\n"
9422 "}",
9423 format("void SomeFunction(int parameter= 0) {\n"
9424 " int const i= 1;\n"
9425 " int *j=2;\n"
9426 " int big = 10000;\n"
9427 "\n"
9428 "unsigned oneTwoThree =123;\n"
9429 "int oneTwo = 12;\n"
9430 " method();\n"
9431 "float k= 2;\n"
9432 "int ll=10000;\n"
9433 "}",
9434 Alignment));
9435 Alignment.AlignConsecutiveAssignments = false;
9436 Alignment.AlignEscapedNewlinesLeft = true;
9437 verifyFormat("#define A \\\n"
9438 " int aaaa = 12; \\\n"
9439 " float b = 23; \\\n"
9440 " const int ccc = 234; \\\n"
9441 " unsigned dddddddddd = 2345;",
9442 Alignment);
9443 Alignment.AlignEscapedNewlinesLeft = false;
9444 Alignment.ColumnLimit = 30;
9445 verifyFormat("#define A \\\n"
9446 " int aaaa = 12; \\\n"
9447 " float b = 23; \\\n"
9448 " const int ccc = 234; \\\n"
9449 " int dddddddddd = 2345;",
9450 Alignment);
9451 Alignment.ColumnLimit = 80;
9452 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9453 "k = 4, int l = 5,\n"
9454 " int m = 6) {\n"
9455 " const int j = 10;\n"
9456 " otherThing = 1;\n"
9457 "}",
9458 Alignment);
9459 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9460 " int const i = 1;\n"
9461 " int * j = 2;\n"
9462 " int big = 10000;\n"
9463 "}",
9464 Alignment);
9465 verifyFormat("class C {\n"
9466 "public:\n"
9467 " int i = 1;\n"
9468 " virtual void f() = 0;\n"
9469 "};",
9470 Alignment);
9471 verifyFormat("float i = 1;\n"
9472 "if (SomeType t = getSomething()) {\n"
9473 "}\n"
9474 "const unsigned j = 2;\n"
9475 "int big = 10000;",
9476 Alignment);
9477 verifyFormat("float j = 7;\n"
9478 "for (int k = 0; k < N; ++k) {\n"
9479 "}\n"
9480 "unsigned j = 2;\n"
9481 "int big = 10000;\n"
9482 "}",
9483 Alignment);
9484 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9485 verifyFormat("float i = 1;\n"
9486 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9487 " = someLooooooooooooooooongFunction();\n"
9488 "int j = 2;",
9489 Alignment);
9490 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9491 verifyFormat("int i = 1;\n"
9492 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9493 " someLooooooooooooooooongFunction();\n"
9494 "int j = 2;",
9495 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009496
9497 Alignment.AlignConsecutiveAssignments = true;
9498 verifyFormat("auto lambda = []() {\n"
9499 " auto ii = 0;\n"
9500 " float j = 0;\n"
9501 " return 0;\n"
9502 "};\n"
9503 "int i = 0;\n"
9504 "float i2 = 0;\n"
9505 "auto v = type{\n"
9506 " i = 1, //\n"
9507 " (i = 2), //\n"
9508 " i = 3 //\n"
9509 "};",
9510 Alignment);
9511 Alignment.AlignConsecutiveAssignments = false;
9512
Daniel Jaspere12597c2015-10-01 10:06:54 +00009513 // FIXME: Should align all three declarations
9514 verifyFormat(
9515 "int i = 1;\n"
9516 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9517 " loooooooooooooooooooooongParameterB);\n"
9518 "int j = 2;",
9519 Alignment);
9520
9521 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9522 // We expect declarations and assignments to align, as long as it doesn't
9523 // exceed the column limit, starting a new alignemnt sequence whenever it
9524 // happens.
9525 Alignment.AlignConsecutiveAssignments = true;
9526 Alignment.ColumnLimit = 30;
9527 verifyFormat("float ii = 1;\n"
9528 "unsigned j = 2;\n"
9529 "int someVerylongVariable = 1;\n"
9530 "AnotherLongType ll = 123456;\n"
9531 "VeryVeryLongType k = 2;\n"
9532 "int myvar = 1;",
9533 Alignment);
9534 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009535 Alignment.AlignConsecutiveAssignments = false;
9536
9537 verifyFormat(
9538 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9539 " typename LongType, typename B>\n"
9540 "auto foo() {}\n",
9541 Alignment);
9542 verifyFormat("float a, b = 1;\n"
9543 "int c = 2;\n"
9544 "int dd = 3;\n",
9545 Alignment);
9546 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9547 "float b[1][] = {{3.f}};\n",
9548 Alignment);
9549 Alignment.AlignConsecutiveAssignments = true;
9550 verifyFormat("float a, b = 1;\n"
9551 "int c = 2;\n"
9552 "int dd = 3;\n",
9553 Alignment);
9554 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9555 "float b[1][] = {{3.f}};\n",
9556 Alignment);
9557 Alignment.AlignConsecutiveAssignments = false;
9558
9559 Alignment.ColumnLimit = 30;
9560 Alignment.BinPackParameters = false;
9561 verifyFormat("void foo(float a,\n"
9562 " float b,\n"
9563 " int c,\n"
9564 " uint32_t *d) {\n"
9565 " int * e = 0;\n"
9566 " float f = 0;\n"
9567 " double g = 0;\n"
9568 "}\n"
9569 "void bar(ino_t a,\n"
9570 " int b,\n"
9571 " uint32_t *c,\n"
9572 " bool d) {}\n",
9573 Alignment);
9574 Alignment.BinPackParameters = true;
9575 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009576}
9577
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009578TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009579 FormatStyle LinuxBraceStyle = getLLVMStyle();
9580 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009581 verifyFormat("namespace a\n"
9582 "{\n"
9583 "class A\n"
9584 "{\n"
9585 " void f()\n"
9586 " {\n"
9587 " if (true) {\n"
9588 " a();\n"
9589 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009590 " } else {\n"
9591 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009592 " }\n"
9593 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009594 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009595 "};\n"
9596 "struct B {\n"
9597 " int x;\n"
9598 "};\n"
9599 "}\n",
9600 LinuxBraceStyle);
9601 verifyFormat("enum X {\n"
9602 " Y = 0,\n"
9603 "}\n",
9604 LinuxBraceStyle);
9605 verifyFormat("struct S {\n"
9606 " int Type;\n"
9607 " union {\n"
9608 " int x;\n"
9609 " double y;\n"
9610 " } Value;\n"
9611 " class C\n"
9612 " {\n"
9613 " MyFavoriteType Value;\n"
9614 " } Class;\n"
9615 "}\n",
9616 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009617}
9618
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009619TEST_F(FormatTest, MozillaBraceBreaking) {
9620 FormatStyle MozillaBraceStyle = getLLVMStyle();
9621 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
9622 verifyFormat("namespace a {\n"
9623 "class A\n"
9624 "{\n"
9625 " void f()\n"
9626 " {\n"
9627 " if (true) {\n"
9628 " a();\n"
9629 " b();\n"
9630 " }\n"
9631 " }\n"
9632 " void g() { return; }\n"
9633 "};\n"
9634 "enum E\n"
9635 "{\n"
9636 " A,\n"
9637 " // foo\n"
9638 " B,\n"
9639 " C\n"
9640 "};\n"
9641 "struct B\n"
9642 "{\n"
9643 " int x;\n"
9644 "};\n"
9645 "}\n",
9646 MozillaBraceStyle);
9647 verifyFormat("struct S\n"
9648 "{\n"
9649 " int Type;\n"
9650 " union\n"
9651 " {\n"
9652 " int x;\n"
9653 " double y;\n"
9654 " } Value;\n"
9655 " class C\n"
9656 " {\n"
9657 " MyFavoriteType Value;\n"
9658 " } Class;\n"
9659 "}\n",
9660 MozillaBraceStyle);
9661}
9662
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009663TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009664 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9665 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009666 verifyFormat("namespace a {\n"
9667 "class A {\n"
9668 " void f()\n"
9669 " {\n"
9670 " if (true) {\n"
9671 " a();\n"
9672 " b();\n"
9673 " }\n"
9674 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009675 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009676 "};\n"
9677 "struct B {\n"
9678 " int x;\n"
9679 "};\n"
9680 "}\n",
9681 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009682
Daniel Jasperd9670872014-08-05 12:06:20 +00009683 verifyFormat("void foo()\n"
9684 "{\n"
9685 " if (a) {\n"
9686 " a();\n"
9687 " }\n"
9688 " else {\n"
9689 " b();\n"
9690 " }\n"
9691 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009692 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009693
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009694 verifyFormat("#ifdef _DEBUG\n"
9695 "int foo(int i = 0)\n"
9696 "#else\n"
9697 "int foo(int i = 5)\n"
9698 "#endif\n"
9699 "{\n"
9700 " return i;\n"
9701 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009702 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009703
9704 verifyFormat("void foo() {}\n"
9705 "void bar()\n"
9706 "#ifdef _DEBUG\n"
9707 "{\n"
9708 " foo();\n"
9709 "}\n"
9710 "#else\n"
9711 "{\n"
9712 "}\n"
9713 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009714 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009715
9716 verifyFormat("void foobar() { int i = 5; }\n"
9717 "#ifdef _DEBUG\n"
9718 "void bar() {}\n"
9719 "#else\n"
9720 "void bar() { foobar(); }\n"
9721 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009722 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009723}
9724
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009725TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009726 FormatStyle AllmanBraceStyle = getLLVMStyle();
9727 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009728 verifyFormat("namespace a\n"
9729 "{\n"
9730 "class A\n"
9731 "{\n"
9732 " void f()\n"
9733 " {\n"
9734 " if (true)\n"
9735 " {\n"
9736 " a();\n"
9737 " b();\n"
9738 " }\n"
9739 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009740 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009741 "};\n"
9742 "struct B\n"
9743 "{\n"
9744 " int x;\n"
9745 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009746 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009747 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009748
9749 verifyFormat("void f()\n"
9750 "{\n"
9751 " if (true)\n"
9752 " {\n"
9753 " a();\n"
9754 " }\n"
9755 " else if (false)\n"
9756 " {\n"
9757 " b();\n"
9758 " }\n"
9759 " else\n"
9760 " {\n"
9761 " c();\n"
9762 " }\n"
9763 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009764 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009765
9766 verifyFormat("void f()\n"
9767 "{\n"
9768 " for (int i = 0; i < 10; ++i)\n"
9769 " {\n"
9770 " a();\n"
9771 " }\n"
9772 " while (false)\n"
9773 " {\n"
9774 " b();\n"
9775 " }\n"
9776 " do\n"
9777 " {\n"
9778 " c();\n"
9779 " } while (false)\n"
9780 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009781 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009782
9783 verifyFormat("void f(int a)\n"
9784 "{\n"
9785 " switch (a)\n"
9786 " {\n"
9787 " case 0:\n"
9788 " break;\n"
9789 " case 1:\n"
9790 " {\n"
9791 " break;\n"
9792 " }\n"
9793 " case 2:\n"
9794 " {\n"
9795 " }\n"
9796 " break;\n"
9797 " default:\n"
9798 " break;\n"
9799 " }\n"
9800 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009801 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009802
9803 verifyFormat("enum X\n"
9804 "{\n"
9805 " Y = 0,\n"
9806 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009807 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009808 verifyFormat("enum X\n"
9809 "{\n"
9810 " Y = 0\n"
9811 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009812 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009813
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009814 verifyFormat("@interface BSApplicationController ()\n"
9815 "{\n"
9816 "@private\n"
9817 " id _extraIvar;\n"
9818 "}\n"
9819 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009820 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009821
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009822 verifyFormat("#ifdef _DEBUG\n"
9823 "int foo(int i = 0)\n"
9824 "#else\n"
9825 "int foo(int i = 5)\n"
9826 "#endif\n"
9827 "{\n"
9828 " return i;\n"
9829 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009830 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009831
9832 verifyFormat("void foo() {}\n"
9833 "void bar()\n"
9834 "#ifdef _DEBUG\n"
9835 "{\n"
9836 " foo();\n"
9837 "}\n"
9838 "#else\n"
9839 "{\n"
9840 "}\n"
9841 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009842 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009843
9844 verifyFormat("void foobar() { int i = 5; }\n"
9845 "#ifdef _DEBUG\n"
9846 "void bar() {}\n"
9847 "#else\n"
9848 "void bar() { foobar(); }\n"
9849 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009850 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009851
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009852 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009853 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009854 " // ...\n"
9855 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009856 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009857 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009858 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009859 " // ...\n"
9860 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009861 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009862 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009863 // .. or dict literals.
9864 verifyFormat("void f()\n"
9865 "{\n"
9866 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
9867 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009868 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009869 verifyFormat("int f()\n"
9870 "{ // comment\n"
9871 " return 42;\n"
9872 "}",
9873 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009874
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009875 AllmanBraceStyle.ColumnLimit = 19;
9876 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9877 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009878 verifyFormat("void f()\n"
9879 "{\n"
9880 " int i;\n"
9881 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009882 AllmanBraceStyle);
9883 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009884
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009885 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009886 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9887 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9888 verifyFormat("void f(bool b)\n"
9889 "{\n"
9890 " if (b)\n"
9891 " {\n"
9892 " return;\n"
9893 " }\n"
9894 "}\n",
9895 BreakBeforeBraceShortIfs);
9896 verifyFormat("void f(bool b)\n"
9897 "{\n"
9898 " if (b) return;\n"
9899 "}\n",
9900 BreakBeforeBraceShortIfs);
9901 verifyFormat("void f(bool b)\n"
9902 "{\n"
9903 " while (b)\n"
9904 " {\n"
9905 " return;\n"
9906 " }\n"
9907 "}\n",
9908 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009909}
9910
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009911TEST_F(FormatTest, GNUBraceBreaking) {
9912 FormatStyle GNUBraceStyle = getLLVMStyle();
9913 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9914 verifyFormat("namespace a\n"
9915 "{\n"
9916 "class A\n"
9917 "{\n"
9918 " void f()\n"
9919 " {\n"
9920 " int a;\n"
9921 " {\n"
9922 " int b;\n"
9923 " }\n"
9924 " if (true)\n"
9925 " {\n"
9926 " a();\n"
9927 " b();\n"
9928 " }\n"
9929 " }\n"
9930 " void g() { return; }\n"
9931 "}\n"
9932 "}",
9933 GNUBraceStyle);
9934
9935 verifyFormat("void f()\n"
9936 "{\n"
9937 " if (true)\n"
9938 " {\n"
9939 " a();\n"
9940 " }\n"
9941 " else if (false)\n"
9942 " {\n"
9943 " b();\n"
9944 " }\n"
9945 " else\n"
9946 " {\n"
9947 " c();\n"
9948 " }\n"
9949 "}\n",
9950 GNUBraceStyle);
9951
9952 verifyFormat("void f()\n"
9953 "{\n"
9954 " for (int i = 0; i < 10; ++i)\n"
9955 " {\n"
9956 " a();\n"
9957 " }\n"
9958 " while (false)\n"
9959 " {\n"
9960 " b();\n"
9961 " }\n"
9962 " do\n"
9963 " {\n"
9964 " c();\n"
9965 " }\n"
9966 " while (false);\n"
9967 "}\n",
9968 GNUBraceStyle);
9969
9970 verifyFormat("void f(int a)\n"
9971 "{\n"
9972 " switch (a)\n"
9973 " {\n"
9974 " case 0:\n"
9975 " break;\n"
9976 " case 1:\n"
9977 " {\n"
9978 " break;\n"
9979 " }\n"
9980 " case 2:\n"
9981 " {\n"
9982 " }\n"
9983 " break;\n"
9984 " default:\n"
9985 " break;\n"
9986 " }\n"
9987 "}\n",
9988 GNUBraceStyle);
9989
9990 verifyFormat("enum X\n"
9991 "{\n"
9992 " Y = 0,\n"
9993 "}\n",
9994 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009995
9996 verifyFormat("@interface BSApplicationController ()\n"
9997 "{\n"
9998 "@private\n"
9999 " id _extraIvar;\n"
10000 "}\n"
10001 "@end\n",
10002 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +000010003
10004 verifyFormat("#ifdef _DEBUG\n"
10005 "int foo(int i = 0)\n"
10006 "#else\n"
10007 "int foo(int i = 5)\n"
10008 "#endif\n"
10009 "{\n"
10010 " return i;\n"
10011 "}",
10012 GNUBraceStyle);
10013
10014 verifyFormat("void foo() {}\n"
10015 "void bar()\n"
10016 "#ifdef _DEBUG\n"
10017 "{\n"
10018 " foo();\n"
10019 "}\n"
10020 "#else\n"
10021 "{\n"
10022 "}\n"
10023 "#endif",
10024 GNUBraceStyle);
10025
10026 verifyFormat("void foobar() { int i = 5; }\n"
10027 "#ifdef _DEBUG\n"
10028 "void bar() {}\n"
10029 "#else\n"
10030 "void bar() { foobar(); }\n"
10031 "#endif",
10032 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010033}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +000010034
10035TEST_F(FormatTest, WebKitBraceBreaking) {
10036 FormatStyle WebKitBraceStyle = getLLVMStyle();
10037 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
10038 verifyFormat("namespace a {\n"
10039 "class A {\n"
10040 " void f()\n"
10041 " {\n"
10042 " if (true) {\n"
10043 " a();\n"
10044 " b();\n"
10045 " }\n"
10046 " }\n"
10047 " void g() { return; }\n"
10048 "};\n"
10049 "enum E {\n"
10050 " A,\n"
10051 " // foo\n"
10052 " B,\n"
10053 " C\n"
10054 "};\n"
10055 "struct B {\n"
10056 " int x;\n"
10057 "};\n"
10058 "}\n",
10059 WebKitBraceStyle);
10060 verifyFormat("struct S {\n"
10061 " int Type;\n"
10062 " union {\n"
10063 " int x;\n"
10064 " double y;\n"
10065 " } Value;\n"
10066 " class C {\n"
10067 " MyFavoriteType Value;\n"
10068 " } Class;\n"
10069 "};\n",
10070 WebKitBraceStyle);
10071}
10072
Manuel Klimekd5735502013-08-12 03:51:17 +000010073TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10074 verifyFormat("void f() {\n"
10075 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010076 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010077 " }\n"
10078 "}\n",
10079 getLLVMStyle());
10080}
10081
Daniel Jasper9613c812013-08-07 16:29:23 +000010082TEST_F(FormatTest, UnderstandsPragmas) {
10083 verifyFormat("#pragma omp reduction(| : var)");
10084 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010085
10086 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10087 "(including parentheses).",
10088 format("#pragma mark Any non-hyphenated or hyphenated string "
10089 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010090}
10091
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010092TEST_F(FormatTest, UnderstandPragmaOption) {
10093 verifyFormat("#pragma option -C -A");
10094
10095 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10096}
10097
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010098#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10099 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010100 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10101 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010102
10103TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010104 SmallVector<FormatStyle, 3> Styles;
10105 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010106
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010107 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010108 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10109 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10110 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010111
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010112 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010113 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10114 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10115 EXPECT_ALL_STYLES_EQUAL(Styles);
10116
Nico Weber514ecc82014-02-02 20:50:45 +000010117 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010118 EXPECT_TRUE(
10119 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10120 EXPECT_TRUE(
10121 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10122 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010123
Nico Weber514ecc82014-02-02 20:50:45 +000010124 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010125 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10126 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10127 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010128
10129 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010130 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10131 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10132 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010133
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010134 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010135 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10136 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10137 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010138
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010139 Styles[0] = getGNUStyle();
10140 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10141 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10142 EXPECT_ALL_STYLES_EQUAL(Styles);
10143
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010144 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10145}
10146
10147TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10148 SmallVector<FormatStyle, 8> Styles;
10149 Styles.resize(2);
10150
10151 Styles[0] = getGoogleStyle();
10152 Styles[1] = getLLVMStyle();
10153 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10154 EXPECT_ALL_STYLES_EQUAL(Styles);
10155
10156 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010157 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010158 Styles[1] = getLLVMStyle();
10159 Styles[1].Language = FormatStyle::LK_JavaScript;
10160 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10161
10162 Styles[2] = getLLVMStyle();
10163 Styles[2].Language = FormatStyle::LK_JavaScript;
10164 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10165 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010166 &Styles[2])
10167 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010168
10169 Styles[3] = getLLVMStyle();
10170 Styles[3].Language = FormatStyle::LK_JavaScript;
10171 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10172 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010173 &Styles[3])
10174 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010175
10176 Styles[4] = getLLVMStyle();
10177 Styles[4].Language = FormatStyle::LK_JavaScript;
10178 EXPECT_EQ(0, parseConfiguration("---\n"
10179 "BasedOnStyle: LLVM\n"
10180 "IndentWidth: 123\n"
10181 "---\n"
10182 "BasedOnStyle: Google\n"
10183 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010184 &Styles[4])
10185 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010186 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010187}
10188
Daniel Jasper91881d92014-09-29 08:07:46 +000010189#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010190 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010191 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010192 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010193 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010194 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010195
Daniel Jasper91881d92014-09-29 08:07:46 +000010196#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10197
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010198#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10199 Style.STRUCT.FIELD = false; \
10200 EXPECT_EQ(0, \
10201 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10202 .value()); \
10203 EXPECT_TRUE(Style.STRUCT.FIELD); \
10204 EXPECT_EQ(0, \
10205 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10206 .value()); \
10207 EXPECT_FALSE(Style.STRUCT.FIELD);
10208
10209#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10210 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10211
Daniel Jasper00853002014-09-16 16:22:30 +000010212#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10213 EXPECT_NE(VALUE, Style.FIELD); \
10214 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10215 EXPECT_EQ(VALUE, Style.FIELD)
10216
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010217TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010218 FormatStyle Style = {};
10219 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010220 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +000010221 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010222 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010223 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010224 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010225 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010226 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010227 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010228 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010229 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010230 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010231 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010232 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010233 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010234 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +000010235 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010236 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010237 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010238 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010239 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010240 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010241 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010242 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010243 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010244 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010245 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010246 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010247 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010248 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010249 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010250 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010251 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010252 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010253 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010254 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010255 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010256 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010257 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010258
10259 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10260 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10261 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10262 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10263 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10264 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10265 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10266 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
10267 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10268 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10269 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010270}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010271
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010272#undef CHECK_PARSE_BOOL
10273
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010274TEST_F(FormatTest, ParsesConfiguration) {
10275 FormatStyle Style = {};
10276 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010277 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010278 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10279 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010280 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010281 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10282 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010283 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10284 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010285 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10286 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10287 PenaltyReturnTypeOnItsOwnLine, 1234u);
10288 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10289 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010290 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010291 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010292 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010293
Daniel Jasper553d4872014-06-17 12:40:34 +000010294 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010295 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10296 FormatStyle::PAS_Left);
10297 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10298 FormatStyle::PAS_Right);
10299 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10300 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010301 // For backward compatibility:
10302 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10303 FormatStyle::PAS_Left);
10304 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10305 FormatStyle::PAS_Right);
10306 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10307 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010308
Alexander Kornienkod6538332013-05-07 15:32:14 +000010309 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010310 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10311 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010312 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10313 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10314 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10315
Daniel Jasperac043c92014-09-15 11:11:00 +000010316 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010317 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10318 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010319 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10320 FormatStyle::BOS_None);
10321 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10322 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010323 // For backward compatibility:
10324 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10325 FormatStyle::BOS_None);
10326 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10327 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010328
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010329 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10330 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10331 FormatStyle::BAS_Align);
10332 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10333 FormatStyle::BAS_DontAlign);
10334 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10335 FormatStyle::BAS_AlwaysBreak);
10336 // For backward compatibility:
10337 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10338 FormatStyle::BAS_DontAlign);
10339 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10340 FormatStyle::BAS_Align);
10341
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010342 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010343 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10344 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10345 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010346 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10347 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010348 // For backward compatibility:
10349 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10350 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010351
Daniel Jasperd74cf402014-04-08 12:46:38 +000010352 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010353 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10354 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10355 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10356 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010357 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10358 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010359 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10360 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010361 // For backward compatibility:
10362 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10363 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10364 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10365 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010366
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010367 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10368 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10369 FormatStyle::SBPO_Never);
10370 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10371 FormatStyle::SBPO_Always);
10372 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10373 FormatStyle::SBPO_ControlStatements);
10374 // For backward compatibility:
10375 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10376 FormatStyle::SBPO_Never);
10377 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10378 FormatStyle::SBPO_ControlStatements);
10379
Alexander Kornienkod6538332013-05-07 15:32:14 +000010380 Style.ColumnLimit = 123;
10381 FormatStyle BaseStyle = getLLVMStyle();
10382 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10383 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10384
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010385 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10386 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10387 FormatStyle::BS_Attach);
10388 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10389 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010390 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10391 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010392 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10393 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010394 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10395 FormatStyle::BS_Allman);
10396 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010397 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10398 FormatStyle::BS_WebKit);
10399 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10400 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010401
Zachary Turner448592e2015-12-18 22:20:15 +000010402 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10403 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10404 FormatStyle::RTBS_None);
10405 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10406 FormatStyle::RTBS_All);
10407 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010408 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010409 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10410 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10411 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10412 AlwaysBreakAfterReturnType,
10413 FormatStyle::RTBS_TopLevelDefinitions);
10414
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010415 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10416 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10417 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10418 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10419 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10420 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10421 AlwaysBreakAfterDefinitionReturnType,
10422 FormatStyle::DRTBS_TopLevel);
10423
Daniel Jasper65ee3472013-07-31 23:16:02 +000010424 Style.NamespaceIndentation = FormatStyle::NI_All;
10425 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10426 FormatStyle::NI_None);
10427 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10428 FormatStyle::NI_Inner);
10429 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10430 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010431
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010432 // FIXME: This is required because parsing a configuration simply overwrites
10433 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010434 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010435 std::vector<std::string> BoostForeach;
10436 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010437 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010438 std::vector<std::string> BoostAndQForeach;
10439 BoostAndQForeach.push_back("BOOST_FOREACH");
10440 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010441 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10442 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010443
10444 Style.IncludeCategories.clear();
10445 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10446 {".*", 1}};
10447 CHECK_PARSE("IncludeCategories:\n"
10448 " - Regex: abc/.*\n"
10449 " Priority: 2\n"
10450 " - Regex: .*\n"
10451 " Priority: 1",
10452 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010453 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010454}
10455
10456TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10457 FormatStyle Style = {};
10458 Style.Language = FormatStyle::LK_Cpp;
10459 CHECK_PARSE("Language: Cpp\n"
10460 "IndentWidth: 12",
10461 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010462 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10463 "IndentWidth: 34",
10464 &Style),
10465 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010466 EXPECT_EQ(12u, Style.IndentWidth);
10467 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10468 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10469
10470 Style.Language = FormatStyle::LK_JavaScript;
10471 CHECK_PARSE("Language: JavaScript\n"
10472 "IndentWidth: 12",
10473 IndentWidth, 12u);
10474 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010475 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10476 "IndentWidth: 34",
10477 &Style),
10478 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010479 EXPECT_EQ(23u, Style.IndentWidth);
10480 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10481 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10482
10483 CHECK_PARSE("BasedOnStyle: LLVM\n"
10484 "IndentWidth: 67",
10485 IndentWidth, 67u);
10486
10487 CHECK_PARSE("---\n"
10488 "Language: JavaScript\n"
10489 "IndentWidth: 12\n"
10490 "---\n"
10491 "Language: Cpp\n"
10492 "IndentWidth: 34\n"
10493 "...\n",
10494 IndentWidth, 12u);
10495
10496 Style.Language = FormatStyle::LK_Cpp;
10497 CHECK_PARSE("---\n"
10498 "Language: JavaScript\n"
10499 "IndentWidth: 12\n"
10500 "---\n"
10501 "Language: Cpp\n"
10502 "IndentWidth: 34\n"
10503 "...\n",
10504 IndentWidth, 34u);
10505 CHECK_PARSE("---\n"
10506 "IndentWidth: 78\n"
10507 "---\n"
10508 "Language: JavaScript\n"
10509 "IndentWidth: 56\n"
10510 "...\n",
10511 IndentWidth, 78u);
10512
10513 Style.ColumnLimit = 123;
10514 Style.IndentWidth = 234;
10515 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10516 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010517 EXPECT_FALSE(parseConfiguration("---\n"
10518 "IndentWidth: 456\n"
10519 "BreakBeforeBraces: Allman\n"
10520 "---\n"
10521 "Language: JavaScript\n"
10522 "IndentWidth: 111\n"
10523 "TabWidth: 111\n"
10524 "---\n"
10525 "Language: Cpp\n"
10526 "BreakBeforeBraces: Stroustrup\n"
10527 "TabWidth: 789\n"
10528 "...\n",
10529 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010530 EXPECT_EQ(123u, Style.ColumnLimit);
10531 EXPECT_EQ(456u, Style.IndentWidth);
10532 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10533 EXPECT_EQ(789u, Style.TabWidth);
10534
Rafael Espindola1f243172014-06-12 11:35:17 +000010535 EXPECT_EQ(parseConfiguration("---\n"
10536 "Language: JavaScript\n"
10537 "IndentWidth: 56\n"
10538 "---\n"
10539 "IndentWidth: 78\n"
10540 "...\n",
10541 &Style),
10542 ParseError::Error);
10543 EXPECT_EQ(parseConfiguration("---\n"
10544 "Language: JavaScript\n"
10545 "IndentWidth: 56\n"
10546 "---\n"
10547 "Language: JavaScript\n"
10548 "IndentWidth: 78\n"
10549 "...\n",
10550 &Style),
10551 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010552
10553 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10554}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010555
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010556#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010557
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010558TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10559 FormatStyle Style = {};
10560 Style.Language = FormatStyle::LK_JavaScript;
10561 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010562 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010563 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010564
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010565 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010566 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010567 "BasedOnStyle: Google\n"
10568 "---\n"
10569 "Language: JavaScript\n"
10570 "IndentWidth: 76\n"
10571 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010572 &Style)
10573 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010574 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010575 EXPECT_EQ(76u, Style.IndentWidth);
10576 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10577}
10578
Alexander Kornienkod6538332013-05-07 15:32:14 +000010579TEST_F(FormatTest, ConfigurationRoundTripTest) {
10580 FormatStyle Style = getLLVMStyle();
10581 std::string YAML = configurationAsText(Style);
10582 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010583 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010584 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10585 EXPECT_EQ(Style, ParsedStyle);
10586}
10587
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010588TEST_F(FormatTest, WorksFor8bitEncodings) {
10589 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10590 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10591 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10592 "\"\xef\xee\xf0\xf3...\"",
10593 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10594 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10595 "\xef\xee\xf0\xf3...\"",
10596 getLLVMStyleWithColumns(12)));
10597}
10598
Alexander Kornienko393e3082013-11-13 14:04:17 +000010599TEST_F(FormatTest, HandlesUTF8BOM) {
10600 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10601 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10602 format("\xef\xbb\xbf#include <iostream>"));
10603 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10604 format("\xef\xbb\xbf\n#include <iostream>"));
10605}
10606
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010607// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10608#if !defined(_MSC_VER)
10609
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010610TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10611 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10612 getLLVMStyleWithColumns(35));
10613 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010614 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010615 verifyFormat("// Однажды в студёную зимнюю пору...",
10616 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010617 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010618 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10619 getLLVMStyleWithColumns(39));
10620 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010621 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010622}
10623
10624TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010625 // Non-printable characters' width is currently considered to be the length in
10626 // bytes in UTF8. The characters can be displayed in very different manner
10627 // (zero-width, single width with a substitution glyph, expanded to their code
10628 // (e.g. "<8d>"), so there's no single correct way to handle them.
10629 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010630 "\"\xc2\x8d\";",
10631 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010632 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010633 "\"\xc2\x8d\";",
10634 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010635 EXPECT_EQ("\"Однажды, в \"\n"
10636 "\"студёную \"\n"
10637 "\"зимнюю \"\n"
10638 "\"пору,\"",
10639 format("\"Однажды, в студёную зимнюю пору,\"",
10640 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010641 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010642 "\"一 二 三 \"\n"
10643 "\"四 五六 \"\n"
10644 "\"七 八 九 \"\n"
10645 "\"十\"",
10646 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010647 EXPECT_EQ("\"一\t二 \"\n"
10648 "\"\t三 \"\n"
10649 "\"四 五\t六 \"\n"
10650 "\"\t七 \"\n"
10651 "\"八九十\tqq\"",
10652 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10653 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010654
10655 // UTF8 character in an escape sequence.
10656 EXPECT_EQ("\"aaaaaa\"\n"
10657 "\"\\\xC2\x8D\"",
10658 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010659}
10660
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010661TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10662 EXPECT_EQ("const char *sssss =\n"
10663 " \"一二三四五六七八\\\n"
10664 " 九 十\";",
10665 format("const char *sssss = \"一二三四五六七八\\\n"
10666 " 九 十\";",
10667 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010668}
10669
10670TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010671 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10672 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010673 EXPECT_EQ("// Я из лесу\n"
10674 "// вышел; был\n"
10675 "// сильный\n"
10676 "// мороз.",
10677 format("// Я из лесу вышел; был сильный мороз.",
10678 getLLVMStyleWithColumns(13)));
10679 EXPECT_EQ("// 一二三\n"
10680 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010681 "// 八 九\n"
10682 "// 十",
10683 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010684}
10685
10686TEST_F(FormatTest, SplitsUTF8BlockComments) {
10687 EXPECT_EQ("/* Гляжу,\n"
10688 " * поднимается\n"
10689 " * медленно в\n"
10690 " * гору\n"
10691 " * Лошадка,\n"
10692 " * везущая\n"
10693 " * хворосту\n"
10694 " * воз. */",
10695 format("/* Гляжу, поднимается медленно в гору\n"
10696 " * Лошадка, везущая хворосту воз. */",
10697 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010698 EXPECT_EQ(
10699 "/* 一二三\n"
10700 " * 四五六七\n"
10701 " * 八 九\n"
10702 " * 十 */",
10703 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010704 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10705 " * 𝕓𝕪𝕥𝕖\n"
10706 " * 𝖀𝕿𝕱-𝟠 */",
10707 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010708}
10709
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010710#endif // _MSC_VER
10711
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010712TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10713 FormatStyle Style = getLLVMStyle();
10714
10715 Style.ConstructorInitializerIndentWidth = 4;
10716 verifyFormat(
10717 "SomeClass::Constructor()\n"
10718 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10719 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10720 Style);
10721
10722 Style.ConstructorInitializerIndentWidth = 2;
10723 verifyFormat(
10724 "SomeClass::Constructor()\n"
10725 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10726 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10727 Style);
10728
10729 Style.ConstructorInitializerIndentWidth = 0;
10730 verifyFormat(
10731 "SomeClass::Constructor()\n"
10732 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10733 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10734 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010735 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10736 verifyFormat(
10737 "SomeLongTemplateVariableName<\n"
10738 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10739 Style);
10740 verifyFormat(
10741 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10742 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10743 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010744}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010745
Daniel Jasper00853002014-09-16 16:22:30 +000010746TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10747 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010748 Style.BreakConstructorInitializersBeforeComma = true;
10749 Style.ConstructorInitializerIndentWidth = 4;
10750 verifyFormat("SomeClass::Constructor()\n"
10751 " : a(a)\n"
10752 " , b(b)\n"
10753 " , c(c) {}",
10754 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010755 verifyFormat("SomeClass::Constructor()\n"
10756 " : a(a) {}",
10757 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010758
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010759 Style.ColumnLimit = 0;
10760 verifyFormat("SomeClass::Constructor()\n"
10761 " : a(a) {}",
10762 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010763 verifyFormat("SomeClass::Constructor() noexcept\n"
10764 " : a(a) {}",
10765 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010766 verifyFormat("SomeClass::Constructor()\n"
10767 " : a(a)\n"
10768 " , b(b)\n"
10769 " , c(c) {}",
10770 Style);
10771 verifyFormat("SomeClass::Constructor()\n"
10772 " : a(a) {\n"
10773 " foo();\n"
10774 " bar();\n"
10775 "}",
10776 Style);
10777
Daniel Jasperd74cf402014-04-08 12:46:38 +000010778 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010779 verifyFormat("SomeClass::Constructor()\n"
10780 " : a(a)\n"
10781 " , b(b)\n"
10782 " , c(c) {\n}",
10783 Style);
10784 verifyFormat("SomeClass::Constructor()\n"
10785 " : a(a) {\n}",
10786 Style);
10787
10788 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010789 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010790 Style.ConstructorInitializerIndentWidth = 2;
10791 verifyFormat("SomeClass::Constructor()\n"
10792 " : a(a)\n"
10793 " , b(b)\n"
10794 " , c(c) {}",
10795 Style);
10796
10797 Style.ConstructorInitializerIndentWidth = 0;
10798 verifyFormat("SomeClass::Constructor()\n"
10799 ": a(a)\n"
10800 ", b(b)\n"
10801 ", c(c) {}",
10802 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010803
10804 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10805 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010806 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10807 verifyFormat(
10808 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10809 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010810 verifyFormat(
10811 "SomeClass::Constructor()\n"
10812 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10813 Style);
10814 Style.ConstructorInitializerIndentWidth = 4;
10815 Style.ColumnLimit = 60;
10816 verifyFormat("SomeClass::Constructor()\n"
10817 " : aaaaaaaa(aaaaaaaa)\n"
10818 " , aaaaaaaa(aaaaaaaa)\n"
10819 " , aaaaaaaa(aaaaaaaa) {}",
10820 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010821}
10822
Daniel Jasper38efc132014-10-21 07:51:54 +000010823TEST_F(FormatTest, Destructors) {
10824 verifyFormat("void F(int &i) { i.~int(); }");
10825 verifyFormat("void F(int &i) { i->~int(); }");
10826}
10827
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010828TEST_F(FormatTest, FormatsWithWebKitStyle) {
10829 FormatStyle Style = getWebKitStyle();
10830
10831 // Don't indent in outer namespaces.
10832 verifyFormat("namespace outer {\n"
10833 "int i;\n"
10834 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010835 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010836 "} // namespace inner\n"
10837 "} // namespace outer\n"
10838 "namespace other_outer {\n"
10839 "int i;\n"
10840 "}",
10841 Style);
10842
10843 // Don't indent case labels.
10844 verifyFormat("switch (variable) {\n"
10845 "case 1:\n"
10846 "case 2:\n"
10847 " doSomething();\n"
10848 " break;\n"
10849 "default:\n"
10850 " ++variable;\n"
10851 "}",
10852 Style);
10853
10854 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010855 EXPECT_EQ("void f()\n"
10856 "{\n"
10857 " if (aaaaaaaaaaaaaaaa\n"
10858 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10859 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10860 " return;\n"
10861 "}",
10862 format("void f() {\n"
10863 "if (aaaaaaaaaaaaaaaa\n"
10864 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10865 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10866 "return;\n"
10867 "}",
10868 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010869
Daniel Jasper35995672014-04-29 14:05:20 +000010870 // Allow functions on a single line.
10871 verifyFormat("void f() { return; }", Style);
10872
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010873 // Constructor initializers are formatted one per line with the "," on the
10874 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010875 verifyFormat("Constructor()\n"
10876 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10877 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010878 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010879 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10880 "{\n"
10881 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010882 Style);
10883 verifyFormat("SomeClass::Constructor()\n"
10884 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010885 "{\n"
10886 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010887 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010888 EXPECT_EQ("SomeClass::Constructor()\n"
10889 " : a(a)\n"
10890 "{\n"
10891 "}",
10892 format("SomeClass::Constructor():a(a){}", Style));
10893 verifyFormat("SomeClass::Constructor()\n"
10894 " : a(a)\n"
10895 " , b(b)\n"
10896 " , c(c)\n"
10897 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010898 "}",
10899 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010900 verifyFormat("SomeClass::Constructor()\n"
10901 " : a(a)\n"
10902 "{\n"
10903 " foo();\n"
10904 " bar();\n"
10905 "}",
10906 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010907
Daniel Jasper65ee3472013-07-31 23:16:02 +000010908 // Access specifiers should be aligned left.
10909 verifyFormat("class C {\n"
10910 "public:\n"
10911 " int i;\n"
10912 "};",
10913 Style);
10914
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010915 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010916 verifyFormat("int a; // Do not\n"
10917 "double b; // align comments.",
10918 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010919
Daniel Jasper3219e432014-12-02 13:24:51 +000010920 // Do not align operands.
10921 EXPECT_EQ("ASSERT(aaaa\n"
10922 " || bbbb);",
10923 format("ASSERT ( aaaa\n||bbbb);", Style));
10924
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010925 // Accept input's line breaks.
10926 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10927 " || bbbbbbbbbbbbbbb) {\n"
10928 " i++;\n"
10929 "}",
10930 format("if (aaaaaaaaaaaaaaa\n"
10931 "|| bbbbbbbbbbbbbbb) { i++; }",
10932 Style));
10933 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10934 " i++;\n"
10935 "}",
10936 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010937
10938 // Don't automatically break all macro definitions (llvm.org/PR17842).
10939 verifyFormat("#define aNumber 10", Style);
10940 // However, generally keep the line breaks that the user authored.
10941 EXPECT_EQ("#define aNumber \\\n"
10942 " 10",
10943 format("#define aNumber \\\n"
10944 " 10",
10945 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010946
10947 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010948 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10949 " copyItems:YES];",
10950 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10951 "copyItems:YES];",
10952 Style));
10953 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10954 " copyItems:YES];",
10955 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10956 " copyItems:YES];",
10957 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010958 // FIXME: This does not seem right, there should be more indentation before
10959 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010960 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010961 " @\"a\",\n"
10962 " @\"a\"\n"
10963 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010964 " copyItems:YES];",
10965 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10966 " @\"a\",\n"
10967 " @\"a\"\n"
10968 " ]\n"
10969 " copyItems:YES];",
10970 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010971 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010972 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10973 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010974 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10975 " copyItems:YES];",
10976 Style));
10977
10978 verifyFormat("[self.a b:c c:d];", Style);
10979 EXPECT_EQ("[self.a b:c\n"
10980 " c:d];",
10981 format("[self.a b:c\n"
10982 "c:d];",
10983 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010984}
10985
Manuel Klimekffdeb592013-09-03 15:10:01 +000010986TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010987 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10988 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10989 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10990 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10991 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010992 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010993 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010994 verifyFormat("void f() {\n"
10995 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10996 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010997 verifyFormat("void f() {\n"
10998 " other(x.begin(), //\n"
10999 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000011000 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000011001 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000011002 verifyFormat("SomeFunction([]() { // A cool function...\n"
11003 " return 43;\n"
11004 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000011005 EXPECT_EQ("SomeFunction([]() {\n"
11006 "#define A a\n"
11007 " return 43;\n"
11008 "});",
11009 format("SomeFunction([](){\n"
11010 "#define A a\n"
11011 "return 43;\n"
11012 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000011013 verifyFormat("void f() {\n"
11014 " SomeFunction([](decltype(x), A *a) {});\n"
11015 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011016 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
11017 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000011018 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
11019 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
11020 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000011021 verifyFormat("Constructor()\n"
11022 " : Field([] { // comment\n"
11023 " int i;\n"
11024 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000011025 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
11026 " return some_parameter.size();\n"
11027 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000011028 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
11029 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000011030 verifyFormat("int i = aaaaaa ? 1 //\n"
11031 " : [] {\n"
11032 " return 2; //\n"
11033 " }();");
11034 verifyFormat("llvm::errs() << \"number of twos is \"\n"
11035 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
11036 " return x == 2; // force break\n"
11037 " });");
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000011038 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n"
11039 " int iiiiiiiiiiii) {\n"
11040 " return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n"
11041 "});",
11042 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000011043 verifyFormat("SomeFunction({[&] {\n"
11044 " // comment\n"
11045 " },\n"
11046 " [&] {\n"
11047 " // comment\n"
11048 " }});");
11049 verifyFormat("SomeFunction({[&] {\n"
11050 " // comment\n"
11051 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011052 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11053 " [&]() { return true; },\n"
11054 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011055
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011056 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011057 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011058 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011059 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11060 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011061 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011062 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011063 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11064 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011065 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011066 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11067 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011068 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011069 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011070 verifyFormat(
11071 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11072 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11073 " return aaaaaaaaaaaaaaaaa;\n"
11074 " });",
11075 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011076 verifyFormat("[]() //\n"
11077 " -> int {\n"
11078 " return 1; //\n"
11079 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011080
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011081 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011082 verifyFormat("SomeFunction(\n"
11083 " []() {\n"
11084 " int i = 42;\n"
11085 " return i;\n"
11086 " },\n"
11087 " []() {\n"
11088 " int j = 43;\n"
11089 " return j;\n"
11090 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011091
Daniel Jasperda18fd82014-06-10 06:39:03 +000011092 // More complex introducers.
11093 verifyFormat("return [i, args...] {};");
11094
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011095 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011096 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011097 verifyFormat("double &operator[](int i) { return 0; }\n"
11098 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011099 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011100 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011101 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011102
11103 // Other corner cases.
11104 verifyFormat("void f() {\n"
11105 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
11106 " );\n"
11107 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011108
11109 // Lambdas created through weird macros.
11110 verifyFormat("void f() {\n"
11111 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011112 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011113 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011114
11115 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11116 " doo_dah();\n"
11117 " doo_dah();\n"
11118 " })) {\n"
11119 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011120 verifyFormat("auto lambda = []() {\n"
11121 " int a = 2\n"
11122 "#if A\n"
11123 " + 2\n"
11124 "#endif\n"
11125 " ;\n"
11126 "};");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011127}
11128
Manuel Klimek516e0542013-09-04 13:25:30 +000011129TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011130 FormatStyle ShortBlocks = getLLVMStyle();
11131 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11132 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11133 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11134 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11135 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11136 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11137 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011138
Daniel Jasper76284682014-10-22 09:12:44 +000011139 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11140 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11141 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011142
Daniel Jasper76284682014-10-22 09:12:44 +000011143 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011144 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011145 "}];");
11146 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011147 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011148 "}]};");
11149 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011150 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011151 "}];");
11152 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011153 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011154 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011155 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011156 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011157 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011158 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011159 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011160
11161 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011162 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011163 "}];",
11164 getLLVMStyleWithColumns(60));
11165 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011166 " NSString *path = [self sessionFilePath];\n"
11167 " if (path) {\n"
11168 " // ...\n"
11169 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011170 "});");
11171 verifyFormat("[[SessionService sharedService]\n"
11172 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011173 " if (window) {\n"
11174 " [self windowDidLoad:window];\n"
11175 " } else {\n"
11176 " [self errorLoadingWindow];\n"
11177 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011178 " }];");
11179 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011180 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011181 "};\n",
11182 getLLVMStyleWithColumns(40));
11183 verifyFormat("[[SessionService sharedService]\n"
11184 " loadWindowWithCompletionBlock: //\n"
11185 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011186 " if (window) {\n"
11187 " [self windowDidLoad:window];\n"
11188 " } else {\n"
11189 " [self errorLoadingWindow];\n"
11190 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011191 " }];",
11192 getLLVMStyleWithColumns(60));
11193 verifyFormat("[myObject doSomethingWith:arg1\n"
11194 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011195 " // ...\n"
11196 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011197 " }\n"
11198 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011199 " // ...\n"
11200 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011201 " }\n"
11202 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011203 " // ...\n"
11204 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011205 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011206 verifyFormat("[myObject doSomethingWith:arg1\n"
11207 " firstBlock:-1\n"
11208 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011209 " // ...\n"
11210 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011211 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011212
11213 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011214 " @autoreleasepool {\n"
11215 " if (a) {\n"
11216 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011217 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011218 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011219 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011220 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011221 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11222 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011223
11224 FormatStyle FourIndent = getLLVMStyle();
11225 FourIndent.ObjCBlockIndentWidth = 4;
11226 verifyFormat("[operation setCompletionBlock:^{\n"
11227 " [self onOperationDone];\n"
11228 "}];",
11229 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011230}
11231
Daniel Jasper289afc02015-04-23 09:23:17 +000011232TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11233 FormatStyle ZeroColumn = getLLVMStyle();
11234 ZeroColumn.ColumnLimit = 0;
11235
11236 verifyFormat("[[SessionService sharedService] "
11237 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11238 " if (window) {\n"
11239 " [self windowDidLoad:window];\n"
11240 " } else {\n"
11241 " [self errorLoadingWindow];\n"
11242 " }\n"
11243 "}];",
11244 ZeroColumn);
11245 EXPECT_EQ("[[SessionService sharedService]\n"
11246 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11247 " if (window) {\n"
11248 " [self windowDidLoad:window];\n"
11249 " } else {\n"
11250 " [self errorLoadingWindow];\n"
11251 " }\n"
11252 " }];",
11253 format("[[SessionService sharedService]\n"
11254 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11255 " if (window) {\n"
11256 " [self windowDidLoad:window];\n"
11257 " } else {\n"
11258 " [self errorLoadingWindow];\n"
11259 " }\n"
11260 "}];",
11261 ZeroColumn));
11262 verifyFormat("[myObject doSomethingWith:arg1\n"
11263 " firstBlock:^(Foo *a) {\n"
11264 " // ...\n"
11265 " int i;\n"
11266 " }\n"
11267 " secondBlock:^(Bar *b) {\n"
11268 " // ...\n"
11269 " int i;\n"
11270 " }\n"
11271 " thirdBlock:^Foo(Bar *b) {\n"
11272 " // ...\n"
11273 " int i;\n"
11274 " }];",
11275 ZeroColumn);
11276 verifyFormat("f(^{\n"
11277 " @autoreleasepool {\n"
11278 " if (a) {\n"
11279 " g();\n"
11280 " }\n"
11281 " }\n"
11282 "});",
11283 ZeroColumn);
11284 verifyFormat("void (^largeBlock)(void) = ^{\n"
11285 " // ...\n"
11286 "};",
11287 ZeroColumn);
11288
11289 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11290 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011291 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011292 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11293 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11294 " int i;\n"
11295 "};",
11296 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11297}
11298
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011299TEST_F(FormatTest, SupportsCRLF) {
11300 EXPECT_EQ("int a;\r\n"
11301 "int b;\r\n"
11302 "int c;\r\n",
11303 format("int a;\r\n"
11304 " int b;\r\n"
11305 " int c;\r\n",
11306 getLLVMStyle()));
11307 EXPECT_EQ("int a;\r\n"
11308 "int b;\r\n"
11309 "int c;\r\n",
11310 format("int a;\r\n"
11311 " int b;\n"
11312 " int c;\r\n",
11313 getLLVMStyle()));
11314 EXPECT_EQ("int a;\n"
11315 "int b;\n"
11316 "int c;\n",
11317 format("int a;\r\n"
11318 " int b;\n"
11319 " int c;\n",
11320 getLLVMStyle()));
11321 EXPECT_EQ("\"aaaaaaa \"\r\n"
11322 "\"bbbbbbb\";\r\n",
11323 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11324 EXPECT_EQ("#define A \\\r\n"
11325 " b; \\\r\n"
11326 " c; \\\r\n"
11327 " d;\r\n",
11328 format("#define A \\\r\n"
11329 " b; \\\r\n"
11330 " c; d; \r\n",
11331 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011332
11333 EXPECT_EQ("/*\r\n"
11334 "multi line block comments\r\n"
11335 "should not introduce\r\n"
11336 "an extra carriage return\r\n"
11337 "*/\r\n",
11338 format("/*\r\n"
11339 "multi line block comments\r\n"
11340 "should not introduce\r\n"
11341 "an extra carriage return\r\n"
11342 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011343}
11344
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011345TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11346 verifyFormat("MY_CLASS(C) {\n"
11347 " int i;\n"
11348 " int j;\n"
11349 "};");
11350}
11351
Daniel Jasper6633ab82013-10-18 10:38:14 +000011352TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11353 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11354 TwoIndent.ContinuationIndentWidth = 2;
11355
11356 EXPECT_EQ("int i =\n"
11357 " longFunction(\n"
11358 " arg);",
11359 format("int i = longFunction(arg);", TwoIndent));
11360
11361 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11362 SixIndent.ContinuationIndentWidth = 6;
11363
11364 EXPECT_EQ("int i =\n"
11365 " longFunction(\n"
11366 " arg);",
11367 format("int i = longFunction(arg);", SixIndent));
11368}
11369
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011370TEST_F(FormatTest, SpacesInAngles) {
11371 FormatStyle Spaces = getLLVMStyle();
11372 Spaces.SpacesInAngles = true;
11373
11374 verifyFormat("static_cast< int >(arg);", Spaces);
11375 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11376 verifyFormat("f< int, float >();", Spaces);
11377 verifyFormat("template <> g() {}", Spaces);
11378 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011379 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11380 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11381 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011382
11383 Spaces.Standard = FormatStyle::LS_Cpp03;
11384 Spaces.SpacesInAngles = true;
11385 verifyFormat("A< A< int > >();", Spaces);
11386
11387 Spaces.SpacesInAngles = false;
11388 verifyFormat("A<A<int> >();", Spaces);
11389
11390 Spaces.Standard = FormatStyle::LS_Cpp11;
11391 Spaces.SpacesInAngles = true;
11392 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011393
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011394 Spaces.SpacesInAngles = false;
11395 verifyFormat("A<A<int>>();", Spaces);
11396}
11397
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011398TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11399 FormatStyle Style = getLLVMStyle();
11400 Style.SpaceAfterTemplateKeyword = false;
11401 verifyFormat("template<int> void foo();", Style);
11402}
11403
Jacques Pienaarfc275112015-02-18 23:48:37 +000011404TEST_F(FormatTest, TripleAngleBrackets) {
11405 verifyFormat("f<<<1, 1>>>();");
11406 verifyFormat("f<<<1, 1, 1, s>>>();");
11407 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011408 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011409 verifyFormat("f<param><<<1, 1>>>();");
11410 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011411 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011412 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11413 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011414 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11415 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011416}
11417
11418TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011419 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011420 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011421 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11422 "aaallvm::outs() <<");
11423 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11424 "aaaallvm::outs()\n <<");
11425}
11426
Manuel Klimek819788d2014-03-18 11:22:45 +000011427TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11428 std::string code = "#if A\n"
11429 "#if B\n"
11430 "a.\n"
11431 "#endif\n"
11432 " a = 1;\n"
11433 "#else\n"
11434 "#endif\n"
11435 "#if C\n"
11436 "#else\n"
11437 "#endif\n";
11438 EXPECT_EQ(code, format(code));
11439}
11440
Manuel Klimek68b03042014-04-14 09:14:11 +000011441TEST_F(FormatTest, HandleConflictMarkers) {
11442 // Git/SVN conflict markers.
11443 EXPECT_EQ("int a;\n"
11444 "void f() {\n"
11445 " callme(some(parameter1,\n"
11446 "<<<<<<< text by the vcs\n"
11447 " parameter2),\n"
11448 "||||||| text by the vcs\n"
11449 " parameter2),\n"
11450 " parameter3,\n"
11451 "======= text by the vcs\n"
11452 " parameter2, parameter3),\n"
11453 ">>>>>>> text by the vcs\n"
11454 " otherparameter);\n",
11455 format("int a;\n"
11456 "void f() {\n"
11457 " callme(some(parameter1,\n"
11458 "<<<<<<< text by the vcs\n"
11459 " parameter2),\n"
11460 "||||||| text by the vcs\n"
11461 " parameter2),\n"
11462 " parameter3,\n"
11463 "======= text by the vcs\n"
11464 " parameter2,\n"
11465 " parameter3),\n"
11466 ">>>>>>> text by the vcs\n"
11467 " otherparameter);\n"));
11468
11469 // Perforce markers.
11470 EXPECT_EQ("void f() {\n"
11471 " function(\n"
11472 ">>>> text by the vcs\n"
11473 " parameter,\n"
11474 "==== text by the vcs\n"
11475 " parameter,\n"
11476 "==== text by the vcs\n"
11477 " parameter,\n"
11478 "<<<< text by the vcs\n"
11479 " parameter);\n",
11480 format("void f() {\n"
11481 " function(\n"
11482 ">>>> text by the vcs\n"
11483 " parameter,\n"
11484 "==== text by the vcs\n"
11485 " parameter,\n"
11486 "==== text by the vcs\n"
11487 " parameter,\n"
11488 "<<<< text by the vcs\n"
11489 " parameter);\n"));
11490
11491 EXPECT_EQ("<<<<<<<\n"
11492 "|||||||\n"
11493 "=======\n"
11494 ">>>>>>>",
11495 format("<<<<<<<\n"
11496 "|||||||\n"
11497 "=======\n"
11498 ">>>>>>>"));
11499
11500 EXPECT_EQ("<<<<<<<\n"
11501 "|||||||\n"
11502 "int i;\n"
11503 "=======\n"
11504 ">>>>>>>",
11505 format("<<<<<<<\n"
11506 "|||||||\n"
11507 "int i;\n"
11508 "=======\n"
11509 ">>>>>>>"));
11510
11511 // FIXME: Handle parsing of macros around conflict markers correctly:
11512 EXPECT_EQ("#define Macro \\\n"
11513 "<<<<<<<\n"
11514 "Something \\\n"
11515 "|||||||\n"
11516 "Else \\\n"
11517 "=======\n"
11518 "Other \\\n"
11519 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011520 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011521 format("#define Macro \\\n"
11522 "<<<<<<<\n"
11523 " Something \\\n"
11524 "|||||||\n"
11525 " Else \\\n"
11526 "=======\n"
11527 " Other \\\n"
11528 ">>>>>>>\n"
11529 " End\n"
11530 "int i;\n"));
11531}
11532
Daniel Jasper471894432014-08-06 13:40:26 +000011533TEST_F(FormatTest, DisableRegions) {
11534 EXPECT_EQ("int i;\n"
11535 "// clang-format off\n"
11536 " int j;\n"
11537 "// clang-format on\n"
11538 "int k;",
11539 format(" int i;\n"
11540 " // clang-format off\n"
11541 " int j;\n"
11542 " // clang-format on\n"
11543 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011544 EXPECT_EQ("int i;\n"
11545 "/* clang-format off */\n"
11546 " int j;\n"
11547 "/* clang-format on */\n"
11548 "int k;",
11549 format(" int i;\n"
11550 " /* clang-format off */\n"
11551 " int j;\n"
11552 " /* clang-format on */\n"
11553 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011554
11555 // Don't reflow comments within disabled regions.
11556 EXPECT_EQ(
11557 "// clang-format off\n"
11558 "// long long long long long long line\n"
11559 "/* clang-format on */\n"
11560 "/* long long long\n"
11561 " * long long long\n"
11562 " * line */\n"
11563 "int i;\n"
11564 "/* clang-format off */\n"
11565 "/* long long long long long long line */\n",
11566 format("// clang-format off\n"
11567 "// long long long long long long line\n"
11568 "/* clang-format on */\n"
11569 "/* long long long long long long line */\n"
11570 "int i;\n"
11571 "/* clang-format off */\n"
11572 "/* long long long long long long line */\n",
11573 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011574}
11575
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011576TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11577 format("? ) =");
11578 verifyNoCrash("#define a\\\n /**/}");
11579}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011580
Daniel Jasper498f5582015-12-25 08:53:31 +000011581TEST_F(FormatTest, FormatsTableGenCode) {
11582 FormatStyle Style = getLLVMStyle();
11583 Style.Language = FormatStyle::LK_TableGen;
11584 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11585}
11586
Nico Weberb2673a12016-11-10 21:49:25 +000011587TEST_F(FormatTest, ArrayOfTemplates) {
11588 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11589 format("auto a = new unique_ptr<int > [ 10];"));
11590
11591 FormatStyle Spaces = getLLVMStyle();
11592 Spaces.SpacesInSquareBrackets = true;
11593 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11594 format("auto a = new unique_ptr<int > [10];", Spaces));
11595}
11596
11597TEST_F(FormatTest, ArrayAsTemplateType) {
11598 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11599 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11600
11601 FormatStyle Spaces = getLLVMStyle();
11602 Spaces.SpacesInSquareBrackets = true;
11603 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11604 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11605}
11606
Eric Liu547d8792016-03-24 13:22:42 +000011607TEST(FormatStyle, GetStyleOfFile) {
11608 vfs::InMemoryFileSystem FS;
11609 // Test 1: format file in the same directory.
11610 ASSERT_TRUE(
11611 FS.addFile("/a/.clang-format", 0,
11612 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11613 ASSERT_TRUE(
11614 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011615 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011616 ASSERT_TRUE((bool)Style1);
11617 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011618
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011619 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011620 ASSERT_TRUE(
11621 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011622 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011623 ASSERT_TRUE((bool)Style2);
11624 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011625
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011626 // Test 2.2: no format on 'none' fallback style.
11627 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11628 ASSERT_TRUE((bool)Style2);
11629 ASSERT_EQ(*Style2, getNoStyle());
11630
11631 // Test 2.3: format if config is found with no based style while fallback is
11632 // 'none'.
11633 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11634 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11635 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11636 ASSERT_TRUE((bool)Style2);
11637 ASSERT_EQ(*Style2, getLLVMStyle());
11638
11639 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11640 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11641 ASSERT_TRUE((bool)Style2);
11642 ASSERT_EQ(*Style2, getLLVMStyle());
11643
Eric Liu547d8792016-03-24 13:22:42 +000011644 // Test 3: format file in parent directory.
11645 ASSERT_TRUE(
11646 FS.addFile("/c/.clang-format", 0,
11647 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11648 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11649 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011650 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011651 ASSERT_TRUE((bool)Style3);
11652 ASSERT_EQ(*Style3, getGoogleStyle());
11653
11654 // Test 4: error on invalid fallback style
11655 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11656 ASSERT_FALSE((bool)Style4);
11657 llvm::consumeError(Style4.takeError());
11658
11659 // Test 5: error on invalid yaml on command line
11660 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11661 ASSERT_FALSE((bool)Style5);
11662 llvm::consumeError(Style5.takeError());
11663
11664 // Test 6: error on invalid style
11665 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11666 ASSERT_FALSE((bool)Style6);
11667 llvm::consumeError(Style6.takeError());
11668
11669 // Test 7: found config file, error on parsing it
11670 ASSERT_TRUE(
11671 FS.addFile("/d/.clang-format", 0,
11672 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11673 "InvalidKey: InvalidValue")));
11674 ASSERT_TRUE(
11675 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11676 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11677 ASSERT_FALSE((bool)Style7);
11678 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011679}
11680
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011681TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11682 // Column limit is 20.
11683 std::string Code = "Type *a =\n"
11684 " new Type();\n"
11685 "g(iiiii, 0, jjjjj,\n"
11686 " 0, kkkkk, 0, mm);\n"
11687 "int bad = format ;";
11688 std::string Expected = "auto a = new Type();\n"
11689 "g(iiiii, nullptr,\n"
11690 " jjjjj, nullptr,\n"
11691 " kkkkk, nullptr,\n"
11692 " mm);\n"
11693 "int bad = format ;";
11694 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011695 tooling::Replacements Replaces = toReplacements(
11696 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11697 "auto "),
11698 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11699 "nullptr"),
11700 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11701 "nullptr"),
11702 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11703 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011704
11705 format::FormatStyle Style = format::getLLVMStyle();
11706 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011707 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11708 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11709 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11710 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11711 EXPECT_TRUE(static_cast<bool>(Result));
11712 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011713}
11714
Eric Liubaf58c22016-05-18 13:43:48 +000011715TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11716 std::string Code = "#include \"a.h\"\n"
11717 "#include \"c.h\"\n"
11718 "\n"
11719 "int main() {\n"
11720 " return 0;\n"
11721 "}";
11722 std::string Expected = "#include \"a.h\"\n"
11723 "#include \"b.h\"\n"
11724 "#include \"c.h\"\n"
11725 "\n"
11726 "int main() {\n"
11727 " return 0;\n"
11728 "}";
11729 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011730 tooling::Replacements Replaces = toReplacements(
11731 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11732 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011733
11734 format::FormatStyle Style = format::getLLVMStyle();
11735 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011736 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11737 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11738 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11739 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11740 EXPECT_TRUE(static_cast<bool>(Result));
11741 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011742}
11743
Krasimir Georgiev13dbaa02017-02-01 10:10:04 +000011744TEST_F(FormatTest, AlignTrailingComments) {
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011745 EXPECT_EQ("#define MACRO(V) \\\n"
11746 " V(Rt2) /* one more char */ \\\n"
11747 " V(Rs) /* than here */ \\\n"
11748 "/* comment 3 */\n",
11749 format("#define MACRO(V)\\\n"
11750 "V(Rt2) /* one more char */ \\\n"
11751 "V(Rs) /* than here */ \\\n"
11752 "/* comment 3 */ \\\n",
11753 getLLVMStyleWithColumns(40)));
Krasimir Georgiev13dbaa02017-02-01 10:10:04 +000011754 EXPECT_EQ("int i = f(abc, // line 1\n"
11755 " d, // line 2\n"
11756 " // line 3\n"
11757 " b);",
11758 format("int i = f(abc, // line 1\n"
11759 " d, // line 2\n"
11760 " // line 3\n"
11761 " b);",
11762 getLLVMStyleWithColumns(40)));
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011763}
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011764} // end namespace
11765} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011766} // end namespace clang