blob: a7c2f7c9df2ba316591b56f15d0f79ab698a4b26 [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
937 verifyFormat(
938 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000939 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // Trailing comment");
Daniel Jasperd8bb2db2013-01-09 09:33:39 +0000940 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
941 " // Comment inside a statement.\n"
942 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper4281c5a2014-10-07 14:45:34 +0000943 verifyFormat("SomeFunction(a,\n"
944 " // comment\n"
945 " b + x);");
946 verifyFormat("SomeFunction(a, a,\n"
947 " // comment\n"
948 " b + x);");
Daniel Jasper38396592013-02-06 15:23:09 +0000949 verifyFormat(
950 "bool aaaaaaaaaaaaa = // comment\n"
951 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
952 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Manuel Klimekc74d2922013-01-07 08:54:53 +0000953
Daniel Jasper525264c2013-02-13 19:25:54 +0000954 verifyFormat("int aaaa; // aaaaa\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000955 "int aa; // aaaaaaa",
956 getLLVMStyleWithColumns(20));
Daniel Jasper525264c2013-02-13 19:25:54 +0000957
Daniel Jasper304a9862013-01-21 22:49:20 +0000958 EXPECT_EQ("void f() { // This does something ..\n"
959 "}\n"
960 "int a; // This is unrelated",
961 format("void f() { // This does something ..\n"
962 " }\n"
963 "int a; // This is unrelated"));
Daniel Jasper251b3c92013-07-01 11:22:57 +0000964 EXPECT_EQ("class C {\n"
965 " void f() { // This does something ..\n"
966 " } // awesome..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +0000967 "\n"
Daniel Jasper251b3c92013-07-01 11:22:57 +0000968 " int a; // This is unrelated\n"
969 "};",
970 format("class C{void f() { // This does something ..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +0000971 " } // awesome..\n"
972 " \n"
Daniel Jasper251b3c92013-07-01 11:22:57 +0000973 "int a; // This is unrelated\n"
974 "};"));
Daniel Jasper304a9862013-01-21 22:49:20 +0000975
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000976 EXPECT_EQ("int i; // single line trailing comment",
Manuel Klimekc74d2922013-01-07 08:54:53 +0000977 format("int i;\\\n// single line trailing comment"));
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000978
979 verifyGoogleFormat("int a; // Trailing comment.");
Daniel Jasperddaa9be2013-01-29 19:41:55 +0000980
981 verifyFormat("someFunction(anotherFunction( // Force break.\n"
982 " parameter));");
Daniel Jaspera885dbe2013-02-05 09:34:14 +0000983
984 verifyGoogleFormat("#endif // HEADER_GUARD");
Daniel Jasperf79f9352013-02-06 22:04:05 +0000985
986 verifyFormat("const char *test[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +0000987 " // A\n"
988 " \"aaaa\",\n"
989 " // B\n"
990 " \"aaaaa\"};");
Daniel Jaspereef30492013-02-11 12:36:37 +0000991 verifyGoogleFormat(
992 "aaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +0000993 " aaaaaaaaaaaaaaaaaaaaaa); // 81_cols_with_this_comment");
Alexander Kornienkob1be9d62013-04-03 12:38:53 +0000994 EXPECT_EQ("D(a, {\n"
995 " // test\n"
996 " int a;\n"
997 "});",
998 format("D(a, {\n"
999 "// test\n"
1000 "int a;\n"
1001 "});"));
Manuel Klimekc5730802013-05-23 11:42:52 +00001002
1003 EXPECT_EQ("lineWith(); // comment\n"
1004 "// at start\n"
1005 "otherLine();",
1006 format("lineWith(); // comment\n"
1007 "// at start\n"
1008 "otherLine();"));
1009 EXPECT_EQ("lineWith(); // comment\n"
Daniel Jasperbb37a2f2016-02-01 11:20:55 +00001010 "/*\n"
1011 " * at start */\n"
1012 "otherLine();",
1013 format("lineWith(); // comment\n"
1014 "/*\n"
1015 " * at start */\n"
1016 "otherLine();"));
1017 EXPECT_EQ("lineWith(); // comment\n"
Manuel Klimekc5730802013-05-23 11:42:52 +00001018 " // at start\n"
1019 "otherLine();",
1020 format("lineWith(); // comment\n"
1021 " // at start\n"
1022 "otherLine();"));
Manuel Klimekb27375f2013-05-23 19:54:43 +00001023
1024 EXPECT_EQ("lineWith(); // comment\n"
1025 "// at start\n"
1026 "otherLine(); // comment",
1027 format("lineWith(); // comment\n"
1028 "// at start\n"
1029 "otherLine(); // comment"));
Manuel Klimek75ef31f2013-05-23 20:46:07 +00001030 EXPECT_EQ("lineWith();\n"
1031 "// at start\n"
1032 "otherLine(); // comment",
1033 format("lineWith();\n"
1034 " // at start\n"
1035 "otherLine(); // comment"));
1036 EXPECT_EQ("// first\n"
1037 "// at start\n"
1038 "otherLine(); // comment",
1039 format("// first\n"
1040 " // at start\n"
1041 "otherLine(); // comment"));
1042 EXPECT_EQ("f();\n"
1043 "// first\n"
1044 "// at start\n"
1045 "otherLine(); // comment",
1046 format("f();\n"
1047 "// first\n"
1048 " // at start\n"
1049 "otherLine(); // comment"));
Daniel Jasper0e93cdb2013-11-08 23:31:14 +00001050 verifyFormat("f(); // comment\n"
1051 "// first\n"
1052 "// at start\n"
1053 "otherLine();");
1054 EXPECT_EQ("f(); // comment\n"
1055 "// first\n"
1056 "// at start\n"
1057 "otherLine();",
1058 format("f(); // comment\n"
1059 "// first\n"
1060 " // at start\n"
1061 "otherLine();"));
1062 EXPECT_EQ("f(); // comment\n"
1063 " // first\n"
1064 "// at start\n"
1065 "otherLine();",
1066 format("f(); // comment\n"
1067 " // first\n"
1068 "// at start\n"
1069 "otherLine();"));
Daniel Jasper49532102015-01-07 14:00:11 +00001070 EXPECT_EQ("void f() {\n"
1071 " lineWith(); // comment\n"
1072 " // at start\n"
1073 "}",
1074 format("void f() {\n"
1075 " lineWith(); // comment\n"
1076 " // at start\n"
1077 "}"));
Benjamin Kramerdab50462016-01-11 16:27:16 +00001078 EXPECT_EQ("int xy; // a\n"
1079 "int z; // b",
1080 format("int xy; // a\n"
1081 "int z; //b"));
1082 EXPECT_EQ("int xy; // a\n"
1083 "int z; // bb",
1084 format("int xy; // a\n"
1085 "int z; //bb",
1086 getLLVMStyleWithColumns(12)));
Daniel Jasper66935022014-04-27 10:03:19 +00001087
Daniel Jaspera44991332015-04-29 13:06:49 +00001088 verifyFormat("#define A \\\n"
1089 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1090 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1091 getLLVMStyleWithColumns(60));
Daniel Jasper66935022014-04-27 10:03:19 +00001092 verifyFormat(
1093 "#define A \\\n"
1094 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1095 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1096 getLLVMStyleWithColumns(61));
Daniel Jasper8acf8222014-05-07 09:23:05 +00001097
1098 verifyFormat("if ( // This is some comment\n"
1099 " x + 3) {\n"
1100 "}");
1101 EXPECT_EQ("if ( // This is some comment\n"
1102 " // spanning two lines\n"
1103 " x + 3) {\n"
1104 "}",
1105 format("if( // This is some comment\n"
1106 " // spanning two lines\n"
1107 " x + 3) {\n"
1108 "}"));
Daniel Jasper9b79efb2015-01-19 11:49:32 +00001109
1110 verifyNoCrash("/\\\n/");
1111 verifyNoCrash("/\\\n* */");
Daniel Jasper62c78f52015-05-06 08:58:57 +00001112 // The 0-character somehow makes the lexer return a proper comment.
1113 verifyNoCrash(StringRef("/*\\\0\n/", 6));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001114}
1115
Daniel Jasper14e58e52014-03-21 11:58:45 +00001116TEST_F(FormatTest, KeepsParameterWithTrailingCommentsOnTheirOwnLine) {
1117 EXPECT_EQ("SomeFunction(a,\n"
1118 " b, // comment\n"
1119 " c);",
1120 format("SomeFunction(a,\n"
1121 " b, // comment\n"
1122 " c);"));
Daniel Jasper28df0a32014-03-21 12:15:40 +00001123 EXPECT_EQ("SomeFunction(a, b,\n"
1124 " // comment\n"
1125 " c);",
1126 format("SomeFunction(a,\n"
1127 " b,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001128 " // comment\n"
Daniel Jasper28df0a32014-03-21 12:15:40 +00001129 " c);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001130 EXPECT_EQ("SomeFunction(a, b, // comment (unclear relation)\n"
1131 " c);",
1132 format("SomeFunction(a, b, // comment (unclear relation)\n"
1133 " c);"));
1134 EXPECT_EQ("SomeFunction(a, // comment\n"
1135 " b,\n"
1136 " c); // comment",
1137 format("SomeFunction(a, // comment\n"
1138 " b,\n"
1139 " c); // comment"));
Daniel Jasper35e41222016-11-29 09:40:01 +00001140 EXPECT_EQ("aaaaaaaaaa(aaaa(aaaa,\n"
1141 " aaaa), //\n"
1142 " aaaa, bbbbb);",
1143 format("aaaaaaaaaa(aaaa(aaaa,\n"
1144 "aaaa), //\n"
1145 "aaaa, bbbbb);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001146}
1147
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001148TEST_F(FormatTest, RemovesTrailingWhitespaceOfComments) {
1149 EXPECT_EQ("// comment", format("// comment "));
1150 EXPECT_EQ("int aaaaaaa, bbbbbbb; // comment",
1151 format("int aaaaaaa, bbbbbbb; // comment ",
1152 getLLVMStyleWithColumns(33)));
Alexander Kornienko9ab4a772013-09-06 17:24:54 +00001153 EXPECT_EQ("// comment\\\n", format("// comment\\\n \t \v \f "));
1154 EXPECT_EQ("// comment \\\n", format("// comment \\\n \t \v \f "));
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001155}
1156
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001157TEST_F(FormatTest, UnderstandsBlockComments) {
Nico Weber8084cff2013-06-26 00:15:19 +00001158 verifyFormat("f(/*noSpaceAfterParameterNamingComment=*/true);");
Daniel Jasper2b2c9672016-05-08 18:14:01 +00001159 verifyFormat("void f() { g(/*aaa=*/x, /*bbb=*/!y, /*c=*/::c); }");
Daniel Jasper38c82402013-11-29 09:27:43 +00001160 EXPECT_EQ("f(aaaaaaaaaaaaaaaaaaaaaaaaa, /* Trailing comment for aa... */\n"
1161 " bbbbbbbbbbbbbbbbbbbbbbbbb);",
1162 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \\\n"
1163 "/* Trailing comment for aa... */\n"
1164 " bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001165 EXPECT_EQ(
1166 "f(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1167 " /* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);",
1168 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \n"
1169 "/* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper61a40782013-06-06 16:08:57 +00001170 EXPECT_EQ(
1171 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1172 " aaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001173 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001174 "}",
1175 format("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1176 " aaaaaaaaaaaaaaaaaa ,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001177 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001178 "}"));
Daniel Jasper99302ed2016-05-27 08:59:34 +00001179 verifyFormat("f(/* aaaaaaaaaaaaaaaaaa = */\n"
1180 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperddaa9be2013-01-29 19:41:55 +00001181
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00001182 FormatStyle NoBinPacking = getLLVMStyle();
1183 NoBinPacking.BinPackParameters = false;
1184 verifyFormat("aaaaaaaa(/* parameter 1 */ aaaaaa,\n"
1185 " /* parameter 2 */ aaaaaa,\n"
1186 " /* parameter 3 */ aaaaaa,\n"
1187 " /* parameter 4 */ aaaaaa);",
1188 NoBinPacking);
Daniel Jasper03b1bc72014-03-28 15:06:01 +00001189
1190 // Aligning block comments in macros.
1191 verifyGoogleFormat("#define A \\\n"
1192 " int i; /*a*/ \\\n"
1193 " int jjj; /*b*/");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001194}
1195
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001196TEST_F(FormatTest, AlignsBlockComments) {
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001197 EXPECT_EQ("/*\n"
1198 " * Really multi-line\n"
1199 " * comment.\n"
1200 " */\n"
1201 "void f() {}",
1202 format(" /*\n"
1203 " * Really multi-line\n"
1204 " * comment.\n"
1205 " */\n"
1206 " void f() {}"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001207 EXPECT_EQ("class C {\n"
1208 " /*\n"
1209 " * Another multi-line\n"
1210 " * comment.\n"
1211 " */\n"
1212 " void f() {}\n"
1213 "};",
1214 format("class C {\n"
1215 "/*\n"
1216 " * Another multi-line\n"
1217 " * comment.\n"
1218 " */\n"
1219 "void f() {}\n"
1220 "};"));
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001221 EXPECT_EQ("/*\n"
1222 " 1. This is a comment with non-trivial formatting.\n"
1223 " 1.1. We have to indent/outdent all lines equally\n"
1224 " 1.1.1. to keep the formatting.\n"
1225 " */",
1226 format(" /*\n"
1227 " 1. This is a comment with non-trivial formatting.\n"
1228 " 1.1. We have to indent/outdent all lines equally\n"
1229 " 1.1.1. to keep the formatting.\n"
1230 " */"));
1231 EXPECT_EQ("/*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001232 "Don't try to outdent if there's not enough indentation.\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001233 "*/",
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001234 format(" /*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001235 " Don't try to outdent if there's not enough indentation.\n"
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001236 " */"));
Manuel Klimek281dcbe2013-05-28 08:55:01 +00001237
1238 EXPECT_EQ("int i; /* Comment with empty...\n"
1239 " *\n"
1240 " * line. */",
1241 format("int i; /* Comment with empty...\n"
1242 " *\n"
1243 " * line. */"));
Alexander Kornienko67d9c8c2014-04-17 16:12:46 +00001244 EXPECT_EQ("int foobar = 0; /* comment */\n"
1245 "int bar = 0; /* multiline\n"
1246 " comment 1 */\n"
1247 "int baz = 0; /* multiline\n"
1248 " comment 2 */\n"
1249 "int bzz = 0; /* multiline\n"
1250 " comment 3 */",
1251 format("int foobar = 0; /* comment */\n"
1252 "int bar = 0; /* multiline\n"
1253 " comment 1 */\n"
1254 "int baz = 0; /* multiline\n"
1255 " comment 2 */\n"
1256 "int bzz = 0; /* multiline\n"
1257 " comment 3 */"));
1258 EXPECT_EQ("int foobar = 0; /* comment */\n"
1259 "int bar = 0; /* multiline\n"
1260 " comment */\n"
1261 "int baz = 0; /* multiline\n"
1262 "comment */",
1263 format("int foobar = 0; /* comment */\n"
1264 "int bar = 0; /* multiline\n"
1265 "comment */\n"
1266 "int baz = 0; /* multiline\n"
1267 "comment */"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001268}
1269
Daniel Jaspera0a50392015-12-01 13:28:53 +00001270TEST_F(FormatTest, CommentReflowingCanBeTurnedOff) {
1271 FormatStyle Style = getLLVMStyleWithColumns(20);
1272 Style.ReflowComments = false;
1273 verifyFormat("// aaaaaaaaa aaaaaaaaaa aaaaaaaaaa", Style);
1274 verifyFormat("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa */", Style);
1275}
1276
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001277TEST_F(FormatTest, CorrectlyHandlesLengthOfBlockComments) {
1278 EXPECT_EQ("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1279 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */",
1280 format("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1281 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */"));
Alexander Kornienkoaa620e12013-07-01 13:42:42 +00001282 EXPECT_EQ(
1283 "void ffffffffffff(\n"
1284 " int aaaaaaaa, int bbbbbbbb,\n"
1285 " int cccccccccccc) { /*\n"
1286 " aaaaaaaaaa\n"
1287 " aaaaaaaaaaaaa\n"
1288 " bbbbbbbbbbbbbb\n"
1289 " bbbbbbbbbb\n"
1290 " */\n"
1291 "}",
1292 format("void ffffffffffff(int aaaaaaaa, int bbbbbbbb, int cccccccccccc)\n"
1293 "{ /*\n"
1294 " aaaaaaaaaa aaaaaaaaaaaaa\n"
1295 " bbbbbbbbbbbbbb bbbbbbbbbb\n"
1296 " */\n"
1297 "}",
1298 getLLVMStyleWithColumns(40)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001299}
1300
Alexander Kornienko94042342013-07-16 23:47:22 +00001301TEST_F(FormatTest, DontBreakNonTrailingBlockComments) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00001302 EXPECT_EQ("void ffffffffff(\n"
1303 " int aaaaa /* test */);",
Alexander Kornienko94042342013-07-16 23:47:22 +00001304 format("void ffffffffff(int aaaaa /* test */);",
1305 getLLVMStyleWithColumns(35)));
1306}
1307
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001308TEST_F(FormatTest, SplitsLongCxxComments) {
1309 EXPECT_EQ("// A comment that\n"
1310 "// doesn't fit on\n"
1311 "// one line",
1312 format("// A comment that doesn't fit on one line",
1313 getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001314 EXPECT_EQ("/// A comment that\n"
1315 "/// doesn't fit on\n"
1316 "/// one line",
1317 format("/// A comment that doesn't fit on one line",
1318 getLLVMStyleWithColumns(20)));
1319 EXPECT_EQ("//! A comment that\n"
1320 "//! doesn't fit on\n"
1321 "//! one line",
1322 format("//! A comment that doesn't fit on one line",
1323 getLLVMStyleWithColumns(20)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00001324 EXPECT_EQ("// a b c d\n"
1325 "// e f g\n"
1326 "// h i j k",
Daniel Jaspera44991332015-04-29 13:06:49 +00001327 format("// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
1328 EXPECT_EQ(
1329 "// a b c d\n"
1330 "// e f g\n"
1331 "// h i j k",
1332 format("\\\n// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001333 EXPECT_EQ("if (true) // A comment that\n"
1334 " // doesn't fit on\n"
1335 " // one line",
1336 format("if (true) // A comment that doesn't fit on one line ",
1337 getLLVMStyleWithColumns(30)));
1338 EXPECT_EQ("// Don't_touch_leading_whitespace",
1339 format("// Don't_touch_leading_whitespace",
1340 getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001341 EXPECT_EQ("// Add leading\n"
1342 "// whitespace",
1343 format("//Add leading whitespace", getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001344 EXPECT_EQ("/// Add leading\n"
1345 "/// whitespace",
1346 format("///Add leading whitespace", getLLVMStyleWithColumns(20)));
1347 EXPECT_EQ("//! Add leading\n"
1348 "//! whitespace",
1349 format("//!Add leading whitespace", getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001350 EXPECT_EQ("// whitespace", format("//whitespace", getLLVMStyle()));
1351 EXPECT_EQ("// Even if it makes the line exceed the column\n"
1352 "// limit",
1353 format("//Even if it makes the line exceed the column limit",
1354 getLLVMStyleWithColumns(51)));
1355 EXPECT_EQ("//--But not here", format("//--But not here", getLLVMStyle()));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001356
1357 EXPECT_EQ("// aa bb cc dd",
1358 format("// aa bb cc dd ",
1359 getLLVMStyleWithColumns(15)));
1360
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001361 EXPECT_EQ("// A comment before\n"
1362 "// a macro\n"
1363 "// definition\n"
1364 "#define a b",
1365 format("// A comment before a macro definition\n"
1366 "#define a b",
1367 getLLVMStyleWithColumns(20)));
Daniel Jaspere068ac72014-10-27 17:13:59 +00001368 EXPECT_EQ("void ffffff(\n"
1369 " int aaaaaaaaa, // wwww\n"
1370 " int bbbbbbbbbb, // xxxxxxx\n"
1371 " // yyyyyyyyyy\n"
1372 " int c, int d, int e) {}",
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001373 format("void ffffff(\n"
1374 " int aaaaaaaaa, // wwww\n"
Daniel Jasper19a541e2013-12-19 16:45:34 +00001375 " int bbbbbbbbbb, // xxxxxxx yyyyyyyyyy\n"
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001376 " int c, int d, int e) {}",
1377 getLLVMStyleWithColumns(40)));
Alexander Kornienkob93062e2013-06-20 13:58:37 +00001378 EXPECT_EQ("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1379 format("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1380 getLLVMStyleWithColumns(20)));
Alexander Kornienko3abbb8a2013-11-12 17:30:49 +00001381 EXPECT_EQ(
1382 "#define XXX // a b c d\n"
1383 " // e f g h",
1384 format("#define XXX // a b c d e f g h", getLLVMStyleWithColumns(22)));
1385 EXPECT_EQ(
1386 "#define XXX // q w e r\n"
1387 " // t y u i",
1388 format("#define XXX //q w e r t y u i", getLLVMStyleWithColumns(22)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001389}
Manuel Klimek9043c742013-05-27 15:23:34 +00001390
Alexander Kornienko4504f932014-03-10 13:14:56 +00001391TEST_F(FormatTest, PreservesHangingIndentInCxxComments) {
1392 EXPECT_EQ("// A comment\n"
1393 "// that doesn't\n"
1394 "// fit on one\n"
1395 "// line",
1396 format("// A comment that doesn't fit on one line",
1397 getLLVMStyleWithColumns(20)));
1398 EXPECT_EQ("/// A comment\n"
1399 "/// that doesn't\n"
1400 "/// fit on one\n"
1401 "/// line",
1402 format("/// A comment that doesn't fit on one line",
1403 getLLVMStyleWithColumns(20)));
1404}
1405
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001406TEST_F(FormatTest, DontSplitLineCommentsWithEscapedNewlines) {
1407 EXPECT_EQ("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1408 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1409 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1410 format("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1411 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1412 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
1413 EXPECT_EQ("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1414 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1415 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1416 format("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1417 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1418 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1419 getLLVMStyleWithColumns(50)));
1420 // FIXME: One day we might want to implement adjustment of leading whitespace
1421 // of the consecutive lines in this kind of comment:
Daniel Jasper4355e7f2014-07-09 07:50:33 +00001422 EXPECT_EQ("double\n"
1423 " a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1424 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1425 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1426 format("double a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1427 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1428 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001429 getLLVMStyleWithColumns(49)));
1430}
1431
Alexander Kornienkoce9161a2014-01-02 15:13:14 +00001432TEST_F(FormatTest, DontSplitLineCommentsWithPragmas) {
1433 FormatStyle Pragmas = getLLVMStyleWithColumns(30);
1434 Pragmas.CommentPragmas = "^ IWYU pragma:";
1435 EXPECT_EQ(
1436 "// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb",
1437 format("// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb", Pragmas));
1438 EXPECT_EQ(
1439 "/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */",
1440 format("/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */", Pragmas));
1441}
1442
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001443TEST_F(FormatTest, PriorityOfCommentBreaking) {
Daniel Jasper2739af32013-08-28 10:03:58 +00001444 EXPECT_EQ("if (xxx ==\n"
1445 " yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001446 " zzz)\n"
1447 " q();",
1448 format("if (xxx == yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
1449 " zzz) q();",
1450 getLLVMStyleWithColumns(40)));
1451 EXPECT_EQ("if (xxxxxxxxxx ==\n"
1452 " yyy && // aaaaaa bbbbbbbb cccc\n"
1453 " zzz)\n"
1454 " q();",
1455 format("if (xxxxxxxxxx == yyy && // aaaaaa bbbbbbbb cccc\n"
1456 " zzz) q();",
1457 getLLVMStyleWithColumns(40)));
1458 EXPECT_EQ("if (xxxxxxxxxx &&\n"
1459 " yyy || // aaaaaa bbbbbbbb cccc\n"
1460 " zzz)\n"
1461 " q();",
1462 format("if (xxxxxxxxxx && yyy || // aaaaaa bbbbbbbb cccc\n"
1463 " zzz) q();",
1464 getLLVMStyleWithColumns(40)));
Daniel Jasper19a541e2013-12-19 16:45:34 +00001465 EXPECT_EQ("fffffffff(\n"
1466 " &xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1467 " zzz);",
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001468 format("fffffffff(&xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1469 " zzz);",
1470 getLLVMStyleWithColumns(40)));
Manuel Klimek9043c742013-05-27 15:23:34 +00001471}
1472
1473TEST_F(FormatTest, MultiLineCommentsInDefines) {
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001474 EXPECT_EQ("#define A(x) /* \\\n"
1475 " a comment \\\n"
1476 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001477 " f();",
1478 format("#define A(x) /* \\\n"
1479 " a comment \\\n"
1480 " inside */ \\\n"
1481 " f();",
1482 getLLVMStyleWithColumns(17)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001483 EXPECT_EQ("#define A( \\\n"
1484 " x) /* \\\n"
1485 " a comment \\\n"
1486 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001487 " f();",
1488 format("#define A( \\\n"
1489 " x) /* \\\n"
1490 " a comment \\\n"
1491 " inside */ \\\n"
1492 " f();",
1493 getLLVMStyleWithColumns(17)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001494}
1495
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001496TEST_F(FormatTest, ParsesCommentsAdjacentToPPDirectives) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001497 EXPECT_EQ("namespace {}\n// Test\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001498 format("namespace {}\n // Test\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001499 EXPECT_EQ("namespace {}\n/* Test */\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001500 format("namespace {}\n /* Test */\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001501 EXPECT_EQ("namespace {}\n/* Test */ #define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001502 format("namespace {}\n /* Test */ #define A"));
1503}
1504
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001505TEST_F(FormatTest, SplitsLongLinesInComments) {
1506 EXPECT_EQ("/* This is a long\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001507 " * comment that\n"
1508 " * doesn't\n"
1509 " * fit on one line.\n"
1510 " */",
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001511 format("/* "
1512 "This is a long "
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001513 "comment that "
1514 "doesn't "
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001515 "fit on one line. */",
1516 getLLVMStyleWithColumns(20)));
Daniel Jaspera44991332015-04-29 13:06:49 +00001517 EXPECT_EQ(
1518 "/* a b c d\n"
1519 " * e f g\n"
1520 " * h i j k\n"
1521 " */",
1522 format("/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
1523 EXPECT_EQ(
1524 "/* a b c d\n"
1525 " * e f g\n"
1526 " * h i j k\n"
1527 " */",
1528 format("\\\n/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001529 EXPECT_EQ("/*\n"
1530 "This is a long\n"
1531 "comment that doesn't\n"
1532 "fit on one line.\n"
1533 "*/",
1534 format("/*\n"
1535 "This is a long "
1536 "comment that doesn't "
1537 "fit on one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001538 "*/",
1539 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001540 EXPECT_EQ("/*\n"
1541 " * This is a long\n"
1542 " * comment that\n"
1543 " * doesn't fit on\n"
1544 " * one line.\n"
1545 " */",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001546 format("/* \n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001547 " * This is a long "
1548 " comment that "
1549 " doesn't fit on "
1550 " one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001551 " */",
1552 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001553 EXPECT_EQ("/*\n"
1554 " * This_is_a_comment_with_words_that_dont_fit_on_one_line\n"
1555 " * so_it_should_be_broken\n"
1556 " * wherever_a_space_occurs\n"
1557 " */",
1558 format("/*\n"
1559 " * This_is_a_comment_with_words_that_dont_fit_on_one_line "
1560 " so_it_should_be_broken "
1561 " wherever_a_space_occurs \n"
1562 " */",
1563 getLLVMStyleWithColumns(20)));
1564 EXPECT_EQ("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001565 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001566 " */",
1567 format("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001568 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001569 " */",
1570 getLLVMStyleWithColumns(20)));
1571 EXPECT_EQ("{\n"
1572 " /*\n"
1573 " This is another\n"
1574 " long comment that\n"
1575 " doesn't fit on one\n"
1576 " line 1234567890\n"
1577 " */\n"
1578 "}",
1579 format("{\n"
1580 "/*\n"
1581 "This is another "
1582 " long comment that "
1583 " doesn't fit on one"
1584 " line 1234567890\n"
1585 "*/\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001586 "}",
1587 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001588 EXPECT_EQ("{\n"
1589 " /*\n"
1590 " * This i s\n"
1591 " * another comment\n"
1592 " * t hat doesn' t\n"
1593 " * fit on one l i\n"
1594 " * n e\n"
1595 " */\n"
1596 "}",
1597 format("{\n"
1598 "/*\n"
1599 " * This i s"
1600 " another comment"
1601 " t hat doesn' t"
1602 " fit on one l i"
1603 " n e\n"
1604 " */\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001605 "}",
1606 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001607 EXPECT_EQ("/*\n"
1608 " * This is a long\n"
1609 " * comment that\n"
1610 " * doesn't fit on\n"
1611 " * one line\n"
1612 " */",
1613 format(" /*\n"
1614 " * This is a long comment that doesn't fit on one line\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001615 " */",
1616 getLLVMStyleWithColumns(20)));
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001617 EXPECT_EQ("{\n"
1618 " if (something) /* This is a\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001619 " long\n"
1620 " comment */\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001621 " ;\n"
1622 "}",
1623 format("{\n"
1624 " if (something) /* This is a long comment */\n"
1625 " ;\n"
1626 "}",
1627 getLLVMStyleWithColumns(30)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001628
1629 EXPECT_EQ("/* A comment before\n"
1630 " * a macro\n"
1631 " * definition */\n"
1632 "#define a b",
1633 format("/* A comment before a macro definition */\n"
1634 "#define a b",
1635 getLLVMStyleWithColumns(20)));
1636
1637 EXPECT_EQ("/* some comment\n"
1638 " * a comment\n"
1639 "* that we break\n"
1640 " * another comment\n"
1641 "* we have to break\n"
1642 "* a left comment\n"
1643 " */",
1644 format(" /* some comment\n"
1645 " * a comment that we break\n"
1646 " * another comment we have to break\n"
1647 "* a left comment\n"
1648 " */",
1649 getLLVMStyleWithColumns(20)));
1650
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00001651 EXPECT_EQ("/**\n"
1652 " * multiline block\n"
1653 " * comment\n"
1654 " *\n"
1655 " */",
1656 format("/**\n"
1657 " * multiline block comment\n"
1658 " *\n"
1659 " */",
1660 getLLVMStyleWithColumns(20)));
1661
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001662 EXPECT_EQ("/*\n"
1663 "\n"
1664 "\n"
1665 " */\n",
1666 format(" /* \n"
1667 " \n"
1668 " \n"
1669 " */\n"));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001670
1671 EXPECT_EQ("/* a a */",
1672 format("/* a a */", getLLVMStyleWithColumns(15)));
1673 EXPECT_EQ("/* a a bc */",
1674 format("/* a a bc */", getLLVMStyleWithColumns(15)));
1675 EXPECT_EQ("/* aaa aaa\n"
1676 " * aaaaa */",
1677 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
1678 EXPECT_EQ("/* aaa aaa\n"
1679 " * aaaaa */",
1680 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001681}
1682
1683TEST_F(FormatTest, SplitsLongLinesInCommentsInPreprocessor) {
1684 EXPECT_EQ("#define X \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001685 " /* \\\n"
1686 " Test \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001687 " Macro comment \\\n"
1688 " with a long \\\n"
1689 " line \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001690 " */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001691 " A + B",
1692 format("#define X \\\n"
1693 " /*\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001694 " Test\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001695 " Macro comment with a long line\n"
1696 " */ \\\n"
1697 " A + B",
1698 getLLVMStyleWithColumns(20)));
1699 EXPECT_EQ("#define X \\\n"
1700 " /* Macro comment \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001701 " with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001702 " line */ \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001703 " A + B",
1704 format("#define X \\\n"
1705 " /* Macro comment with a long\n"
1706 " line */ \\\n"
1707 " A + B",
1708 getLLVMStyleWithColumns(20)));
1709 EXPECT_EQ("#define X \\\n"
1710 " /* Macro comment \\\n"
1711 " * with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001712 " * line */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001713 " A + B",
1714 format("#define X \\\n"
1715 " /* Macro comment with a long line */ \\\n"
1716 " A + B",
1717 getLLVMStyleWithColumns(20)));
1718}
1719
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001720TEST_F(FormatTest, CommentsInStaticInitializers) {
1721 EXPECT_EQ(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001722 "static SomeType type = {aaaaaaaaaaaaaaaaaaaa, /* comment */\n"
1723 " aaaaaaaaaaaaaaaaaaaa /* comment */,\n"
1724 " /* comment */ aaaaaaaaaaaaaaaaaaaa,\n"
1725 " aaaaaaaaaaaaaaaaaaaa, // comment\n"
1726 " aaaaaaaaaaaaaaaaaaaa};",
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001727 format("static SomeType type = { aaaaaaaaaaaaaaaaaaaa , /* comment */\n"
1728 " aaaaaaaaaaaaaaaaaaaa /* comment */ ,\n"
1729 " /* comment */ aaaaaaaaaaaaaaaaaaaa ,\n"
1730 " aaaaaaaaaaaaaaaaaaaa , // comment\n"
1731 " aaaaaaaaaaaaaaaaaaaa };"));
Chandler Carruthf8b72662014-03-02 12:37:31 +00001732 verifyFormat("static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1733 " bbbbbbbbbbb, ccccccccccc};");
1734 verifyFormat("static SomeType type = {aaaaaaaaaaa,\n"
1735 " // comment for bb....\n"
1736 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001737 verifyGoogleFormat(
Daniel Jaspere5777d22013-05-23 10:15:45 +00001738 "static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1739 " bbbbbbbbbbb, ccccccccccc};");
1740 verifyGoogleFormat("static SomeType type = {aaaaaaaaaaa,\n"
1741 " // comment for bb....\n"
1742 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001743
Chandler Carruthf8b72662014-03-02 12:37:31 +00001744 verifyFormat("S s = {{a, b, c}, // Group #1\n"
1745 " {d, e, f}, // Group #2\n"
1746 " {g, h, i}}; // Group #3");
1747 verifyFormat("S s = {{// Group #1\n"
1748 " a, b, c},\n"
1749 " {// Group #2\n"
1750 " d, e, f},\n"
1751 " {// Group #3\n"
1752 " g, h, i}};");
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001753
1754 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001755 " // Some comment\n"
1756 " a,\n"
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001757 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001758 " // Comment after empty line\n"
1759 " b}",
Daniel Jasperfb5e2412013-02-26 13:10:34 +00001760 format("S s = {\n"
1761 " // Some comment\n"
1762 " a,\n"
1763 " \n"
1764 " // Comment after empty line\n"
1765 " b\n"
1766 "}"));
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001767 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001768 " /* Some comment */\n"
1769 " a,\n"
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001770 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001771 " /* Comment after empty line */\n"
1772 " b}",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001773 format("S s = {\n"
1774 " /* Some comment */\n"
1775 " a,\n"
1776 " \n"
1777 " /* Comment after empty line */\n"
1778 " b\n"
1779 "}"));
Daniel Jaspera400cab2013-02-28 15:04:12 +00001780 verifyFormat("const uint8_t aaaaaaaaaaaaaaaaaaaaaa[0] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001781 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1782 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1783 " 0x00, 0x00, 0x00, 0x00}; // comment\n");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001784}
1785
Alexander Kornienkof2e02122013-05-24 18:24:24 +00001786TEST_F(FormatTest, IgnoresIf0Contents) {
1787 EXPECT_EQ("#if 0\n"
1788 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
1789 "#endif\n"
1790 "void f() {}",
1791 format("#if 0\n"
1792 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
1793 "#endif\n"
1794 "void f( ) { }"));
1795 EXPECT_EQ("#if false\n"
1796 "void f( ) { }\n"
1797 "#endif\n"
1798 "void g() {}\n",
1799 format("#if false\n"
1800 "void f( ) { }\n"
1801 "#endif\n"
1802 "void g( ) { }\n"));
1803 EXPECT_EQ("enum E {\n"
1804 " One,\n"
1805 " Two,\n"
1806 "#if 0\n"
1807 "Three,\n"
1808 " Four,\n"
1809 "#endif\n"
1810 " Five\n"
1811 "};",
1812 format("enum E {\n"
1813 " One,Two,\n"
1814 "#if 0\n"
1815 "Three,\n"
1816 " Four,\n"
1817 "#endif\n"
1818 " Five};"));
1819 EXPECT_EQ("enum F {\n"
1820 " One,\n"
1821 "#if 1\n"
1822 " Two,\n"
1823 "#if 0\n"
1824 "Three,\n"
1825 " Four,\n"
1826 "#endif\n"
1827 " Five\n"
1828 "#endif\n"
1829 "};",
1830 format("enum F {\n"
1831 "One,\n"
1832 "#if 1\n"
1833 "Two,\n"
1834 "#if 0\n"
1835 "Three,\n"
1836 " Four,\n"
1837 "#endif\n"
1838 "Five\n"
1839 "#endif\n"
1840 "};"));
1841 EXPECT_EQ("enum G {\n"
1842 " One,\n"
1843 "#if 0\n"
1844 "Two,\n"
1845 "#else\n"
1846 " Three,\n"
1847 "#endif\n"
1848 " Four\n"
1849 "};",
1850 format("enum G {\n"
1851 "One,\n"
1852 "#if 0\n"
1853 "Two,\n"
1854 "#else\n"
1855 "Three,\n"
1856 "#endif\n"
1857 "Four\n"
1858 "};"));
1859 EXPECT_EQ("enum H {\n"
1860 " One,\n"
1861 "#if 0\n"
1862 "#ifdef Q\n"
1863 "Two,\n"
1864 "#else\n"
1865 "Three,\n"
1866 "#endif\n"
1867 "#endif\n"
1868 " Four\n"
1869 "};",
1870 format("enum H {\n"
1871 "One,\n"
1872 "#if 0\n"
1873 "#ifdef Q\n"
1874 "Two,\n"
1875 "#else\n"
1876 "Three,\n"
1877 "#endif\n"
1878 "#endif\n"
1879 "Four\n"
1880 "};"));
1881 EXPECT_EQ("enum I {\n"
1882 " One,\n"
1883 "#if /* test */ 0 || 1\n"
1884 "Two,\n"
1885 "Three,\n"
1886 "#endif\n"
1887 " Four\n"
1888 "};",
1889 format("enum I {\n"
1890 "One,\n"
1891 "#if /* test */ 0 || 1\n"
1892 "Two,\n"
1893 "Three,\n"
1894 "#endif\n"
1895 "Four\n"
1896 "};"));
1897 EXPECT_EQ("enum J {\n"
1898 " One,\n"
1899 "#if 0\n"
1900 "#if 0\n"
1901 "Two,\n"
1902 "#else\n"
1903 "Three,\n"
1904 "#endif\n"
1905 "Four,\n"
1906 "#endif\n"
1907 " Five\n"
1908 "};",
1909 format("enum J {\n"
1910 "One,\n"
1911 "#if 0\n"
1912 "#if 0\n"
1913 "Two,\n"
1914 "#else\n"
1915 "Three,\n"
1916 "#endif\n"
1917 "Four,\n"
1918 "#endif\n"
1919 "Five\n"
1920 "};"));
Alexander Kornienkof2e02122013-05-24 18:24:24 +00001921}
1922
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001923//===----------------------------------------------------------------------===//
1924// Tests for classes, namespaces, etc.
1925//===----------------------------------------------------------------------===//
1926
1927TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001928 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001929}
1930
1931TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1932 verifyFormat("class A {\n"
1933 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00001934 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001935 "protected:\n"
1936 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001937 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001938 "};");
1939 verifyGoogleFormat("class A {\n"
1940 " public:\n"
1941 " protected:\n"
1942 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001943 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001944 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00001945 verifyFormat("class A {\n"
1946 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001947 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00001948 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001949 " void f2() {}\n"
1950 "protected slots:\n"
1951 " void f3() {}\n"
1952 "protected Q_SLOTS:\n"
1953 " void f4() {}\n"
1954 "private slots:\n"
1955 " void f5() {}\n"
1956 "private Q_SLOTS:\n"
1957 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00001958 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001959 " void g1();\n"
1960 "Q_SIGNALS:\n"
1961 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00001962 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00001963
1964 // Don't interpret 'signals' the wrong way.
1965 verifyFormat("signals.set();");
1966 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00001967 verifyFormat("{\n"
1968 " signals.set(); // This needs indentation.\n"
1969 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00001970 verifyFormat("void f() {\n"
1971 "label:\n"
1972 " signals.baz();\n"
1973 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001974}
1975
Alexander Kornienkofd433362013-03-27 17:08:02 +00001976TEST_F(FormatTest, SeparatesLogicalBlocks) {
1977 EXPECT_EQ("class A {\n"
1978 "public:\n"
1979 " void f();\n"
1980 "\n"
1981 "private:\n"
1982 " void g() {}\n"
1983 " // test\n"
1984 "protected:\n"
1985 " int h;\n"
1986 "};",
1987 format("class A {\n"
1988 "public:\n"
1989 "void f();\n"
1990 "private:\n"
1991 "void g() {}\n"
1992 "// test\n"
1993 "protected:\n"
1994 "int h;\n"
1995 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00001996 EXPECT_EQ("class A {\n"
1997 "protected:\n"
1998 "public:\n"
1999 " void f();\n"
2000 "};",
2001 format("class A {\n"
2002 "protected:\n"
2003 "\n"
2004 "public:\n"
2005 "\n"
2006 " void f();\n"
2007 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00002008
2009 // Even ensure proper spacing inside macros.
2010 EXPECT_EQ("#define B \\\n"
2011 " class A { \\\n"
2012 " protected: \\\n"
2013 " public: \\\n"
2014 " void f(); \\\n"
2015 " };",
2016 format("#define B \\\n"
2017 " class A { \\\n"
2018 " protected: \\\n"
2019 " \\\n"
2020 " public: \\\n"
2021 " \\\n"
2022 " void f(); \\\n"
2023 " };",
2024 getGoogleStyle()));
2025 // But don't remove empty lines after macros ending in access specifiers.
2026 EXPECT_EQ("#define A private:\n"
2027 "\n"
2028 "int i;",
2029 format("#define A private:\n"
2030 "\n"
2031 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00002032}
2033
Daniel Jasper83193602013-04-05 17:22:09 +00002034TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002035 verifyFormat("class A : public B {};");
2036 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002037
2038 verifyFormat(
2039 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002040 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00002041 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
2042 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002043 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002044 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002045 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002046 verifyFormat("class AAAAAAAAAAAA : public B,\n"
2047 " public C,\n"
2048 " public D,\n"
2049 " public E,\n"
2050 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002051 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00002052
2053 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002054 " ReallyReallyLongClassName {\n"
2055 " int i;\n"
2056 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00002057 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00002058 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
2059 " aaaaaaaaaaaaaaaa> {};");
2060 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
2061 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
2062 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00002063 verifyFormat("template <class R, class C>\n"
2064 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
2065 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00002066 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00002067}
2068
Manuel Klimek28cacc72013-01-07 18:10:23 +00002069TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002070 verifyFormat("class A {\n} a, b;");
2071 verifyFormat("struct A {\n} a, b;");
2072 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00002073}
2074
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002075TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002076 verifyFormat("enum {\n"
2077 " Zero,\n"
2078 " One = 1,\n"
2079 " Two = One + 1,\n"
2080 " Three = (One + Two),\n"
2081 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2082 " Five = (One, Two, Three, Four, 5)\n"
2083 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002084 verifyGoogleFormat("enum {\n"
2085 " Zero,\n"
2086 " One = 1,\n"
2087 " Two = One + 1,\n"
2088 " Three = (One + Two),\n"
2089 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2090 " Five = (One, Two, Three, Four, 5)\n"
2091 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002092 verifyFormat("enum Enum {};");
2093 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002094 verifyFormat("enum X E {} d;");
2095 verifyFormat("enum __attribute__((...)) E {} d;");
2096 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00002097 verifyFormat("enum {\n"
2098 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002099 "};",
2100 getLLVMStyleWithColumns(30));
2101
2102 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00002103 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002104
2105 EXPECT_EQ("enum KeepEmptyLines {\n"
2106 " ONE,\n"
2107 "\n"
2108 " TWO,\n"
2109 "\n"
2110 " THREE\n"
2111 "}",
2112 format("enum KeepEmptyLines {\n"
2113 " ONE,\n"
2114 "\n"
2115 " TWO,\n"
2116 "\n"
2117 "\n"
2118 " THREE\n"
2119 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00002120 verifyFormat("enum E { // comment\n"
2121 " ONE,\n"
2122 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00002123 "};\n"
2124 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002125 // Not enums.
2126 verifyFormat("enum X f() {\n"
2127 " a();\n"
2128 " return 42;\n"
2129 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00002130 verifyFormat("enum X Type::f() {\n"
2131 " a();\n"
2132 " return 42;\n"
2133 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002134 verifyFormat("enum ::X f() {\n"
2135 " a();\n"
2136 " return 42;\n"
2137 "}");
2138 verifyFormat("enum ns::X f() {\n"
2139 " a();\n"
2140 " return 42;\n"
2141 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002142}
2143
Daniel Jasperb7150872013-08-30 10:10:19 +00002144TEST_F(FormatTest, FormatsEnumsWithErrors) {
2145 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002146 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002147 " Two = 1;\n"
2148 "};");
2149 verifyFormat("namespace n {\n"
2150 "enum Type {\n"
2151 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002152 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002153 " int i;\n"
2154 "}\n"
2155 "void g() {}");
2156}
2157
Daniel Jasper2b41a822013-08-20 12:42:50 +00002158TEST_F(FormatTest, FormatsEnumStruct) {
2159 verifyFormat("enum struct {\n"
2160 " Zero,\n"
2161 " One = 1,\n"
2162 " Two = One + 1,\n"
2163 " Three = (One + Two),\n"
2164 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2165 " Five = (One, Two, Three, Four, 5)\n"
2166 "};");
2167 verifyFormat("enum struct Enum {};");
2168 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002169 verifyFormat("enum struct X E {} d;");
2170 verifyFormat("enum struct __attribute__((...)) E {} d;");
2171 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002172 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
2173}
2174
2175TEST_F(FormatTest, FormatsEnumClass) {
2176 verifyFormat("enum class {\n"
2177 " Zero,\n"
2178 " One = 1,\n"
2179 " Two = One + 1,\n"
2180 " Three = (One + Two),\n"
2181 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2182 " Five = (One, Two, Three, Four, 5)\n"
2183 "};");
2184 verifyFormat("enum class Enum {};");
2185 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002186 verifyFormat("enum class X E {} d;");
2187 verifyFormat("enum class __attribute__((...)) E {} d;");
2188 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002189 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
2190}
2191
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002192TEST_F(FormatTest, FormatsEnumTypes) {
2193 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002194 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002195 " B\n"
2196 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00002197 verifyFormat("enum X : int { A, B };");
2198 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002199}
2200
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002201TEST_F(FormatTest, FormatsNSEnums) {
2202 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
2203 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
2204 " // Information about someDecentlyLongValue.\n"
2205 " someDecentlyLongValue,\n"
2206 " // Information about anotherDecentlyLongValue.\n"
2207 " anotherDecentlyLongValue,\n"
2208 " // Information about aThirdDecentlyLongValue.\n"
2209 " aThirdDecentlyLongValue\n"
2210 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00002211 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
2212 " a = 1,\n"
2213 " b = 2,\n"
2214 " c = 3,\n"
2215 "};");
2216 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
2217 " a = 1,\n"
2218 " b = 2,\n"
2219 " c = 3,\n"
2220 "};");
2221 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
2222 " a = 1,\n"
2223 " b = 2,\n"
2224 " c = 3,\n"
2225 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002226}
2227
Nico Weber7769a902013-01-14 05:49:49 +00002228TEST_F(FormatTest, FormatsBitfields) {
2229 verifyFormat("struct Bitfields {\n"
2230 " unsigned sClass : 8;\n"
2231 " unsigned ValueKind : 2;\n"
2232 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00002233 verifyFormat("struct A {\n"
2234 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
2235 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
2236 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00002237 verifyFormat("struct MyStruct {\n"
2238 " uchar data;\n"
2239 " uchar : 8;\n"
2240 " uchar : 8;\n"
2241 " uchar other;\n"
2242 "};");
Nico Weber7769a902013-01-14 05:49:49 +00002243}
2244
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002245TEST_F(FormatTest, FormatsNamespaces) {
2246 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002247 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002248 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002249 "}");
2250 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002251 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002252 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002253 "}");
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002254 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002255 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002256 "void f() { f(); }\n"
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002257 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002258 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002259 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002260 "void f() { f(); }");
Manuel Klimek046b9302013-02-06 16:08:09 +00002261
2262 // This code is more common than we thought; if we
2263 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002264 // its own line, which is undesirable.
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002265 verifyFormat("namespace {};");
Manuel Klimek046b9302013-02-06 16:08:09 +00002266 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002267 "class A {};\n"
Manuel Klimek046b9302013-02-06 16:08:09 +00002268 "};");
Daniel Jasper251b3c92013-07-01 11:22:57 +00002269
2270 verifyFormat("namespace {\n"
2271 "int SomeVariable = 0; // comment\n"
2272 "} // namespace");
2273 EXPECT_EQ("#ifndef HEADER_GUARD\n"
2274 "#define HEADER_GUARD\n"
2275 "namespace my_namespace {\n"
2276 "int i;\n"
2277 "} // my_namespace\n"
2278 "#endif // HEADER_GUARD",
2279 format("#ifndef HEADER_GUARD\n"
2280 " #define HEADER_GUARD\n"
2281 " namespace my_namespace {\n"
2282 "int i;\n"
2283 "} // my_namespace\n"
2284 "#endif // HEADER_GUARD"));
Daniel Jasper65ee3472013-07-31 23:16:02 +00002285
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00002286 EXPECT_EQ("namespace A::B {\n"
2287 "class C {};\n"
2288 "}",
2289 format("namespace A::B {\n"
2290 "class C {};\n"
2291 "}"));
2292
Daniel Jasper65ee3472013-07-31 23:16:02 +00002293 FormatStyle Style = getLLVMStyle();
2294 Style.NamespaceIndentation = FormatStyle::NI_All;
2295 EXPECT_EQ("namespace out {\n"
2296 " int i;\n"
2297 " namespace in {\n"
2298 " int i;\n"
2299 " } // namespace\n"
2300 "} // namespace",
2301 format("namespace out {\n"
2302 "int i;\n"
2303 "namespace in {\n"
2304 "int i;\n"
2305 "} // namespace\n"
2306 "} // namespace",
2307 Style));
2308
2309 Style.NamespaceIndentation = FormatStyle::NI_Inner;
2310 EXPECT_EQ("namespace out {\n"
2311 "int i;\n"
2312 "namespace in {\n"
2313 " int i;\n"
2314 "} // namespace\n"
2315 "} // namespace",
2316 format("namespace out {\n"
2317 "int i;\n"
2318 "namespace in {\n"
2319 "int i;\n"
2320 "} // namespace\n"
2321 "} // namespace",
2322 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002323}
2324
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002325TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00002326
Daniel Jasper40aacf42013-03-14 13:45:21 +00002327TEST_F(FormatTest, FormatsInlineASM) {
2328 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00002329 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00002330 verifyFormat(
2331 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2332 " \"cpuid\\n\\t\"\n"
2333 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00002334 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00002335 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00002336 EXPECT_EQ(
2337 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002338 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002339 " mov edx,[that] // vtable in edx\n"
2340 " mov eax,methodIndex\n"
2341 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002342 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002343 "}",
2344 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2345 " __asm {\n"
2346 " mov edx,[that] // vtable in edx\n"
2347 " mov eax,methodIndex\n"
2348 " call [edx][eax*4] // stdcall\n"
2349 " }\n"
2350 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00002351 EXPECT_EQ("_asm {\n"
2352 " xor eax, eax;\n"
2353 " cpuid;\n"
2354 "}",
2355 format("_asm {\n"
2356 " xor eax, eax;\n"
2357 " cpuid;\n"
2358 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00002359 verifyFormat("void function() {\n"
2360 " // comment\n"
2361 " asm(\"\");\n"
2362 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00002363 EXPECT_EQ("__asm {\n"
2364 "}\n"
2365 "int i;",
2366 format("__asm {\n"
2367 "}\n"
2368 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00002369}
2370
Nico Weberd5650bd2013-01-07 16:36:17 +00002371TEST_F(FormatTest, FormatTryCatch) {
2372 verifyFormat("try {\n"
2373 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002374 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002375 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002376 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002377 " exit(42);\n"
2378 "}");
2379
2380 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00002381 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002382 " return 5;\n"
2383 "}");
2384 verifyFormat("class A {\n"
2385 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002386 " A() try : a(0) {\n"
2387 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002388 " throw;\n"
2389 " }\n"
2390 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00002391
2392 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002393 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00002394}
2395
Nico Weberfac23712015-02-04 15:26:27 +00002396TEST_F(FormatTest, FormatSEHTryCatch) {
2397 verifyFormat("__try {\n"
2398 " int a = b * c;\n"
2399 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2400 " // Do nothing.\n"
2401 "}");
2402
2403 verifyFormat("__try {\n"
2404 " int a = b * c;\n"
2405 "} __finally {\n"
2406 " // Do nothing.\n"
2407 "}");
2408
2409 verifyFormat("DEBUG({\n"
2410 " __try {\n"
2411 " } __finally {\n"
2412 " }\n"
2413 "});\n");
2414}
2415
Daniel Jasper04a71a42014-05-08 11:58:24 +00002416TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2417 verifyFormat("try {\n"
2418 " f();\n"
2419 "} catch {\n"
2420 " g();\n"
2421 "}");
2422 verifyFormat("try {\n"
2423 " f();\n"
2424 "} catch (A a) MACRO(x) {\n"
2425 " g();\n"
2426 "} catch (B b) MACRO(x) {\n"
2427 " g();\n"
2428 "}");
2429}
2430
2431TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2432 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00002433 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2434 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00002435 Style.BreakBeforeBraces = BraceStyle;
2436 verifyFormat("try {\n"
2437 " // something\n"
2438 "} catch (...) {\n"
2439 " // something\n"
2440 "}",
2441 Style);
2442 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00002443 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2444 verifyFormat("try {\n"
2445 " // something\n"
2446 "}\n"
2447 "catch (...) {\n"
2448 " // something\n"
2449 "}",
2450 Style);
Nico Weberfac23712015-02-04 15:26:27 +00002451 verifyFormat("__try {\n"
2452 " // something\n"
2453 "}\n"
2454 "__finally {\n"
2455 " // something\n"
2456 "}",
2457 Style);
Nico Weber33381f52015-02-07 01:57:32 +00002458 verifyFormat("@try {\n"
2459 " // something\n"
2460 "}\n"
2461 "@finally {\n"
2462 " // something\n"
2463 "}",
2464 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00002465 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2466 verifyFormat("try\n"
2467 "{\n"
2468 " // something\n"
2469 "}\n"
2470 "catch (...)\n"
2471 "{\n"
2472 " // something\n"
2473 "}",
2474 Style);
2475 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
2476 verifyFormat("try\n"
2477 " {\n"
2478 " // something\n"
2479 " }\n"
2480 "catch (...)\n"
2481 " {\n"
2482 " // something\n"
2483 " }",
2484 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00002485 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2486 Style.BraceWrapping.BeforeCatch = true;
2487 verifyFormat("try {\n"
2488 " // something\n"
2489 "}\n"
2490 "catch (...) {\n"
2491 " // something\n"
2492 "}",
2493 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00002494}
2495
Daniel Jaspere25509f2012-12-17 11:29:41 +00002496TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002497 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00002498
Daniel Jaspera44991332015-04-29 13:06:49 +00002499 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
2500 " 100000000, "
2501 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00002502
Daniel Jasper473c62c2013-05-17 09:35:01 +00002503 // Here, everything other than the "}" would fit on a line.
2504 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002505 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002506 EXPECT_EQ("S s = {a,\n"
2507 "\n"
2508 " b};",
2509 format("S s = {\n"
2510 " a,\n"
2511 "\n"
2512 " b\n"
2513 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00002514
2515 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
2516 // line. However, the formatting looks a bit off and this probably doesn't
2517 // happen often in practice.
2518 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002519 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00002520 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00002521}
2522
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002523TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002524 verifyFormat("const struct A a = {.a = 1, .b = 2};");
2525 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
2526 " .bbbbbbbbbb = 2,\n"
2527 " .cccccccccc = 3,\n"
2528 " .dddddddddd = 4,\n"
2529 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002530 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002531 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
2532 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
2533 " .ccccccccccccccccccccccccccc = 3,\n"
2534 " .ddddddddddddddddddddddddddd = 4,\n"
2535 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002536
2537 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
2538}
2539
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002540TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002541 verifyFormat("static A x = {{{}}};\n");
2542 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2543 " {init1, init2, init3, init4}}};",
2544 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00002545
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002546 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002547 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2548 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2549 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2550 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00002551 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002552 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2553 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2554 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00002555 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2556 " {rect.fRight - rect.fLeft, rect.fBottom - "
2557 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002558
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002559 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00002560 "SomeArrayOfSomeType a = {\n"
2561 " {{1, 2, 3},\n"
2562 " {1, 2, 3},\n"
2563 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
2564 " 333333333333333333333333333333},\n"
2565 " {1, 2, 3},\n"
2566 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00002567 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00002568 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002569 " {{1, 2, 3}},\n"
2570 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002571 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2572 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002573 " {{1, 2, 3}},\n"
2574 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002575
Daniel Jaspera44991332015-04-29 13:06:49 +00002576 verifyFormat("struct {\n"
2577 " unsigned bit;\n"
2578 " const char *const name;\n"
2579 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2580 " {kOsWin, \"Windows\"},\n"
2581 " {kOsLinux, \"Linux\"},\n"
2582 " {kOsCrOS, \"Chrome OS\"}};");
2583 verifyFormat("struct {\n"
2584 " unsigned bit;\n"
2585 " const char *const name;\n"
2586 "} kBitsToOs[] = {\n"
2587 " {kOsMac, \"Mac\"},\n"
2588 " {kOsWin, \"Windows\"},\n"
2589 " {kOsLinux, \"Linux\"},\n"
2590 " {kOsCrOS, \"Chrome OS\"},\n"
2591 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002592}
2593
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002594TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2595 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2596 " \\\n"
2597 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2598}
2599
Daniel Jasperda16db32013-01-07 10:48:50 +00002600TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002601 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2602 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00002603
2604 // Do break defaulted and deleted functions.
2605 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2606 " default;",
2607 getLLVMStyleWithColumns(40));
2608 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2609 " delete;",
2610 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002611}
2612
2613TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2614 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2615 getLLVMStyleWithColumns(40));
2616 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2617 getLLVMStyleWithColumns(40));
2618 EXPECT_EQ("#define Q \\\n"
2619 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
2620 " \"aaaaaaaa.cpp\"",
2621 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2622 getLLVMStyleWithColumns(40)));
2623}
2624
2625TEST_F(FormatTest, UnderstandsLinePPDirective) {
2626 EXPECT_EQ("# 123 \"A string literal\"",
2627 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00002628}
2629
Manuel Klimek591b5802013-01-31 15:58:48 +00002630TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00002631 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00002632 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002633}
2634
2635TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2636 EXPECT_EQ("#line 42 \"test\"\n",
2637 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002638 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
2639 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002640}
2641
2642TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2643 EXPECT_EQ("#line 42 \"test\"",
2644 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002645 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002646}
2647
Daniel Jasper877615c2013-10-11 19:45:02 +00002648TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2649 verifyFormat("#define A \\x20");
2650 verifyFormat("#define A \\ x20");
2651 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
2652 verifyFormat("#define A ''");
2653 verifyFormat("#define A ''qqq");
2654 verifyFormat("#define A `qqq");
2655 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00002656 EXPECT_EQ("const char *c = STRINGIFY(\n"
2657 "\\na : b);",
2658 format("const char * c = STRINGIFY(\n"
2659 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00002660
2661 verifyFormat("a\r\\");
2662 verifyFormat("a\v\\");
2663 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00002664}
2665
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002666TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002667 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2668 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002669 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002670 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00002671 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00002672
2673 verifyFormat("#define A A\n#define A A");
2674 verifyFormat("#define A(X) A\n#define A A");
2675
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002676 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2677 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002678}
2679
2680TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002681 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002682 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002683 "#define A( \\\n"
2684 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002685 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002686 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002687 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002688 " #include \"a.h\"\n"
2689 "#define A(A,\\\n"
2690 " B)\n"
2691 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002692 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002693 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002694}
2695
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002696TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002697
2698TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2699 EXPECT_EQ("#define A \\\n"
2700 " c; \\\n"
2701 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002702 "f;",
2703 format("#define A c; e;\n"
2704 "f;",
2705 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002706}
2707
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002708TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002709
Manuel Klimek1abf7892013-01-04 23:34:14 +00002710TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00002711 EXPECT_EQ("int x,\n"
2712 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002713 " y;",
2714 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002715}
2716
Manuel Klimek09e07972013-01-05 21:34:55 +00002717TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00002718 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00002719 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00002720 verifyFormat("#define A \\\n"
2721 " { \\\n"
2722 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002723 " }",
2724 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00002725
2726 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002727 " void function##X()",
2728 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002729
2730 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002731 " void a##b##c()",
2732 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002733
Daniel Jasper39825ea2013-01-14 15:40:57 +00002734 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00002735}
2736
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002737TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00002738 EXPECT_EQ("#define A (x)", format("#define A (x)"));
2739 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002740}
2741
Manuel Klimek0c137952013-02-11 12:33:24 +00002742TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2743 EXPECT_EQ("#define A b;", format("#define A \\\n"
2744 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002745 " b;",
2746 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002747 EXPECT_EQ("#define A \\\n"
2748 " \\\n"
2749 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002750 " b;",
2751 format("#define A \\\n"
2752 " \\\n"
2753 " a; \\\n"
2754 " b;",
2755 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002756 EXPECT_EQ("#define A \\\n"
2757 " a; \\\n"
2758 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002759 " b;",
2760 format("#define A \\\n"
2761 " a; \\\n"
2762 " \\\n"
2763 " b;",
2764 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002765}
2766
Daniel Jasper00475962013-02-19 17:14:38 +00002767TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002768 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00002769 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00002770 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00002771 " case 2\n",
2772 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00002773 verifyFormat("#define MACRO(a) \\\n"
2774 " if (a) \\\n"
2775 " f(); \\\n"
2776 " else \\\n"
2777 " g()",
2778 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00002779 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002780 verifyIncompleteFormat("#define STR(x) #x\n"
2781 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00002782 verifyFormat("#pragma omp threadprivate( \\\n"
2783 " y)), // expected-warning",
2784 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00002785 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00002786 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002787 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00002788 "#define b \\\n"
2789 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002790 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002791 "a",
2792 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00002793 verifyFormat("#define A \\\n"
2794 " { \\\n"
2795 " {\n"
2796 "#define B \\\n"
2797 " } \\\n"
2798 " }",
2799 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00002800 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00002801 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00002802 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00002803 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00002804}
2805
Daniel Jasper40e19212013-05-29 13:16:10 +00002806TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2807 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2808 EXPECT_EQ("class A : public QObject {\n"
2809 " Q_OBJECT\n"
2810 "\n"
2811 " A() {}\n"
2812 "};",
2813 format("class A : public QObject {\n"
2814 " Q_OBJECT\n"
2815 "\n"
2816 " A() {\n}\n"
2817 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00002818 EXPECT_EQ("MACRO\n"
2819 "/*static*/ int i;",
2820 format("MACRO\n"
2821 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00002822 EXPECT_EQ("SOME_MACRO\n"
2823 "namespace {\n"
2824 "void f();\n"
2825 "}",
2826 format("SOME_MACRO\n"
2827 " namespace {\n"
2828 "void f( );\n"
2829 "}"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002830 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00002831 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2832 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002833 // Only if everything is upper case.
2834 EXPECT_EQ("class A : public QObject {\n"
2835 " Q_Object A() {}\n"
2836 "};",
2837 format("class A : public QObject {\n"
2838 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00002839 " A() {\n}\n"
2840 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00002841
2842 // Only if the next line can actually start an unwrapped line.
2843 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2844 format("SOME_WEIRD_LOG_MACRO\n"
2845 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00002846
2847 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00002848 "(n, buffers))\n",
2849 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00002850}
2851
Alexander Kornienkode644272013-04-08 22:16:06 +00002852TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2853 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2854 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2855 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002856 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00002857 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2858 "int *createScopDetectionPass() { return 0; }",
2859 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2860 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2861 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2862 " class X {};\n"
2863 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2864 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002865 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2866 // braces, so that inner block is indented one level more.
2867 EXPECT_EQ("int q() {\n"
2868 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2869 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2870 " IPC_END_MESSAGE_MAP()\n"
2871 "}",
2872 format("int q() {\n"
2873 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2874 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2875 " IPC_END_MESSAGE_MAP()\n"
2876 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00002877
Daniel Jasper352dae12014-01-03 11:50:46 +00002878 // Same inside macros.
2879 EXPECT_EQ("#define LIST(L) \\\n"
2880 " L(A) \\\n"
2881 " L(B) \\\n"
2882 " L(C)",
2883 format("#define LIST(L) \\\n"
2884 " L(A) \\\n"
2885 " L(B) \\\n"
2886 " L(C)",
2887 getGoogleStyle()));
2888
Daniel Jasper545c6522013-09-17 09:26:07 +00002889 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002890 EXPECT_EQ("int q() {\n"
2891 " f(x);\n"
2892 " f(x) {}\n"
2893 " f(x)->g();\n"
2894 " f(x)->*g();\n"
2895 " f(x).g();\n"
2896 " f(x) = x;\n"
2897 " f(x) += x;\n"
2898 " f(x) -= x;\n"
2899 " f(x) *= x;\n"
2900 " f(x) /= x;\n"
2901 " f(x) %= x;\n"
2902 " f(x) &= x;\n"
2903 " f(x) |= x;\n"
2904 " f(x) ^= x;\n"
2905 " f(x) >>= x;\n"
2906 " f(x) <<= x;\n"
2907 " f(x)[y].z();\n"
2908 " LOG(INFO) << x;\n"
2909 " ifstream(x) >> x;\n"
2910 "}\n",
2911 format("int q() {\n"
2912 " f(x)\n;\n"
2913 " f(x)\n {}\n"
2914 " f(x)\n->g();\n"
2915 " f(x)\n->*g();\n"
2916 " f(x)\n.g();\n"
2917 " f(x)\n = x;\n"
2918 " f(x)\n += x;\n"
2919 " f(x)\n -= x;\n"
2920 " f(x)\n *= x;\n"
2921 " f(x)\n /= x;\n"
2922 " f(x)\n %= x;\n"
2923 " f(x)\n &= x;\n"
2924 " f(x)\n |= x;\n"
2925 " f(x)\n ^= x;\n"
2926 " f(x)\n >>= x;\n"
2927 " f(x)\n <<= x;\n"
2928 " f(x)\n[y].z();\n"
2929 " LOG(INFO)\n << x;\n"
2930 " ifstream(x)\n >> x;\n"
2931 "}\n"));
2932 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002933 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002934 " if (1) {\n"
2935 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002936 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002937 " while (1) {\n"
2938 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002939 " F(x)\n"
2940 " G(x);\n"
2941 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002942 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002943 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002944 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002945 " }\n"
2946 "}\n",
2947 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002948 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002949 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002950 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002951 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002952 "F(x)\n"
2953 "G(x);\n"
2954 "F(x)\n"
2955 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002956 "}\n"));
2957 EXPECT_EQ("class A {\n"
2958 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002959 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002960 " A(X x)\n" // FIXME: function-level try blocks are broken.
2961 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002962 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002963 " }\n"
2964 "};",
2965 format("class A {\n"
2966 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002967 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002968 " A(X x)\n"
2969 " try : t(0) {} catch (...) {}\n"
2970 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00002971 EXPECT_EQ("class SomeClass {\n"
2972 "public:\n"
2973 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2974 "};",
2975 format("class SomeClass {\n"
2976 "public:\n"
2977 " SomeClass()\n"
2978 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2979 "};"));
2980 EXPECT_EQ("class SomeClass {\n"
2981 "public:\n"
2982 " SomeClass()\n"
2983 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2984 "};",
2985 format("class SomeClass {\n"
2986 "public:\n"
2987 " SomeClass()\n"
2988 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2989 "};",
2990 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00002991
2992 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00002993}
2994
Manuel Klimek4fe43002013-05-22 12:51:29 +00002995TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2996 verifyFormat("#define A \\\n"
2997 " f({ \\\n"
2998 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00002999 " });",
3000 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00003001}
3002
Manuel Klimekef2cfb12013-01-05 22:14:16 +00003003TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
3004 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
3005}
3006
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003007TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003008 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003009}
3010
Manuel Klimek1058d982013-01-06 20:07:31 +00003011TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3012 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
3013 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3014 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
3015 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3016}
Manuel Klimek1abf7892013-01-04 23:34:14 +00003017
Daniel Jaspere2408e32015-05-06 11:16:43 +00003018TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003019 EXPECT_EQ(
3020 "#define A \\\n int i; \\\n int j;",
3021 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003022 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00003023 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003024 EXPECT_EQ("/* \\ \\ \\\n*/", format("\\\n/* \\ \\ \\\n*/"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00003025 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003026}
3027
Alexander Kornienko00691cf2015-01-12 13:11:12 +00003028TEST_F(FormatTest, DontCrashOnBlockComments) {
3029 EXPECT_EQ(
3030 "int xxxxxxxxx; /* "
3031 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\n"
3032 "zzzzzz\n"
3033 "0*/",
3034 format("int xxxxxxxxx; /* "
3035 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzz\n"
3036 "0*/"));
3037}
3038
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003039TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3040 verifyFormat("#define A \\\n"
3041 " int v( \\\n"
3042 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003043 " int i;",
3044 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003045}
3046
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003047TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00003048 EXPECT_EQ(
3049 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3050 " \\\n"
3051 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3052 "\n"
3053 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3054 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3055 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
3056 "\\\n"
3057 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3058 " \n"
3059 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3060 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003061}
3062
Manuel Klimek52b15152013-01-09 15:25:02 +00003063TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3064 EXPECT_EQ("int\n"
3065 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003066 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003067 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003068 verifyFormat("functionCallTo(\n"
3069 " someOtherFunction(\n"
3070 " withSomeParameters, whichInSequence,\n"
3071 " areLongerThanALine(andAnotherCall,\n"
3072 "#define A B\n"
3073 " withMoreParamters,\n"
3074 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003075 " andMoreParameters),\n"
3076 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003077 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00003078 verifyFormat("Foo::Foo()\n"
3079 "#ifdef BAR\n"
3080 " : baz(0)\n"
3081 "#endif\n"
3082 "{\n"
3083 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00003084 verifyFormat("void f() {\n"
3085 " if (true)\n"
3086 "#ifdef A\n"
3087 " f(42);\n"
3088 " x();\n"
3089 "#else\n"
3090 " g();\n"
3091 " x();\n"
3092 "#endif\n"
3093 "}");
3094 verifyFormat("void f(param1, param2,\n"
3095 " param3,\n"
3096 "#ifdef A\n"
3097 " param4(param5,\n"
3098 "#ifdef A1\n"
3099 " param6,\n"
3100 "#ifdef A2\n"
3101 " param7),\n"
3102 "#else\n"
3103 " param8),\n"
3104 " param9,\n"
3105 "#endif\n"
3106 " param10,\n"
3107 "#endif\n"
3108 " param11)\n"
3109 "#else\n"
3110 " param12)\n"
3111 "#endif\n"
3112 "{\n"
3113 " x();\n"
3114 "}",
3115 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00003116 verifyFormat("#if 1\n"
3117 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003118 verifyFormat("#if 1\n"
3119 "#endif\n"
3120 "#if 1\n"
3121 "#else\n"
3122 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00003123 verifyFormat("DEBUG({\n"
3124 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3125 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3126 "});\n"
3127 "#if a\n"
3128 "#else\n"
3129 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00003130
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003131 verifyIncompleteFormat("void f(\n"
3132 "#if A\n"
3133 " );\n"
3134 "#else\n"
3135 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00003136}
3137
Manuel Klimek14bd9172014-01-29 08:49:02 +00003138TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3139 verifyFormat("#endif\n"
3140 "#if B");
3141}
3142
Manuel Klimek88033d72013-10-21 08:11:15 +00003143TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3144 FormatStyle SingleLine = getLLVMStyle();
3145 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00003146 verifyFormat("#if 0\n"
3147 "#elif 1\n"
3148 "#endif\n"
3149 "void foo() {\n"
3150 " if (test) foo2();\n"
3151 "}",
3152 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00003153}
3154
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003155TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00003156 verifyFormat("functionCall({ int i; });");
3157 verifyFormat("functionCall({\n"
3158 " int i;\n"
3159 " int j;\n"
3160 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00003161 verifyFormat("functionCall(\n"
3162 " {\n"
3163 " int i;\n"
3164 " int j;\n"
3165 " },\n"
3166 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00003167 verifyFormat("functionA(functionB({\n"
3168 " int i;\n"
3169 " int j;\n"
3170 " }),\n"
3171 " aaaa, bbbb, cccc);");
3172 verifyFormat("functionCall(\n"
3173 " {\n"
3174 " int i;\n"
3175 " int j;\n"
3176 " },\n"
3177 " aaaa, bbbb, // comment\n"
3178 " cccc);");
3179 verifyFormat("functionA(functionB({\n"
3180 " int i;\n"
3181 " int j;\n"
3182 " }),\n"
3183 " aaaa, bbbb, // comment\n"
3184 " cccc);");
3185 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3186 verifyFormat("functionCall(aaaa, bbbb, {\n"
3187 " int i;\n"
3188 " int j;\n"
3189 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00003190 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00003191 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00003192 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003193 " int i; // break\n"
3194 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00003195 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3196 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003197 verifyFormat("DEBUG({\n"
3198 " if (a)\n"
3199 " f();\n"
3200 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003201}
3202
3203TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003204 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003205 "int i;",
3206 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003207}
3208
3209TEST_F(FormatTest, LayoutNestedBlocks) {
3210 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3211 " struct s {\n"
3212 " int i;\n"
3213 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003214 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003215 " for (int i = 0; i < 10; ++i)\n"
3216 " return;\n"
3217 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003218 verifyFormat("call(parameter, {\n"
3219 " something();\n"
3220 " // Comment using all columns.\n"
3221 " somethingelse();\n"
3222 "});",
3223 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00003224 verifyFormat("DEBUG( //\n"
3225 " { f(); }, a);");
3226 verifyFormat("DEBUG( //\n"
3227 " {\n"
3228 " f(); //\n"
3229 " },\n"
3230 " a);");
3231
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003232 EXPECT_EQ("call(parameter, {\n"
3233 " something();\n"
3234 " // Comment too\n"
3235 " // looooooooooong.\n"
3236 " somethingElse();\n"
3237 "});",
3238 format("call(parameter, {\n"
3239 " something();\n"
3240 " // Comment too looooooooooong.\n"
3241 " somethingElse();\n"
3242 "});",
3243 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003244 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003245 EXPECT_EQ("DEBUG({ // comment\n"
3246 " int i;\n"
3247 "});",
3248 format("DEBUG({ // comment\n"
3249 "int i;\n"
3250 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003251 EXPECT_EQ("DEBUG({\n"
3252 " int i;\n"
3253 "\n"
3254 " // comment\n"
3255 " int j;\n"
3256 "});",
3257 format("DEBUG({\n"
3258 " int i;\n"
3259 "\n"
3260 " // comment\n"
3261 " int j;\n"
3262 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003263
3264 verifyFormat("DEBUG({\n"
3265 " if (a)\n"
3266 " return;\n"
3267 "});");
3268 verifyGoogleFormat("DEBUG({\n"
3269 " if (a) return;\n"
3270 "});");
3271 FormatStyle Style = getGoogleStyle();
3272 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003273 verifyFormat("Debug(aaaaa,\n"
3274 " {\n"
3275 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3276 " },\n"
3277 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003278 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003279
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003280 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3281
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003282 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003283}
3284
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003285TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3286 EXPECT_EQ("#define MACRO() \\\n"
3287 " Debug(aaa, /* force line break */ \\\n"
3288 " { \\\n"
3289 " int i; \\\n"
3290 " int j; \\\n"
3291 " })",
3292 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3293 " { int i; int j; })",
3294 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003295
3296 EXPECT_EQ("#define A \\\n"
3297 " [] { \\\n"
3298 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3299 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3300 " }",
3301 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3302 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3303 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003304}
3305
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003306TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3307 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003308 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003309 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003310}
3311
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003312TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3313 FormatStyle Style = getLLVMStyle();
3314 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3315 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3316 verifyFormat("FOO_BEGIN\n"
3317 " FOO_ENTRY\n"
3318 "FOO_END", Style);
3319 verifyFormat("FOO_BEGIN\n"
3320 " NESTED_FOO_BEGIN\n"
3321 " NESTED_FOO_ENTRY\n"
3322 " NESTED_FOO_END\n"
3323 "FOO_END", Style);
3324 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3325 " int x;\n"
3326 " x = 1;\n"
3327 "FOO_END(Baz)", Style);
3328}
3329
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003330//===----------------------------------------------------------------------===//
3331// Line break tests.
3332//===----------------------------------------------------------------------===//
3333
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003334TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003335 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003336 "void f() {\n"
3337 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3338 " parameter, parameter, parameter)),\n"
3339 " SecondLongCall(parameter));\n"
3340 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003341 verifyFormat(
3342 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3343 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3344 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3345 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3346 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003347 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3348 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3349 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3350 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003351 verifyFormat(
3352 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3353 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3354 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3355 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003356 verifyFormat("int a = bbbb && ccc &&\n"
3357 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003358 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003359 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003360}
3361
Daniel Jasperd69fc772013-05-08 14:12:04 +00003362TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3363 verifyFormat(
3364 "bool aaaaaaa =\n"
3365 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3366 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003367 verifyFormat(
3368 "bool aaaaaaa =\n"
3369 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3370 " bbbbbbbb();");
3371
Daniel Jasperd69fc772013-05-08 14:12:04 +00003372 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3373 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3374 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003375 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3376 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3377 " ccccccccc == ddddddddddd;");
3378 verifyFormat(
3379 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3380 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3381 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003382
3383 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3384 " aaaaaa) &&\n"
3385 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003386 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3387 " aaaaaa) >>\n"
3388 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003389 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003390 " SourceMgr.getSpellingColumnNumber(\n"
3391 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3392 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003393
Daniel Jasper68d888c2013-06-03 08:42:05 +00003394 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3395 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3396 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003397 verifyFormat("b = a &&\n"
3398 " // Comment\n"
3399 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003400
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003401 // If the LHS of a comparison is not a binary expression itself, the
3402 // additional linebreak confuses many people.
3403 verifyFormat(
3404 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3405 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3406 "}");
3407 verifyFormat(
3408 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3409 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3410 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003411 verifyFormat(
3412 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3413 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3414 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003415 // Even explicit parentheses stress the precedence enough to make the
3416 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003417 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3418 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3419 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003420 // This cases is borderline, but with the indentation it is still readable.
3421 verifyFormat(
3422 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3423 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3424 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3425 "}",
3426 getLLVMStyleWithColumns(75));
3427
3428 // If the LHS is a binary expression, we should still use the additional break
3429 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003430 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3431 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3432 " 5) {\n"
3433 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003434
Daniel Jasper571f1af2013-05-14 20:39:56 +00003435 FormatStyle OnePerLine = getLLVMStyle();
3436 OnePerLine.BinPackParameters = false;
3437 verifyFormat(
3438 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3439 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3440 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3441 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00003442
3443 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3444 " .aaa(aaaaaaaaaaaaa) *\n"
3445 " aaaaaaa +\n"
3446 " aaaaaaa;",
3447 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00003448}
3449
Daniel Jasper6bee6822013-04-08 20:33:42 +00003450TEST_F(FormatTest, ExpressionIndentation) {
3451 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3452 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3453 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3454 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3455 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3456 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3457 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3458 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3459 " ccccccccccccccccccccccccccccccccccccccccc;");
3460 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3461 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3462 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3463 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3464 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3465 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3466 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3467 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3468 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3469 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3470 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3471 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003472 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00003473 "} else if (aaaaa &&\n"
3474 " bbbbb > // break\n"
3475 " ccccc) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003476 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00003477
3478 // Presence of a trailing comment used to change indentation of b.
3479 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3480 " b;\n"
3481 "return aaaaaaaaaaaaaaaaaaa +\n"
3482 " b; //",
3483 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003484}
3485
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003486TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3487 // Not sure what the best system is here. Like this, the LHS can be found
3488 // immediately above an operator (everything with the same or a higher
3489 // indent). The RHS is aligned right of the operator and so compasses
3490 // everything until something with the same indent as the operator is found.
3491 // FIXME: Is this a good system?
3492 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003493 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003494 verifyFormat(
3495 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003496 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3497 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3498 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3499 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3500 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003501 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003502 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3503 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003504 Style);
3505 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003506 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3507 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003508 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3509 Style);
3510 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003511 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3512 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003513 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3514 Style);
3515 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3516 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003517 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3518 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003519 Style);
3520 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003521 "} else if (aaaaa\n"
3522 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003523 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003524 "}",
3525 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003526 verifyFormat("return (a)\n"
3527 " // comment\n"
3528 " + b;",
3529 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003530 verifyFormat(
3531 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3532 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3533 " + cc;",
3534 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003535
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003536 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3537 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3538 Style);
3539
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003540 // Forced by comments.
3541 verifyFormat(
3542 "unsigned ContentSize =\n"
3543 " sizeof(int16_t) // DWARF ARange version number\n"
3544 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3545 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
3546 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00003547
3548 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3549 " == boost::fusion::at_c<1>(iiii).second;",
3550 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00003551
3552 Style.ColumnLimit = 60;
3553 verifyFormat("zzzzzzzzzz\n"
3554 " = bbbbbbbbbbbbbbbbb\n"
3555 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3556 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003557}
3558
Daniel Jasper3219e432014-12-02 13:24:51 +00003559TEST_F(FormatTest, NoOperandAlignment) {
3560 FormatStyle Style = getLLVMStyle();
3561 Style.AlignOperands = false;
3562 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00003563 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3564 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3565 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3566 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3567 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3568 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3569 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3570 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3571 " > ccccccccccccccccccccccccccccccccccccccccc;",
3572 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003573
3574 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3575 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3576 " + cc;",
3577 Style);
3578 verifyFormat("int a = aa\n"
3579 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3580 " * cccccccccccccccccccccccccccccccccccc;",
3581 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00003582
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003583 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00003584 verifyFormat("return (a > b\n"
3585 " // comment1\n"
3586 " // comment2\n"
3587 " || c);",
3588 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003589}
3590
Daniel Jasperac043c92014-09-15 11:11:00 +00003591TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3592 FormatStyle Style = getLLVMStyle();
3593 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3594 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3595 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00003596 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3597 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00003598}
3599
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003600TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003601 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003602 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3603 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003604 verifyFormat("Constructor()\n"
3605 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003606 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003607 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003608 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003609 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003610
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003611 verifyFormat("template <typename T>\n"
3612 "Constructor() : Initializer(FitsOnTheLine) {}",
3613 getLLVMStyleWithColumns(45));
3614
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003615 verifyFormat(
3616 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003617 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003618
3619 verifyFormat(
3620 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003621 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003622 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003623 verifyFormat(
3624 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003625 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003626 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003627 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3628 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3629 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003630
3631 verifyFormat("Constructor()\n"
3632 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3633 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3634 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003635 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003636
Daniel Jasper65585ed2013-01-28 13:31:35 +00003637 verifyFormat("Constructor()\n"
3638 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003639 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003640
Daniel Jasper62e68172013-02-25 15:59:54 +00003641 verifyFormat("Constructor(int Parameter = 0)\n"
3642 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3643 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003644 verifyFormat("Constructor()\n"
3645 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3646 "}",
3647 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003648 verifyFormat("Constructor()\n"
3649 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3650 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003651
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003652 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003653 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003654 verifyFormat("Constructor()\n"
3655 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3656 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3657 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003658
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003659 FormatStyle OnePerLine = getLLVMStyle();
3660 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003661 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003662 verifyFormat("SomeClass::Constructor()\n"
3663 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3664 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003665 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003666 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003667 verifyFormat("SomeClass::Constructor()\n"
3668 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3669 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003670 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003671 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003672 verifyFormat("MyClass::MyClass(int var)\n"
3673 " : some_var_(var), // 4 space indent\n"
3674 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003675 "}",
3676 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003677 verifyFormat("Constructor()\n"
3678 " : aaaaa(aaaaaa),\n"
3679 " aaaaa(aaaaaa),\n"
3680 " aaaaa(aaaaaa),\n"
3681 " aaaaa(aaaaaa),\n"
3682 " aaaaa(aaaaaa) {}",
3683 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003684 verifyFormat("Constructor()\n"
3685 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3686 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3687 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003688 OnePerLine.BinPackParameters = false;
3689 verifyFormat(
3690 "Constructor()\n"
3691 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3692 " aaaaaaaaaaa().aaa(),\n"
3693 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3694 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003695 OnePerLine.ColumnLimit = 60;
3696 verifyFormat("Constructor()\n"
3697 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3698 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3699 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003700
3701 EXPECT_EQ("Constructor()\n"
3702 " : // Comment forcing unwanted break.\n"
3703 " aaaa(aaaa) {}",
3704 format("Constructor() :\n"
3705 " // Comment forcing unwanted break.\n"
3706 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003707}
3708
3709TEST_F(FormatTest, MemoizationTests) {
3710 // This breaks if the memoization lookup does not take \c Indent and
3711 // \c LastSpace into account.
3712 verifyFormat(
3713 "extern CFRunLoopTimerRef\n"
3714 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3715 " CFTimeInterval interval, CFOptionFlags flags,\n"
3716 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003717 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003718
3719 // Deep nesting somewhat works around our memoization.
3720 verifyFormat(
3721 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3722 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3723 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3724 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3725 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3726 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003727 verifyFormat(
3728 "aaaaa(\n"
3729 " aaaaa,\n"
3730 " aaaaa(\n"
3731 " aaaaa,\n"
3732 " aaaaa(\n"
3733 " aaaaa,\n"
3734 " aaaaa(\n"
3735 " aaaaa,\n"
3736 " aaaaa(\n"
3737 " aaaaa,\n"
3738 " aaaaa(\n"
3739 " aaaaa,\n"
3740 " aaaaa(\n"
3741 " aaaaa,\n"
3742 " aaaaa(\n"
3743 " aaaaa,\n"
3744 " aaaaa(\n"
3745 " aaaaa,\n"
3746 " aaaaa(\n"
3747 " aaaaa,\n"
3748 " aaaaa(\n"
3749 " aaaaa,\n"
3750 " aaaaa(\n"
3751 " aaaaa,\n"
3752 " aaaaa))))))))))));",
3753 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003754 verifyFormat(
3755 "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"
3756 " a),\n"
3757 " a),\n"
3758 " a),\n"
3759 " a),\n"
3760 " a),\n"
3761 " a),\n"
3762 " a),\n"
3763 " a),\n"
3764 " a),\n"
3765 " a),\n"
3766 " a),\n"
3767 " a),\n"
3768 " a),\n"
3769 " a),\n"
3770 " a),\n"
3771 " a),\n"
3772 " a)",
3773 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003774
3775 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003776 FormatStyle OnePerLine = getLLVMStyle();
3777 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003778 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003779 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003780 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003781 for (unsigned i = 0, e = 80; i != e; ++i) {
3782 input += " a,\n";
3783 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003784 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003785 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003786}
3787
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003788TEST_F(FormatTest, BreaksAsHighAsPossible) {
3789 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003790 "void f() {\n"
3791 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3792 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3793 " f();\n"
3794 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00003795 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003796 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003797}
3798
Daniel Jasper6728fc12013-04-11 14:29:13 +00003799TEST_F(FormatTest, BreaksFunctionDeclarations) {
3800 // Principially, we break function declarations in a certain order:
3801 // 1) break amongst arguments.
3802 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3803 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003804 verifyFormat("template <class TemplateIt>\n"
3805 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3806 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00003807
3808 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00003809 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003810 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003811 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003812 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003813
3814 // 3) break after (.
3815 verifyFormat(
3816 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00003817 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3818 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003819
3820 // 4) break before after nested name specifiers.
3821 verifyFormat(
3822 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003823 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3824 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003825 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003826
3827 // However, there are exceptions, if a sufficient amount of lines can be
3828 // saved.
3829 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3830 // more adjusting.
3831 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3832 " Cccccccccccccc cccccccccc,\n"
3833 " Cccccccccccccc cccccccccc,\n"
3834 " Cccccccccccccc cccccccccc,\n"
3835 " Cccccccccccccc cccccccccc);");
3836 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003837 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003838 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3839 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3840 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003841 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003842 verifyFormat(
3843 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3844 " Cccccccccccccc cccccccccc,\n"
3845 " Cccccccccccccc cccccccccc,\n"
3846 " Cccccccccccccc cccccccccc,\n"
3847 " Cccccccccccccc cccccccccc,\n"
3848 " Cccccccccccccc cccccccccc,\n"
3849 " Cccccccccccccc cccccccccc);");
3850 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3851 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3852 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3853 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3854 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00003855
3856 // Break after multi-line parameters.
3857 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3858 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3859 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3860 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00003861 verifyFormat("void SomeLoooooooooooongFunction(\n"
3862 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3863 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3864 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003865
3866 // Treat overloaded operators like other functions.
3867 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3868 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00003869 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3870 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00003871 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3872 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3873 verifyGoogleFormat(
3874 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3875 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003876 verifyGoogleFormat(
3877 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3878 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00003879 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3880 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3881 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3882 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00003883 verifyGoogleFormat(
3884 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3885 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3886 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00003887 verifyGoogleFormat(
3888 "template <typename T>\n"
3889 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3890 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3891 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00003892
3893 FormatStyle Style = getLLVMStyle();
3894 Style.PointerAlignment = FormatStyle::PAS_Left;
3895 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3896 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3897 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003898 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3899 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3900 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00003901}
3902
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003903TEST_F(FormatTest, TrailingReturnType) {
3904 verifyFormat("auto foo() -> int;\n");
3905 verifyFormat("struct S {\n"
3906 " auto bar() const -> int;\n"
3907 "};");
3908 verifyFormat("template <size_t Order, typename T>\n"
3909 "auto load_img(const std::string &filename)\n"
3910 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00003911 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3912 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00003913 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00003914 verifyFormat("template <typename T>\n"
3915 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3916 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00003917
3918 // Not trailing return types.
3919 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003920}
3921
Daniel Jasper5be31f72013-05-21 09:16:31 +00003922TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003923 // Avoid breaking before trailing 'const' or other trailing annotations, if
3924 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00003925 FormatStyle Style = getGoogleStyle();
3926 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00003927 verifyFormat("void someLongFunction(\n"
3928 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00003929 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00003930 verifyFormat("LoooooongReturnType\n"
3931 "someLoooooooongFunction() const {}",
3932 getLLVMStyleWithColumns(47));
3933 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3934 " const {}",
3935 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003936 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3937 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3938 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3939 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3940 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3941 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00003942 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3943 " aaaaaaaaaaa aaaaa) const override;");
3944 verifyGoogleFormat(
3945 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3946 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003947
Daniel Jasper5550de62014-02-17 07:57:46 +00003948 // Even if the first parameter has to be wrapped.
3949 verifyFormat("void someLongFunction(\n"
3950 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003951 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00003952 verifyFormat("void someLongFunction(\n"
3953 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003954 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00003955 verifyFormat("void someLongFunction(\n"
3956 " int someLongParameter) override {}",
3957 Style);
3958 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003959 " int someLongParameter) OVERRIDE {}",
3960 Style);
3961 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003962 " int someLongParameter) final {}",
3963 Style);
3964 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003965 " int someLongParameter) FINAL {}",
3966 Style);
3967 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003968 " int parameter) const override {}",
3969 Style);
3970
Daniel Jaspere3f907f2014-06-02 09:52:08 +00003971 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3972 verifyFormat("void someLongFunction(\n"
3973 " int someLongParameter) const\n"
3974 "{\n"
3975 "}",
3976 Style);
3977
Daniel Jasper5550de62014-02-17 07:57:46 +00003978 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003979 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
3980 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3981 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00003982
3983 // Breaking before function-like trailing annotations is fine to keep them
3984 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00003985 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3986 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3987 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3988 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3989 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3990 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00003991 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
3992 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00003993 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003994
3995 verifyFormat(
3996 "void aaaaaaaaaaaaaaaaaa()\n"
3997 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
3998 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
3999 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4000 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004001 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004002 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004003 " GUARDED_BY(aaaaaaaaaaaa);");
4004 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004005 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004006 " GUARDED_BY(aaaaaaaaaaaa);");
4007 verifyGoogleFormat(
4008 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4009 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004010 verifyGoogleFormat(
4011 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4012 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004013}
4014
Daniel Jasperf090f032015-05-18 09:47:22 +00004015TEST_F(FormatTest, FunctionAnnotations) {
4016 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004017 "int OldFunction(const string &parameter) {}");
4018 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004019 "string OldFunction(const string &parameter) {}");
4020 verifyFormat("template <typename T>\n"
4021 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4022 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004023
4024 // Not function annotations.
4025 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4026 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004027 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4028 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004029 verifyFormat("MACRO(abc).function() // wrap\n"
4030 " << abc;");
4031 verifyFormat("MACRO(abc)->function() // wrap\n"
4032 " << abc;");
4033 verifyFormat("MACRO(abc)::function() // wrap\n"
4034 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004035}
4036
Daniel Jasperf7935112012-12-03 18:12:45 +00004037TEST_F(FormatTest, BreaksDesireably) {
4038 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4039 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004040 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004041 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4042 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4043 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004044
4045 verifyFormat(
4046 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004047 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004048
4049 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4050 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4051 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004052
4053 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004054 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4055 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4056 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004057 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4058 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004059
4060 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4061 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4062
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004063 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004064 "void f() {\n"
4065 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4066 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4067 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004068 verifyFormat(
4069 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4070 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4071 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004072 "aaaaaa(aaa,\n"
4073 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4074 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jaspera44991332015-04-29 13:06:49 +00004075 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4076 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4077 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004078
Daniel Jasper739b85f2015-06-29 10:42:59 +00004079 // Indent consistently independent of call expression and unary operator.
4080 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4081 " dddddddddddddddddddddddddddddd));");
4082 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4083 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004084 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004085 " dddddddddddddddddddddddddddddd));");
4086
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004087 // This test case breaks on an incorrect memoization, i.e. an optimization not
4088 // taking into account the StopAt value.
4089 verifyFormat(
4090 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004091 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4092 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4093 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004094
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004095 verifyFormat("{\n {\n {\n"
4096 " Annotation.SpaceRequiredBefore =\n"
4097 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4098 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4099 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004100
4101 // Break on an outer level if there was a break on an inner level.
4102 EXPECT_EQ("f(g(h(a, // comment\n"
4103 " b, c),\n"
4104 " d, e),\n"
4105 " x, y);",
4106 format("f(g(h(a, // comment\n"
4107 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004108
4109 // Prefer breaking similar line breaks.
4110 verifyFormat(
4111 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4112 " NSTrackingMouseEnteredAndExited |\n"
4113 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004114}
4115
Daniel Jasper18210d72014-10-09 09:52:05 +00004116TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4117 FormatStyle NoBinPacking = getGoogleStyle();
4118 NoBinPacking.BinPackParameters = false;
4119 NoBinPacking.BinPackArguments = true;
4120 verifyFormat("void f() {\n"
4121 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4122 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4123 "}",
4124 NoBinPacking);
4125 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4126 " int aaaaaaaaaaaaaaaaaaaa,\n"
4127 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4128 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004129
Daniel Jasper00693b082016-01-09 15:56:47 +00004130 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4131 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4132 " vector<int> bbbbbbbbbbbbbbb);",
4133 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004134 // FIXME: This behavior difference is probably not wanted. However, currently
4135 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4136 // template arguments from BreakBeforeParameter being set because of the
4137 // one-per-line formatting.
4138 verifyFormat(
4139 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4140 " aaaaaaaaaa> aaaaaaaaaa);",
4141 NoBinPacking);
4142 verifyFormat(
4143 "void fffffffffff(\n"
4144 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4145 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004146}
4147
Daniel Jasper9278eb92013-01-16 14:59:02 +00004148TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004149 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004150 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004151 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004152 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4153 " aaaaaaaaaaaaaaaaaaaa,\n"
4154 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4155 NoBinPacking);
4156 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4157 " aaaaaaaaaaaaa,\n"
4158 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4159 NoBinPacking);
4160 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004161 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4162 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4163 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4164 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004165 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4166 NoBinPacking);
4167 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4168 " .aaaaaaaaaaaaaaaaaa();",
4169 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004170 verifyFormat("void f() {\n"
4171 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4172 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4173 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004174 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004175
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004176 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004177 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4178 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004179 " aaaaaaaaaaaa);",
4180 NoBinPacking);
4181 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004182 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4183 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004184 " test);",
4185 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004186
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004187 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4188 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004189 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4190 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004191 NoBinPacking);
4192 verifyFormat("a(\"a\"\n"
4193 " \"a\",\n"
4194 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004195
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004196 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004197 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004198 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004199 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004200 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004201 verifyFormat(
4202 "void f() {\n"
4203 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4204 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004205 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004206 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004207 verifyFormat(
4208 "template <class SomeType, class SomeOtherType>\n"
4209 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4210 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004211}
4212
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004213TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4214 FormatStyle Style = getLLVMStyleWithColumns(15);
4215 Style.ExperimentalAutoDetectBinPacking = true;
4216 EXPECT_EQ("aaa(aaaa,\n"
4217 " aaaa,\n"
4218 " aaaa);\n"
4219 "aaa(aaaa,\n"
4220 " aaaa,\n"
4221 " aaaa);",
4222 format("aaa(aaaa,\n" // one-per-line
4223 " aaaa,\n"
4224 " aaaa );\n"
4225 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4226 Style));
4227 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4228 " aaaa);\n"
4229 "aaa(aaaa, aaaa,\n"
4230 " aaaa);",
4231 format("aaa(aaaa, aaaa,\n" // bin-packed
4232 " aaaa );\n"
4233 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4234 Style));
4235}
4236
Daniel Jasper04468962013-01-18 10:56:38 +00004237TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004238 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4239 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4240 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4241 " .StartsWith(\".init\", ORDER_INIT)\n"
4242 " .StartsWith(\".fini\", ORDER_FINI)\n"
4243 " .StartsWith(\".hash\", ORDER_HASH)\n"
4244 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004245
Daniel Jaspereb50c672013-02-15 20:33:06 +00004246 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004247 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004248 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004249 "aaaaaaa->aaaaaaa\n"
4250 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4251 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004252 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004253 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004254 "aaaaaaa->aaaaaaa\n"
4255 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4256 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4257 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004258 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004259 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004260 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004261 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4262 " aaaaaa->aaaaaaaaaaaa()\n"
4263 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004264 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004265 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004266 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004267 "void f() {\n"
4268 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004269 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004270 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004271 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004272 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004273 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004274 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004275 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004276 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004277 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004278 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004279 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004280
4281 verifyFormat(
4282 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4283 verifyFormat("aaaaaaaaaaaaaaa()\n"
4284 " .aaaaaaaaaaaaaaa()\n"
4285 " .aaaaaaaaaaaaaaa()\n"
4286 " .aaaaaaaaaaaaaaa()\n"
4287 " .aaaaaaaaaaaaaaa();");
4288 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4289 " .aaaaaaaaaaaaaaa()\n"
4290 " .aaaaaaaaaaaaaaa()\n"
4291 " .aaaaaaaaaaaaaaa();");
4292 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4293 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4294 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004295 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4296 " ->aaaaaaaaaaaaaae(0)\n"
4297 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004298
Daniel Jasper775954b2015-04-24 10:08:09 +00004299 // Don't linewrap after very short segments.
4300 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4301 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4302 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4303 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4304 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4305 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4306 verifyFormat("aaa()\n"
4307 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4308 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4309 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4310
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004311 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4312 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4313 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4314 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4315 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004316 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004317
Daniel Jaspera41aa532014-09-19 08:01:25 +00004318 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004319 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4320 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004321
4322 // Prefer not to create "hanging" indents.
4323 verifyFormat(
4324 "return !soooooooooooooome_map\n"
4325 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4326 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004327 verifyFormat(
4328 "return aaaaaaaaaaaaaaaa\n"
4329 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4330 " .aaaa(aaaaaaaaaaaaaa);");
4331 // No hanging indent here.
4332 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4333 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4334 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4335 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004336 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4337 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4338 getLLVMStyleWithColumns(60));
4339 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4340 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4341 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4342 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004343 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4344 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4345 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004346}
4347
Daniel Jasperde5c2072012-12-24 00:13:23 +00004348TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4349 verifyFormat(
4350 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004351 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004352 verifyFormat(
4353 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4354 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4355
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004356 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004357 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004358 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4359 " ccccccccccccccccccccccccc) {\n}");
4360
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004361 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004362 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004363 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4364 " ccccccccccccccccccccccccc) {\n}");
4365
Daniel Jasperde5c2072012-12-24 00:13:23 +00004366 verifyFormat(
4367 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004368 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004369 verifyFormat(
4370 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4371 " ccccccccccccccccccccccccc) {\n}");
4372
Daniel Jasper400adc62013-02-08 15:28:42 +00004373 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4374 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4375 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4376 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004377 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4378 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4379 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4380 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4381
Daniel Jasper400adc62013-02-08 15:28:42 +00004382 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4383 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4384 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004385 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4386 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4387 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004388}
4389
Daniel Jasper43b65482013-01-23 12:27:43 +00004390TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004391 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004392 "unsigned Cost =\n"
4393 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4394 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004395 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004396 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4397 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004398
4399 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004400 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4401 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004402 verifyFormat("unsigned OriginalStartColumn =\n"
4403 " SourceMgr.getSpellingColumnNumber(\n"
4404 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4405 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004406}
4407
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004408TEST_F(FormatTest, AlignsAfterAssignments) {
4409 verifyFormat(
4410 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004411 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004412 verifyFormat(
4413 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004414 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004415 verifyFormat(
4416 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004417 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004418 verifyFormat(
4419 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004420 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004421 verifyFormat(
4422 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4423 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4424 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004425}
4426
4427TEST_F(FormatTest, AlignsAfterReturn) {
4428 verifyFormat(
4429 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4430 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4431 verifyFormat(
4432 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4433 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004434 verifyFormat(
4435 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004436 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004437 verifyFormat(
4438 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004439 " aaaaaaaaaaaaaaaaaaaaaa());");
4440 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4441 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4442 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4443 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4444 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004445 verifyFormat("return\n"
4446 " // true if code is one of a or b.\n"
4447 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004448}
4449
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004450TEST_F(FormatTest, AlignsAfterOpenBracket) {
4451 verifyFormat(
4452 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4453 " aaaaaaaaa aaaaaaa) {}");
4454 verifyFormat(
4455 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4456 " aaaaaaaaaaa aaaaaaaaa);");
4457 verifyFormat(
4458 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4459 " aaaaaaaaaaaaaaaaaaaaa));");
4460 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004461 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004462 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4463 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4464 Style);
4465 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4466 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4467 Style);
4468 verifyFormat("SomeLongVariableName->someFunction(\n"
4469 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4470 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004471 verifyFormat(
4472 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4473 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4474 Style);
4475 verifyFormat(
4476 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4477 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4478 Style);
4479 verifyFormat(
4480 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4481 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4482 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004483
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004484 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4485 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4486 " b));",
4487 Style);
4488
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004489 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4490 Style.BinPackArguments = false;
4491 Style.BinPackParameters = false;
4492 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4493 " aaaaaaaaaaa aaaaaaaa,\n"
4494 " aaaaaaaaa aaaaaaa,\n"
4495 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4496 Style);
4497 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4498 " aaaaaaaaaaa aaaaaaaaa,\n"
4499 " aaaaaaaaaaa aaaaaaaaa,\n"
4500 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4501 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004502 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4503 " aaaaaaaaaaaaaaa,\n"
4504 " aaaaaaaaaaaaaaaaaaaaa,\n"
4505 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004506 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004507 verifyFormat(
4508 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4509 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4510 Style);
4511 verifyFormat(
4512 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4513 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4514 Style);
4515 verifyFormat(
4516 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4517 " aaaaaaaaaaaaaaaaaaaaa(\n"
4518 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4519 " aaaaaaaaaaaaaaaa);",
4520 Style);
4521 verifyFormat(
4522 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4523 " aaaaaaaaaaaaaaaaaaaaa(\n"
4524 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4525 " aaaaaaaaaaaaaaaa);",
4526 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004527}
4528
Daniel Jasper3219e432014-12-02 13:24:51 +00004529TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4530 FormatStyle Style = getLLVMStyleWithColumns(40);
4531 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4532 " bbbbbbbbbbbbbbbbbbbbbb);",
4533 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004534 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004535 Style.AlignOperands = false;
4536 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4537 " bbbbbbbbbbbbbbbbbbbbbb);",
4538 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004539 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004540 Style.AlignOperands = true;
4541 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4542 " bbbbbbbbbbbbbbbbbbbbbb);",
4543 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004544 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004545 Style.AlignOperands = false;
4546 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4547 " bbbbbbbbbbbbbbbbbbbbbb);",
4548 Style);
4549}
4550
Daniel Jasper399d24b2013-01-09 07:06:56 +00004551TEST_F(FormatTest, BreaksConditionalExpressions) {
4552 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004553 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
4554 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4555 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004556 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004557 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
4558 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4559 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004560 verifyFormat(
4561 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4562 " : aaaaaaaaaaaaa);");
4563 verifyFormat(
4564 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004565 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004566 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4567 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004568 verifyFormat(
4569 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4570 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4571 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004572 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4573 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4574 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4575 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4576 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4577 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4578 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4579 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4580 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4581 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4582 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4583 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004584 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4585 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4586 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4587 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4588 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004589 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4590 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4591 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004592 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4593 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4594 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4595 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004596 verifyFormat(
4597 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4598 " ? aaaaaaaaaaaaaaa\n"
4599 " : aaaaaaaaaaaaaaa;");
4600 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004601 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004602 " ? b\n"
4603 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004604 verifyFormat("return aaaa == bbbb\n"
4605 " // comment\n"
4606 " ? aaaa\n"
4607 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004608 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004609 " format(TheLine.First,\n"
4610 " IndentForLevel[TheLine.Level] >= 0\n"
4611 " ? IndentForLevel[TheLine.Level]\n"
4612 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004613 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004614 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004615 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4616 " ? aaaaaaaaaaaaaaa\n"
4617 " : bbbbbbbbbbbbbbb //\n"
4618 " ? ccccccccccccccc\n"
4619 " : ddddddddddddddd;");
4620 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4621 " ? aaaaaaaaaaaaaaa\n"
4622 " : (bbbbbbbbbbbbbbb //\n"
4623 " ? ccccccccccccccc\n"
4624 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004625 verifyFormat(
4626 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4627 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4628 " aaaaaaaaaaaaaaaaaaaaa +\n"
4629 " aaaaaaaaaaaaaaaaaaaaa\n"
4630 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004631 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004632 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4633 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4634 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004635
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004636 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004637 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004638 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004639 "void f() {\n"
4640 " g(aaa,\n"
4641 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4642 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4643 " ? aaaaaaaaaaaaaaa\n"
4644 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004645 "}",
4646 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004647 verifyFormat(
4648 "void f() {\n"
4649 " g(aaa,\n"
4650 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4651 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4652 " ?: aaaaaaaaaaaaaaa);\n"
4653 "}",
4654 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004655
4656 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4657 " // comment.\n"
4658 " ccccccccccccccccccccccccccccccccccccccc\n"
4659 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4660 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004661
4662 // Assignments in conditional expressions. Apparently not uncommon :-(.
4663 verifyFormat("return a != b\n"
4664 " // comment\n"
4665 " ? a = b\n"
4666 " : a = b;");
4667 verifyFormat("return a != b\n"
4668 " // comment\n"
4669 " ? a = a != b\n"
4670 " // comment\n"
4671 " ? a = b\n"
4672 " : a\n"
4673 " : a;\n");
4674 verifyFormat("return a != b\n"
4675 " // comment\n"
4676 " ? a\n"
4677 " : a = a != b\n"
4678 " // comment\n"
4679 " ? a = b\n"
4680 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004681}
4682
Daniel Jasper165b29e2013-11-08 00:57:11 +00004683TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4684 FormatStyle Style = getLLVMStyle();
4685 Style.BreakBeforeTernaryOperators = false;
4686 Style.ColumnLimit = 70;
4687 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004688 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
4689 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4690 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004691 Style);
4692 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004693 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
4694 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4695 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004696 Style);
4697 verifyFormat(
4698 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4699 " aaaaaaaaaaaaa);",
4700 Style);
4701 verifyFormat(
4702 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4703 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4704 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4705 " aaaaaaaaaaaaa);",
4706 Style);
4707 verifyFormat(
4708 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4709 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4710 " aaaaaaaaaaaaa);",
4711 Style);
4712 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4713 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4714 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4715 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4716 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4717 Style);
4718 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4719 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4720 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4721 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4722 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4723 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4724 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4725 Style);
4726 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4727 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4728 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4729 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4730 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4731 Style);
4732 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4733 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4734 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4735 Style);
4736 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004737 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004738 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4739 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4740 Style);
4741 verifyFormat(
4742 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4743 " aaaaaaaaaaaaaaa :\n"
4744 " aaaaaaaaaaaaaaa;",
4745 Style);
4746 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4747 " aaaaaaaaa ?\n"
4748 " b :\n"
4749 " c);",
4750 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00004751 verifyFormat("unsigned Indent =\n"
4752 " format(TheLine.First,\n"
4753 " IndentForLevel[TheLine.Level] >= 0 ?\n"
4754 " IndentForLevel[TheLine.Level] :\n"
4755 " TheLine * 2,\n"
4756 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4757 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004758 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4759 " aaaaaaaaaaaaaaa :\n"
4760 " bbbbbbbbbbbbbbb ? //\n"
4761 " ccccccccccccccc :\n"
4762 " ddddddddddddddd;",
4763 Style);
4764 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4765 " aaaaaaaaaaaaaaa :\n"
4766 " (bbbbbbbbbbbbbbb ? //\n"
4767 " ccccccccccccccc :\n"
4768 " ddddddddddddddd);",
4769 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00004770 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4771 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4772 " ccccccccccccccccccccccccccc;",
4773 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00004774 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4775 " aaaaa :\n"
4776 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
4777 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004778}
4779
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004780TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4781 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4782 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4783 verifyFormat("bool a = true, b = false;");
4784
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004785 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004786 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004787 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00004788 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004789 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00004790 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004791 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00004792 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00004793 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4794 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4795 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4796 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4797 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4798 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004799
Daniel Jasperbea1ab42015-03-01 18:55:26 +00004800 FormatStyle Style = getGoogleStyle();
4801 Style.PointerAlignment = FormatStyle::PAS_Left;
4802 Style.DerivePointerAlignment = false;
4803 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4804 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4805 " *b = bbbbbbbbbbbbbbbbbbb;",
4806 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004807 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4808 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4809 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00004810 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00004811 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004812}
4813
Nico Weber4a5030c2013-01-12 01:28:06 +00004814TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4815 verifyFormat("arr[foo ? bar : baz];");
4816 verifyFormat("f()[foo ? bar : baz];");
4817 verifyFormat("(a + b)[foo ? bar : baz];");
4818 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4819}
4820
Daniel Jasperf7935112012-12-03 18:12:45 +00004821TEST_F(FormatTest, AlignsStringLiterals) {
4822 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4823 " \"short literal\");");
4824 verifyFormat(
4825 "looooooooooooooooooooooooongFunction(\n"
4826 " \"short literal\"\n"
4827 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004828 verifyFormat("someFunction(\"Always break between multi-line\"\n"
4829 " \" string literals\",\n"
4830 " and, other, parameters);");
Daniel Jasper240527c2017-01-16 13:13:15 +00004831 EXPECT_EQ("fun +\n"
4832 " \"1243\" /* comment */\n"
4833 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004834 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00004835 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00004836 getLLVMStyleWithColumns(28)));
4837 EXPECT_EQ(
4838 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4839 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4840 " \"aaaaaaaaaaaaaaaa\";",
4841 format("aaaaaa ="
4842 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4843 "aaaaaaaaaaaaaaaaaaaaa\" "
4844 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper240527c2017-01-16 13:13:15 +00004845 verifyFormat("a = a +\n"
4846 " \"a\"\n"
4847 " \"a\"\n"
4848 " \"a\";");
4849 verifyFormat("f(\"a\",\n"
4850 " \"b\"\n"
4851 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00004852
4853 verifyFormat(
4854 "#define LL_FORMAT \"ll\"\n"
4855 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4856 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00004857
4858 verifyFormat("#define A(X) \\\n"
4859 " \"aaaaa\" #X \"bbbbbb\" \\\n"
4860 " \"ccccc\"",
4861 getLLVMStyleWithColumns(23));
4862 verifyFormat("#define A \"def\"\n"
4863 "f(\"abc\" A \"ghi\"\n"
4864 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004865
4866 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004867 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004868 verifyFormat("#define A(X) \\\n"
4869 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4870 " L\"ccccc\"",
4871 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00004872
4873 verifyFormat("f(@\"a\"\n"
4874 " @\"b\");");
4875 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00004876 " @\"b\"\n"
4877 " @\"c\";");
4878 verifyFormat("NSString s = @\"a\"\n"
4879 " \"b\"\n"
4880 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00004881}
4882
Zachary Turner448592e2015-12-18 22:20:15 +00004883TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004884 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004885 // No declarations or definitions should be moved to own line.
4886 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4887 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004888 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004889 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004890 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004891 "int f() { return 1; }\n"
4892 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004893 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00004894
4895 // All declarations and definitions should have the return type moved to its
4896 // own
4897 // line.
4898 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4899 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004900 " int\n"
4901 " f() {\n"
4902 " return 1;\n"
4903 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004904 " int\n"
4905 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004906 "};\n"
4907 "int\n"
4908 "f() {\n"
4909 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004910 "}\n"
4911 "int\n"
4912 "g();\n",
4913 Style);
4914
4915 // Top-level definitions, and no kinds of declarations should have the
4916 // return type moved to its own line.
4917 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4918 verifyFormat("class B {\n"
4919 " int f() { return 1; }\n"
4920 " int g();\n"
4921 "};\n"
4922 "int\n"
4923 "f() {\n"
4924 " return 1;\n"
4925 "}\n"
4926 "int g();\n",
4927 Style);
4928
4929 // Top-level definitions and declarations should have the return type moved
4930 // to its own line.
4931 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4932 verifyFormat("class C {\n"
4933 " int f() { return 1; }\n"
4934 " int g();\n"
4935 "};\n"
4936 "int\n"
4937 "f() {\n"
4938 " return 1;\n"
4939 "}\n"
4940 "int\n"
4941 "g();\n",
4942 Style);
4943
4944 // All definitions should have the return type moved to its own line, but no
4945 // kinds of declarations.
4946 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4947 verifyFormat("class D {\n"
4948 " int\n"
4949 " f() {\n"
4950 " return 1;\n"
4951 " }\n"
4952 " int g();\n"
4953 "};\n"
4954 "int\n"
4955 "f() {\n"
4956 " return 1;\n"
4957 "}\n"
4958 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004959 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004960 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004961 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004962 " return \"\";\n"
4963 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004964 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004965 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004966 verifyFormat("template <class T>\n"
4967 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004968 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004969 " return NULL;\n"
4970 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004971 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004972 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00004973 verifyFormat("class C {\n"
4974 " int\n"
4975 " operator+() {\n"
4976 " return 1;\n"
4977 " }\n"
4978 " int\n"
4979 " operator()() {\n"
4980 " return 1;\n"
4981 " }\n"
4982 "};\n",
4983 Style);
4984 verifyFormat("void\n"
4985 "A::operator()() {}\n"
4986 "void\n"
4987 "A::operator>>() {}\n"
4988 "void\n"
4989 "A::operator+() {}\n",
4990 Style);
4991 verifyFormat("void *operator new(std::size_t s);", // No break here.
4992 Style);
4993 verifyFormat("void *\n"
4994 "operator new(std::size_t s) {}",
4995 Style);
4996 verifyFormat("void *\n"
4997 "operator delete[](void *ptr) {}",
4998 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004999 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005000 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005001 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005002 "{\n"
5003 " return \"\";\n"
5004 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005005 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005006 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005007 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005008 "T *\n" // Problem here: no line break
5009 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005010 "{\n"
5011 " return NULL;\n"
5012 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005013 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005014 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005015}
5016
Alexander Kornienko58611712013-07-04 12:02:44 +00005017TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5018 FormatStyle NoBreak = getLLVMStyle();
5019 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5020 FormatStyle Break = getLLVMStyle();
5021 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005022 verifyFormat("aaaa = \"bbbb\"\n"
5023 " \"cccc\";",
5024 NoBreak);
5025 verifyFormat("aaaa =\n"
5026 " \"bbbb\"\n"
5027 " \"cccc\";",
5028 Break);
5029 verifyFormat("aaaa(\"bbbb\"\n"
5030 " \"cccc\");",
5031 NoBreak);
5032 verifyFormat("aaaa(\n"
5033 " \"bbbb\"\n"
5034 " \"cccc\");",
5035 Break);
Daniel Jasper240527c2017-01-16 13:13:15 +00005036 verifyFormat("aaaa(qqq,\n"
5037 " \"bbbb\"\n"
5038 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005039 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005040 verifyFormat("aaaa(qqq,\n"
5041 " \"bbbb\"\n"
5042 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005043 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005044 verifyFormat("aaaa(qqq,\n"
5045 " L\"bbbb\"\n"
5046 " L\"cccc\");",
5047 Break);
Daniel Jasper240527c2017-01-16 13:13:15 +00005048 verifyFormat("aaaaa(aaaaaa,\n"
5049 " aaaaaaa(\"aaaa\"\n"
5050 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005051 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005052 verifyFormat("string s = someFunction(\n"
5053 " \"abc\"\n"
5054 " \"abc\");",
5055 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005056
Daniel Jasper3251fff2014-06-10 06:27:23 +00005057 // As we break before unary operators, breaking right after them is bad.
5058 verifyFormat("string foo = abc ? \"x\"\n"
5059 " \"blah blah blah blah blah blah\"\n"
5060 " : \"y\";",
5061 Break);
5062
Daniel Jasperc834c702013-07-17 15:38:19 +00005063 // Don't break if there is no column gain.
5064 verifyFormat("f(\"aaaa\"\n"
5065 " \"bbbb\");",
5066 Break);
5067
5068 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005069 EXPECT_EQ("x = \"a\\\n"
5070 "b\\\n"
5071 "c\";",
5072 format("x = \"a\\\n"
5073 "b\\\n"
5074 "c\";",
5075 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005076 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005077 " \"a\\\n"
5078 "b\\\n"
5079 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005080 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005081 "b\\\n"
5082 "c\";",
5083 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005084
5085 // Exempt ObjC strings for now.
5086 EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005087 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005088 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005089 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005090 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005091
5092 Break.ColumnLimit = 0;
5093 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005094}
5095
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005096TEST_F(FormatTest, AlignsPipes) {
5097 verifyFormat(
5098 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5099 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5100 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5101 verifyFormat(
5102 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5103 " << aaaaaaaaaaaaaaaaaaaa;");
5104 verifyFormat(
5105 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5106 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5107 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005108 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5109 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5110 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005111 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5112 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5113 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5114 verifyFormat(
5115 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5116 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5117 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005118 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5119 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5120 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5121 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005122 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5123 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005124 verifyFormat(
5125 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5126 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005127
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005128 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5129 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005130 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5131 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5132 " aaaaaaaaaaaaaaaaaaaaa)\n"
5133 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005134 verifyFormat("LOG_IF(aaa == //\n"
5135 " bbb)\n"
5136 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005137
Daniel Jasper467ddb12013-08-12 12:58:05 +00005138 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005139 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5140 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005141 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5142 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5143 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005144 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5145 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005146 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5147 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5148 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5149 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5150 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5151 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5152 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005153
Daniel Jasperc238c872013-04-02 14:33:13 +00005154 verifyFormat(
5155 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5156 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005157
5158 // Incomplete string literal.
5159 EXPECT_EQ("llvm::errs() << \"\n"
5160 " << a;",
5161 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005162
5163 verifyFormat("void f() {\n"
5164 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5165 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5166 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005167
5168 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005169 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5170 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5171 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005172
5173 // Handle '\n'.
5174 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5175 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5176 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5177 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5178 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5179 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5180 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005181}
5182
Daniel Jasper7209bb92016-12-13 11:16:42 +00005183TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5184 verifyFormat("return out << \"somepacket = {\\n\"\n"
5185 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5186 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5187 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5188 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5189 " << \"}\";");
5190
5191 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5192 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5193 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5194 verifyFormat(
5195 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5196 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5197 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5198 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5199 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5200 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5201 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5202 verifyFormat(
5203 "void f() {\n"
5204 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5205 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5206 "}");
5207
5208 // Breaking before the first "<<" is generally not desirable.
5209 verifyFormat(
5210 "llvm::errs()\n"
5211 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5212 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5213 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5214 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5215 getLLVMStyleWithColumns(70));
5216 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5217 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5218 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5219 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5220 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5221 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5222 getLLVMStyleWithColumns(70));
5223
5224 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5225 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5226 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5227 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5228 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5229 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005230 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5231 " (aaaa + aaaa);",
5232 getLLVMStyleWithColumns(40));
5233 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5234 " (aaaaaaa + aaaaa));",
5235 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005236 verifyFormat(
5237 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5238 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5239 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005240}
5241
Daniel Jasperf7935112012-12-03 18:12:45 +00005242TEST_F(FormatTest, UnderstandsEquals) {
5243 verifyFormat(
5244 "aaaaaaaaaaaaaaaaa =\n"
5245 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5246 verifyFormat(
5247 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005248 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005249 verifyFormat(
5250 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005251 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005252 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005253 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5254 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005255
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005256 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5257 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005258}
5259
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005260TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005261 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5262 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005263
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005264 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5265 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005266
5267 verifyFormat(
5268 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5269 " Parameter2);");
5270
5271 verifyFormat(
5272 "ShortObject->shortFunction(\n"
5273 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5274 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5275
5276 verifyFormat("loooooooooooooongFunction(\n"
5277 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5278
5279 verifyFormat(
5280 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5281 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5282
Daniel Jasper687af3b2013-02-14 14:26:07 +00005283 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5284 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005285 verifyFormat("void f() {\n"
5286 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5287 " .Times(2)\n"
5288 " .WillRepeatedly(Return(SomeValue));\n"
5289 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005290 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5291 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005292 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005293 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5294 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005295 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005296 verifyFormat("void f() {\n"
5297 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5298 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5299 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005300 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5301 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5302 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5303 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5304 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005305 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5306 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5307 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5308 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5309 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005310
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005311 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005312 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005313 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005314 verifyFormat(
5315 "aaaaaaaaaaa->aaaaaaaaa(\n"
5316 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5317 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005318
5319 verifyFormat(
5320 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5321 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005322 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5323 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5324 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5325 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005326
Daniel Jasper9b334242013-03-15 14:57:30 +00005327 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005328 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5329 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005330
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005331 FormatStyle NoBinPacking = getLLVMStyle();
5332 NoBinPacking.BinPackParameters = false;
5333 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5334 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5335 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5336 " aaaaaaaaaaaaaaaaaaa,\n"
5337 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5338 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005339
5340 // If there is a subsequent call, change to hanging indentation.
5341 verifyFormat(
5342 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5343 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5344 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5345 verifyFormat(
5346 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5347 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005348 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5349 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5350 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5351 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5352 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5353 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005354}
5355
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005356TEST_F(FormatTest, WrapsTemplateDeclarations) {
5357 verifyFormat("template <typename T>\n"
5358 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005359 verifyFormat("template <typename T>\n"
5360 "// T should be one of {A, B}.\n"
5361 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005362 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005363 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005364 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005365 verifyFormat("template <typename T>\n"
5366 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5367 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005368 verifyFormat(
5369 "template <typename T>\n"
5370 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5371 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005372 verifyFormat(
5373 "template <typename T>\n"
5374 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5375 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5376 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005377 verifyFormat("template <typename T>\n"
5378 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005379 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005380 verifyFormat(
5381 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5382 " typename T4 = char>\n"
5383 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005384 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5385 " template <typename> class cccccccccccccccccccccc,\n"
5386 " typename ddddddddddddd>\n"
5387 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005388 verifyFormat(
5389 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5390 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005391
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005392 verifyFormat("void f() {\n"
5393 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5394 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5395 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005396
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005397 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005398 verifyFormat("template <typename T> void f();");
5399 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005400 verifyFormat(
5401 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5402 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5403 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5404 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5405 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5406 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5407 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5408 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005409 EXPECT_EQ("static_cast<A< //\n"
5410 " B> *>(\n"
5411 "\n"
5412 " );",
5413 format("static_cast<A<//\n"
5414 " B>*>(\n"
5415 "\n"
5416 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005417 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5418 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005419
5420 FormatStyle AlwaysBreak = getLLVMStyle();
5421 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5422 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5423 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5424 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5425 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5426 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5427 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5428 verifyFormat("template <template <typename> class Fooooooo,\n"
5429 " template <typename> class Baaaaaaar>\n"
5430 "struct C {};",
5431 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005432 verifyFormat("template <typename T> // T can be A, B or C.\n"
5433 "struct C {};",
5434 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005435 verifyFormat("template <enum E> class A {\n"
5436 "public:\n"
5437 " E *f();\n"
5438 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005439}
5440
Daniel Jasper45797022013-01-25 10:57:27 +00005441TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5442 verifyFormat(
5443 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5444 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5445 verifyFormat(
5446 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5447 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5448 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5449
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005450 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005451 verifyFormat(
5452 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5453 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005454 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005455
Daniel Jasper45797022013-01-25 10:57:27 +00005456 verifyFormat(
5457 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005458 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005459
5460 // Breaking at nested name specifiers is generally not desirable.
5461 verifyFormat(
5462 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5463 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005464
5465 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005466 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5467 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5468 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005469 " aaaaaaaaaaaaaaaaaaaaa);",
5470 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005471
5472 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5473 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5474 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005475}
5476
Daniel Jasperf7935112012-12-03 18:12:45 +00005477TEST_F(FormatTest, UnderstandsTemplateParameters) {
5478 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005479 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005480 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5481 verifyFormat("bool x = a < 1 || 2 > a;");
5482 verifyFormat("bool x = 5 < f<int>();");
5483 verifyFormat("bool x = f<int>() > 5;");
5484 verifyFormat("bool x = 5 < a<int>::x;");
5485 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5486 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5487
5488 verifyGoogleFormat("A<A<int>> a;");
5489 verifyGoogleFormat("A<A<A<int>>> a;");
5490 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005491 verifyGoogleFormat("A<A<int> > a;");
5492 verifyGoogleFormat("A<A<A<int> > > a;");
5493 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005494 verifyGoogleFormat("A<::A<int>> a;");
5495 verifyGoogleFormat("A<::A> a;");
5496 verifyGoogleFormat("A< ::A> a;");
5497 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005498 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5499 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005500 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5501 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005502 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5503 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005504
Nico Weber7533b4d2014-09-24 17:17:32 +00005505 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5506
Daniel Jasperf7935112012-12-03 18:12:45 +00005507 verifyFormat("test >> a >> b;");
5508 verifyFormat("test << a >> b;");
5509
5510 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005511 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005512 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005513 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5514 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005515 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005516 verifyFormat("f(a.operator()<A>());");
5517 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5518 " .template operator()<A>());",
5519 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005520
5521 // Not template parameters.
5522 verifyFormat("return a < b && c > d;");
5523 verifyFormat("void f() {\n"
5524 " while (a < b && c > d) {\n"
5525 " }\n"
5526 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005527 verifyFormat("template <typename... Types>\n"
5528 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005529
5530 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5531 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5532 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005533 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005534 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005535 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005536}
5537
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005538TEST_F(FormatTest, BitshiftOperatorWidth) {
5539 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5540 " bar */",
5541 format("int a=1<<2; /* foo\n"
5542 " bar */"));
5543
5544 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5545 " bar */",
5546 format("int b =256>>1 ; /* foo\n"
5547 " bar */"));
5548}
5549
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005550TEST_F(FormatTest, UnderstandsBinaryOperators) {
5551 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005552 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005553}
5554
5555TEST_F(FormatTest, UnderstandsPointersToMembers) {
5556 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005557 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005558 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005559 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005560 verifyFormat("void f() {\n"
5561 " (a->*f)();\n"
5562 " a->*x;\n"
5563 " (a.*f)();\n"
5564 " ((*a).*f)();\n"
5565 " a.*x;\n"
5566 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005567 verifyFormat("void f() {\n"
5568 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5569 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5570 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005571 verifyFormat(
5572 "(aaaaaaaaaa->*bbbbbbb)(\n"
5573 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005574 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005575 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005576 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005577}
5578
Daniel Jasper8dd40472012-12-21 09:41:31 +00005579TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005580 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005581 verifyFormat("f(-1, -2, -3);");
5582 verifyFormat("a[-1] = 5;");
5583 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005584 verifyFormat("if (i == -1) {\n}");
5585 verifyFormat("if (i != -1) {\n}");
5586 verifyFormat("if (i > -1) {\n}");
5587 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005588 verifyFormat("++(a->f());");
5589 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005590 verifyFormat("(a->f())++;");
5591 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005592 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005593
5594 verifyFormat("a-- > b;");
5595 verifyFormat("b ? -a : c;");
5596 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005597 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005598 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005599 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005600
5601 verifyFormat("return -1;");
5602 verifyFormat("switch (a) {\n"
5603 "case -1:\n"
5604 " break;\n"
5605 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005606 verifyFormat("#define X -1");
5607 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005608
Chandler Carruthf8b72662014-03-02 12:37:31 +00005609 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5610 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005611
5612 verifyFormat("int a = /* confusing comment */ -1;");
5613 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5614 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005615}
5616
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005617TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005618 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005619 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005620 "}");
5621 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005622 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005623 verifyFormat("*aaa = aaaaaaa( // break\n"
5624 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005625}
5626
Daniel Jasper8863ada2013-08-26 08:10:17 +00005627TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005628 verifyFormat("bool operator<();");
5629 verifyFormat("bool operator>();");
5630 verifyFormat("bool operator=();");
5631 verifyFormat("bool operator==();");
5632 verifyFormat("bool operator!=();");
5633 verifyFormat("int operator+();");
5634 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00005635 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005636 verifyFormat("bool operator();");
5637 verifyFormat("bool operator()();");
5638 verifyFormat("bool operator[]();");
5639 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005640 verifyFormat("operator int();");
5641 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005642 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005643 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005644 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005645 verifyFormat("void *operator new(std::size_t size);");
5646 verifyFormat("void *operator new[](std::size_t size);");
5647 verifyFormat("void operator delete(void *ptr);");
5648 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005649 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5650 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005651 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005652 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005653
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005654 verifyFormat(
5655 "ostream &operator<<(ostream &OutputStream,\n"
5656 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005657 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5658 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5659 " return left.group < right.group;\n"
5660 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005661 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005662 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005663
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005664 verifyGoogleFormat("operator void*();");
5665 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005666 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005667
5668 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005669 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5670 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005671}
5672
Daniel Jasper1c220482015-02-25 10:30:06 +00005673TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005674 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5675 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5676 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5677 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5678 verifyFormat("Deleted &operator=(const Deleted &) &;");
5679 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5680 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5681 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5682 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5683 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5684 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00005685 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005686 verifyFormat("template <typename T>\n"
5687 "void F(T) && = delete;",
5688 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005689
Daniel Jasperaf642c62015-08-25 13:40:51 +00005690 FormatStyle AlignLeft = getLLVMStyle();
5691 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005692 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005693 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5694 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5695 AlignLeft);
5696 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5697 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005698 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5699 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5700 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5701 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00005702 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005703
5704 FormatStyle Spaces = getLLVMStyle();
5705 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005706 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5707 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5708 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5709 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005710
5711 Spaces.SpacesInCStyleCastParentheses = false;
5712 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005713 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5714 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5715 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5716 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005717}
5718
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005719TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005720 verifyFormat("void f() {\n"
5721 " A *a = new A;\n"
5722 " A *a = new (placement) A;\n"
5723 " delete a;\n"
5724 " delete (A *)a;\n"
5725 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005726 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5727 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005728 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5729 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5730 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005731 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005732}
5733
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005734TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005735 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005736 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005737 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005738 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005739 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005740 verifyIndependentOfContext("int a = b * 10;");
5741 verifyIndependentOfContext("int a = 10 * b;");
5742 verifyIndependentOfContext("int a = b * c;");
5743 verifyIndependentOfContext("int a += b * c;");
5744 verifyIndependentOfContext("int a -= b * c;");
5745 verifyIndependentOfContext("int a *= b * c;");
5746 verifyIndependentOfContext("int a /= b * c;");
5747 verifyIndependentOfContext("int a = *b;");
5748 verifyIndependentOfContext("int a = *b * c;");
5749 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005750 verifyIndependentOfContext("int a = b * (10);");
5751 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005752 verifyIndependentOfContext("return 10 * b;");
5753 verifyIndependentOfContext("return *b * *c;");
5754 verifyIndependentOfContext("return a & ~b;");
5755 verifyIndependentOfContext("f(b ? *c : *d);");
5756 verifyIndependentOfContext("int a = b ? *c : *d;");
5757 verifyIndependentOfContext("*b = a;");
5758 verifyIndependentOfContext("a * ~b;");
5759 verifyIndependentOfContext("a * !b;");
5760 verifyIndependentOfContext("a * +b;");
5761 verifyIndependentOfContext("a * -b;");
5762 verifyIndependentOfContext("a * ++b;");
5763 verifyIndependentOfContext("a * --b;");
5764 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005765 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005766 verifyIndependentOfContext("f() * b;");
5767 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005768 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005769 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005770 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005771 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005772 verifyIndependentOfContext("return sizeof(int **);");
5773 verifyIndependentOfContext("return sizeof(int ******);");
5774 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005775 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005776 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005777 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005778 verifyGoogleFormat("return sizeof(int**);");
5779 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5780 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005781 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005782 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005783 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005784 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005785 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005786 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005787 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005788 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005789 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005790 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005791 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005792 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005793 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005794 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005795 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005796 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00005797 verifyFormat("void f(const MyOverride &override);");
5798 verifyFormat("void f(const MyFinal &final);");
5799 verifyIndependentOfContext("bool a = f() && override.f();");
5800 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00005801
Daniel Jasper5b49f472013-01-23 12:10:53 +00005802 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005803
Daniel Jasper5b49f472013-01-23 12:10:53 +00005804 verifyIndependentOfContext("A<int *> a;");
5805 verifyIndependentOfContext("A<int **> a;");
5806 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005807 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005808 verifyIndependentOfContext(
5809 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005810 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005811 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005812 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005813 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005814 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005815
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005816 verifyFormat(
5817 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5818 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5819
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005820 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005821 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005822 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005823 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005824 verifyGoogleFormat("A<int*> a;");
5825 verifyGoogleFormat("A<int**> a;");
5826 verifyGoogleFormat("A<int*, int*> a;");
5827 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005828 verifyGoogleFormat("f(b ? *c : *d);");
5829 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005830 verifyGoogleFormat("Type* t = **x;");
5831 verifyGoogleFormat("Type* t = *++*x;");
5832 verifyGoogleFormat("*++*x;");
5833 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5834 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005835 verifyGoogleFormat(
5836 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005837 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005838 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5839 verifyGoogleFormat("template <typename T>\n"
5840 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005841
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005842 FormatStyle Left = getLLVMStyle();
5843 Left.PointerAlignment = FormatStyle::PAS_Left;
5844 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00005845 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005846 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005847
Daniel Jasper5b49f472013-01-23 12:10:53 +00005848 verifyIndependentOfContext("a = *(x + y);");
5849 verifyIndependentOfContext("a = &(x + y);");
5850 verifyIndependentOfContext("*(x + y).call();");
5851 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005852 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005853
Daniel Jasper5b49f472013-01-23 12:10:53 +00005854 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005855 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005856 "int *MyValues = {\n"
5857 " *A, // Operator detection might be confused by the '{'\n"
5858 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005859 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005860
Daniel Jasper5b49f472013-01-23 12:10:53 +00005861 verifyIndependentOfContext("if (int *a = &b)");
5862 verifyIndependentOfContext("if (int &a = *b)");
5863 verifyIndependentOfContext("if (a & b[i])");
5864 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5865 verifyIndependentOfContext("if (*b[i])");
5866 verifyIndependentOfContext("if (int *a = (&b))");
5867 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005868 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005869 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005870 verifyFormat("void f() {\n"
5871 " for (const int &v : Values) {\n"
5872 " }\n"
5873 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005874 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5875 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005876 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005877
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005878 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005879 verifyFormat("#define MACRO \\\n"
5880 " int *i = a * b; \\\n"
5881 " void f(a *b);",
5882 getLLVMStyleWithColumns(19));
5883
Daniel Jasper97b89482013-03-13 07:49:51 +00005884 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005885 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005886 verifyIndependentOfContext("T **t = new T *;");
5887 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005888 verifyGoogleFormat("A = new SomeType*[Length]();");
5889 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005890 verifyGoogleFormat("T** t = new T*;");
5891 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005892
Daniel Jasper990ff972013-05-07 14:17:18 +00005893 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005894 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00005895 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00005896 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5897 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005898 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005899 "typename t::if<x && y>::type f() {}");
5900 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005901 verifyFormat("vector<int *> v;");
5902 verifyFormat("vector<int *const> v;");
5903 verifyFormat("vector<int *const **const *> v;");
5904 verifyFormat("vector<int *volatile> v;");
5905 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005906 verifyFormat("foo<b && false>();");
5907 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005908 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005909 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005910 "template <class T,\n"
5911 " class = typename std::enable_if<\n"
5912 " std::is_integral<T>::value &&\n"
5913 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005914 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005915 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005916 verifyFormat(
5917 "template <class T,\n"
5918 " class = typename ::std::enable_if<\n"
5919 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
5920 "void F();",
5921 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005922
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005923 verifyIndependentOfContext("MACRO(int *i);");
5924 verifyIndependentOfContext("MACRO(auto *a);");
5925 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00005926 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00005927 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005928 // FIXME: Is there a way to make this work?
5929 // verifyIndependentOfContext("MACRO(A *a);");
5930
Daniel Jasper32ccb032014-06-23 07:36:18 +00005931 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00005932 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00005933
Daniel Jasper866468a2014-04-14 13:15:29 +00005934 EXPECT_EQ("#define OP(x) \\\n"
5935 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5936 " return s << a.DebugString(); \\\n"
5937 " }",
5938 format("#define OP(x) \\\n"
5939 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5940 " return s << a.DebugString(); \\\n"
5941 " }",
5942 getLLVMStyleWithColumns(50)));
5943
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005944 // FIXME: We cannot handle this case yet; we might be able to figure out that
5945 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00005946 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00005947
5948 FormatStyle PointerMiddle = getLLVMStyle();
5949 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
5950 verifyFormat("delete *x;", PointerMiddle);
5951 verifyFormat("int * x;", PointerMiddle);
5952 verifyFormat("template <int * y> f() {}", PointerMiddle);
5953 verifyFormat("int * f(int * a) {}", PointerMiddle);
5954 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
5955 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
5956 verifyFormat("A<int *> a;", PointerMiddle);
5957 verifyFormat("A<int **> a;", PointerMiddle);
5958 verifyFormat("A<int *, int *> a;", PointerMiddle);
5959 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00005960 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5961 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00005962 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005963
5964 // Member function reference qualifiers aren't binary operators.
5965 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005966 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005967 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005968 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005969 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005970 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005971}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005972
Daniel Jasperee6d6502013-07-17 20:25:02 +00005973TEST_F(FormatTest, UnderstandsAttributes) {
5974 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00005975 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5976 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005977 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005978 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005979 verifyFormat("__attribute__((nodebug)) void\n"
5980 "foo() {}\n",
5981 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00005982}
5983
Daniel Jasper10cd5812013-05-06 06:35:44 +00005984TEST_F(FormatTest, UnderstandsEllipsis) {
5985 verifyFormat("int printf(const char *fmt, ...);");
5986 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005987 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5988
5989 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005990 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005991 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005992}
5993
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005994TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005995 EXPECT_EQ("int *a;\n"
5996 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005997 "int *a;",
5998 format("int *a;\n"
5999 "int* a;\n"
6000 "int *a;",
6001 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006002 EXPECT_EQ("int* a;\n"
6003 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006004 "int* a;",
6005 format("int* a;\n"
6006 "int* a;\n"
6007 "int *a;",
6008 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006009 EXPECT_EQ("int *a;\n"
6010 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006011 "int *a;",
6012 format("int *a;\n"
6013 "int * a;\n"
6014 "int * a;",
6015 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006016 EXPECT_EQ("auto x = [] {\n"
6017 " int *a;\n"
6018 " int *a;\n"
6019 " int *a;\n"
6020 "};",
6021 format("auto x=[]{int *a;\n"
6022 "int * a;\n"
6023 "int * a;};",
6024 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006025}
6026
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006027TEST_F(FormatTest, UnderstandsRvalueReferences) {
6028 verifyFormat("int f(int &&a) {}");
6029 verifyFormat("int f(int a, char &&b) {}");
6030 verifyFormat("void f() { int &&a = b; }");
6031 verifyGoogleFormat("int f(int a, char&& b) {}");
6032 verifyGoogleFormat("void f() { int&& a = b; }");
6033
Daniel Jasper1eff9082013-05-27 16:36:33 +00006034 verifyIndependentOfContext("A<int &&> a;");
6035 verifyIndependentOfContext("A<int &&, int &&> a;");
6036 verifyGoogleFormat("A<int&&> a;");
6037 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006038
6039 // Not rvalue references:
6040 verifyFormat("template <bool B, bool C> class A {\n"
6041 " static_assert(B && C, \"Something is wrong\");\n"
6042 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006043 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6044 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006045 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006046}
6047
Manuel Klimekc1237a82013-01-23 14:08:21 +00006048TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6049 verifyFormat("void f() {\n"
6050 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006051 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006052 "}",
6053 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006054}
6055
Daniel Jasperef906a92013-01-13 08:01:36 +00006056TEST_F(FormatTest, FormatsCasts) {
6057 verifyFormat("Type *A = static_cast<Type *>(P);");
6058 verifyFormat("Type *A = (Type *)P;");
6059 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6060 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006061 verifyFormat("int a = (int)2.0f;");
6062 verifyFormat("x[(int32)y];");
6063 verifyFormat("x = (int32)y;");
6064 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6065 verifyFormat("int a = (int)*b;");
6066 verifyFormat("int a = (int)2.0f;");
6067 verifyFormat("int a = (int)~0;");
6068 verifyFormat("int a = (int)++a;");
6069 verifyFormat("int a = (int)sizeof(int);");
6070 verifyFormat("int a = (int)+2;");
6071 verifyFormat("my_int a = (my_int)2.0f;");
6072 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006073 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006074 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006075 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006076 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006077 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006078
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006079 verifyFormat("void f() { my_int a = (my_int)*b; }");
6080 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6081 verifyFormat("my_int a = (my_int)~0;");
6082 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006083 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006084 verifyFormat("my_int a = (my_int)1;");
6085 verifyFormat("my_int a = (my_int *)1;");
6086 verifyFormat("my_int a = (const my_int)-1;");
6087 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006088 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006089 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006090 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006091 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006092
6093 // FIXME: single value wrapped with paren will be treated as cast.
6094 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006095
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006096 verifyFormat("{ (void)F; }");
6097
Daniel Jasper998cabc2013-07-18 14:46:07 +00006098 // Don't break after a cast's
6099 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6100 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6101 " bbbbbbbbbbbbbbbbbbbbbb);");
6102
Daniel Jasperef906a92013-01-13 08:01:36 +00006103 // These are not casts.
6104 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006105 verifyFormat("f(foo)->b;");
6106 verifyFormat("f(foo).b;");
6107 verifyFormat("f(foo)(b);");
6108 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006109 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006110 verifyFormat("(*funptr)(foo)[4];");
6111 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006112 verifyFormat("void f(int *);");
6113 verifyFormat("void f(int *) = 0;");
6114 verifyFormat("void f(SmallVector<int>) {}");
6115 verifyFormat("void f(SmallVector<int>);");
6116 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006117 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006118 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006119 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006120 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6121 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006122 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006123
Daniel Jasperba0bda92013-02-23 08:07:18 +00006124 // These are not casts, but at some point were confused with casts.
6125 verifyFormat("virtual void foo(int *) override;");
6126 verifyFormat("virtual void foo(char &) const;");
6127 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006128 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006129 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006130 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006131 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006132
6133 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6134 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006135 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006136 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006137 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6138 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6139 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006140}
6141
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006142TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006143 verifyFormat("A<bool()> a;");
6144 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006145 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006146 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006147 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006148 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006149 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006150 verifyFormat("template <class CallbackClass>\n"
6151 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006152
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006153 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6154 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006155 verifyGoogleFormat(
6156 "template <class CallbackClass>\n"
6157 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006158
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006159 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006160 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006161 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006162 verifyFormat("some_var = function(*some_pointer_var)[0];");
6163 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006164 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006165 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006166}
6167
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006168TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6169 verifyFormat("A (*foo_)[6];");
6170 verifyFormat("vector<int> (*foo_)[6];");
6171}
6172
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006173TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6174 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6175 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6176 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6177 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006178 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6179 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006180
6181 // Different ways of ()-initializiation.
6182 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6183 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6184 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6185 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6186 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6187 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006188 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6189 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006190}
6191
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006192TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006193 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006194 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006195 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006196 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006197 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006198 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006199 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6200 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006201 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6202 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006203 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6204 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006205 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6206 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006207 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6208 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006209 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6210 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6211 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6212 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006213 FormatStyle Indented = getLLVMStyle();
6214 Indented.IndentWrappedFunctionNames = true;
6215 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6216 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6217 Indented);
6218 verifyFormat(
6219 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6220 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6221 Indented);
6222 verifyFormat(
6223 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6224 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6225 Indented);
6226 verifyFormat(
6227 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6228 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6229 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006230
6231 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006232 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6233 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6234 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006235
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006236 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006237 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006238 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006239 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6240 " SourceLocation L, IdentifierIn *II,\n"
6241 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006242 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006243 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006244 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006245 " const SomeType<string, SomeOtherTemplateParameter>\n"
6246 " &ReallyReallyLongParameterName,\n"
6247 " const SomeType<string, SomeOtherTemplateParameter>\n"
6248 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006249 verifyFormat("template <typename A>\n"
6250 "SomeLoooooooooooooooooooooongType<\n"
6251 " typename some_namespace::SomeOtherType<A>::Type>\n"
6252 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006253
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006254 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006255 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6256 " aaaaaaaaaaaaaaaaaaaaaaa;");
6257 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006258 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6259 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006260 verifyGoogleFormat(
6261 "some_namespace::LongReturnType\n"
6262 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006263 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006264
6265 verifyGoogleFormat("template <typename T>\n"
6266 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006267 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006268 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6269 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006270
6271 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006272 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6273 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006274 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6275 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6276 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6277 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6278 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6279 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6280 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006281}
6282
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006283TEST_F(FormatTest, FormatsArrays) {
6284 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6285 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006286 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6287 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006288 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6289 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006290 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6291 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6292 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6293 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6294 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6295 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6296 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6297 verifyFormat(
6298 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6299 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6300 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006301 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6302 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006303
6304 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6305 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006306 verifyFormat(
6307 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6308 " .aaaaaaa[0]\n"
6309 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006310 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006311
6312 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006313
6314 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6315 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006316}
6317
Daniel Jaspere9de2602012-12-06 09:56:08 +00006318TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6319 verifyFormat("(a)->b();");
6320 verifyFormat("--a;");
6321}
6322
Daniel Jasper8b529712012-12-04 13:02:32 +00006323TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006324 verifyFormat("#include <string>\n"
6325 "#include <a/b/c.h>\n"
6326 "#include \"a/b/string\"\n"
6327 "#include \"string.h\"\n"
6328 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006329 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006330 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006331 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006332 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006333 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006334 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
6335 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006336 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6337 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006338
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006339 verifyFormat("#import <string>");
6340 verifyFormat("#import <a/b/c.h>");
6341 verifyFormat("#import \"a/b/string\"");
6342 verifyFormat("#import \"string.h\"");
6343 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006344 verifyFormat("#if __has_include(<strstream>)\n"
6345 "#include <strstream>\n"
6346 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006347
Daniel Jasper343643b2014-08-13 08:29:18 +00006348 verifyFormat("#define MY_IMPORT <a/b>");
6349
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006350 // Protocol buffer definition or missing "#".
6351 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6352 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006353
6354 FormatStyle Style = getLLVMStyle();
6355 Style.AlwaysBreakBeforeMultilineStrings = true;
6356 Style.ColumnLimit = 0;
6357 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006358
6359 // But 'import' might also be a regular C++ namespace.
6360 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6361 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006362}
6363
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006364//===----------------------------------------------------------------------===//
6365// Error recovery tests.
6366//===----------------------------------------------------------------------===//
6367
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006368TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006369 FormatStyle NoBinPacking = getLLVMStyle();
6370 NoBinPacking.BinPackParameters = false;
6371 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6372 " double *min_x,\n"
6373 " double *max_x,\n"
6374 " double *min_y,\n"
6375 " double *max_y,\n"
6376 " double *min_z,\n"
6377 " double *max_z, ) {}",
6378 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006379}
6380
Daniel Jasper83a54d22013-01-10 09:26:47 +00006381TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006382 verifyFormat("void f() { return; }\n42");
6383 verifyFormat("void f() {\n"
6384 " if (0)\n"
6385 " return;\n"
6386 "}\n"
6387 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006388 verifyFormat("void f() { return }\n42");
6389 verifyFormat("void f() {\n"
6390 " if (0)\n"
6391 " return\n"
6392 "}\n"
6393 "42");
6394}
6395
6396TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6397 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6398 EXPECT_EQ("void f() {\n"
6399 " if (a)\n"
6400 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006401 "}",
6402 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006403 EXPECT_EQ("namespace N {\n"
6404 "void f()\n"
6405 "}",
6406 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006407 EXPECT_EQ("namespace N {\n"
6408 "void f() {}\n"
6409 "void g()\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006410 "}",
6411 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006412}
6413
Daniel Jasper2df93312013-01-09 10:16:05 +00006414TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6415 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006416 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006417 " b;",
6418 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006419 verifyFormat("function(\n"
6420 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006421 " LoooooooooooongArgument);\n",
6422 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006423}
6424
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006425TEST_F(FormatTest, IncorrectAccessSpecifier) {
6426 verifyFormat("public:");
6427 verifyFormat("class A {\n"
6428 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006429 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006430 "};");
6431 verifyFormat("public\n"
6432 "int qwerty;");
6433 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006434 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006435 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006436 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006437 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006438 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006439}
Daniel Jasperf7935112012-12-03 18:12:45 +00006440
Daniel Jasper291f9362013-03-20 15:58:10 +00006441TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6442 verifyFormat("{");
6443 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006444 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006445}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006446
6447TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006448 verifyFormat("do {\n}");
6449 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006450 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006451 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006452 "wheeee(fun);");
6453 verifyFormat("do {\n"
6454 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006455 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006456}
6457
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006458TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006459 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006460 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006461 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006462 verifyFormat("while {\n foo;\n foo();\n}");
6463 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006464}
6465
Daniel Jasperc0880a92013-01-04 18:52:56 +00006466TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006467 verifyIncompleteFormat("namespace {\n"
6468 "class Foo { Foo (\n"
6469 "};\n"
6470 "} // comment");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006471}
6472
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006473TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006474 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006475 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6476 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006477 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006478
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006479 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006480 " {\n"
6481 " breakme(\n"
6482 " qwe);\n"
6483 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006484 format("{\n"
6485 " {\n"
6486 " breakme(qwe);\n"
6487 "}\n",
6488 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006489}
6490
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006491TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006492 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006493 " avariable,\n"
6494 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006495 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006496}
6497
Manuel Klimek762dd182013-01-21 10:07:49 +00006498TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006499 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006500}
6501
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006502TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006503 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006504 verifyFormat("vector<int> x{\n"
6505 " 1, 2, 3, 4,\n"
6506 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006507 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6508 verifyFormat("f({1, 2});");
6509 verifyFormat("auto v = Foo{-1};");
6510 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6511 verifyFormat("Class::Class : member{1, 2, 3} {}");
6512 verifyFormat("new vector<int>{1, 2, 3};");
6513 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006514 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006515 verifyFormat("return {arg1, arg2};");
6516 verifyFormat("return {arg1, SomeType{parameter}};");
6517 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6518 verifyFormat("new T{arg1, arg2};");
6519 verifyFormat("f(MyMap[{composite, key}]);");
6520 verifyFormat("class Class {\n"
6521 " T member = {arg1, arg2};\n"
6522 "};");
6523 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006524 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6525 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006526
Daniel Jasper438059e2014-05-22 12:11:13 +00006527 verifyFormat("int foo(int i) { return fo1{}(i); }");
6528 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006529 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006530 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006531 verifyFormat("Node n{1, Node{1000}, //\n"
6532 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006533 verifyFormat("Aaaa aaaaaaa{\n"
6534 " {\n"
6535 " aaaa,\n"
6536 " },\n"
6537 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006538 verifyFormat("class C : public D {\n"
6539 " SomeClass SC{2};\n"
6540 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006541 verifyFormat("class C : public A {\n"
6542 " class D : public B {\n"
6543 " void f() { int i{2}; }\n"
6544 " };\n"
6545 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006546 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006547
Daniel Jaspere4ada022016-12-13 10:05:03 +00006548 // Cases where distinguising braced lists and blocks is hard.
6549 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6550 verifyFormat("void f() {\n"
6551 " return; // comment\n"
6552 "}\n"
6553 "SomeType t;");
6554 verifyFormat("void f() {\n"
6555 " if (a) {\n"
6556 " f();\n"
6557 " }\n"
6558 "}\n"
6559 "SomeType t;");
6560
Daniel Jasper08434342015-05-26 07:26:26 +00006561 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006562 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006563 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006564 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6565 " bbbbb,\n"
6566 " ccccc,\n"
6567 " ddddd,\n"
6568 " eeeee,\n"
6569 " ffffff,\n"
6570 " ggggg,\n"
6571 " hhhhhh,\n"
6572 " iiiiii,\n"
6573 " jjjjjj,\n"
6574 " kkkkkk};",
6575 NoBinPacking);
6576 verifyFormat("const Aaaaaa aaaaa = {\n"
6577 " aaaaa,\n"
6578 " bbbbb,\n"
6579 " ccccc,\n"
6580 " ddddd,\n"
6581 " eeeee,\n"
6582 " ffffff,\n"
6583 " ggggg,\n"
6584 " hhhhhh,\n"
6585 " iiiiii,\n"
6586 " jjjjjj,\n"
6587 " kkkkkk,\n"
6588 "};",
6589 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006590 verifyFormat(
6591 "const Aaaaaa aaaaa = {\n"
6592 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6593 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6594 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6595 "};",
6596 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006597
Chandler Carruthf8b72662014-03-02 12:37:31 +00006598 // FIXME: The alignment of these trailing comments might be bad. Then again,
6599 // this might be utterly useless in real code.
6600 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006601 " : some_value{ //\n"
6602 " aaaaaaa, //\n"
6603 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006604
Chandler Carruthf8b72662014-03-02 12:37:31 +00006605 // In braced lists, the first comment is always assumed to belong to the
6606 // first element. Thus, it can be moved to the next or previous line as
6607 // appropriate.
6608 EXPECT_EQ("function({// First element:\n"
6609 " 1,\n"
6610 " // Second element:\n"
6611 " 2});",
6612 format("function({\n"
6613 " // First element:\n"
6614 " 1,\n"
6615 " // Second element:\n"
6616 " 2});"));
6617 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6618 " // First element:\n"
6619 " 1,\n"
6620 " // Second element:\n"
6621 " 2};",
6622 format("std::vector<int> MyNumbers{// First element:\n"
6623 " 1,\n"
6624 " // Second element:\n"
6625 " 2};",
6626 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00006627 // A trailing comma should still lead to an enforced line break.
6628 EXPECT_EQ("vector<int> SomeVector = {\n"
6629 " // aaa\n"
6630 " 1, 2,\n"
6631 "};",
6632 format("vector<int> SomeVector = { // aaa\n"
6633 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006634
Chandler Carruthf8b72662014-03-02 12:37:31 +00006635 FormatStyle ExtraSpaces = getLLVMStyle();
6636 ExtraSpaces.Cpp11BracedListStyle = false;
6637 ExtraSpaces.ColumnLimit = 75;
6638 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6639 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6640 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6641 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6642 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6643 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6644 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6645 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6646 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6647 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6648 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6649 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6650 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6651 verifyFormat("class Class {\n"
6652 " T member = { arg1, arg2 };\n"
6653 "};",
6654 ExtraSpaces);
6655 verifyFormat(
6656 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6657 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6658 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6659 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6660 ExtraSpaces);
6661 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006662 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006663 ExtraSpaces);
6664 verifyFormat(
6665 "someFunction(OtherParam,\n"
6666 " BracedList{ // comment 1 (Forcing interesting break)\n"
6667 " param1, param2,\n"
6668 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006669 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006670 ExtraSpaces);
6671 verifyFormat(
6672 "std::this_thread::sleep_for(\n"
6673 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6674 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00006675 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006676 " aaaaaaa,\n"
6677 " aaaaaaaaaa,\n"
6678 " aaaaa,\n"
6679 " aaaaaaaaaaaaaaa,\n"
6680 " aaa,\n"
6681 " aaaaaaaaaa,\n"
6682 " a,\n"
6683 " aaaaaaaaaaaaaaaaaaaaa,\n"
6684 " aaaaaaaaaaaa,\n"
6685 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6686 " aaaaaaa,\n"
6687 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006688 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006689}
6690
Daniel Jasper33b909c2013-10-25 14:29:37 +00006691TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006692 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6693 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6694 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6695 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6696 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6697 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006698 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006699 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006700 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006701 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6702 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006703 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006704 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6705 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6706 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6707 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6708 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6709 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6710 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006711 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006712 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6713 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006714 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6715 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6716 " // Separating comment.\n"
6717 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6718 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6719 " // Leading comment\n"
6720 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6721 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006722 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6723 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006724 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006725 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6726 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006727 getLLVMStyleWithColumns(38));
6728 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006729 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6730 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006731 verifyFormat(
6732 "static unsigned SomeValues[10][3] = {\n"
6733 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6734 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6735 verifyFormat("static auto fields = new vector<string>{\n"
6736 " \"aaaaaaaaaaaaa\",\n"
6737 " \"aaaaaaaaaaaaa\",\n"
6738 " \"aaaaaaaaaaaa\",\n"
6739 " \"aaaaaaaaaaaaaa\",\n"
6740 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6741 " \"aaaaaaaaaaaa\",\n"
6742 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6743 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006744 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6745 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6746 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6747 " 3, cccccccccccccccccccccc};",
6748 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006749
6750 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006751 verifyFormat("vector<int> x = {\n"
6752 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6753 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006754 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006755 verifyFormat("vector<int> x = {\n"
6756 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006757 "};",
6758 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006759 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6760 " 1, 1, 1, 1,\n"
6761 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006762 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006763
Daniel Jasper60c27072015-05-13 08:16:00 +00006764 // Trailing comment in the first line.
6765 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6766 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6767 " 111111111, 222222222, 3333333333, 444444444, //\n"
6768 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006769 // Trailing comment in the last line.
6770 verifyFormat("int aaaaa[] = {\n"
6771 " 1, 2, 3, // comment\n"
6772 " 4, 5, 6 // comment\n"
6773 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006774
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006775 // With nested lists, we should either format one item per line or all nested
6776 // lists one on line.
6777 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006778 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6779 " {aaaaaaaaaaaaaaaaaaa},\n"
6780 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6781 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006782 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006783 verifyFormat(
6784 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006785 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6786 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6787 " {aaa, aaa},\n"
6788 " {aaa, aaa},\n"
6789 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6790 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6791 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006792
6793 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006794 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
6795 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006796
6797 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006798
Daniel Jaspereb65e912015-12-21 18:31:15 +00006799 // No braced initializer here.
6800 verifyFormat("void f() {\n"
6801 " struct Dummy {};\n"
6802 " f(v);\n"
6803 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006804
6805 // Long lists should be formatted in columns even if they are nested.
6806 verifyFormat(
6807 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6808 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6809 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6810 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6811 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6812 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00006813
6814 // Allow "single-column" layout even if that violates the column limit. There
6815 // isn't going to be a better way.
6816 verifyFormat("std::vector<int> a = {\n"
6817 " aaaaaaaa,\n"
6818 " aaaaaaaa,\n"
6819 " aaaaaaaa,\n"
6820 " aaaaaaaa,\n"
6821 " aaaaaaaaaa,\n"
6822 " aaaaaaaa,\n"
6823 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
6824 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00006825 verifyFormat("vector<int> aaaa = {\n"
6826 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6827 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6828 " aaaaaa.aaaaaaa,\n"
6829 " aaaaaa.aaaaaaa,\n"
6830 " aaaaaa.aaaaaaa,\n"
6831 " aaaaaa.aaaaaaa,\n"
6832 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006833
6834 // Don't create hanging lists.
6835 verifyFormat("someFunction(Param,\n"
6836 " {List1, List2,\n"
6837 " List3});",
6838 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00006839 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
6840 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006841}
6842
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006843TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006844 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006845 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006846
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006847 verifyFormat("void f() { return 42; }");
6848 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006849 " return 42;\n"
6850 "}",
6851 DoNotMerge);
6852 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006853 " // Comment\n"
6854 "}");
6855 verifyFormat("{\n"
6856 "#error {\n"
6857 " int a;\n"
6858 "}");
6859 verifyFormat("{\n"
6860 " int a;\n"
6861 "#error {\n"
6862 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00006863 verifyFormat("void f() {} // comment");
6864 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00006865 verifyFormat("void f() {\n"
6866 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006867 DoNotMerge);
6868 verifyFormat("void f() {\n"
6869 " int a;\n"
6870 "} // comment",
6871 DoNotMerge);
6872 verifyFormat("void f() {\n"
6873 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00006874 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006875
6876 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
6877 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
6878
6879 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
6880 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00006881 verifyFormat("class C {\n"
6882 " C()\n"
6883 " : iiiiiiii(nullptr),\n"
6884 " kkkkkkk(nullptr),\n"
6885 " mmmmmmm(nullptr),\n"
6886 " nnnnnnn(nullptr) {}\n"
6887 "};",
6888 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00006889
6890 FormatStyle NoColumnLimit = getLLVMStyle();
6891 NoColumnLimit.ColumnLimit = 0;
6892 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
6893 EXPECT_EQ("class C {\n"
6894 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00006895 "};",
6896 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00006897 EXPECT_EQ("A()\n"
6898 " : b(0) {\n"
6899 "}",
6900 format("A()\n:b(0)\n{\n}", NoColumnLimit));
6901
6902 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00006903 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
6904 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00006905 EXPECT_EQ("A()\n"
6906 " : b(0) {\n"
6907 "}",
6908 format("A():b(0){}", DoNotMergeNoColumnLimit));
6909 EXPECT_EQ("A()\n"
6910 " : b(0) {\n"
6911 "}",
6912 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00006913
6914 verifyFormat("#define A \\\n"
6915 " void f() { \\\n"
6916 " int i; \\\n"
6917 " }",
6918 getLLVMStyleWithColumns(20));
6919 verifyFormat("#define A \\\n"
6920 " void f() { int i; }",
6921 getLLVMStyleWithColumns(21));
6922 verifyFormat("#define A \\\n"
6923 " void f() { \\\n"
6924 " int i; \\\n"
6925 " } \\\n"
6926 " int j;",
6927 getLLVMStyleWithColumns(22));
6928 verifyFormat("#define A \\\n"
6929 " void f() { int i; } \\\n"
6930 " int j;",
6931 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006932}
6933
Daniel Jasperd74cf402014-04-08 12:46:38 +00006934TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
6935 FormatStyle MergeInlineOnly = getLLVMStyle();
6936 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6937 verifyFormat("class C {\n"
6938 " int f() { return 42; }\n"
6939 "};",
6940 MergeInlineOnly);
6941 verifyFormat("int f() {\n"
6942 " return 42;\n"
6943 "}",
6944 MergeInlineOnly);
6945}
6946
Manuel Klimeke01bab52013-01-15 13:38:33 +00006947TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
6948 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006949 verifyFormat("struct foo a = {bar};\nint n;");
6950 verifyFormat("class foo a = {bar};\nint n;");
6951 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006952
6953 // Elaborate types inside function definitions.
6954 verifyFormat("struct foo f() {}\nint n;");
6955 verifyFormat("class foo f() {}\nint n;");
6956 verifyFormat("union foo f() {}\nint n;");
6957
6958 // Templates.
6959 verifyFormat("template <class X> void f() {}\nint n;");
6960 verifyFormat("template <struct X> void f() {}\nint n;");
6961 verifyFormat("template <union X> void f() {}\nint n;");
6962
6963 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006964 verifyFormat("struct {\n} n;");
6965 verifyFormat(
6966 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006967 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006968 verifyFormat("class MACRO Z {\n} n;");
6969 verifyFormat("class MACRO(X) Z {\n} n;");
6970 verifyFormat("class __attribute__(X) Z {\n} n;");
6971 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00006972 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00006973 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00006974 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6975 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006976
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006977 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006978 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006979
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006980 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00006981 verifyFormat(
6982 "template <typename F>\n"
6983 "Matcher(const Matcher<F> &Other,\n"
6984 " typename enable_if_c<is_base_of<F, T>::value &&\n"
6985 " !is_same<F, T>::value>::type * = 0)\n"
6986 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6987
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006988 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006989 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00006990 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006991
6992 // FIXME:
6993 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006994 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006995
Manuel Klimeke01bab52013-01-15 13:38:33 +00006996 // Elaborate types where incorrectly parsing the structural element would
6997 // break the indent.
6998 verifyFormat("if (true)\n"
6999 " class X x;\n"
7000 "else\n"
7001 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007002
7003 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007004 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007005}
7006
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007007TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007008 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7009 format("#error Leave all white!!!!! space* alone!\n"));
7010 EXPECT_EQ(
7011 "#warning Leave all white!!!!! space* alone!\n",
7012 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007013 EXPECT_EQ("#error 1", format(" # error 1"));
7014 EXPECT_EQ("#warning 1", format(" # warning 1"));
7015}
7016
Daniel Jasper4431aa92013-04-23 13:54:04 +00007017TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007018 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007019 verifyFormat("#if (AAAA && BBBB)");
7020 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007021 // FIXME: Come up with a better indentation for #elif.
7022 verifyFormat(
7023 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7024 " defined(BBBBBBBB)\n"
7025 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7026 " defined(BBBBBBBB)\n"
7027 "#endif",
7028 getLLVMStyleWithColumns(65));
7029}
7030
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007031TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7032 FormatStyle AllowsMergedIf = getGoogleStyle();
7033 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7034 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7035 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007036 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7037 EXPECT_EQ("if (true) return 42;",
7038 format("if (true)\nreturn 42;", AllowsMergedIf));
7039 FormatStyle ShortMergedIf = AllowsMergedIf;
7040 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007041 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007042 " if (true) return 42;",
7043 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007044 verifyFormat("#define A \\\n"
7045 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007046 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007047 "#define B",
7048 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007049 verifyFormat("#define A \\\n"
7050 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007051 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007052 "g();",
7053 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007054 verifyFormat("{\n"
7055 "#ifdef A\n"
7056 " // Comment\n"
7057 " if (true) continue;\n"
7058 "#endif\n"
7059 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007060 " if (true) continue;\n"
7061 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007062 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007063 ShortMergedIf.ColumnLimit = 29;
7064 verifyFormat("#define A \\\n"
7065 " if (aaaaaaaaaa) return 1; \\\n"
7066 " return 2;",
7067 ShortMergedIf);
7068 ShortMergedIf.ColumnLimit = 28;
7069 verifyFormat("#define A \\\n"
7070 " if (aaaaaaaaaa) \\\n"
7071 " return 1; \\\n"
7072 " return 2;",
7073 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007074}
7075
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007076TEST_F(FormatTest, BlockCommentsInControlLoops) {
7077 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7078 " f();\n"
7079 "}");
7080 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7081 " f();\n"
7082 "} /* another comment */ else /* comment #3 */ {\n"
7083 " g();\n"
7084 "}");
7085 verifyFormat("while (0) /* a comment in a strange place */ {\n"
7086 " f();\n"
7087 "}");
7088 verifyFormat("for (;;) /* a comment in a strange place */ {\n"
7089 " f();\n"
7090 "}");
7091 verifyFormat("do /* a comment in a strange place */ {\n"
7092 " f();\n"
7093 "} /* another comment */ while (0);");
7094}
7095
7096TEST_F(FormatTest, BlockComments) {
7097 EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
7098 format("/* *//* */ /* */\n/* *//* */ /* */"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007099 EXPECT_EQ("/* */ a /* */ b;", format(" /* */ a/* */ b;"));
Daniel Jaspera49393f2013-08-28 09:07:32 +00007100 EXPECT_EQ("#define A /*123*/ \\\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007101 " b\n"
7102 "/* */\n"
7103 "someCall(\n"
7104 " parameter);",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00007105 format("#define A /*123*/ b\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007106 "/* */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007107 "someCall(parameter);",
7108 getLLVMStyleWithColumns(15)));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007109
7110 EXPECT_EQ("#define A\n"
7111 "/* */ someCall(\n"
7112 " parameter);",
7113 format("#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007114 "/* */someCall(parameter);",
7115 getLLVMStyleWithColumns(15)));
Daniel Jasper51fb2b22013-05-30 06:40:07 +00007116 EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007117 EXPECT_EQ("/*\n"
7118 "*\n"
7119 " * aaaaaa\n"
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00007120 " * aaaaaa\n"
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007121 "*/",
7122 format("/*\n"
7123 "*\n"
7124 " * aaaaaa aaaaaa\n"
7125 "*/",
7126 getLLVMStyleWithColumns(10)));
Daniel Jasperce257f22013-05-30 17:27:48 +00007127 EXPECT_EQ("/*\n"
7128 "**\n"
7129 "* aaaaaa\n"
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007130 "*aaaaaa\n"
Daniel Jasperce257f22013-05-30 17:27:48 +00007131 "*/",
7132 format("/*\n"
7133 "**\n"
7134 "* aaaaaa aaaaaa\n"
7135 "*/",
7136 getLLVMStyleWithColumns(10)));
Daniel Jasperacadc8e2016-06-08 09:45:08 +00007137 EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7138 " /* line 1\n"
7139 " bbbbbbbbbbbb */\n"
7140 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7141 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7142 " /* line 1\n"
7143 " bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7144 getLLVMStyleWithColumns(50)));
Daniel Jasper1f140982013-02-04 07:32:14 +00007145
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007146 FormatStyle NoBinPacking = getLLVMStyle();
7147 NoBinPacking.BinPackParameters = false;
Daniel Jasper1f140982013-02-04 07:32:14 +00007148 EXPECT_EQ("someFunction(1, /* comment 1 */\n"
7149 " 2, /* comment 2 */\n"
7150 " 3, /* comment 3 */\n"
Daniel Jasper14e40ec2013-02-04 08:34:57 +00007151 " aaaa,\n"
7152 " bbbb);",
Daniel Jasper1f140982013-02-04 07:32:14 +00007153 format("someFunction (1, /* comment 1 */\n"
7154 " 2, /* comment 2 */ \n"
7155 " 3, /* comment 3 */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007156 "aaaa, bbbb );",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007157 NoBinPacking));
Daniel Jasper38396592013-02-06 15:23:09 +00007158 verifyFormat(
7159 "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7160 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7161 EXPECT_EQ(
7162 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7163 " aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7164 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
7165 format(
7166 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7167 " aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7168 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
Daniel Jasper94f0e132013-02-06 20:07:35 +00007169 EXPECT_EQ(
7170 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7171 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7172 "int cccccccccccccccccccccccccccccc; /* comment */\n",
7173 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7174 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7175 "int cccccccccccccccccccccccccccccc; /* comment */\n"));
Daniel Jasper022612d2013-07-01 09:34:09 +00007176
7177 verifyFormat("void f(int * /* unused */) {}");
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007178
7179 EXPECT_EQ("/*\n"
7180 " **\n"
7181 " */",
7182 format("/*\n"
7183 " **\n"
7184 " */"));
7185 EXPECT_EQ("/*\n"
7186 " *q\n"
7187 " */",
7188 format("/*\n"
7189 " *q\n"
7190 " */"));
7191 EXPECT_EQ("/*\n"
7192 " * q\n"
7193 " */",
7194 format("/*\n"
7195 " * q\n"
7196 " */"));
7197 EXPECT_EQ("/*\n"
7198 " **/",
7199 format("/*\n"
7200 " **/"));
7201 EXPECT_EQ("/*\n"
7202 " ***/",
7203 format("/*\n"
7204 " ***/"));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007205}
7206
Manuel Klimek82b836a2013-02-06 16:40:56 +00007207TEST_F(FormatTest, BlockCommentsInMacros) {
7208 EXPECT_EQ("#define A \\\n"
7209 " { \\\n"
7210 " /* one line */ \\\n"
7211 " someCall();",
7212 format("#define A { \\\n"
7213 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007214 " someCall();",
7215 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007216 EXPECT_EQ("#define A \\\n"
7217 " { \\\n"
7218 " /* previous */ \\\n"
7219 " /* one line */ \\\n"
7220 " someCall();",
7221 format("#define A { \\\n"
7222 " /* previous */ \\\n"
7223 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007224 " someCall();",
7225 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007226}
7227
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007228TEST_F(FormatTest, BlockCommentsAtEndOfLine) {
7229 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007230 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007231 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007232 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007233 "};",
7234 getLLVMStyleWithColumns(15)));
7235 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007236 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007237 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007238 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007239 "};",
7240 getLLVMStyleWithColumns(15)));
7241
7242 // FIXME: The formatting is still wrong here.
7243 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007244 " 1111 /* a\n"
7245 " */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007246 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007247 format("a = {1111 /* a */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007248 "};",
7249 getLLVMStyleWithColumns(15)));
7250}
7251
Manuel Klimek82b836a2013-02-06 16:40:56 +00007252TEST_F(FormatTest, IndentLineCommentsInStartOfBlockAtEndOfFile) {
Manuel Klimek82b836a2013-02-06 16:40:56 +00007253 verifyFormat("{\n"
Marianne Mailhot-Sarrasin03137c62016-04-14 14:56:49 +00007254 " // a\n"
7255 " // b");
Manuel Klimek82b836a2013-02-06 16:40:56 +00007256}
7257
Manuel Klimekd33516e2013-01-23 10:09:28 +00007258TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007259 verifyFormat("void f(int *a);");
7260 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007261 verifyFormat("class A {\n void f(int *a);\n};");
7262 verifyFormat("class A {\n int *a;\n};");
7263 verifyFormat("namespace a {\n"
7264 "namespace b {\n"
7265 "class A {\n"
7266 " void f() {}\n"
7267 " int *a;\n"
7268 "};\n"
7269 "}\n"
7270 "}");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007271}
7272
Manuel Klimekd33516e2013-01-23 10:09:28 +00007273TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7274 verifyFormat("while");
7275 verifyFormat("operator");
7276}
7277
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007278TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7279 // This code would be painfully slow to format if we didn't skip it.
7280 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
7281 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7282 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7283 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7284 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7285 "A(1, 1)\n"
7286 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7287 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7288 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7289 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7290 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7291 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7292 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7293 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7294 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7295 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7296 // Deeply nested part is untouched, rest is formatted.
7297 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7298 format(std::string("int i;\n") + Code + "int j;\n",
7299 getLLVMStyle(), IC_ExpectIncomplete));
7300}
7301
Nico Weber7e6a7a12013-01-08 17:56:31 +00007302//===----------------------------------------------------------------------===//
7303// Objective-C tests.
7304//===----------------------------------------------------------------------===//
7305
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007306TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7307 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7308 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7309 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007310 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007311 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7312 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7313 format("-(NSInteger)Method3:(id)anObject;"));
7314 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7315 format("-(NSInteger)Method4:(id)anObject;"));
7316 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7317 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7318 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7319 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007320 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7321 "forAllCells:(BOOL)flag;",
7322 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7323 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007324
7325 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007326 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7327 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007328 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7329 " inRange:(NSRange)range\n"
7330 " outRange:(NSRange)out_range\n"
7331 " outRange1:(NSRange)out_range1\n"
7332 " outRange2:(NSRange)out_range2\n"
7333 " outRange3:(NSRange)out_range3\n"
7334 " outRange4:(NSRange)out_range4\n"
7335 " outRange5:(NSRange)out_range5\n"
7336 " outRange6:(NSRange)out_range6\n"
7337 " outRange7:(NSRange)out_range7\n"
7338 " outRange8:(NSRange)out_range8\n"
7339 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007340
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007341 // When the function name has to be wrapped.
7342 FormatStyle Style = getLLVMStyle();
7343 Style.IndentWrappedFunctionNames = false;
7344 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7345 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7346 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7347 "}",
7348 Style);
7349 Style.IndentWrappedFunctionNames = true;
7350 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7351 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7352 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7353 "}",
7354 Style);
7355
Nico Weberd6f962f2013-01-10 20:18:33 +00007356 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007357 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007358 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7359 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007360 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007361
Daniel Jasper37194282013-05-28 08:33:00 +00007362 verifyFormat("- (int (*)())foo:(int (*)())f;");
7363 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007364
7365 // If there's no return type (very rare in practice!), LLVM and Google style
7366 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007367 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007368 verifyFormat("- foo:(int)f;");
7369 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007370}
7371
Nico Weber0588b502013-02-07 00:19:29 +00007372
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007373TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007374 EXPECT_EQ("\"some text \"\n"
7375 "\"other\";",
7376 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007377 EXPECT_EQ("\"some text \"\n"
7378 "\"other\";",
7379 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007380 EXPECT_EQ(
7381 "#define A \\\n"
7382 " \"some \" \\\n"
7383 " \"text \" \\\n"
7384 " \"other\";",
7385 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7386 EXPECT_EQ(
7387 "#define A \\\n"
7388 " \"so \" \\\n"
7389 " \"text \" \\\n"
7390 " \"other\";",
7391 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7392
7393 EXPECT_EQ("\"some text\"",
7394 format("\"some text\"", getLLVMStyleWithColumns(1)));
7395 EXPECT_EQ("\"some text\"",
7396 format("\"some text\"", getLLVMStyleWithColumns(11)));
7397 EXPECT_EQ("\"some \"\n"
7398 "\"text\"",
7399 format("\"some text\"", getLLVMStyleWithColumns(10)));
7400 EXPECT_EQ("\"some \"\n"
7401 "\"text\"",
7402 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007403 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007404 "\" tex\"\n"
7405 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007406 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007407 EXPECT_EQ("\"some\"\n"
7408 "\" tex\"\n"
7409 "\" and\"",
7410 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7411 EXPECT_EQ("\"some\"\n"
7412 "\"/tex\"\n"
7413 "\"/and\"",
7414 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007415
7416 EXPECT_EQ("variable =\n"
7417 " \"long string \"\n"
7418 " \"literal\";",
7419 format("variable = \"long string literal\";",
7420 getLLVMStyleWithColumns(20)));
7421
7422 EXPECT_EQ("variable = f(\n"
7423 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007424 " \"literal\",\n"
7425 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007426 " loooooooooooooooooooong);",
7427 format("variable = f(\"long string literal\", short, "
7428 "loooooooooooooooooooong);",
7429 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007430
Daniel Jaspera44991332015-04-29 13:06:49 +00007431 EXPECT_EQ(
7432 "f(g(\"long string \"\n"
7433 " \"literal\"),\n"
7434 " b);",
7435 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007436 EXPECT_EQ("f(g(\"long string \"\n"
7437 " \"literal\",\n"
7438 " a),\n"
7439 " b);",
7440 format("f(g(\"long string literal\", a), b);",
7441 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007442 EXPECT_EQ(
7443 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00007444 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007445 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7446 EXPECT_EQ("f(\"one two three four five six \"\n"
7447 " \"seven\".split(\n"
7448 " really_looooong_variable));",
7449 format("f(\"one two three four five six seven\"."
7450 "split(really_looooong_variable));",
7451 getLLVMStyleWithColumns(33)));
7452
7453 EXPECT_EQ("f(\"some \"\n"
7454 " \"text\",\n"
7455 " other);",
7456 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00007457
7458 // Only break as a last resort.
7459 verifyFormat(
7460 "aaaaaaaaaaaaaaaaaaaa(\n"
7461 " aaaaaaaaaaaaaaaaaaaa,\n"
7462 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00007463
Daniel Jaspera44991332015-04-29 13:06:49 +00007464 EXPECT_EQ("\"splitmea\"\n"
7465 "\"trandomp\"\n"
7466 "\"oint\"",
7467 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00007468
Daniel Jaspera44991332015-04-29 13:06:49 +00007469 EXPECT_EQ("\"split/\"\n"
7470 "\"pathat/\"\n"
7471 "\"slashes\"",
7472 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007473
Daniel Jaspera44991332015-04-29 13:06:49 +00007474 EXPECT_EQ("\"split/\"\n"
7475 "\"pathat/\"\n"
7476 "\"slashes\"",
7477 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00007478 EXPECT_EQ("\"split at \"\n"
7479 "\"spaces/at/\"\n"
7480 "\"slashes.at.any$\"\n"
7481 "\"non-alphanumeric%\"\n"
7482 "\"1111111111characte\"\n"
7483 "\"rs\"",
7484 format("\"split at "
7485 "spaces/at/"
7486 "slashes.at."
7487 "any$non-"
7488 "alphanumeric%"
7489 "1111111111characte"
7490 "rs\"",
7491 getLLVMStyleWithColumns(20)));
7492
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007493 // Verify that splitting the strings understands
7494 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00007495 EXPECT_EQ(
7496 "aaaaaaaaaaaa(\n"
7497 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
7498 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
7499 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
7500 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7501 "aaaaaaaaaaaaaaaaaaaaaa\");",
7502 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00007503 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7504 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
7505 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
7506 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7507 "aaaaaaaaaaaaaaaaaaaaaa\";",
7508 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00007509 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7510 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7511 format("llvm::outs() << "
7512 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
7513 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00007514 EXPECT_EQ("ffff(\n"
7515 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7516 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7517 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
7518 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7519 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007520
Daniel Jaspere1a7b762016-02-01 11:21:02 +00007521 FormatStyle Style = getLLVMStyleWithColumns(12);
7522 Style.BreakStringLiterals = false;
7523 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
7524
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007525 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
7526 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00007527 EXPECT_EQ("#define A \\\n"
7528 " \"some \" \\\n"
7529 " \"text \" \\\n"
7530 " \"other\";",
7531 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007532}
7533
Manuel Klimek9e321992015-07-28 15:50:24 +00007534TEST_F(FormatTest, FullyRemoveEmptyLines) {
7535 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
7536 NoEmptyLines.MaxEmptyLinesToKeep = 0;
7537 EXPECT_EQ("int i = a(b());",
7538 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
7539}
7540
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007541TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
7542 EXPECT_EQ(
7543 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7544 "(\n"
7545 " \"x\t\");",
7546 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7547 "aaaaaaa("
7548 "\"x\t\");"));
7549}
7550
Daniel Jasper174b0122014-01-09 14:18:12 +00007551TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00007552 EXPECT_EQ(
7553 "u8\"utf8 string \"\n"
7554 "u8\"literal\";",
7555 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
7556 EXPECT_EQ(
7557 "u\"utf16 string \"\n"
7558 "u\"literal\";",
7559 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
7560 EXPECT_EQ(
7561 "U\"utf32 string \"\n"
7562 "U\"literal\";",
7563 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
7564 EXPECT_EQ("L\"wide string \"\n"
7565 "L\"literal\";",
7566 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00007567 EXPECT_EQ("@\"NSString \"\n"
7568 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00007569 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00007570
7571 // This input makes clang-format try to split the incomplete unicode escape
7572 // sequence, which used to lead to a crasher.
7573 verifyNoCrash(
7574 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7575 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007576}
7577
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00007578TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
7579 FormatStyle Style = getGoogleStyleWithColumns(15);
7580 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
7581 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
7582 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
7583 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
7584 EXPECT_EQ("u8R\"x(raw literal)x\";",
7585 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007586}
7587
7588TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
7589 FormatStyle Style = getLLVMStyleWithColumns(20);
7590 EXPECT_EQ(
7591 "_T(\"aaaaaaaaaaaaaa\")\n"
7592 "_T(\"aaaaaaaaaaaaaa\")\n"
7593 "_T(\"aaaaaaaaaaaa\")",
7594 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
7595 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
7596 " _T(\"aaaaaa\"),\n"
7597 " z);",
7598 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
7599
7600 // FIXME: Handle embedded spaces in one iteration.
7601 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
7602 // "_T(\"aaaaaaaaaaaaa\")\n"
7603 // "_T(\"aaaaaaaaaaaaa\")\n"
7604 // "_T(\"a\")",
7605 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7606 // getLLVMStyleWithColumns(20)));
7607 EXPECT_EQ(
7608 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7609 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007610 EXPECT_EQ("f(\n"
7611 "#if !TEST\n"
7612 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7613 "#endif\n"
7614 " );",
7615 format("f(\n"
7616 "#if !TEST\n"
7617 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7618 "#endif\n"
7619 ");"));
7620 EXPECT_EQ("f(\n"
7621 "\n"
7622 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
7623 format("f(\n"
7624 "\n"
7625 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007626}
7627
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007628TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007629 EXPECT_EQ(
7630 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7631 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7632 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7633 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7634 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7635 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
7636}
7637
7638TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
7639 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007640 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007641 EXPECT_EQ("fffffffffff(g(R\"x(\n"
7642 "multiline raw string literal xxxxxxxxxxxxxx\n"
7643 ")x\",\n"
7644 " a),\n"
7645 " b);",
7646 format("fffffffffff(g(R\"x(\n"
7647 "multiline raw string literal xxxxxxxxxxxxxx\n"
7648 ")x\", a), b);",
7649 getGoogleStyleWithColumns(20)));
7650 EXPECT_EQ("fffffffffff(\n"
7651 " g(R\"x(qqq\n"
7652 "multiline raw string literal xxxxxxxxxxxxxx\n"
7653 ")x\",\n"
7654 " a),\n"
7655 " b);",
7656 format("fffffffffff(g(R\"x(qqq\n"
7657 "multiline raw string literal xxxxxxxxxxxxxx\n"
7658 ")x\", a), b);",
7659 getGoogleStyleWithColumns(20)));
7660
7661 EXPECT_EQ("fffffffffff(R\"x(\n"
7662 "multiline raw string literal xxxxxxxxxxxxxx\n"
7663 ")x\");",
7664 format("fffffffffff(R\"x(\n"
7665 "multiline raw string literal xxxxxxxxxxxxxx\n"
7666 ")x\");",
7667 getGoogleStyleWithColumns(20)));
7668 EXPECT_EQ("fffffffffff(R\"x(\n"
7669 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007670 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007671 format("fffffffffff(R\"x(\n"
7672 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007673 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007674 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007675 EXPECT_EQ("fffffffffff(\n"
7676 " R\"x(\n"
7677 "multiline raw string literal xxxxxxxxxxxxxx\n"
7678 ")x\" +\n"
7679 " bbbbbb);",
7680 format("fffffffffff(\n"
7681 " R\"x(\n"
7682 "multiline raw string literal xxxxxxxxxxxxxx\n"
7683 ")x\" + bbbbbb);",
7684 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007685}
7686
Alexander Kornienkobe633902013-06-14 11:46:10 +00007687TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00007688 verifyFormat("string a = \"unterminated;");
7689 EXPECT_EQ("function(\"unterminated,\n"
7690 " OtherParameter);",
7691 format("function( \"unterminated,\n"
7692 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00007693}
7694
7695TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007696 FormatStyle Style = getLLVMStyle();
7697 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00007698 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007699 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00007700}
7701
Daniel Jaspera44991332015-04-29 13:06:49 +00007702TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00007703
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007704TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
7705 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
7706 " \"ddeeefff\");",
7707 format("someFunction(\"aaabbbcccdddeeefff\");",
7708 getLLVMStyleWithColumns(25)));
7709 EXPECT_EQ("someFunction1234567890(\n"
7710 " \"aaabbbcccdddeeefff\");",
7711 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7712 getLLVMStyleWithColumns(26)));
7713 EXPECT_EQ("someFunction1234567890(\n"
7714 " \"aaabbbcccdddeeeff\"\n"
7715 " \"f\");",
7716 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7717 getLLVMStyleWithColumns(25)));
7718 EXPECT_EQ("someFunction1234567890(\n"
7719 " \"aaabbbcccdddeeeff\"\n"
7720 " \"f\");",
7721 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7722 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00007723 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
7724 " \"ddde \"\n"
7725 " \"efff\");",
7726 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007727 getLLVMStyleWithColumns(25)));
7728 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
7729 " \"ddeeefff\");",
7730 format("someFunction(\"aaabbbccc ddeeefff\");",
7731 getLLVMStyleWithColumns(25)));
7732 EXPECT_EQ("someFunction1234567890(\n"
7733 " \"aaabb \"\n"
7734 " \"cccdddeeefff\");",
7735 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
7736 getLLVMStyleWithColumns(25)));
7737 EXPECT_EQ("#define A \\\n"
7738 " string s = \\\n"
7739 " \"123456789\" \\\n"
7740 " \"0\"; \\\n"
7741 " int i;",
7742 format("#define A string s = \"1234567890\"; int i;",
7743 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00007744 // FIXME: Put additional penalties on breaking at non-whitespace locations.
7745 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
7746 " \"dddeeeff\"\n"
7747 " \"f\");",
7748 format("someFunction(\"aaabbbcc dddeeefff\");",
7749 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007750}
7751
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007752TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00007753 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
7754 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007755 EXPECT_EQ("\"test\"\n"
7756 "\"\\n\"",
7757 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
7758 EXPECT_EQ("\"tes\\\\\"\n"
7759 "\"n\"",
7760 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
7761 EXPECT_EQ("\"\\\\\\\\\"\n"
7762 "\"\\n\"",
7763 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00007764 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007765 EXPECT_EQ("\"\\uff01\"\n"
7766 "\"test\"",
7767 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
7768 EXPECT_EQ("\"\\Uff01ff02\"",
7769 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
7770 EXPECT_EQ("\"\\x000000000001\"\n"
7771 "\"next\"",
7772 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
7773 EXPECT_EQ("\"\\x000000000001next\"",
7774 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
7775 EXPECT_EQ("\"\\x000000000001\"",
7776 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
7777 EXPECT_EQ("\"test\"\n"
7778 "\"\\000000\"\n"
7779 "\"000001\"",
7780 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
7781 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007782 "\"00000000\"\n"
7783 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007784 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007785}
7786
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00007787TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
7788 verifyFormat("void f() {\n"
7789 " return g() {}\n"
7790 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007791 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00007792 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00007793 "}");
7794}
7795
Manuel Klimek421147e2014-01-24 09:25:23 +00007796TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
7797 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00007798 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00007799}
7800
Manuel Klimek13b97d82013-05-13 08:42:42 +00007801TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
7802 verifyFormat("class X {\n"
7803 " void f() {\n"
7804 " }\n"
7805 "};",
7806 getLLVMStyleWithColumns(12));
7807}
7808
7809TEST_F(FormatTest, ConfigurableIndentWidth) {
7810 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
7811 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00007812 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00007813 verifyFormat("void f() {\n"
7814 " someFunction();\n"
7815 " if (true) {\n"
7816 " f();\n"
7817 " }\n"
7818 "}",
7819 EightIndent);
7820 verifyFormat("class X {\n"
7821 " void f() {\n"
7822 " }\n"
7823 "};",
7824 EightIndent);
7825 verifyFormat("int x[] = {\n"
7826 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007827 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00007828 EightIndent);
7829}
7830
Alexander Kornienko34a87e82013-06-22 01:35:36 +00007831TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00007832 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00007833 "f();",
7834 getLLVMStyleWithColumns(8));
7835}
7836
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007837TEST_F(FormatTest, ConfigurableUseOfTab) {
7838 FormatStyle Tab = getLLVMStyleWithColumns(42);
7839 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007840 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007841 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00007842
7843 EXPECT_EQ("if (aaaaaaaa && // q\n"
7844 " bb)\t\t// w\n"
7845 "\t;",
7846 format("if (aaaaaaaa &&// q\n"
7847 "bb)// w\n"
7848 ";",
7849 Tab));
7850 EXPECT_EQ("if (aaa && bbb) // w\n"
7851 "\t;",
7852 format("if(aaa&&bbb)// w\n"
7853 ";",
7854 Tab));
7855
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007856 verifyFormat("class X {\n"
7857 "\tvoid f() {\n"
7858 "\t\tsomeFunction(parameter1,\n"
7859 "\t\t\t parameter2);\n"
7860 "\t}\n"
7861 "};",
7862 Tab);
7863 verifyFormat("#define A \\\n"
7864 "\tvoid f() { \\\n"
7865 "\t\tsomeFunction( \\\n"
7866 "\t\t parameter1, \\\n"
7867 "\t\t parameter2); \\\n"
7868 "\t}",
7869 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00007870
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00007871 Tab.TabWidth = 4;
7872 Tab.IndentWidth = 8;
7873 verifyFormat("class TabWidth4Indent8 {\n"
7874 "\t\tvoid f() {\n"
7875 "\t\t\t\tsomeFunction(parameter1,\n"
7876 "\t\t\t\t\t\t\t parameter2);\n"
7877 "\t\t}\n"
7878 "};",
7879 Tab);
7880
7881 Tab.TabWidth = 4;
7882 Tab.IndentWidth = 4;
7883 verifyFormat("class TabWidth4Indent4 {\n"
7884 "\tvoid f() {\n"
7885 "\t\tsomeFunction(parameter1,\n"
7886 "\t\t\t\t\t parameter2);\n"
7887 "\t}\n"
7888 "};",
7889 Tab);
7890
7891 Tab.TabWidth = 8;
7892 Tab.IndentWidth = 4;
7893 verifyFormat("class TabWidth8Indent4 {\n"
7894 " void f() {\n"
7895 "\tsomeFunction(parameter1,\n"
7896 "\t\t parameter2);\n"
7897 " }\n"
7898 "};",
7899 Tab);
7900
Alexander Kornienko39856b72013-09-10 09:38:25 +00007901 Tab.TabWidth = 8;
7902 Tab.IndentWidth = 8;
7903 EXPECT_EQ("/*\n"
7904 "\t a\t\tcomment\n"
7905 "\t in multiple lines\n"
7906 " */",
7907 format(" /*\t \t \n"
7908 " \t \t a\t\tcomment\t \t\n"
7909 " \t \t in multiple lines\t\n"
7910 " \t */",
7911 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00007912
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007913 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00007914 verifyFormat("{\n"
7915 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7916 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7917 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7918 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7919 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7920 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00007921 "};",
7922 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00007923 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00007924 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00007925 "\ta2,\n"
7926 "\ta3\n"
7927 "};",
7928 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007929 EXPECT_EQ("if (aaaaaaaa && // q\n"
7930 " bb) // w\n"
7931 "\t;",
7932 format("if (aaaaaaaa &&// q\n"
7933 "bb)// w\n"
7934 ";",
7935 Tab));
7936 verifyFormat("class X {\n"
7937 "\tvoid f() {\n"
7938 "\t\tsomeFunction(parameter1,\n"
7939 "\t\t parameter2);\n"
7940 "\t}\n"
7941 "};",
7942 Tab);
7943 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00007944 "\tQ(\n"
7945 "\t {\n"
7946 "\t\t int a;\n"
7947 "\t\t someFunction(aaaaaaaa,\n"
7948 "\t\t bbbbbbb);\n"
7949 "\t },\n"
7950 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007951 "}",
7952 Tab);
7953 EXPECT_EQ("{\n"
7954 "\t/* aaaa\n"
7955 "\t bbbb */\n"
7956 "}",
7957 format("{\n"
7958 "/* aaaa\n"
7959 " bbbb */\n"
7960 "}",
7961 Tab));
7962 EXPECT_EQ("{\n"
7963 "\t/*\n"
7964 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7965 "\t bbbbbbbbbbbbb\n"
7966 "\t*/\n"
7967 "}",
7968 format("{\n"
7969 "/*\n"
7970 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7971 "*/\n"
7972 "}",
7973 Tab));
7974 EXPECT_EQ("{\n"
7975 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7976 "\t// bbbbbbbbbbbbb\n"
7977 "}",
7978 format("{\n"
7979 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7980 "}",
7981 Tab));
7982 EXPECT_EQ("{\n"
7983 "\t/*\n"
7984 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7985 "\t bbbbbbbbbbbbb\n"
7986 "\t*/\n"
7987 "}",
7988 format("{\n"
7989 "\t/*\n"
7990 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7991 "\t*/\n"
7992 "}",
7993 Tab));
7994 EXPECT_EQ("{\n"
7995 "\t/*\n"
7996 "\n"
7997 "\t*/\n"
7998 "}",
7999 format("{\n"
8000 "\t/*\n"
8001 "\n"
8002 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008003 "}",
8004 Tab));
8005 EXPECT_EQ("{\n"
8006 "\t/*\n"
8007 " asdf\n"
8008 "\t*/\n"
8009 "}",
8010 format("{\n"
8011 "\t/*\n"
8012 " asdf\n"
8013 "\t*/\n"
8014 "}",
8015 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008016
8017 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008018 EXPECT_EQ("/*\n"
8019 " a\t\tcomment\n"
8020 " in multiple lines\n"
8021 " */",
8022 format(" /*\t \t \n"
8023 " \t \t a\t\tcomment\t \t\n"
8024 " \t \t in multiple lines\t\n"
8025 " \t */",
8026 Tab));
8027 EXPECT_EQ("/* some\n"
8028 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008029 format(" \t \t /* some\n"
8030 " \t \t comment */",
8031 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008032 EXPECT_EQ("int a; /* some\n"
8033 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008034 format(" \t \t int a; /* some\n"
8035 " \t \t comment */",
8036 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008037
Alexander Kornienko39856b72013-09-10 09:38:25 +00008038 EXPECT_EQ("int a; /* some\n"
8039 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008040 format(" \t \t int\ta; /* some\n"
8041 " \t \t comment */",
8042 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008043 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8044 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008045 format(" \t \t f(\"\t\t\"); /* some\n"
8046 " \t \t comment */",
8047 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008048 EXPECT_EQ("{\n"
8049 " /*\n"
8050 " * Comment\n"
8051 " */\n"
8052 " int i;\n"
8053 "}",
8054 format("{\n"
8055 "\t/*\n"
8056 "\t * Comment\n"
8057 "\t */\n"
8058 "\t int i;\n"
8059 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008060
8061 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8062 Tab.TabWidth = 8;
8063 Tab.IndentWidth = 8;
8064 EXPECT_EQ("if (aaaaaaaa && // q\n"
8065 " bb) // w\n"
8066 "\t;",
8067 format("if (aaaaaaaa &&// q\n"
8068 "bb)// w\n"
8069 ";",
8070 Tab));
8071 EXPECT_EQ("if (aaa && bbb) // w\n"
8072 "\t;",
8073 format("if(aaa&&bbb)// w\n"
8074 ";",
8075 Tab));
8076 verifyFormat("class X {\n"
8077 "\tvoid f() {\n"
8078 "\t\tsomeFunction(parameter1,\n"
8079 "\t\t\t parameter2);\n"
8080 "\t}\n"
8081 "};",
8082 Tab);
8083 verifyFormat("#define A \\\n"
8084 "\tvoid f() { \\\n"
8085 "\t\tsomeFunction( \\\n"
8086 "\t\t parameter1, \\\n"
8087 "\t\t parameter2); \\\n"
8088 "\t}",
8089 Tab);
8090 Tab.TabWidth = 4;
8091 Tab.IndentWidth = 8;
8092 verifyFormat("class TabWidth4Indent8 {\n"
8093 "\t\tvoid f() {\n"
8094 "\t\t\t\tsomeFunction(parameter1,\n"
8095 "\t\t\t\t\t\t\t parameter2);\n"
8096 "\t\t}\n"
8097 "};",
8098 Tab);
8099 Tab.TabWidth = 4;
8100 Tab.IndentWidth = 4;
8101 verifyFormat("class TabWidth4Indent4 {\n"
8102 "\tvoid f() {\n"
8103 "\t\tsomeFunction(parameter1,\n"
8104 "\t\t\t\t\t parameter2);\n"
8105 "\t}\n"
8106 "};",
8107 Tab);
8108 Tab.TabWidth = 8;
8109 Tab.IndentWidth = 4;
8110 verifyFormat("class TabWidth8Indent4 {\n"
8111 " void f() {\n"
8112 "\tsomeFunction(parameter1,\n"
8113 "\t\t parameter2);\n"
8114 " }\n"
8115 "};",
8116 Tab);
8117 Tab.TabWidth = 8;
8118 Tab.IndentWidth = 8;
8119 EXPECT_EQ("/*\n"
8120 "\t a\t\tcomment\n"
8121 "\t in multiple lines\n"
8122 " */",
8123 format(" /*\t \t \n"
8124 " \t \t a\t\tcomment\t \t\n"
8125 " \t \t in multiple lines\t\n"
8126 " \t */",
8127 Tab));
8128 verifyFormat("{\n"
8129 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8130 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8131 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8132 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8133 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8134 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8135 "};",
8136 Tab);
8137 verifyFormat("enum AA {\n"
8138 "\ta1, // Force multiple lines\n"
8139 "\ta2,\n"
8140 "\ta3\n"
8141 "};",
8142 Tab);
8143 EXPECT_EQ("if (aaaaaaaa && // q\n"
8144 " bb) // w\n"
8145 "\t;",
8146 format("if (aaaaaaaa &&// q\n"
8147 "bb)// w\n"
8148 ";",
8149 Tab));
8150 verifyFormat("class X {\n"
8151 "\tvoid f() {\n"
8152 "\t\tsomeFunction(parameter1,\n"
8153 "\t\t\t parameter2);\n"
8154 "\t}\n"
8155 "};",
8156 Tab);
8157 verifyFormat("{\n"
8158 "\tQ(\n"
8159 "\t {\n"
8160 "\t\t int a;\n"
8161 "\t\t someFunction(aaaaaaaa,\n"
8162 "\t\t\t\t bbbbbbb);\n"
8163 "\t },\n"
8164 "\t p);\n"
8165 "}",
8166 Tab);
8167 EXPECT_EQ("{\n"
8168 "\t/* aaaa\n"
8169 "\t bbbb */\n"
8170 "}",
8171 format("{\n"
8172 "/* aaaa\n"
8173 " bbbb */\n"
8174 "}",
8175 Tab));
8176 EXPECT_EQ("{\n"
8177 "\t/*\n"
8178 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8179 "\t bbbbbbbbbbbbb\n"
8180 "\t*/\n"
8181 "}",
8182 format("{\n"
8183 "/*\n"
8184 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8185 "*/\n"
8186 "}",
8187 Tab));
8188 EXPECT_EQ("{\n"
8189 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8190 "\t// bbbbbbbbbbbbb\n"
8191 "}",
8192 format("{\n"
8193 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8194 "}",
8195 Tab));
8196 EXPECT_EQ("{\n"
8197 "\t/*\n"
8198 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8199 "\t bbbbbbbbbbbbb\n"
8200 "\t*/\n"
8201 "}",
8202 format("{\n"
8203 "\t/*\n"
8204 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8205 "\t*/\n"
8206 "}",
8207 Tab));
8208 EXPECT_EQ("{\n"
8209 "\t/*\n"
8210 "\n"
8211 "\t*/\n"
8212 "}",
8213 format("{\n"
8214 "\t/*\n"
8215 "\n"
8216 "\t*/\n"
8217 "}",
8218 Tab));
8219 EXPECT_EQ("{\n"
8220 "\t/*\n"
8221 " asdf\n"
8222 "\t*/\n"
8223 "}",
8224 format("{\n"
8225 "\t/*\n"
8226 " asdf\n"
8227 "\t*/\n"
8228 "}",
8229 Tab));
8230 EXPECT_EQ("/*\n"
8231 "\t a\t\tcomment\n"
8232 "\t in multiple lines\n"
8233 " */",
8234 format(" /*\t \t \n"
8235 " \t \t a\t\tcomment\t \t\n"
8236 " \t \t in multiple lines\t\n"
8237 " \t */",
8238 Tab));
8239 EXPECT_EQ("/* some\n"
8240 " comment */",
8241 format(" \t \t /* some\n"
8242 " \t \t comment */",
8243 Tab));
8244 EXPECT_EQ("int a; /* some\n"
8245 " comment */",
8246 format(" \t \t int a; /* some\n"
8247 " \t \t comment */",
8248 Tab));
8249 EXPECT_EQ("int a; /* some\n"
8250 "comment */",
8251 format(" \t \t int\ta; /* some\n"
8252 " \t \t comment */",
8253 Tab));
8254 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8255 " comment */",
8256 format(" \t \t f(\"\t\t\"); /* some\n"
8257 " \t \t comment */",
8258 Tab));
8259 EXPECT_EQ("{\n"
8260 " /*\n"
8261 " * Comment\n"
8262 " */\n"
8263 " int i;\n"
8264 "}",
8265 format("{\n"
8266 "\t/*\n"
8267 "\t * Comment\n"
8268 "\t */\n"
8269 "\t int i;\n"
8270 "}"));
8271 Tab.AlignConsecutiveAssignments = true;
8272 Tab.AlignConsecutiveDeclarations = true;
8273 Tab.TabWidth = 4;
8274 Tab.IndentWidth = 4;
8275 verifyFormat("class Assign {\n"
8276 "\tvoid f() {\n"
8277 "\t\tint x = 123;\n"
8278 "\t\tint random = 4;\n"
8279 "\t\tstd::string alphabet =\n"
8280 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8281 "\t}\n"
8282 "};",
8283 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008284}
8285
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008286TEST_F(FormatTest, CalculatesOriginalColumn) {
8287 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8288 "q\"; /* some\n"
8289 " comment */",
8290 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8291 "q\"; /* some\n"
8292 " comment */",
8293 getLLVMStyle()));
8294 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8295 "/* some\n"
8296 " comment */",
8297 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8298 " /* some\n"
8299 " comment */",
8300 getLLVMStyle()));
8301 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8302 "qqq\n"
8303 "/* some\n"
8304 " comment */",
8305 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8306 "qqq\n"
8307 " /* some\n"
8308 " comment */",
8309 getLLVMStyle()));
8310 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8311 "wwww; /* some\n"
8312 " comment */",
8313 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8314 "wwww; /* some\n"
8315 " comment */",
8316 getLLVMStyle()));
8317}
8318
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008319TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008320 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008321 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008322
8323 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008324 " continue;",
8325 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008326 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008327 " continue;",
8328 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008329 verifyFormat("if(true)\n"
8330 " f();\n"
8331 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008332 " f();",
8333 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008334 verifyFormat("do {\n"
8335 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008336 "} while(something());",
8337 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008338 verifyFormat("switch(x) {\n"
8339 "default:\n"
8340 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008341 "}",
8342 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008343 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008344 verifyFormat("size_t x = sizeof(x);", NoSpace);
8345 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8346 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8347 verifyFormat("alignas(128) char a[128];", NoSpace);
8348 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8349 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8350 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008351 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008352 verifyFormat("T A::operator()();", NoSpace);
8353 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008354
8355 FormatStyle Space = getLLVMStyle();
8356 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8357
8358 verifyFormat("int f ();", Space);
8359 verifyFormat("void f (int a, T b) {\n"
8360 " while (true)\n"
8361 " continue;\n"
8362 "}",
8363 Space);
8364 verifyFormat("if (true)\n"
8365 " f ();\n"
8366 "else if (true)\n"
8367 " f ();",
8368 Space);
8369 verifyFormat("do {\n"
8370 " do_something ();\n"
8371 "} while (something ());",
8372 Space);
8373 verifyFormat("switch (x) {\n"
8374 "default:\n"
8375 " break;\n"
8376 "}",
8377 Space);
8378 verifyFormat("A::A () : a (1) {}", Space);
8379 verifyFormat("void f () __attribute__ ((asdf));", Space);
8380 verifyFormat("*(&a + 1);\n"
8381 "&((&a)[1]);\n"
8382 "a[(b + c) * d];\n"
8383 "(((a + 1) * 2) + 3) * 4;",
8384 Space);
8385 verifyFormat("#define A(x) x", Space);
8386 verifyFormat("#define A (x) x", Space);
8387 verifyFormat("#if defined(x)\n"
8388 "#endif",
8389 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008390 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008391 verifyFormat("size_t x = sizeof (x);", Space);
8392 verifyFormat("auto f (int x) -> decltype (x);", Space);
8393 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8394 verifyFormat("alignas (128) char a[128];", Space);
8395 verifyFormat("size_t x = alignof (MyType);", Space);
8396 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8397 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008398 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008399 verifyFormat("T A::operator() ();", Space);
8400 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008401}
8402
8403TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8404 FormatStyle Spaces = getLLVMStyle();
8405
8406 Spaces.SpacesInParentheses = true;
8407 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008408 verifyFormat("call();", Spaces);
8409 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008410 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8411 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008412 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008413 " continue;",
8414 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008415 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008416 " continue;",
8417 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008418 verifyFormat("if ( true )\n"
8419 " f();\n"
8420 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008421 " f();",
8422 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008423 verifyFormat("do {\n"
8424 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008425 "} while ( something() );",
8426 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008427 verifyFormat("switch ( x ) {\n"
8428 "default:\n"
8429 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008430 "}",
8431 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008432
8433 Spaces.SpacesInParentheses = false;
8434 Spaces.SpacesInCStyleCastParentheses = true;
8435 verifyFormat("Type *A = ( Type * )P;", Spaces);
8436 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8437 verifyFormat("x = ( int32 )y;", Spaces);
8438 verifyFormat("int a = ( int )(2.0f);", Spaces);
8439 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8440 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8441 verifyFormat("#define x (( int )-1)", Spaces);
8442
Daniel Jasper92e09822015-03-18 12:59:19 +00008443 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008444 Spaces.SpacesInParentheses = false;
8445 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008446 Spaces.SpacesInCStyleCastParentheses = true;
8447 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008448 verifyFormat("call( );", Spaces);
8449 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008450 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008451 " continue;",
8452 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008453 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008454 " continue;",
8455 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008456 verifyFormat("if (true)\n"
8457 " f( );\n"
8458 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008459 " f( );",
8460 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008461 verifyFormat("do {\n"
8462 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008463 "} while (something( ));",
8464 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008465 verifyFormat("switch (x) {\n"
8466 "default:\n"
8467 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008468 "}",
8469 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008470
Daniel Jasper92e09822015-03-18 12:59:19 +00008471 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008472 Spaces.SpaceAfterCStyleCast = true;
8473 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008474 verifyFormat("call( );", Spaces);
8475 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008476 verifyFormat("while (( bool ) 1)\n"
8477 " continue;",
8478 Spaces);
8479 verifyFormat("for (;;)\n"
8480 " continue;",
8481 Spaces);
8482 verifyFormat("if (true)\n"
8483 " f( );\n"
8484 "else if (true)\n"
8485 " f( );",
8486 Spaces);
8487 verifyFormat("do {\n"
8488 " do_something(( int ) i);\n"
8489 "} while (something( ));",
8490 Spaces);
8491 verifyFormat("switch (x) {\n"
8492 "default:\n"
8493 " break;\n"
8494 "}",
8495 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008496
8497 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008498 Spaces.SpacesInCStyleCastParentheses = false;
8499 Spaces.SpaceAfterCStyleCast = true;
8500 verifyFormat("while ((bool) 1)\n"
8501 " continue;",
8502 Spaces);
8503 verifyFormat("do {\n"
8504 " do_something((int) i);\n"
8505 "} while (something( ));",
8506 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008507}
8508
Daniel Jasperad981f82014-08-26 11:41:14 +00008509TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8510 verifyFormat("int a[5];");
8511 verifyFormat("a[3] += 42;");
8512
8513 FormatStyle Spaces = getLLVMStyle();
8514 Spaces.SpacesInSquareBrackets = true;
8515 // Lambdas unchanged.
8516 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8517 verifyFormat("return [i, args...] {};", Spaces);
8518
8519 // Not lambdas.
8520 verifyFormat("int a[ 5 ];", Spaces);
8521 verifyFormat("a[ 3 ] += 42;", Spaces);
8522 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
8523 verifyFormat("double &operator[](int i) { return 0; }\n"
8524 "int i;",
8525 Spaces);
8526 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
8527 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
8528 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
8529}
8530
Daniel Jasperd94bff32013-09-25 15:15:02 +00008531TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
8532 verifyFormat("int a = 5;");
8533 verifyFormat("a += 42;");
8534 verifyFormat("a or_eq 8;");
8535
8536 FormatStyle Spaces = getLLVMStyle();
8537 Spaces.SpaceBeforeAssignmentOperators = false;
8538 verifyFormat("int a= 5;", Spaces);
8539 verifyFormat("a+= 42;", Spaces);
8540 verifyFormat("a or_eq 8;", Spaces);
8541}
8542
Daniel Jaspera44991332015-04-29 13:06:49 +00008543TEST_F(FormatTest, AlignConsecutiveAssignments) {
8544 FormatStyle Alignment = getLLVMStyle();
8545 Alignment.AlignConsecutiveAssignments = false;
8546 verifyFormat("int a = 5;\n"
8547 "int oneTwoThree = 123;",
8548 Alignment);
8549 verifyFormat("int a = 5;\n"
8550 "int oneTwoThree = 123;",
8551 Alignment);
8552
8553 Alignment.AlignConsecutiveAssignments = true;
8554 verifyFormat("int a = 5;\n"
8555 "int oneTwoThree = 123;",
8556 Alignment);
8557 verifyFormat("int a = method();\n"
8558 "int oneTwoThree = 133;",
8559 Alignment);
8560 verifyFormat("a &= 5;\n"
8561 "bcd *= 5;\n"
8562 "ghtyf += 5;\n"
8563 "dvfvdb -= 5;\n"
8564 "a /= 5;\n"
8565 "vdsvsv %= 5;\n"
8566 "sfdbddfbdfbb ^= 5;\n"
8567 "dvsdsv |= 5;\n"
8568 "int dsvvdvsdvvv = 123;",
8569 Alignment);
8570 verifyFormat("int i = 1, j = 10;\n"
8571 "something = 2000;",
8572 Alignment);
8573 verifyFormat("something = 2000;\n"
8574 "int i = 1, j = 10;\n",
8575 Alignment);
8576 verifyFormat("something = 2000;\n"
8577 "another = 911;\n"
8578 "int i = 1, j = 10;\n"
8579 "oneMore = 1;\n"
8580 "i = 2;",
8581 Alignment);
8582 verifyFormat("int a = 5;\n"
8583 "int one = 1;\n"
8584 "method();\n"
8585 "int oneTwoThree = 123;\n"
8586 "int oneTwo = 12;",
8587 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00008588 verifyFormat("int oneTwoThree = 123;\n"
8589 "int oneTwo = 12;\n"
8590 "method();\n",
8591 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008592 verifyFormat("int oneTwoThree = 123; // comment\n"
8593 "int oneTwo = 12; // comment",
8594 Alignment);
8595 EXPECT_EQ("int a = 5;\n"
8596 "\n"
8597 "int oneTwoThree = 123;",
8598 format("int a = 5;\n"
8599 "\n"
8600 "int oneTwoThree= 123;",
8601 Alignment));
8602 EXPECT_EQ("int a = 5;\n"
8603 "int one = 1;\n"
8604 "\n"
8605 "int oneTwoThree = 123;",
8606 format("int a = 5;\n"
8607 "int one = 1;\n"
8608 "\n"
8609 "int oneTwoThree = 123;",
8610 Alignment));
8611 EXPECT_EQ("int a = 5;\n"
8612 "int one = 1;\n"
8613 "\n"
8614 "int oneTwoThree = 123;\n"
8615 "int oneTwo = 12;",
8616 format("int a = 5;\n"
8617 "int one = 1;\n"
8618 "\n"
8619 "int oneTwoThree = 123;\n"
8620 "int oneTwo = 12;",
8621 Alignment));
8622 Alignment.AlignEscapedNewlinesLeft = true;
8623 verifyFormat("#define A \\\n"
8624 " int aaaa = 12; \\\n"
8625 " int b = 23; \\\n"
8626 " int ccc = 234; \\\n"
8627 " int dddddddddd = 2345;",
8628 Alignment);
8629 Alignment.AlignEscapedNewlinesLeft = false;
8630 verifyFormat("#define A "
8631 " \\\n"
8632 " int aaaa = 12; "
8633 " \\\n"
8634 " int b = 23; "
8635 " \\\n"
8636 " int ccc = 234; "
8637 " \\\n"
8638 " int dddddddddd = 2345;",
8639 Alignment);
8640 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8641 "k = 4, int l = 5,\n"
8642 " int m = 6) {\n"
8643 " int j = 10;\n"
8644 " otherThing = 1;\n"
8645 "}",
8646 Alignment);
8647 verifyFormat("void SomeFunction(int parameter = 0) {\n"
8648 " int i = 1;\n"
8649 " int j = 2;\n"
8650 " int big = 10000;\n"
8651 "}",
8652 Alignment);
8653 verifyFormat("class C {\n"
8654 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00008655 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008656 " virtual void f() = 0;\n"
8657 "};",
8658 Alignment);
8659 verifyFormat("int i = 1;\n"
8660 "if (SomeType t = getSomething()) {\n"
8661 "}\n"
8662 "int j = 2;\n"
8663 "int big = 10000;",
8664 Alignment);
8665 verifyFormat("int j = 7;\n"
8666 "for (int k = 0; k < N; ++k) {\n"
8667 "}\n"
8668 "int j = 2;\n"
8669 "int big = 10000;\n"
8670 "}",
8671 Alignment);
8672 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8673 verifyFormat("int i = 1;\n"
8674 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8675 " = someLooooooooooooooooongFunction();\n"
8676 "int j = 2;",
8677 Alignment);
8678 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8679 verifyFormat("int i = 1;\n"
8680 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8681 " someLooooooooooooooooongFunction();\n"
8682 "int j = 2;",
8683 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00008684
8685 verifyFormat("auto lambda = []() {\n"
8686 " auto i = 0;\n"
8687 " return 0;\n"
8688 "};\n"
8689 "int i = 0;\n"
8690 "auto v = type{\n"
8691 " i = 1, //\n"
8692 " (i = 2), //\n"
8693 " i = 3 //\n"
8694 "};",
8695 Alignment);
8696
Daniel Jaspera44991332015-04-29 13:06:49 +00008697 // FIXME: Should align all three assignments
8698 verifyFormat(
8699 "int i = 1;\n"
8700 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
8701 " loooooooooooooooooooooongParameterB);\n"
8702 "int j = 2;",
8703 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00008704
8705 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
8706 " typename B = very_long_type_name_1,\n"
8707 " typename T_2 = very_long_type_name_2>\n"
8708 "auto foo() {}\n",
8709 Alignment);
8710 verifyFormat("int a, b = 1;\n"
8711 "int c = 2;\n"
8712 "int dd = 3;\n",
8713 Alignment);
8714 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8715 "float b[1][] = {{3.f}};\n",
8716 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008717}
8718
Daniel Jaspere12597c2015-10-01 10:06:54 +00008719TEST_F(FormatTest, AlignConsecutiveDeclarations) {
8720 FormatStyle Alignment = getLLVMStyle();
8721 Alignment.AlignConsecutiveDeclarations = false;
8722 verifyFormat("float const a = 5;\n"
8723 "int oneTwoThree = 123;",
8724 Alignment);
8725 verifyFormat("int a = 5;\n"
8726 "float const oneTwoThree = 123;",
8727 Alignment);
8728
8729 Alignment.AlignConsecutiveDeclarations = true;
8730 verifyFormat("float const a = 5;\n"
8731 "int oneTwoThree = 123;",
8732 Alignment);
8733 verifyFormat("int a = method();\n"
8734 "float const oneTwoThree = 133;",
8735 Alignment);
8736 verifyFormat("int i = 1, j = 10;\n"
8737 "something = 2000;",
8738 Alignment);
8739 verifyFormat("something = 2000;\n"
8740 "int i = 1, j = 10;\n",
8741 Alignment);
8742 verifyFormat("float something = 2000;\n"
8743 "double another = 911;\n"
8744 "int i = 1, j = 10;\n"
8745 "const int *oneMore = 1;\n"
8746 "unsigned i = 2;",
8747 Alignment);
8748 verifyFormat("float a = 5;\n"
8749 "int one = 1;\n"
8750 "method();\n"
8751 "const double oneTwoThree = 123;\n"
8752 "const unsigned int oneTwo = 12;",
8753 Alignment);
8754 verifyFormat("int oneTwoThree{0}; // comment\n"
8755 "unsigned oneTwo; // comment",
8756 Alignment);
8757 EXPECT_EQ("float const a = 5;\n"
8758 "\n"
8759 "int oneTwoThree = 123;",
8760 format("float const a = 5;\n"
8761 "\n"
8762 "int oneTwoThree= 123;",
8763 Alignment));
8764 EXPECT_EQ("float a = 5;\n"
8765 "int one = 1;\n"
8766 "\n"
8767 "unsigned oneTwoThree = 123;",
8768 format("float a = 5;\n"
8769 "int one = 1;\n"
8770 "\n"
8771 "unsigned oneTwoThree = 123;",
8772 Alignment));
8773 EXPECT_EQ("float a = 5;\n"
8774 "int one = 1;\n"
8775 "\n"
8776 "unsigned oneTwoThree = 123;\n"
8777 "int oneTwo = 12;",
8778 format("float a = 5;\n"
8779 "int one = 1;\n"
8780 "\n"
8781 "unsigned oneTwoThree = 123;\n"
8782 "int oneTwo = 12;",
8783 Alignment));
8784 Alignment.AlignConsecutiveAssignments = true;
8785 verifyFormat("float something = 2000;\n"
8786 "double another = 911;\n"
8787 "int i = 1, j = 10;\n"
8788 "const int *oneMore = 1;\n"
8789 "unsigned i = 2;",
8790 Alignment);
8791 verifyFormat("int oneTwoThree = {0}; // comment\n"
8792 "unsigned oneTwo = 0; // comment",
8793 Alignment);
8794 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
8795 " int const i = 1;\n"
8796 " int * j = 2;\n"
8797 " int big = 10000;\n"
8798 "\n"
8799 " unsigned oneTwoThree = 123;\n"
8800 " int oneTwo = 12;\n"
8801 " method();\n"
8802 " float k = 2;\n"
8803 " int ll = 10000;\n"
8804 "}",
8805 format("void SomeFunction(int parameter= 0) {\n"
8806 " int const i= 1;\n"
8807 " int *j=2;\n"
8808 " int big = 10000;\n"
8809 "\n"
8810 "unsigned oneTwoThree =123;\n"
8811 "int oneTwo = 12;\n"
8812 " method();\n"
8813 "float k= 2;\n"
8814 "int ll=10000;\n"
8815 "}",
8816 Alignment));
8817 Alignment.AlignConsecutiveAssignments = false;
8818 Alignment.AlignEscapedNewlinesLeft = true;
8819 verifyFormat("#define A \\\n"
8820 " int aaaa = 12; \\\n"
8821 " float b = 23; \\\n"
8822 " const int ccc = 234; \\\n"
8823 " unsigned dddddddddd = 2345;",
8824 Alignment);
8825 Alignment.AlignEscapedNewlinesLeft = false;
8826 Alignment.ColumnLimit = 30;
8827 verifyFormat("#define A \\\n"
8828 " int aaaa = 12; \\\n"
8829 " float b = 23; \\\n"
8830 " const int ccc = 234; \\\n"
8831 " int dddddddddd = 2345;",
8832 Alignment);
8833 Alignment.ColumnLimit = 80;
8834 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8835 "k = 4, int l = 5,\n"
8836 " int m = 6) {\n"
8837 " const int j = 10;\n"
8838 " otherThing = 1;\n"
8839 "}",
8840 Alignment);
8841 verifyFormat("void SomeFunction(int parameter = 0) {\n"
8842 " int const i = 1;\n"
8843 " int * j = 2;\n"
8844 " int big = 10000;\n"
8845 "}",
8846 Alignment);
8847 verifyFormat("class C {\n"
8848 "public:\n"
8849 " int i = 1;\n"
8850 " virtual void f() = 0;\n"
8851 "};",
8852 Alignment);
8853 verifyFormat("float i = 1;\n"
8854 "if (SomeType t = getSomething()) {\n"
8855 "}\n"
8856 "const unsigned j = 2;\n"
8857 "int big = 10000;",
8858 Alignment);
8859 verifyFormat("float j = 7;\n"
8860 "for (int k = 0; k < N; ++k) {\n"
8861 "}\n"
8862 "unsigned j = 2;\n"
8863 "int big = 10000;\n"
8864 "}",
8865 Alignment);
8866 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8867 verifyFormat("float i = 1;\n"
8868 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8869 " = someLooooooooooooooooongFunction();\n"
8870 "int j = 2;",
8871 Alignment);
8872 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8873 verifyFormat("int i = 1;\n"
8874 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8875 " someLooooooooooooooooongFunction();\n"
8876 "int j = 2;",
8877 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00008878
8879 Alignment.AlignConsecutiveAssignments = true;
8880 verifyFormat("auto lambda = []() {\n"
8881 " auto ii = 0;\n"
8882 " float j = 0;\n"
8883 " return 0;\n"
8884 "};\n"
8885 "int i = 0;\n"
8886 "float i2 = 0;\n"
8887 "auto v = type{\n"
8888 " i = 1, //\n"
8889 " (i = 2), //\n"
8890 " i = 3 //\n"
8891 "};",
8892 Alignment);
8893 Alignment.AlignConsecutiveAssignments = false;
8894
Daniel Jaspere12597c2015-10-01 10:06:54 +00008895 // FIXME: Should align all three declarations
8896 verifyFormat(
8897 "int i = 1;\n"
8898 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
8899 " loooooooooooooooooooooongParameterB);\n"
8900 "int j = 2;",
8901 Alignment);
8902
8903 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
8904 // We expect declarations and assignments to align, as long as it doesn't
8905 // exceed the column limit, starting a new alignemnt sequence whenever it
8906 // happens.
8907 Alignment.AlignConsecutiveAssignments = true;
8908 Alignment.ColumnLimit = 30;
8909 verifyFormat("float ii = 1;\n"
8910 "unsigned j = 2;\n"
8911 "int someVerylongVariable = 1;\n"
8912 "AnotherLongType ll = 123456;\n"
8913 "VeryVeryLongType k = 2;\n"
8914 "int myvar = 1;",
8915 Alignment);
8916 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00008917 Alignment.AlignConsecutiveAssignments = false;
8918
8919 verifyFormat(
8920 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
8921 " typename LongType, typename B>\n"
8922 "auto foo() {}\n",
8923 Alignment);
8924 verifyFormat("float a, b = 1;\n"
8925 "int c = 2;\n"
8926 "int dd = 3;\n",
8927 Alignment);
8928 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8929 "float b[1][] = {{3.f}};\n",
8930 Alignment);
8931 Alignment.AlignConsecutiveAssignments = true;
8932 verifyFormat("float a, b = 1;\n"
8933 "int c = 2;\n"
8934 "int dd = 3;\n",
8935 Alignment);
8936 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8937 "float b[1][] = {{3.f}};\n",
8938 Alignment);
8939 Alignment.AlignConsecutiveAssignments = false;
8940
8941 Alignment.ColumnLimit = 30;
8942 Alignment.BinPackParameters = false;
8943 verifyFormat("void foo(float a,\n"
8944 " float b,\n"
8945 " int c,\n"
8946 " uint32_t *d) {\n"
8947 " int * e = 0;\n"
8948 " float f = 0;\n"
8949 " double g = 0;\n"
8950 "}\n"
8951 "void bar(ino_t a,\n"
8952 " int b,\n"
8953 " uint32_t *c,\n"
8954 " bool d) {}\n",
8955 Alignment);
8956 Alignment.BinPackParameters = true;
8957 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00008958}
8959
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008960TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008961 FormatStyle LinuxBraceStyle = getLLVMStyle();
8962 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008963 verifyFormat("namespace a\n"
8964 "{\n"
8965 "class A\n"
8966 "{\n"
8967 " void f()\n"
8968 " {\n"
8969 " if (true) {\n"
8970 " a();\n"
8971 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00008972 " } else {\n"
8973 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008974 " }\n"
8975 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008976 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008977 "};\n"
8978 "struct B {\n"
8979 " int x;\n"
8980 "};\n"
8981 "}\n",
8982 LinuxBraceStyle);
8983 verifyFormat("enum X {\n"
8984 " Y = 0,\n"
8985 "}\n",
8986 LinuxBraceStyle);
8987 verifyFormat("struct S {\n"
8988 " int Type;\n"
8989 " union {\n"
8990 " int x;\n"
8991 " double y;\n"
8992 " } Value;\n"
8993 " class C\n"
8994 " {\n"
8995 " MyFavoriteType Value;\n"
8996 " } Class;\n"
8997 "}\n",
8998 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008999}
9000
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009001TEST_F(FormatTest, MozillaBraceBreaking) {
9002 FormatStyle MozillaBraceStyle = getLLVMStyle();
9003 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
9004 verifyFormat("namespace a {\n"
9005 "class A\n"
9006 "{\n"
9007 " void f()\n"
9008 " {\n"
9009 " if (true) {\n"
9010 " a();\n"
9011 " b();\n"
9012 " }\n"
9013 " }\n"
9014 " void g() { return; }\n"
9015 "};\n"
9016 "enum E\n"
9017 "{\n"
9018 " A,\n"
9019 " // foo\n"
9020 " B,\n"
9021 " C\n"
9022 "};\n"
9023 "struct B\n"
9024 "{\n"
9025 " int x;\n"
9026 "};\n"
9027 "}\n",
9028 MozillaBraceStyle);
9029 verifyFormat("struct S\n"
9030 "{\n"
9031 " int Type;\n"
9032 " union\n"
9033 " {\n"
9034 " int x;\n"
9035 " double y;\n"
9036 " } Value;\n"
9037 " class C\n"
9038 " {\n"
9039 " MyFavoriteType Value;\n"
9040 " } Class;\n"
9041 "}\n",
9042 MozillaBraceStyle);
9043}
9044
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009045TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009046 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9047 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009048 verifyFormat("namespace a {\n"
9049 "class A {\n"
9050 " void f()\n"
9051 " {\n"
9052 " if (true) {\n"
9053 " a();\n"
9054 " b();\n"
9055 " }\n"
9056 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009057 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009058 "};\n"
9059 "struct B {\n"
9060 " int x;\n"
9061 "};\n"
9062 "}\n",
9063 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009064
Daniel Jasperd9670872014-08-05 12:06:20 +00009065 verifyFormat("void foo()\n"
9066 "{\n"
9067 " if (a) {\n"
9068 " a();\n"
9069 " }\n"
9070 " else {\n"
9071 " b();\n"
9072 " }\n"
9073 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009074 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009075
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009076 verifyFormat("#ifdef _DEBUG\n"
9077 "int foo(int i = 0)\n"
9078 "#else\n"
9079 "int foo(int i = 5)\n"
9080 "#endif\n"
9081 "{\n"
9082 " return i;\n"
9083 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009084 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009085
9086 verifyFormat("void foo() {}\n"
9087 "void bar()\n"
9088 "#ifdef _DEBUG\n"
9089 "{\n"
9090 " foo();\n"
9091 "}\n"
9092 "#else\n"
9093 "{\n"
9094 "}\n"
9095 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009096 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009097
9098 verifyFormat("void foobar() { int i = 5; }\n"
9099 "#ifdef _DEBUG\n"
9100 "void bar() {}\n"
9101 "#else\n"
9102 "void bar() { foobar(); }\n"
9103 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009104 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009105}
9106
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009107TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009108 FormatStyle AllmanBraceStyle = getLLVMStyle();
9109 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009110 verifyFormat("namespace a\n"
9111 "{\n"
9112 "class A\n"
9113 "{\n"
9114 " void f()\n"
9115 " {\n"
9116 " if (true)\n"
9117 " {\n"
9118 " a();\n"
9119 " b();\n"
9120 " }\n"
9121 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009122 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009123 "};\n"
9124 "struct B\n"
9125 "{\n"
9126 " int x;\n"
9127 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009128 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009129 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009130
9131 verifyFormat("void f()\n"
9132 "{\n"
9133 " if (true)\n"
9134 " {\n"
9135 " a();\n"
9136 " }\n"
9137 " else if (false)\n"
9138 " {\n"
9139 " b();\n"
9140 " }\n"
9141 " else\n"
9142 " {\n"
9143 " c();\n"
9144 " }\n"
9145 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009146 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009147
9148 verifyFormat("void f()\n"
9149 "{\n"
9150 " for (int i = 0; i < 10; ++i)\n"
9151 " {\n"
9152 " a();\n"
9153 " }\n"
9154 " while (false)\n"
9155 " {\n"
9156 " b();\n"
9157 " }\n"
9158 " do\n"
9159 " {\n"
9160 " c();\n"
9161 " } while (false)\n"
9162 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009163 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009164
9165 verifyFormat("void f(int a)\n"
9166 "{\n"
9167 " switch (a)\n"
9168 " {\n"
9169 " case 0:\n"
9170 " break;\n"
9171 " case 1:\n"
9172 " {\n"
9173 " break;\n"
9174 " }\n"
9175 " case 2:\n"
9176 " {\n"
9177 " }\n"
9178 " break;\n"
9179 " default:\n"
9180 " break;\n"
9181 " }\n"
9182 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009183 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009184
9185 verifyFormat("enum X\n"
9186 "{\n"
9187 " Y = 0,\n"
9188 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009189 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009190 verifyFormat("enum X\n"
9191 "{\n"
9192 " Y = 0\n"
9193 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009194 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009195
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009196 verifyFormat("@interface BSApplicationController ()\n"
9197 "{\n"
9198 "@private\n"
9199 " id _extraIvar;\n"
9200 "}\n"
9201 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009202 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009203
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009204 verifyFormat("#ifdef _DEBUG\n"
9205 "int foo(int i = 0)\n"
9206 "#else\n"
9207 "int foo(int i = 5)\n"
9208 "#endif\n"
9209 "{\n"
9210 " return i;\n"
9211 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009212 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009213
9214 verifyFormat("void foo() {}\n"
9215 "void bar()\n"
9216 "#ifdef _DEBUG\n"
9217 "{\n"
9218 " foo();\n"
9219 "}\n"
9220 "#else\n"
9221 "{\n"
9222 "}\n"
9223 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009224 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009225
9226 verifyFormat("void foobar() { int i = 5; }\n"
9227 "#ifdef _DEBUG\n"
9228 "void bar() {}\n"
9229 "#else\n"
9230 "void bar() { foobar(); }\n"
9231 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009232 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009233
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009234 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009235 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009236 " // ...\n"
9237 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009238 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009239 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009240 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009241 " // ...\n"
9242 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009243 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009244 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009245 // .. or dict literals.
9246 verifyFormat("void f()\n"
9247 "{\n"
9248 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
9249 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009250 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009251 verifyFormat("int f()\n"
9252 "{ // comment\n"
9253 " return 42;\n"
9254 "}",
9255 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009256
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009257 AllmanBraceStyle.ColumnLimit = 19;
9258 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9259 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009260 verifyFormat("void f()\n"
9261 "{\n"
9262 " int i;\n"
9263 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009264 AllmanBraceStyle);
9265 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009266
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009267 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009268 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9269 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9270 verifyFormat("void f(bool b)\n"
9271 "{\n"
9272 " if (b)\n"
9273 " {\n"
9274 " return;\n"
9275 " }\n"
9276 "}\n",
9277 BreakBeforeBraceShortIfs);
9278 verifyFormat("void f(bool b)\n"
9279 "{\n"
9280 " if (b) return;\n"
9281 "}\n",
9282 BreakBeforeBraceShortIfs);
9283 verifyFormat("void f(bool b)\n"
9284 "{\n"
9285 " while (b)\n"
9286 " {\n"
9287 " return;\n"
9288 " }\n"
9289 "}\n",
9290 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009291}
9292
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009293TEST_F(FormatTest, GNUBraceBreaking) {
9294 FormatStyle GNUBraceStyle = getLLVMStyle();
9295 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9296 verifyFormat("namespace a\n"
9297 "{\n"
9298 "class A\n"
9299 "{\n"
9300 " void f()\n"
9301 " {\n"
9302 " int a;\n"
9303 " {\n"
9304 " int b;\n"
9305 " }\n"
9306 " if (true)\n"
9307 " {\n"
9308 " a();\n"
9309 " b();\n"
9310 " }\n"
9311 " }\n"
9312 " void g() { return; }\n"
9313 "}\n"
9314 "}",
9315 GNUBraceStyle);
9316
9317 verifyFormat("void f()\n"
9318 "{\n"
9319 " if (true)\n"
9320 " {\n"
9321 " a();\n"
9322 " }\n"
9323 " else if (false)\n"
9324 " {\n"
9325 " b();\n"
9326 " }\n"
9327 " else\n"
9328 " {\n"
9329 " c();\n"
9330 " }\n"
9331 "}\n",
9332 GNUBraceStyle);
9333
9334 verifyFormat("void f()\n"
9335 "{\n"
9336 " for (int i = 0; i < 10; ++i)\n"
9337 " {\n"
9338 " a();\n"
9339 " }\n"
9340 " while (false)\n"
9341 " {\n"
9342 " b();\n"
9343 " }\n"
9344 " do\n"
9345 " {\n"
9346 " c();\n"
9347 " }\n"
9348 " while (false);\n"
9349 "}\n",
9350 GNUBraceStyle);
9351
9352 verifyFormat("void f(int a)\n"
9353 "{\n"
9354 " switch (a)\n"
9355 " {\n"
9356 " case 0:\n"
9357 " break;\n"
9358 " case 1:\n"
9359 " {\n"
9360 " break;\n"
9361 " }\n"
9362 " case 2:\n"
9363 " {\n"
9364 " }\n"
9365 " break;\n"
9366 " default:\n"
9367 " break;\n"
9368 " }\n"
9369 "}\n",
9370 GNUBraceStyle);
9371
9372 verifyFormat("enum X\n"
9373 "{\n"
9374 " Y = 0,\n"
9375 "}\n",
9376 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009377
9378 verifyFormat("@interface BSApplicationController ()\n"
9379 "{\n"
9380 "@private\n"
9381 " id _extraIvar;\n"
9382 "}\n"
9383 "@end\n",
9384 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009385
9386 verifyFormat("#ifdef _DEBUG\n"
9387 "int foo(int i = 0)\n"
9388 "#else\n"
9389 "int foo(int i = 5)\n"
9390 "#endif\n"
9391 "{\n"
9392 " return i;\n"
9393 "}",
9394 GNUBraceStyle);
9395
9396 verifyFormat("void foo() {}\n"
9397 "void bar()\n"
9398 "#ifdef _DEBUG\n"
9399 "{\n"
9400 " foo();\n"
9401 "}\n"
9402 "#else\n"
9403 "{\n"
9404 "}\n"
9405 "#endif",
9406 GNUBraceStyle);
9407
9408 verifyFormat("void foobar() { int i = 5; }\n"
9409 "#ifdef _DEBUG\n"
9410 "void bar() {}\n"
9411 "#else\n"
9412 "void bar() { foobar(); }\n"
9413 "#endif",
9414 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009415}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009416
9417TEST_F(FormatTest, WebKitBraceBreaking) {
9418 FormatStyle WebKitBraceStyle = getLLVMStyle();
9419 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
9420 verifyFormat("namespace a {\n"
9421 "class A {\n"
9422 " void f()\n"
9423 " {\n"
9424 " if (true) {\n"
9425 " a();\n"
9426 " b();\n"
9427 " }\n"
9428 " }\n"
9429 " void g() { return; }\n"
9430 "};\n"
9431 "enum E {\n"
9432 " A,\n"
9433 " // foo\n"
9434 " B,\n"
9435 " C\n"
9436 "};\n"
9437 "struct B {\n"
9438 " int x;\n"
9439 "};\n"
9440 "}\n",
9441 WebKitBraceStyle);
9442 verifyFormat("struct S {\n"
9443 " int Type;\n"
9444 " union {\n"
9445 " int x;\n"
9446 " double y;\n"
9447 " } Value;\n"
9448 " class C {\n"
9449 " MyFavoriteType Value;\n"
9450 " } Class;\n"
9451 "};\n",
9452 WebKitBraceStyle);
9453}
9454
Manuel Klimekd5735502013-08-12 03:51:17 +00009455TEST_F(FormatTest, CatchExceptionReferenceBinding) {
9456 verifyFormat("void f() {\n"
9457 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00009458 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00009459 " }\n"
9460 "}\n",
9461 getLLVMStyle());
9462}
9463
Daniel Jasper9613c812013-08-07 16:29:23 +00009464TEST_F(FormatTest, UnderstandsPragmas) {
9465 verifyFormat("#pragma omp reduction(| : var)");
9466 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00009467
9468 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
9469 "(including parentheses).",
9470 format("#pragma mark Any non-hyphenated or hyphenated string "
9471 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +00009472}
9473
Daniel Jasperee4a8a12015-04-22 09:45:42 +00009474TEST_F(FormatTest, UnderstandPragmaOption) {
9475 verifyFormat("#pragma option -C -A");
9476
9477 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
9478}
9479
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009480#define EXPECT_ALL_STYLES_EQUAL(Styles) \
9481 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +00009482 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
9483 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +00009484
9485TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009486 SmallVector<FormatStyle, 3> Styles;
9487 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009488
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009489 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009490 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
9491 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
9492 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009493
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009494 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009495 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
9496 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
9497 EXPECT_ALL_STYLES_EQUAL(Styles);
9498
Nico Weber514ecc82014-02-02 20:50:45 +00009499 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009500 EXPECT_TRUE(
9501 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
9502 EXPECT_TRUE(
9503 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
9504 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009505
Nico Weber514ecc82014-02-02 20:50:45 +00009506 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009507 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
9508 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
9509 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009510
9511 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009512 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
9513 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
9514 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009515
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009516 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009517 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
9518 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
9519 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009520
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +00009521 Styles[0] = getGNUStyle();
9522 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
9523 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
9524 EXPECT_ALL_STYLES_EQUAL(Styles);
9525
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009526 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
9527}
9528
9529TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
9530 SmallVector<FormatStyle, 8> Styles;
9531 Styles.resize(2);
9532
9533 Styles[0] = getGoogleStyle();
9534 Styles[1] = getLLVMStyle();
9535 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9536 EXPECT_ALL_STYLES_EQUAL(Styles);
9537
9538 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +00009539 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009540 Styles[1] = getLLVMStyle();
9541 Styles[1].Language = FormatStyle::LK_JavaScript;
9542 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9543
9544 Styles[2] = getLLVMStyle();
9545 Styles[2].Language = FormatStyle::LK_JavaScript;
9546 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
9547 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009548 &Styles[2])
9549 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009550
9551 Styles[3] = getLLVMStyle();
9552 Styles[3].Language = FormatStyle::LK_JavaScript;
9553 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
9554 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009555 &Styles[3])
9556 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009557
9558 Styles[4] = getLLVMStyle();
9559 Styles[4].Language = FormatStyle::LK_JavaScript;
9560 EXPECT_EQ(0, parseConfiguration("---\n"
9561 "BasedOnStyle: LLVM\n"
9562 "IndentWidth: 123\n"
9563 "---\n"
9564 "BasedOnStyle: Google\n"
9565 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009566 &Styles[4])
9567 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009568 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009569}
9570
Daniel Jasper91881d92014-09-29 08:07:46 +00009571#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +00009572 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +00009573 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009574 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +00009575 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +00009576 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009577
Daniel Jasper91881d92014-09-29 08:07:46 +00009578#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
9579
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009580#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
9581 Style.STRUCT.FIELD = false; \
9582 EXPECT_EQ(0, \
9583 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
9584 .value()); \
9585 EXPECT_TRUE(Style.STRUCT.FIELD); \
9586 EXPECT_EQ(0, \
9587 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
9588 .value()); \
9589 EXPECT_FALSE(Style.STRUCT.FIELD);
9590
9591#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
9592 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
9593
Daniel Jasper00853002014-09-16 16:22:30 +00009594#define CHECK_PARSE(TEXT, FIELD, VALUE) \
9595 EXPECT_NE(VALUE, Style.FIELD); \
9596 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
9597 EXPECT_EQ(VALUE, Style.FIELD)
9598
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009599TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009600 FormatStyle Style = {};
9601 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009602 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +00009603 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +00009604 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +00009605 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009606 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009607 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +00009608 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +00009609 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009610 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +00009611 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00009612 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +00009613 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00009614 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00009615 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +00009616 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00009617 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00009618 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009619 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +00009620 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +00009621 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +00009622 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009623 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00009624 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +00009625 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +00009626 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009627 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +00009628 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +00009629 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +00009630 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009631 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +00009632 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009633 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009634 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +00009635 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009636 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009637 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00009638 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +00009639 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009640
9641 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
9642 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
9643 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
9644 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
9645 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
9646 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
9647 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
9648 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
9649 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
9650 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
9651 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009652}
Alexander Kornienkod6538332013-05-07 15:32:14 +00009653
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009654#undef CHECK_PARSE_BOOL
9655
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009656TEST_F(FormatTest, ParsesConfiguration) {
9657 FormatStyle Style = {};
9658 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009659 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009660 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
9661 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +00009662 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009663 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
9664 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +00009665 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
9666 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009667 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
9668 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
9669 PenaltyReturnTypeOnItsOwnLine, 1234u);
9670 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
9671 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +00009672 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +00009673 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00009674 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +00009675
Daniel Jasper553d4872014-06-17 12:40:34 +00009676 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +00009677 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
9678 FormatStyle::PAS_Left);
9679 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
9680 FormatStyle::PAS_Right);
9681 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
9682 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +00009683 // For backward compatibility:
9684 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
9685 FormatStyle::PAS_Left);
9686 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
9687 FormatStyle::PAS_Right);
9688 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
9689 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +00009690
Alexander Kornienkod6538332013-05-07 15:32:14 +00009691 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +00009692 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
9693 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009694 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
9695 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
9696 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
9697
Daniel Jasperac043c92014-09-15 11:11:00 +00009698 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +00009699 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
9700 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +00009701 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
9702 FormatStyle::BOS_None);
9703 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
9704 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00009705 // For backward compatibility:
9706 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
9707 FormatStyle::BOS_None);
9708 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
9709 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +00009710
Daniel Jasper6501f7e2015-10-27 12:38:37 +00009711 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9712 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
9713 FormatStyle::BAS_Align);
9714 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
9715 FormatStyle::BAS_DontAlign);
9716 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
9717 FormatStyle::BAS_AlwaysBreak);
9718 // For backward compatibility:
9719 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
9720 FormatStyle::BAS_DontAlign);
9721 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
9722 FormatStyle::BAS_Align);
9723
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009724 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009725 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
9726 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
9727 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00009728 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
9729 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +00009730 // For backward compatibility:
9731 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
9732 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009733
Daniel Jasperd74cf402014-04-08 12:46:38 +00009734 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +00009735 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
9736 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
9737 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
9738 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +00009739 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
9740 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +00009741 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
9742 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00009743 // For backward compatibility:
9744 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
9745 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
9746 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
9747 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +00009748
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009749 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
9750 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
9751 FormatStyle::SBPO_Never);
9752 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
9753 FormatStyle::SBPO_Always);
9754 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
9755 FormatStyle::SBPO_ControlStatements);
9756 // For backward compatibility:
9757 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
9758 FormatStyle::SBPO_Never);
9759 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
9760 FormatStyle::SBPO_ControlStatements);
9761
Alexander Kornienkod6538332013-05-07 15:32:14 +00009762 Style.ColumnLimit = 123;
9763 FormatStyle BaseStyle = getLLVMStyle();
9764 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
9765 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
9766
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009767 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
9768 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
9769 FormatStyle::BS_Attach);
9770 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
9771 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009772 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
9773 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009774 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
9775 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009776 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
9777 FormatStyle::BS_Allman);
9778 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009779 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
9780 FormatStyle::BS_WebKit);
9781 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
9782 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009783
Zachary Turner448592e2015-12-18 22:20:15 +00009784 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
9785 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
9786 FormatStyle::RTBS_None);
9787 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
9788 FormatStyle::RTBS_All);
9789 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +00009790 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +00009791 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
9792 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
9793 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
9794 AlwaysBreakAfterReturnType,
9795 FormatStyle::RTBS_TopLevelDefinitions);
9796
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00009797 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
9798 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
9799 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
9800 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
9801 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
9802 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
9803 AlwaysBreakAfterDefinitionReturnType,
9804 FormatStyle::DRTBS_TopLevel);
9805
Daniel Jasper65ee3472013-07-31 23:16:02 +00009806 Style.NamespaceIndentation = FormatStyle::NI_All;
9807 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
9808 FormatStyle::NI_None);
9809 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
9810 FormatStyle::NI_Inner);
9811 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
9812 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +00009813
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00009814 // FIXME: This is required because parsing a configuration simply overwrites
9815 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +00009816 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +00009817 std::vector<std::string> BoostForeach;
9818 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00009819 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +00009820 std::vector<std::string> BoostAndQForeach;
9821 BoostAndQForeach.push_back("BOOST_FOREACH");
9822 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00009823 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
9824 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00009825
9826 Style.IncludeCategories.clear();
9827 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
9828 {".*", 1}};
9829 CHECK_PARSE("IncludeCategories:\n"
9830 " - Regex: abc/.*\n"
9831 " Priority: 2\n"
9832 " - Regex: .*\n"
9833 " Priority: 1",
9834 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00009835 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009836}
9837
9838TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
9839 FormatStyle Style = {};
9840 Style.Language = FormatStyle::LK_Cpp;
9841 CHECK_PARSE("Language: Cpp\n"
9842 "IndentWidth: 12",
9843 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +00009844 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
9845 "IndentWidth: 34",
9846 &Style),
9847 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009848 EXPECT_EQ(12u, Style.IndentWidth);
9849 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
9850 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
9851
9852 Style.Language = FormatStyle::LK_JavaScript;
9853 CHECK_PARSE("Language: JavaScript\n"
9854 "IndentWidth: 12",
9855 IndentWidth, 12u);
9856 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +00009857 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
9858 "IndentWidth: 34",
9859 &Style),
9860 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009861 EXPECT_EQ(23u, Style.IndentWidth);
9862 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
9863 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
9864
9865 CHECK_PARSE("BasedOnStyle: LLVM\n"
9866 "IndentWidth: 67",
9867 IndentWidth, 67u);
9868
9869 CHECK_PARSE("---\n"
9870 "Language: JavaScript\n"
9871 "IndentWidth: 12\n"
9872 "---\n"
9873 "Language: Cpp\n"
9874 "IndentWidth: 34\n"
9875 "...\n",
9876 IndentWidth, 12u);
9877
9878 Style.Language = FormatStyle::LK_Cpp;
9879 CHECK_PARSE("---\n"
9880 "Language: JavaScript\n"
9881 "IndentWidth: 12\n"
9882 "---\n"
9883 "Language: Cpp\n"
9884 "IndentWidth: 34\n"
9885 "...\n",
9886 IndentWidth, 34u);
9887 CHECK_PARSE("---\n"
9888 "IndentWidth: 78\n"
9889 "---\n"
9890 "Language: JavaScript\n"
9891 "IndentWidth: 56\n"
9892 "...\n",
9893 IndentWidth, 78u);
9894
9895 Style.ColumnLimit = 123;
9896 Style.IndentWidth = 234;
9897 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
9898 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +00009899 EXPECT_FALSE(parseConfiguration("---\n"
9900 "IndentWidth: 456\n"
9901 "BreakBeforeBraces: Allman\n"
9902 "---\n"
9903 "Language: JavaScript\n"
9904 "IndentWidth: 111\n"
9905 "TabWidth: 111\n"
9906 "---\n"
9907 "Language: Cpp\n"
9908 "BreakBeforeBraces: Stroustrup\n"
9909 "TabWidth: 789\n"
9910 "...\n",
9911 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009912 EXPECT_EQ(123u, Style.ColumnLimit);
9913 EXPECT_EQ(456u, Style.IndentWidth);
9914 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
9915 EXPECT_EQ(789u, Style.TabWidth);
9916
Rafael Espindola1f243172014-06-12 11:35:17 +00009917 EXPECT_EQ(parseConfiguration("---\n"
9918 "Language: JavaScript\n"
9919 "IndentWidth: 56\n"
9920 "---\n"
9921 "IndentWidth: 78\n"
9922 "...\n",
9923 &Style),
9924 ParseError::Error);
9925 EXPECT_EQ(parseConfiguration("---\n"
9926 "Language: JavaScript\n"
9927 "IndentWidth: 56\n"
9928 "---\n"
9929 "Language: JavaScript\n"
9930 "IndentWidth: 78\n"
9931 "...\n",
9932 &Style),
9933 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009934
9935 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
9936}
Daniel Jasper65ee3472013-07-31 23:16:02 +00009937
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009938#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009939
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009940TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
9941 FormatStyle Style = {};
9942 Style.Language = FormatStyle::LK_JavaScript;
9943 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009944 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00009945 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009946
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009947 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009948 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009949 "BasedOnStyle: Google\n"
9950 "---\n"
9951 "Language: JavaScript\n"
9952 "IndentWidth: 76\n"
9953 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009954 &Style)
9955 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00009956 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009957 EXPECT_EQ(76u, Style.IndentWidth);
9958 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
9959}
9960
Alexander Kornienkod6538332013-05-07 15:32:14 +00009961TEST_F(FormatTest, ConfigurationRoundTripTest) {
9962 FormatStyle Style = getLLVMStyle();
9963 std::string YAML = configurationAsText(Style);
9964 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009965 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009966 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
9967 EXPECT_EQ(Style, ParsedStyle);
9968}
9969
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009970TEST_F(FormatTest, WorksFor8bitEncodings) {
9971 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
9972 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
9973 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
9974 "\"\xef\xee\xf0\xf3...\"",
9975 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
9976 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
9977 "\xef\xee\xf0\xf3...\"",
9978 getLLVMStyleWithColumns(12)));
9979}
9980
Alexander Kornienko393e3082013-11-13 14:04:17 +00009981TEST_F(FormatTest, HandlesUTF8BOM) {
9982 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
9983 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
9984 format("\xef\xbb\xbf#include <iostream>"));
9985 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
9986 format("\xef\xbb\xbf\n#include <iostream>"));
9987}
9988
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +00009989// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
9990#if !defined(_MSC_VER)
9991
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009992TEST_F(FormatTest, CountsUTF8CharactersProperly) {
9993 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
9994 getLLVMStyleWithColumns(35));
9995 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009996 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009997 verifyFormat("// Однажды в студёную зимнюю пору...",
9998 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +00009999 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010000 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10001 getLLVMStyleWithColumns(39));
10002 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010003 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010004}
10005
10006TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010007 // Non-printable characters' width is currently considered to be the length in
10008 // bytes in UTF8. The characters can be displayed in very different manner
10009 // (zero-width, single width with a substitution glyph, expanded to their code
10010 // (e.g. "<8d>"), so there's no single correct way to handle them.
10011 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010012 "\"\xc2\x8d\";",
10013 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010014 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010015 "\"\xc2\x8d\";",
10016 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010017 EXPECT_EQ("\"Однажды, в \"\n"
10018 "\"студёную \"\n"
10019 "\"зимнюю \"\n"
10020 "\"пору,\"",
10021 format("\"Однажды, в студёную зимнюю пору,\"",
10022 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010023 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010024 "\"一 二 三 \"\n"
10025 "\"四 五六 \"\n"
10026 "\"七 八 九 \"\n"
10027 "\"十\"",
10028 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010029 EXPECT_EQ("\"一\t二 \"\n"
10030 "\"\t三 \"\n"
10031 "\"四 五\t六 \"\n"
10032 "\"\t七 \"\n"
10033 "\"八九十\tqq\"",
10034 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10035 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010036
10037 // UTF8 character in an escape sequence.
10038 EXPECT_EQ("\"aaaaaa\"\n"
10039 "\"\\\xC2\x8D\"",
10040 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010041}
10042
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010043TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10044 EXPECT_EQ("const char *sssss =\n"
10045 " \"一二三四五六七八\\\n"
10046 " 九 十\";",
10047 format("const char *sssss = \"一二三四五六七八\\\n"
10048 " 九 十\";",
10049 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010050}
10051
10052TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010053 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10054 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010055 EXPECT_EQ("// Я из лесу\n"
10056 "// вышел; был\n"
10057 "// сильный\n"
10058 "// мороз.",
10059 format("// Я из лесу вышел; был сильный мороз.",
10060 getLLVMStyleWithColumns(13)));
10061 EXPECT_EQ("// 一二三\n"
10062 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010063 "// 八 九\n"
10064 "// 十",
10065 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010066}
10067
10068TEST_F(FormatTest, SplitsUTF8BlockComments) {
10069 EXPECT_EQ("/* Гляжу,\n"
10070 " * поднимается\n"
10071 " * медленно в\n"
10072 " * гору\n"
10073 " * Лошадка,\n"
10074 " * везущая\n"
10075 " * хворосту\n"
10076 " * воз. */",
10077 format("/* Гляжу, поднимается медленно в гору\n"
10078 " * Лошадка, везущая хворосту воз. */",
10079 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010080 EXPECT_EQ(
10081 "/* 一二三\n"
10082 " * 四五六七\n"
10083 " * 八 九\n"
10084 " * 十 */",
10085 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010086 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10087 " * 𝕓𝕪𝕥𝕖\n"
10088 " * 𝖀𝕿𝕱-𝟠 */",
10089 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010090}
10091
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010092#endif // _MSC_VER
10093
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010094TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10095 FormatStyle Style = getLLVMStyle();
10096
10097 Style.ConstructorInitializerIndentWidth = 4;
10098 verifyFormat(
10099 "SomeClass::Constructor()\n"
10100 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10101 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10102 Style);
10103
10104 Style.ConstructorInitializerIndentWidth = 2;
10105 verifyFormat(
10106 "SomeClass::Constructor()\n"
10107 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10108 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10109 Style);
10110
10111 Style.ConstructorInitializerIndentWidth = 0;
10112 verifyFormat(
10113 "SomeClass::Constructor()\n"
10114 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10115 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10116 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010117 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10118 verifyFormat(
10119 "SomeLongTemplateVariableName<\n"
10120 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10121 Style);
10122 verifyFormat(
10123 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10124 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10125 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010126}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010127
Daniel Jasper00853002014-09-16 16:22:30 +000010128TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10129 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010130 Style.BreakConstructorInitializersBeforeComma = true;
10131 Style.ConstructorInitializerIndentWidth = 4;
10132 verifyFormat("SomeClass::Constructor()\n"
10133 " : a(a)\n"
10134 " , b(b)\n"
10135 " , c(c) {}",
10136 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010137 verifyFormat("SomeClass::Constructor()\n"
10138 " : a(a) {}",
10139 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010140
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010141 Style.ColumnLimit = 0;
10142 verifyFormat("SomeClass::Constructor()\n"
10143 " : a(a) {}",
10144 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010145 verifyFormat("SomeClass::Constructor() noexcept\n"
10146 " : a(a) {}",
10147 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010148 verifyFormat("SomeClass::Constructor()\n"
10149 " : a(a)\n"
10150 " , b(b)\n"
10151 " , c(c) {}",
10152 Style);
10153 verifyFormat("SomeClass::Constructor()\n"
10154 " : a(a) {\n"
10155 " foo();\n"
10156 " bar();\n"
10157 "}",
10158 Style);
10159
Daniel Jasperd74cf402014-04-08 12:46:38 +000010160 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010161 verifyFormat("SomeClass::Constructor()\n"
10162 " : a(a)\n"
10163 " , b(b)\n"
10164 " , c(c) {\n}",
10165 Style);
10166 verifyFormat("SomeClass::Constructor()\n"
10167 " : a(a) {\n}",
10168 Style);
10169
10170 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010171 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010172 Style.ConstructorInitializerIndentWidth = 2;
10173 verifyFormat("SomeClass::Constructor()\n"
10174 " : a(a)\n"
10175 " , b(b)\n"
10176 " , c(c) {}",
10177 Style);
10178
10179 Style.ConstructorInitializerIndentWidth = 0;
10180 verifyFormat("SomeClass::Constructor()\n"
10181 ": a(a)\n"
10182 ", b(b)\n"
10183 ", c(c) {}",
10184 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010185
10186 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10187 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010188 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10189 verifyFormat(
10190 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10191 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010192 verifyFormat(
10193 "SomeClass::Constructor()\n"
10194 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10195 Style);
10196 Style.ConstructorInitializerIndentWidth = 4;
10197 Style.ColumnLimit = 60;
10198 verifyFormat("SomeClass::Constructor()\n"
10199 " : aaaaaaaa(aaaaaaaa)\n"
10200 " , aaaaaaaa(aaaaaaaa)\n"
10201 " , aaaaaaaa(aaaaaaaa) {}",
10202 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010203}
10204
Daniel Jasper38efc132014-10-21 07:51:54 +000010205TEST_F(FormatTest, Destructors) {
10206 verifyFormat("void F(int &i) { i.~int(); }");
10207 verifyFormat("void F(int &i) { i->~int(); }");
10208}
10209
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010210TEST_F(FormatTest, FormatsWithWebKitStyle) {
10211 FormatStyle Style = getWebKitStyle();
10212
10213 // Don't indent in outer namespaces.
10214 verifyFormat("namespace outer {\n"
10215 "int i;\n"
10216 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010217 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010218 "} // namespace inner\n"
10219 "} // namespace outer\n"
10220 "namespace other_outer {\n"
10221 "int i;\n"
10222 "}",
10223 Style);
10224
10225 // Don't indent case labels.
10226 verifyFormat("switch (variable) {\n"
10227 "case 1:\n"
10228 "case 2:\n"
10229 " doSomething();\n"
10230 " break;\n"
10231 "default:\n"
10232 " ++variable;\n"
10233 "}",
10234 Style);
10235
10236 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010237 EXPECT_EQ("void f()\n"
10238 "{\n"
10239 " if (aaaaaaaaaaaaaaaa\n"
10240 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10241 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10242 " return;\n"
10243 "}",
10244 format("void f() {\n"
10245 "if (aaaaaaaaaaaaaaaa\n"
10246 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10247 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10248 "return;\n"
10249 "}",
10250 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010251
Daniel Jasper35995672014-04-29 14:05:20 +000010252 // Allow functions on a single line.
10253 verifyFormat("void f() { return; }", Style);
10254
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010255 // Constructor initializers are formatted one per line with the "," on the
10256 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010257 verifyFormat("Constructor()\n"
10258 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10259 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010260 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010261 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10262 "{\n"
10263 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010264 Style);
10265 verifyFormat("SomeClass::Constructor()\n"
10266 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010267 "{\n"
10268 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010269 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010270 EXPECT_EQ("SomeClass::Constructor()\n"
10271 " : a(a)\n"
10272 "{\n"
10273 "}",
10274 format("SomeClass::Constructor():a(a){}", Style));
10275 verifyFormat("SomeClass::Constructor()\n"
10276 " : a(a)\n"
10277 " , b(b)\n"
10278 " , c(c)\n"
10279 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010280 "}",
10281 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010282 verifyFormat("SomeClass::Constructor()\n"
10283 " : a(a)\n"
10284 "{\n"
10285 " foo();\n"
10286 " bar();\n"
10287 "}",
10288 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010289
Daniel Jasper65ee3472013-07-31 23:16:02 +000010290 // Access specifiers should be aligned left.
10291 verifyFormat("class C {\n"
10292 "public:\n"
10293 " int i;\n"
10294 "};",
10295 Style);
10296
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010297 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010298 verifyFormat("int a; // Do not\n"
10299 "double b; // align comments.",
10300 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010301
Daniel Jasper3219e432014-12-02 13:24:51 +000010302 // Do not align operands.
10303 EXPECT_EQ("ASSERT(aaaa\n"
10304 " || bbbb);",
10305 format("ASSERT ( aaaa\n||bbbb);", Style));
10306
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010307 // Accept input's line breaks.
10308 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10309 " || bbbbbbbbbbbbbbb) {\n"
10310 " i++;\n"
10311 "}",
10312 format("if (aaaaaaaaaaaaaaa\n"
10313 "|| bbbbbbbbbbbbbbb) { i++; }",
10314 Style));
10315 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10316 " i++;\n"
10317 "}",
10318 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010319
10320 // Don't automatically break all macro definitions (llvm.org/PR17842).
10321 verifyFormat("#define aNumber 10", Style);
10322 // However, generally keep the line breaks that the user authored.
10323 EXPECT_EQ("#define aNumber \\\n"
10324 " 10",
10325 format("#define aNumber \\\n"
10326 " 10",
10327 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010328
10329 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010330 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10331 " copyItems:YES];",
10332 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10333 "copyItems:YES];",
10334 Style));
10335 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10336 " copyItems:YES];",
10337 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10338 " copyItems:YES];",
10339 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010340 // FIXME: This does not seem right, there should be more indentation before
10341 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010342 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010343 " @\"a\",\n"
10344 " @\"a\"\n"
10345 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010346 " copyItems:YES];",
10347 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10348 " @\"a\",\n"
10349 " @\"a\"\n"
10350 " ]\n"
10351 " copyItems:YES];",
10352 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010353 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010354 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10355 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010356 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10357 " copyItems:YES];",
10358 Style));
10359
10360 verifyFormat("[self.a b:c c:d];", Style);
10361 EXPECT_EQ("[self.a b:c\n"
10362 " c:d];",
10363 format("[self.a b:c\n"
10364 "c:d];",
10365 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010366}
10367
Manuel Klimekffdeb592013-09-03 15:10:01 +000010368TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010369 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10370 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10371 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10372 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10373 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010374 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010375 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010376 verifyFormat("void f() {\n"
10377 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10378 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010379 verifyFormat("void f() {\n"
10380 " other(x.begin(), //\n"
10381 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000010382 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010383 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000010384 verifyFormat("SomeFunction([]() { // A cool function...\n"
10385 " return 43;\n"
10386 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000010387 EXPECT_EQ("SomeFunction([]() {\n"
10388 "#define A a\n"
10389 " return 43;\n"
10390 "});",
10391 format("SomeFunction([](){\n"
10392 "#define A a\n"
10393 "return 43;\n"
10394 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000010395 verifyFormat("void f() {\n"
10396 " SomeFunction([](decltype(x), A *a) {});\n"
10397 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010398 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10399 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000010400 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10401 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
10402 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000010403 verifyFormat("Constructor()\n"
10404 " : Field([] { // comment\n"
10405 " int i;\n"
10406 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000010407 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
10408 " return some_parameter.size();\n"
10409 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000010410 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
10411 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000010412 verifyFormat("int i = aaaaaa ? 1 //\n"
10413 " : [] {\n"
10414 " return 2; //\n"
10415 " }();");
10416 verifyFormat("llvm::errs() << \"number of twos is \"\n"
10417 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
10418 " return x == 2; // force break\n"
10419 " });");
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000010420 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n"
10421 " int iiiiiiiiiiii) {\n"
10422 " return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n"
10423 "});",
10424 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000010425 verifyFormat("SomeFunction({[&] {\n"
10426 " // comment\n"
10427 " },\n"
10428 " [&] {\n"
10429 " // comment\n"
10430 " }});");
10431 verifyFormat("SomeFunction({[&] {\n"
10432 " // comment\n"
10433 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000010434 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
10435 " [&]() { return true; },\n"
10436 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010437
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010438 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000010439 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000010440 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000010441 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
10442 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010443 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000010444 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010445 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
10446 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000010447 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010448 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
10449 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010450 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010451 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000010452 verifyFormat(
10453 "aaaaaaaaaaaaaaaaaaaaaa(\n"
10454 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
10455 " return aaaaaaaaaaaaaaaaa;\n"
10456 " });",
10457 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000010458 verifyFormat("[]() //\n"
10459 " -> int {\n"
10460 " return 1; //\n"
10461 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010462
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010463 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000010464 verifyFormat("SomeFunction(\n"
10465 " []() {\n"
10466 " int i = 42;\n"
10467 " return i;\n"
10468 " },\n"
10469 " []() {\n"
10470 " int j = 43;\n"
10471 " return j;\n"
10472 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010473
Daniel Jasperda18fd82014-06-10 06:39:03 +000010474 // More complex introducers.
10475 verifyFormat("return [i, args...] {};");
10476
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010477 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000010478 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000010479 verifyFormat("double &operator[](int i) { return 0; }\n"
10480 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000010481 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000010482 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000010483 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000010484
10485 // Other corner cases.
10486 verifyFormat("void f() {\n"
10487 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
10488 " );\n"
10489 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000010490
10491 // Lambdas created through weird macros.
10492 verifyFormat("void f() {\n"
10493 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000010494 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000010495 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000010496
10497 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
10498 " doo_dah();\n"
10499 " doo_dah();\n"
10500 " })) {\n"
10501 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000010502 verifyFormat("auto lambda = []() {\n"
10503 " int a = 2\n"
10504 "#if A\n"
10505 " + 2\n"
10506 "#endif\n"
10507 " ;\n"
10508 "};");
Manuel Klimekffdeb592013-09-03 15:10:01 +000010509}
10510
Manuel Klimek516e0542013-09-04 13:25:30 +000010511TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000010512 FormatStyle ShortBlocks = getLLVMStyle();
10513 ShortBlocks.AllowShortBlocksOnASingleLine = true;
10514 verifyFormat("int (^Block)(int, int);", ShortBlocks);
10515 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
10516 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
10517 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
10518 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
10519 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000010520
Daniel Jasper76284682014-10-22 09:12:44 +000010521 verifyFormat("foo(^{ bar(); });", ShortBlocks);
10522 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
10523 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000010524
Daniel Jasper76284682014-10-22 09:12:44 +000010525 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010526 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010527 "}];");
10528 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010529 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010530 "}]};");
10531 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010532 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010533 "}];");
10534 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010535 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010536 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000010537 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010538 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010539 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010540 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010541 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010542
10543 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010544 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010545 "}];",
10546 getLLVMStyleWithColumns(60));
10547 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010548 " NSString *path = [self sessionFilePath];\n"
10549 " if (path) {\n"
10550 " // ...\n"
10551 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010552 "});");
10553 verifyFormat("[[SessionService sharedService]\n"
10554 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010555 " if (window) {\n"
10556 " [self windowDidLoad:window];\n"
10557 " } else {\n"
10558 " [self errorLoadingWindow];\n"
10559 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010560 " }];");
10561 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010562 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010563 "};\n",
10564 getLLVMStyleWithColumns(40));
10565 verifyFormat("[[SessionService sharedService]\n"
10566 " loadWindowWithCompletionBlock: //\n"
10567 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010568 " if (window) {\n"
10569 " [self windowDidLoad:window];\n"
10570 " } else {\n"
10571 " [self errorLoadingWindow];\n"
10572 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010573 " }];",
10574 getLLVMStyleWithColumns(60));
10575 verifyFormat("[myObject doSomethingWith:arg1\n"
10576 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010577 " // ...\n"
10578 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010579 " }\n"
10580 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010581 " // ...\n"
10582 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000010583 " }\n"
10584 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010585 " // ...\n"
10586 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010587 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000010588 verifyFormat("[myObject doSomethingWith:arg1\n"
10589 " firstBlock:-1\n"
10590 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010591 " // ...\n"
10592 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000010593 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010594
10595 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010596 " @autoreleasepool {\n"
10597 " if (a) {\n"
10598 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010599 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010600 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010601 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000010602 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000010603 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
10604 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000010605
10606 FormatStyle FourIndent = getLLVMStyle();
10607 FourIndent.ObjCBlockIndentWidth = 4;
10608 verifyFormat("[operation setCompletionBlock:^{\n"
10609 " [self onOperationDone];\n"
10610 "}];",
10611 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000010612}
10613
Daniel Jasper289afc02015-04-23 09:23:17 +000010614TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
10615 FormatStyle ZeroColumn = getLLVMStyle();
10616 ZeroColumn.ColumnLimit = 0;
10617
10618 verifyFormat("[[SessionService sharedService] "
10619 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10620 " if (window) {\n"
10621 " [self windowDidLoad:window];\n"
10622 " } else {\n"
10623 " [self errorLoadingWindow];\n"
10624 " }\n"
10625 "}];",
10626 ZeroColumn);
10627 EXPECT_EQ("[[SessionService sharedService]\n"
10628 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10629 " if (window) {\n"
10630 " [self windowDidLoad:window];\n"
10631 " } else {\n"
10632 " [self errorLoadingWindow];\n"
10633 " }\n"
10634 " }];",
10635 format("[[SessionService sharedService]\n"
10636 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10637 " if (window) {\n"
10638 " [self windowDidLoad:window];\n"
10639 " } else {\n"
10640 " [self errorLoadingWindow];\n"
10641 " }\n"
10642 "}];",
10643 ZeroColumn));
10644 verifyFormat("[myObject doSomethingWith:arg1\n"
10645 " firstBlock:^(Foo *a) {\n"
10646 " // ...\n"
10647 " int i;\n"
10648 " }\n"
10649 " secondBlock:^(Bar *b) {\n"
10650 " // ...\n"
10651 " int i;\n"
10652 " }\n"
10653 " thirdBlock:^Foo(Bar *b) {\n"
10654 " // ...\n"
10655 " int i;\n"
10656 " }];",
10657 ZeroColumn);
10658 verifyFormat("f(^{\n"
10659 " @autoreleasepool {\n"
10660 " if (a) {\n"
10661 " g();\n"
10662 " }\n"
10663 " }\n"
10664 "});",
10665 ZeroColumn);
10666 verifyFormat("void (^largeBlock)(void) = ^{\n"
10667 " // ...\n"
10668 "};",
10669 ZeroColumn);
10670
10671 ZeroColumn.AllowShortBlocksOnASingleLine = true;
10672 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010673 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000010674 ZeroColumn.AllowShortBlocksOnASingleLine = false;
10675 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
10676 " int i;\n"
10677 "};",
10678 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
10679}
10680
Alexander Kornienko9e649af2013-09-11 12:25:57 +000010681TEST_F(FormatTest, SupportsCRLF) {
10682 EXPECT_EQ("int a;\r\n"
10683 "int b;\r\n"
10684 "int c;\r\n",
10685 format("int a;\r\n"
10686 " int b;\r\n"
10687 " int c;\r\n",
10688 getLLVMStyle()));
10689 EXPECT_EQ("int a;\r\n"
10690 "int b;\r\n"
10691 "int c;\r\n",
10692 format("int a;\r\n"
10693 " int b;\n"
10694 " int c;\r\n",
10695 getLLVMStyle()));
10696 EXPECT_EQ("int a;\n"
10697 "int b;\n"
10698 "int c;\n",
10699 format("int a;\r\n"
10700 " int b;\n"
10701 " int c;\n",
10702 getLLVMStyle()));
10703 EXPECT_EQ("\"aaaaaaa \"\r\n"
10704 "\"bbbbbbb\";\r\n",
10705 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
10706 EXPECT_EQ("#define A \\\r\n"
10707 " b; \\\r\n"
10708 " c; \\\r\n"
10709 " d;\r\n",
10710 format("#define A \\\r\n"
10711 " b; \\\r\n"
10712 " c; d; \r\n",
10713 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000010714
10715 EXPECT_EQ("/*\r\n"
10716 "multi line block comments\r\n"
10717 "should not introduce\r\n"
10718 "an extra carriage return\r\n"
10719 "*/\r\n",
10720 format("/*\r\n"
10721 "multi line block comments\r\n"
10722 "should not introduce\r\n"
10723 "an extra carriage return\r\n"
10724 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000010725}
10726
Manuel Klimekb212f3b2013-10-12 22:46:56 +000010727TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
10728 verifyFormat("MY_CLASS(C) {\n"
10729 " int i;\n"
10730 " int j;\n"
10731 "};");
10732}
10733
Daniel Jasper6633ab82013-10-18 10:38:14 +000010734TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
10735 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
10736 TwoIndent.ContinuationIndentWidth = 2;
10737
10738 EXPECT_EQ("int i =\n"
10739 " longFunction(\n"
10740 " arg);",
10741 format("int i = longFunction(arg);", TwoIndent));
10742
10743 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
10744 SixIndent.ContinuationIndentWidth = 6;
10745
10746 EXPECT_EQ("int i =\n"
10747 " longFunction(\n"
10748 " arg);",
10749 format("int i = longFunction(arg);", SixIndent));
10750}
10751
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010752TEST_F(FormatTest, SpacesInAngles) {
10753 FormatStyle Spaces = getLLVMStyle();
10754 Spaces.SpacesInAngles = true;
10755
10756 verifyFormat("static_cast< int >(arg);", Spaces);
10757 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
10758 verifyFormat("f< int, float >();", Spaces);
10759 verifyFormat("template <> g() {}", Spaces);
10760 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000010761 verifyFormat("std::function< void(int, int) > fct;", Spaces);
10762 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
10763 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010764
10765 Spaces.Standard = FormatStyle::LS_Cpp03;
10766 Spaces.SpacesInAngles = true;
10767 verifyFormat("A< A< int > >();", Spaces);
10768
10769 Spaces.SpacesInAngles = false;
10770 verifyFormat("A<A<int> >();", Spaces);
10771
10772 Spaces.Standard = FormatStyle::LS_Cpp11;
10773 Spaces.SpacesInAngles = true;
10774 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000010775
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010776 Spaces.SpacesInAngles = false;
10777 verifyFormat("A<A<int>>();", Spaces);
10778}
10779
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010780TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
10781 FormatStyle Style = getLLVMStyle();
10782 Style.SpaceAfterTemplateKeyword = false;
10783 verifyFormat("template<int> void foo();", Style);
10784}
10785
Jacques Pienaarfc275112015-02-18 23:48:37 +000010786TEST_F(FormatTest, TripleAngleBrackets) {
10787 verifyFormat("f<<<1, 1>>>();");
10788 verifyFormat("f<<<1, 1, 1, s>>>();");
10789 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000010790 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010791 verifyFormat("f<param><<<1, 1>>>();");
10792 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000010793 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010794 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10795 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000010796 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
10797 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000010798}
10799
10800TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000010801 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000010802 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010803 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10804 "aaallvm::outs() <<");
10805 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10806 "aaaallvm::outs()\n <<");
10807}
10808
Manuel Klimek819788d2014-03-18 11:22:45 +000010809TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
10810 std::string code = "#if A\n"
10811 "#if B\n"
10812 "a.\n"
10813 "#endif\n"
10814 " a = 1;\n"
10815 "#else\n"
10816 "#endif\n"
10817 "#if C\n"
10818 "#else\n"
10819 "#endif\n";
10820 EXPECT_EQ(code, format(code));
10821}
10822
Manuel Klimek68b03042014-04-14 09:14:11 +000010823TEST_F(FormatTest, HandleConflictMarkers) {
10824 // Git/SVN conflict markers.
10825 EXPECT_EQ("int a;\n"
10826 "void f() {\n"
10827 " callme(some(parameter1,\n"
10828 "<<<<<<< text by the vcs\n"
10829 " parameter2),\n"
10830 "||||||| text by the vcs\n"
10831 " parameter2),\n"
10832 " parameter3,\n"
10833 "======= text by the vcs\n"
10834 " parameter2, parameter3),\n"
10835 ">>>>>>> text by the vcs\n"
10836 " otherparameter);\n",
10837 format("int a;\n"
10838 "void f() {\n"
10839 " callme(some(parameter1,\n"
10840 "<<<<<<< text by the vcs\n"
10841 " parameter2),\n"
10842 "||||||| text by the vcs\n"
10843 " parameter2),\n"
10844 " parameter3,\n"
10845 "======= text by the vcs\n"
10846 " parameter2,\n"
10847 " parameter3),\n"
10848 ">>>>>>> text by the vcs\n"
10849 " otherparameter);\n"));
10850
10851 // Perforce markers.
10852 EXPECT_EQ("void f() {\n"
10853 " function(\n"
10854 ">>>> text by the vcs\n"
10855 " parameter,\n"
10856 "==== text by the vcs\n"
10857 " parameter,\n"
10858 "==== text by the vcs\n"
10859 " parameter,\n"
10860 "<<<< text by the vcs\n"
10861 " parameter);\n",
10862 format("void f() {\n"
10863 " function(\n"
10864 ">>>> text by the vcs\n"
10865 " parameter,\n"
10866 "==== text by the vcs\n"
10867 " parameter,\n"
10868 "==== text by the vcs\n"
10869 " parameter,\n"
10870 "<<<< text by the vcs\n"
10871 " parameter);\n"));
10872
10873 EXPECT_EQ("<<<<<<<\n"
10874 "|||||||\n"
10875 "=======\n"
10876 ">>>>>>>",
10877 format("<<<<<<<\n"
10878 "|||||||\n"
10879 "=======\n"
10880 ">>>>>>>"));
10881
10882 EXPECT_EQ("<<<<<<<\n"
10883 "|||||||\n"
10884 "int i;\n"
10885 "=======\n"
10886 ">>>>>>>",
10887 format("<<<<<<<\n"
10888 "|||||||\n"
10889 "int i;\n"
10890 "=======\n"
10891 ">>>>>>>"));
10892
10893 // FIXME: Handle parsing of macros around conflict markers correctly:
10894 EXPECT_EQ("#define Macro \\\n"
10895 "<<<<<<<\n"
10896 "Something \\\n"
10897 "|||||||\n"
10898 "Else \\\n"
10899 "=======\n"
10900 "Other \\\n"
10901 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000010902 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000010903 format("#define Macro \\\n"
10904 "<<<<<<<\n"
10905 " Something \\\n"
10906 "|||||||\n"
10907 " Else \\\n"
10908 "=======\n"
10909 " Other \\\n"
10910 ">>>>>>>\n"
10911 " End\n"
10912 "int i;\n"));
10913}
10914
Daniel Jasper471894432014-08-06 13:40:26 +000010915TEST_F(FormatTest, DisableRegions) {
10916 EXPECT_EQ("int i;\n"
10917 "// clang-format off\n"
10918 " int j;\n"
10919 "// clang-format on\n"
10920 "int k;",
10921 format(" int i;\n"
10922 " // clang-format off\n"
10923 " int j;\n"
10924 " // clang-format on\n"
10925 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000010926 EXPECT_EQ("int i;\n"
10927 "/* clang-format off */\n"
10928 " int j;\n"
10929 "/* clang-format on */\n"
10930 "int k;",
10931 format(" int i;\n"
10932 " /* clang-format off */\n"
10933 " int j;\n"
10934 " /* clang-format on */\n"
10935 " int k;"));
Daniel Jasper471894432014-08-06 13:40:26 +000010936}
10937
Manuel Klimekf0c95b32015-06-11 10:14:13 +000010938TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
10939 format("? ) =");
10940 verifyNoCrash("#define a\\\n /**/}");
10941}
Manuel Klimek5f594f82014-08-13 14:00:41 +000010942
Daniel Jasper498f5582015-12-25 08:53:31 +000010943TEST_F(FormatTest, FormatsTableGenCode) {
10944 FormatStyle Style = getLLVMStyle();
10945 Style.Language = FormatStyle::LK_TableGen;
10946 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
10947}
10948
Nico Weberb2673a12016-11-10 21:49:25 +000010949TEST_F(FormatTest, ArrayOfTemplates) {
10950 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
10951 format("auto a = new unique_ptr<int > [ 10];"));
10952
10953 FormatStyle Spaces = getLLVMStyle();
10954 Spaces.SpacesInSquareBrackets = true;
10955 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
10956 format("auto a = new unique_ptr<int > [10];", Spaces));
10957}
10958
10959TEST_F(FormatTest, ArrayAsTemplateType) {
10960 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
10961 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
10962
10963 FormatStyle Spaces = getLLVMStyle();
10964 Spaces.SpacesInSquareBrackets = true;
10965 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
10966 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
10967}
10968
Eric Liu547d8792016-03-24 13:22:42 +000010969TEST(FormatStyle, GetStyleOfFile) {
10970 vfs::InMemoryFileSystem FS;
10971 // Test 1: format file in the same directory.
10972 ASSERT_TRUE(
10973 FS.addFile("/a/.clang-format", 0,
10974 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
10975 ASSERT_TRUE(
10976 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010977 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000010978 ASSERT_TRUE((bool)Style1);
10979 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000010980
Antonio Maiorano7eb75072017-01-20 01:22:42 +000010981 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000010982 ASSERT_TRUE(
10983 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010984 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000010985 ASSERT_TRUE((bool)Style2);
10986 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000010987
Antonio Maiorano7eb75072017-01-20 01:22:42 +000010988 // Test 2.2: no format on 'none' fallback style.
10989 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
10990 ASSERT_TRUE((bool)Style2);
10991 ASSERT_EQ(*Style2, getNoStyle());
10992
10993 // Test 2.3: format if config is found with no based style while fallback is
10994 // 'none'.
10995 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
10996 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
10997 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
10998 ASSERT_TRUE((bool)Style2);
10999 ASSERT_EQ(*Style2, getLLVMStyle());
11000
11001 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11002 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11003 ASSERT_TRUE((bool)Style2);
11004 ASSERT_EQ(*Style2, getLLVMStyle());
11005
Eric Liu547d8792016-03-24 13:22:42 +000011006 // Test 3: format file in parent directory.
11007 ASSERT_TRUE(
11008 FS.addFile("/c/.clang-format", 0,
11009 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11010 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11011 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011012 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011013 ASSERT_TRUE((bool)Style3);
11014 ASSERT_EQ(*Style3, getGoogleStyle());
11015
11016 // Test 4: error on invalid fallback style
11017 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11018 ASSERT_FALSE((bool)Style4);
11019 llvm::consumeError(Style4.takeError());
11020
11021 // Test 5: error on invalid yaml on command line
11022 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11023 ASSERT_FALSE((bool)Style5);
11024 llvm::consumeError(Style5.takeError());
11025
11026 // Test 6: error on invalid style
11027 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11028 ASSERT_FALSE((bool)Style6);
11029 llvm::consumeError(Style6.takeError());
11030
11031 // Test 7: found config file, error on parsing it
11032 ASSERT_TRUE(
11033 FS.addFile("/d/.clang-format", 0,
11034 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11035 "InvalidKey: InvalidValue")));
11036 ASSERT_TRUE(
11037 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11038 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11039 ASSERT_FALSE((bool)Style7);
11040 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011041}
11042
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011043TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11044 // Column limit is 20.
11045 std::string Code = "Type *a =\n"
11046 " new Type();\n"
11047 "g(iiiii, 0, jjjjj,\n"
11048 " 0, kkkkk, 0, mm);\n"
11049 "int bad = format ;";
11050 std::string Expected = "auto a = new Type();\n"
11051 "g(iiiii, nullptr,\n"
11052 " jjjjj, nullptr,\n"
11053 " kkkkk, nullptr,\n"
11054 " mm);\n"
11055 "int bad = format ;";
11056 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011057 tooling::Replacements Replaces = toReplacements(
11058 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11059 "auto "),
11060 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11061 "nullptr"),
11062 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11063 "nullptr"),
11064 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11065 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011066
11067 format::FormatStyle Style = format::getLLVMStyle();
11068 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011069 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11070 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11071 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11072 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11073 EXPECT_TRUE(static_cast<bool>(Result));
11074 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011075}
11076
Eric Liubaf58c22016-05-18 13:43:48 +000011077TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11078 std::string Code = "#include \"a.h\"\n"
11079 "#include \"c.h\"\n"
11080 "\n"
11081 "int main() {\n"
11082 " return 0;\n"
11083 "}";
11084 std::string Expected = "#include \"a.h\"\n"
11085 "#include \"b.h\"\n"
11086 "#include \"c.h\"\n"
11087 "\n"
11088 "int main() {\n"
11089 " return 0;\n"
11090 "}";
11091 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011092 tooling::Replacements Replaces = toReplacements(
11093 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11094 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011095
11096 format::FormatStyle Style = format::getLLVMStyle();
11097 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011098 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11099 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11100 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11101 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11102 EXPECT_TRUE(static_cast<bool>(Result));
11103 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011104}
11105
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011106TEST_F(FormatTest, AllignTrailingComments) {
11107 EXPECT_EQ("#define MACRO(V) \\\n"
11108 " V(Rt2) /* one more char */ \\\n"
11109 " V(Rs) /* than here */ \\\n"
11110 "/* comment 3 */\n",
11111 format("#define MACRO(V)\\\n"
11112 "V(Rt2) /* one more char */ \\\n"
11113 "V(Rs) /* than here */ \\\n"
11114 "/* comment 3 */ \\\n",
11115 getLLVMStyleWithColumns(40)));
11116}
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011117} // end namespace
11118} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011119} // end namespace clang