blob: 2be5062d6f62fd19acecedafd6713695e4e60539 [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
Krasimir Georgiev91834222017-01-25 13:58:58 +00001786TEST_F(FormatTest, ReflowsComments) {
1787 // Break a long line and reflow with the full next line.
1788 EXPECT_EQ("// long long long\n"
1789 "// long long",
1790 format("// long long long long\n"
1791 "// long",
1792 getLLVMStyleWithColumns(20)));
1793
1794 // Keep the trailing newline while reflowing.
1795 EXPECT_EQ("// long long long\n"
1796 "// long long\n",
1797 format("// long long long long\n"
1798 "// long\n",
1799 getLLVMStyleWithColumns(20)));
1800
1801 // Break a long line and reflow with a part of the next line.
1802 EXPECT_EQ("// long long long\n"
1803 "// long long\n"
1804 "// long_long",
1805 format("// long long long long\n"
1806 "// long long_long",
1807 getLLVMStyleWithColumns(20)));
1808
1809 // Break but do not reflow if the first word from the next line is too long.
1810 EXPECT_EQ("// long long long\n"
1811 "// long\n"
1812 "// long_long_long\n",
1813 format("// long long long long\n"
1814 "// long_long_long\n",
1815 getLLVMStyleWithColumns(20)));
1816
1817 // Don't break or reflow short lines.
1818 verifyFormat("// long\n"
1819 "// long long long lo\n"
1820 "// long long long lo\n"
1821 "// long",
1822 getLLVMStyleWithColumns(20));
1823
1824 // Keep prefixes and decorations while reflowing.
1825 EXPECT_EQ("/// long long long\n"
1826 "/// long long\n",
1827 format("/// long long long long\n"
1828 "/// long\n",
1829 getLLVMStyleWithColumns(20)));
1830 EXPECT_EQ("//! long long long\n"
1831 "//! long long\n",
1832 format("//! long long long long\n"
1833 "//! long\n",
1834 getLLVMStyleWithColumns(20)));
1835 EXPECT_EQ("/* long long long\n"
1836 " * long long */",
1837 format("/* long long long long\n"
1838 " * long */",
1839 getLLVMStyleWithColumns(20)));
1840
1841 // Don't bring leading whitespace up while reflowing.
1842 EXPECT_EQ("/* long long long\n"
1843 " * long long long\n"
1844 " */",
1845 format("/* long long long long\n"
1846 " * long long\n"
1847 " */",
1848 getLLVMStyleWithColumns(20)));
1849
1850 // Reflow the last line of a block comment with its trailing '*/'.
1851 EXPECT_EQ("/* long long long\n"
1852 " long long */",
1853 format("/* long long long long\n"
1854 " long */",
1855 getLLVMStyleWithColumns(20)));
1856
1857 // Reflow two short lines; keep the postfix of the last one.
1858 EXPECT_EQ("/* long long long\n"
1859 " * long long long */",
1860 format("/* long long long long\n"
1861 " * long\n"
1862 " * long */",
1863 getLLVMStyleWithColumns(20)));
1864
1865 // Put the postfix of the last short reflow line on a newline if it doesn't
1866 // fit.
1867 EXPECT_EQ("/* long long long\n"
1868 " * long long longg\n"
1869 " */",
1870 format("/* long long long long\n"
1871 " * long\n"
1872 " * longg */",
1873 getLLVMStyleWithColumns(20)));
1874
1875 // Break single line block comments that are first in the line with ' *'
1876 // decoration.
1877 EXPECT_EQ("/* long long long\n"
1878 " * long */",
1879 format("/* long long long long */", getLLVMStyleWithColumns(20)));
1880
1881 // Break single line block comment that are not first in the line with ' '
1882 // decoration.
1883 EXPECT_EQ("int i; /* long long\n"
1884 " long */",
1885 format("int i; /* long long long */", getLLVMStyleWithColumns(20)));
1886
1887 // Reflow a line that goes just over the column limit.
1888 EXPECT_EQ("// long long long\n"
1889 "// lon long",
1890 format("// long long long lon\n"
1891 "// long",
1892 getLLVMStyleWithColumns(20)));
1893
1894 // Stop reflowing if the next line has a different indentation than the
1895 // previous line.
1896 EXPECT_EQ("// long long long\n"
1897 "// long\n"
1898 "// long long\n"
1899 "// long",
1900 format("// long long long long\n"
1901 "// long long\n"
1902 "// long",
1903 getLLVMStyleWithColumns(20)));
1904
1905 // Reflow into the last part of a really long line that has been broken into
1906 // multiple lines.
1907 EXPECT_EQ("// long long long\n"
1908 "// long long long\n"
1909 "// long long long\n",
1910 format("// long long long long long long long long\n"
1911 "// long\n",
1912 getLLVMStyleWithColumns(20)));
1913
1914 // Break the first line, then reflow the beginning of the second and third
1915 // line up.
1916 EXPECT_EQ("// long long long\n"
1917 "// lon1 lon2 lon2\n"
1918 "// lon2 lon3 lon3",
1919 format("// long long long lon1\n"
1920 "// lon2 lon2 lon2\n"
1921 "// lon3 lon3",
1922 getLLVMStyleWithColumns(20)));
1923
1924 // Reflow the beginning of the second line, then break the rest.
1925 EXPECT_EQ("// long long long\n"
1926 "// lon1 lon2 lon2\n"
1927 "// lon2 lon2 lon2\n"
1928 "// lon3",
1929 format("// long long long lon1\n"
1930 "// lon2 lon2 lon2 lon2 lon2 lon3",
1931 getLLVMStyleWithColumns(20)));
1932
1933 // Shrink the first line, then reflow the second line up.
1934 EXPECT_EQ("// long long long", format("// long long\n"
1935 "// long",
1936 getLLVMStyleWithColumns(20)));
1937
1938 // Don't shrink leading whitespace.
1939 EXPECT_EQ("int i; /// a",
1940 format("int i; /// a", getLLVMStyleWithColumns(20)));
1941
1942 // Shrink trailing whitespace if there is no postfix and reflow.
1943 EXPECT_EQ("// long long long\n"
1944 "// long long",
1945 format("// long long long long \n"
1946 "// long",
1947 getLLVMStyleWithColumns(20)));
1948
1949 // Shrink trailing whitespace to a single one if there is postfix.
1950 EXPECT_EQ("/* long long long */",
1951 format("/* long long long */", getLLVMStyleWithColumns(20)));
1952
1953 // Break a block comment postfix if exceeding the line limit.
1954 EXPECT_EQ("/* long\n"
1955 " */",
1956 format("/* long */", getLLVMStyleWithColumns(20)));
1957
1958 // Reflow indented comments.
1959 EXPECT_EQ("{\n"
1960 " // long long long\n"
1961 " // long long\n"
1962 " int i; /* long lon\n"
1963 " g long\n"
1964 " */\n"
1965 "}",
1966 format("{\n"
1967 " // long long long long\n"
1968 " // long\n"
1969 " int i; /* long lon g\n"
1970 " long */\n"
1971 "}",
1972 getLLVMStyleWithColumns(20)));
1973
1974 // Don't realign trailing comments after reflow has happened.
1975 EXPECT_EQ("// long long long\n"
1976 "// long long\n"
1977 "long i; // long",
1978 format("// long long long long\n"
1979 "// long\n"
1980 "long i; // long",
1981 getLLVMStyleWithColumns(20)));
1982 EXPECT_EQ("// long long long\n"
1983 "// longng long long\n"
1984 "// long lo",
1985 format("// long long long longng\n"
1986 "// long long long\n"
1987 "// lo",
1988 getLLVMStyleWithColumns(20)));
1989
1990 // Reflow lines after a broken line.
1991 EXPECT_EQ("int a; // Trailing\n"
1992 " // comment on\n"
1993 " // 2 or 3\n"
1994 " // lines.\n",
1995 format("int a; // Trailing comment\n"
1996 " // on 2\n"
1997 " // or 3\n"
1998 " // lines.\n",
1999 getLLVMStyleWithColumns(20)));
2000 EXPECT_EQ("/// This long line\n"
2001 "/// gets reflown.\n",
2002 format("/// This long line gets\n"
2003 "/// reflown.\n",
2004 getLLVMStyleWithColumns(20)));
2005 EXPECT_EQ("//! This long line\n"
2006 "//! gets reflown.\n",
2007 format(" //! This long line gets\n"
2008 " //! reflown.\n",
2009 getLLVMStyleWithColumns(20)));
2010 EXPECT_EQ("/* This long line\n"
2011 " * gets reflown.\n"
2012 " */\n",
2013 format("/* This long line gets\n"
2014 " * reflown.\n"
2015 " */\n",
2016 getLLVMStyleWithColumns(20)));
2017
2018 // Reflow after indentation makes a line too long.
2019 EXPECT_EQ("{\n"
2020 " // long long long\n"
2021 " // lo long\n"
2022 "}\n",
2023 format("{\n"
2024 "// long long long lo\n"
2025 "// long\n"
2026 "}\n",
2027 getLLVMStyleWithColumns(20)));
2028
2029 // Break and reflow multiple lines.
2030 EXPECT_EQ("/*\n"
2031 " * Reflow the end of\n"
2032 " * line by 11 22 33\n"
2033 " * 4.\n"
2034 " */\n",
2035 format("/*\n"
2036 " * Reflow the end of line\n"
2037 " * by\n"
2038 " * 11\n"
2039 " * 22\n"
2040 " * 33\n"
2041 " * 4.\n"
2042 " */\n",
2043 getLLVMStyleWithColumns(20)));
2044 EXPECT_EQ("/// First line gets\n"
2045 "/// broken. Second\n"
2046 "/// line gets\n"
2047 "/// reflown and\n"
2048 "/// broken. Third\n"
2049 "/// gets reflown.\n",
2050 format("/// First line gets broken.\n"
2051 "/// Second line gets reflown and broken.\n"
2052 "/// Third gets reflown.\n",
2053 getLLVMStyleWithColumns(20)));
2054 EXPECT_EQ("int i; // first long\n"
2055 " // long snd\n"
2056 " // long.\n",
2057 format("int i; // first long long\n"
2058 " // snd long.\n",
2059 getLLVMStyleWithColumns(20)));
2060 EXPECT_EQ("{\n"
2061 " // first long line\n"
2062 " // line second\n"
2063 " // long line line\n"
2064 " // third long line\n"
2065 " // line\n"
2066 "}\n",
2067 format("{\n"
2068 " // first long line line\n"
2069 " // second long line line\n"
2070 " // third long line line\n"
2071 "}\n",
2072 getLLVMStyleWithColumns(20)));
2073 EXPECT_EQ("int i; /* first line\n"
2074 " * second\n"
2075 " * line third\n"
2076 " * line\n"
2077 " */",
2078 format("int i; /* first line\n"
2079 " * second line\n"
2080 " * third line\n"
2081 " */",
2082 getLLVMStyleWithColumns(20)));
2083
2084 // Reflow the last two lines of a section that starts with a line having
2085 // different indentation.
2086 EXPECT_EQ(
2087 "// long\n"
2088 "// long long long\n"
2089 "// long long",
2090 format("// long\n"
2091 "// long long long long\n"
2092 "// long",
2093 getLLVMStyleWithColumns(20)));
2094
2095 // Keep the block comment endling '*/' while reflowing.
2096 EXPECT_EQ("/* Long long long\n"
2097 " * line short */\n",
2098 format("/* Long long long line\n"
2099 " * short */\n",
2100 getLLVMStyleWithColumns(20)));
2101
2102 // Don't reflow between separate blocks of comments.
2103 EXPECT_EQ("/* First comment\n"
2104 " * block will */\n"
2105 "/* Snd\n"
2106 " */\n",
2107 format("/* First comment block\n"
2108 " * will */\n"
2109 "/* Snd\n"
2110 " */\n",
2111 getLLVMStyleWithColumns(20)));
2112
2113 // Don't reflow across blank comment lines.
2114 EXPECT_EQ("int i; // This long\n"
2115 " // line gets\n"
2116 " // broken.\n"
2117 " // \n"
2118 " // keep.\n",
2119 format("int i; // This long line gets broken.\n"
2120 " // \n"
2121 " // keep.\n",
2122 getLLVMStyleWithColumns(20)));
2123 EXPECT_EQ("{\n"
2124 " /// long long long\n"
2125 " /// long long\n"
2126 " ///\n"
2127 " /// long\n"
2128 "}",
2129 format("{\n"
2130 " /// long long long long\n"
2131 " /// long\n"
2132 " ///\n"
2133 " /// long\n"
2134 "}",
2135 getLLVMStyleWithColumns(20)));
2136 EXPECT_EQ("//! long long long\n"
2137 "//! long\n"
2138 "\n"
2139 "//! long",
2140 format("//! long long long long\n"
2141 "\n"
2142 "//! long",
2143 getLLVMStyleWithColumns(20)));
2144 EXPECT_EQ("/* long long long\n"
2145 " long\n"
2146 "\n"
2147 " long */",
2148 format("/* long long long long\n"
2149 "\n"
2150 " long */",
2151 getLLVMStyleWithColumns(20)));
2152 EXPECT_EQ("/* long long long\n"
2153 " * long\n"
2154 " *\n"
2155 " * long */",
2156 format("/* long long long long\n"
2157 " *\n"
2158 " * long */",
2159 getLLVMStyleWithColumns(20)));
2160
2161 // Don't reflow lines having content that is a single character.
2162 EXPECT_EQ("// long long long\n"
2163 "// long\n"
2164 "// l",
2165 format("// long long long long\n"
2166 "// l",
2167 getLLVMStyleWithColumns(20)));
2168
2169 // Don't reflow lines starting with two punctuation characters.
2170 EXPECT_EQ("// long long long\n"
2171 "// long\n"
2172 "// ... --- ...",
2173 format(
2174 "// long long long long\n"
2175 "// ... --- ...",
2176 getLLVMStyleWithColumns(20)));
2177 // Reflow lines that have a non-punctuation character among their first 2
2178 // characters.
2179 EXPECT_EQ("// long long long\n"
2180 "// long 'long'",
2181 format(
2182 "// long long long long\n"
2183 "// 'long'",
2184 getLLVMStyleWithColumns(20)));
2185
2186 // Don't reflow between separate blocks of comments.
2187 EXPECT_EQ("/* First comment\n"
2188 " * block will */\n"
2189 "/* Snd\n"
2190 " */\n",
2191 format("/* First comment block\n"
2192 " * will */\n"
2193 "/* Snd\n"
2194 " */\n",
2195 getLLVMStyleWithColumns(20)));
2196
2197 // Don't reflow lines having different indentation.
2198 EXPECT_EQ("// long long long\n"
2199 "// long\n"
2200 "// long",
2201 format("// long long long long\n"
2202 "// long",
2203 getLLVMStyleWithColumns(20)));
2204
2205 // Don't break or reflow after implicit string literals.
2206 verifyFormat("#include <t> // l l l\n"
2207 " // l",
2208 getLLVMStyleWithColumns(20));
2209
2210 // Don't break or reflow comments on import lines.
2211 EXPECT_EQ("#include \"t\" /* l l l\n"
2212 " * l */",
2213 format("#include \"t\" /* l l l\n"
2214 " * l */",
2215 getLLVMStyleWithColumns(20)));
2216
2217 // Don't reflow between different trailing comment sections.
2218 EXPECT_EQ("int i; // long long\n"
2219 " // long\n"
2220 "int j; // long long\n"
2221 " // long\n",
2222 format("int i; // long long long\n"
2223 "int j; // long long long\n",
2224 getLLVMStyleWithColumns(20)));
2225
2226 // Don't reflow if the first word on the next line is longer than the
2227 // available space at current line.
2228 EXPECT_EQ("int i; // trigger\n"
2229 " // reflow\n"
2230 " // longsec\n",
2231 format("int i; // trigger reflow\n"
2232 " // longsec\n",
2233 getLLVMStyleWithColumns(20)));
2234
2235 // Keep empty comment lines.
2236 EXPECT_EQ("/**/", format(" /**/", getLLVMStyleWithColumns(20)));
2237 EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
2238 EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
2239 EXPECT_EQ("//", format(" // ", getLLVMStyleWithColumns(20)));
2240 EXPECT_EQ("///", format(" /// ", getLLVMStyleWithColumns(20)));
2241}
2242
Alexander Kornienkof2e02122013-05-24 18:24:24 +00002243TEST_F(FormatTest, IgnoresIf0Contents) {
2244 EXPECT_EQ("#if 0\n"
2245 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
2246 "#endif\n"
2247 "void f() {}",
2248 format("#if 0\n"
2249 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
2250 "#endif\n"
2251 "void f( ) { }"));
2252 EXPECT_EQ("#if false\n"
2253 "void f( ) { }\n"
2254 "#endif\n"
2255 "void g() {}\n",
2256 format("#if false\n"
2257 "void f( ) { }\n"
2258 "#endif\n"
2259 "void g( ) { }\n"));
2260 EXPECT_EQ("enum E {\n"
2261 " One,\n"
2262 " Two,\n"
2263 "#if 0\n"
2264 "Three,\n"
2265 " Four,\n"
2266 "#endif\n"
2267 " Five\n"
2268 "};",
2269 format("enum E {\n"
2270 " One,Two,\n"
2271 "#if 0\n"
2272 "Three,\n"
2273 " Four,\n"
2274 "#endif\n"
2275 " Five};"));
2276 EXPECT_EQ("enum F {\n"
2277 " One,\n"
2278 "#if 1\n"
2279 " Two,\n"
2280 "#if 0\n"
2281 "Three,\n"
2282 " Four,\n"
2283 "#endif\n"
2284 " Five\n"
2285 "#endif\n"
2286 "};",
2287 format("enum F {\n"
2288 "One,\n"
2289 "#if 1\n"
2290 "Two,\n"
2291 "#if 0\n"
2292 "Three,\n"
2293 " Four,\n"
2294 "#endif\n"
2295 "Five\n"
2296 "#endif\n"
2297 "};"));
2298 EXPECT_EQ("enum G {\n"
2299 " One,\n"
2300 "#if 0\n"
2301 "Two,\n"
2302 "#else\n"
2303 " Three,\n"
2304 "#endif\n"
2305 " Four\n"
2306 "};",
2307 format("enum G {\n"
2308 "One,\n"
2309 "#if 0\n"
2310 "Two,\n"
2311 "#else\n"
2312 "Three,\n"
2313 "#endif\n"
2314 "Four\n"
2315 "};"));
2316 EXPECT_EQ("enum H {\n"
2317 " One,\n"
2318 "#if 0\n"
2319 "#ifdef Q\n"
2320 "Two,\n"
2321 "#else\n"
2322 "Three,\n"
2323 "#endif\n"
2324 "#endif\n"
2325 " Four\n"
2326 "};",
2327 format("enum H {\n"
2328 "One,\n"
2329 "#if 0\n"
2330 "#ifdef Q\n"
2331 "Two,\n"
2332 "#else\n"
2333 "Three,\n"
2334 "#endif\n"
2335 "#endif\n"
2336 "Four\n"
2337 "};"));
2338 EXPECT_EQ("enum I {\n"
2339 " One,\n"
2340 "#if /* test */ 0 || 1\n"
2341 "Two,\n"
2342 "Three,\n"
2343 "#endif\n"
2344 " Four\n"
2345 "};",
2346 format("enum I {\n"
2347 "One,\n"
2348 "#if /* test */ 0 || 1\n"
2349 "Two,\n"
2350 "Three,\n"
2351 "#endif\n"
2352 "Four\n"
2353 "};"));
2354 EXPECT_EQ("enum J {\n"
2355 " One,\n"
2356 "#if 0\n"
2357 "#if 0\n"
2358 "Two,\n"
2359 "#else\n"
2360 "Three,\n"
2361 "#endif\n"
2362 "Four,\n"
2363 "#endif\n"
2364 " Five\n"
2365 "};",
2366 format("enum J {\n"
2367 "One,\n"
2368 "#if 0\n"
2369 "#if 0\n"
2370 "Two,\n"
2371 "#else\n"
2372 "Three,\n"
2373 "#endif\n"
2374 "Four,\n"
2375 "#endif\n"
2376 "Five\n"
2377 "};"));
Alexander Kornienkof2e02122013-05-24 18:24:24 +00002378}
2379
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002380//===----------------------------------------------------------------------===//
2381// Tests for classes, namespaces, etc.
2382//===----------------------------------------------------------------------===//
2383
2384TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002385 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002386}
2387
2388TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
2389 verifyFormat("class A {\n"
2390 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00002391 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002392 "protected:\n"
2393 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002394 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002395 "};");
2396 verifyGoogleFormat("class A {\n"
2397 " public:\n"
2398 " protected:\n"
2399 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002400 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002401 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00002402 verifyFormat("class A {\n"
2403 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002404 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00002405 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002406 " void f2() {}\n"
2407 "protected slots:\n"
2408 " void f3() {}\n"
2409 "protected Q_SLOTS:\n"
2410 " void f4() {}\n"
2411 "private slots:\n"
2412 " void f5() {}\n"
2413 "private Q_SLOTS:\n"
2414 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00002415 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002416 " void g1();\n"
2417 "Q_SIGNALS:\n"
2418 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00002419 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00002420
2421 // Don't interpret 'signals' the wrong way.
2422 verifyFormat("signals.set();");
2423 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00002424 verifyFormat("{\n"
2425 " signals.set(); // This needs indentation.\n"
2426 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00002427 verifyFormat("void f() {\n"
2428 "label:\n"
2429 " signals.baz();\n"
2430 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002431}
2432
Alexander Kornienkofd433362013-03-27 17:08:02 +00002433TEST_F(FormatTest, SeparatesLogicalBlocks) {
2434 EXPECT_EQ("class A {\n"
2435 "public:\n"
2436 " void f();\n"
2437 "\n"
2438 "private:\n"
2439 " void g() {}\n"
2440 " // test\n"
2441 "protected:\n"
2442 " int h;\n"
2443 "};",
2444 format("class A {\n"
2445 "public:\n"
2446 "void f();\n"
2447 "private:\n"
2448 "void g() {}\n"
2449 "// test\n"
2450 "protected:\n"
2451 "int h;\n"
2452 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00002453 EXPECT_EQ("class A {\n"
2454 "protected:\n"
2455 "public:\n"
2456 " void f();\n"
2457 "};",
2458 format("class A {\n"
2459 "protected:\n"
2460 "\n"
2461 "public:\n"
2462 "\n"
2463 " void f();\n"
2464 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00002465
2466 // Even ensure proper spacing inside macros.
2467 EXPECT_EQ("#define B \\\n"
2468 " class A { \\\n"
2469 " protected: \\\n"
2470 " public: \\\n"
2471 " void f(); \\\n"
2472 " };",
2473 format("#define B \\\n"
2474 " class A { \\\n"
2475 " protected: \\\n"
2476 " \\\n"
2477 " public: \\\n"
2478 " \\\n"
2479 " void f(); \\\n"
2480 " };",
2481 getGoogleStyle()));
2482 // But don't remove empty lines after macros ending in access specifiers.
2483 EXPECT_EQ("#define A private:\n"
2484 "\n"
2485 "int i;",
2486 format("#define A private:\n"
2487 "\n"
2488 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00002489}
2490
Daniel Jasper83193602013-04-05 17:22:09 +00002491TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002492 verifyFormat("class A : public B {};");
2493 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002494
2495 verifyFormat(
2496 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002497 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00002498 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
2499 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002500 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002501 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002502 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002503 verifyFormat("class AAAAAAAAAAAA : public B,\n"
2504 " public C,\n"
2505 " public D,\n"
2506 " public E,\n"
2507 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002508 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00002509
2510 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002511 " ReallyReallyLongClassName {\n"
2512 " int i;\n"
2513 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00002514 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00002515 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
2516 " aaaaaaaaaaaaaaaa> {};");
2517 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
2518 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
2519 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00002520 verifyFormat("template <class R, class C>\n"
2521 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
2522 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00002523 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00002524}
2525
Manuel Klimek28cacc72013-01-07 18:10:23 +00002526TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002527 verifyFormat("class A {\n} a, b;");
2528 verifyFormat("struct A {\n} a, b;");
2529 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00002530}
2531
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002532TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002533 verifyFormat("enum {\n"
2534 " Zero,\n"
2535 " One = 1,\n"
2536 " Two = One + 1,\n"
2537 " Three = (One + Two),\n"
2538 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2539 " Five = (One, Two, Three, Four, 5)\n"
2540 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002541 verifyGoogleFormat("enum {\n"
2542 " Zero,\n"
2543 " One = 1,\n"
2544 " Two = One + 1,\n"
2545 " Three = (One + Two),\n"
2546 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2547 " Five = (One, Two, Three, Four, 5)\n"
2548 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002549 verifyFormat("enum Enum {};");
2550 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002551 verifyFormat("enum X E {} d;");
2552 verifyFormat("enum __attribute__((...)) E {} d;");
2553 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00002554 verifyFormat("enum {\n"
2555 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002556 "};",
2557 getLLVMStyleWithColumns(30));
2558
2559 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00002560 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002561
2562 EXPECT_EQ("enum KeepEmptyLines {\n"
2563 " ONE,\n"
2564 "\n"
2565 " TWO,\n"
2566 "\n"
2567 " THREE\n"
2568 "}",
2569 format("enum KeepEmptyLines {\n"
2570 " ONE,\n"
2571 "\n"
2572 " TWO,\n"
2573 "\n"
2574 "\n"
2575 " THREE\n"
2576 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00002577 verifyFormat("enum E { // comment\n"
2578 " ONE,\n"
2579 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00002580 "};\n"
2581 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002582 // Not enums.
2583 verifyFormat("enum X f() {\n"
2584 " a();\n"
2585 " return 42;\n"
2586 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00002587 verifyFormat("enum X Type::f() {\n"
2588 " a();\n"
2589 " return 42;\n"
2590 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002591 verifyFormat("enum ::X f() {\n"
2592 " a();\n"
2593 " return 42;\n"
2594 "}");
2595 verifyFormat("enum ns::X f() {\n"
2596 " a();\n"
2597 " return 42;\n"
2598 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002599}
2600
Daniel Jasperb7150872013-08-30 10:10:19 +00002601TEST_F(FormatTest, FormatsEnumsWithErrors) {
2602 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002603 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002604 " Two = 1;\n"
2605 "};");
2606 verifyFormat("namespace n {\n"
2607 "enum Type {\n"
2608 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002609 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002610 " int i;\n"
2611 "}\n"
2612 "void g() {}");
2613}
2614
Daniel Jasper2b41a822013-08-20 12:42:50 +00002615TEST_F(FormatTest, FormatsEnumStruct) {
2616 verifyFormat("enum struct {\n"
2617 " Zero,\n"
2618 " One = 1,\n"
2619 " Two = One + 1,\n"
2620 " Three = (One + Two),\n"
2621 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2622 " Five = (One, Two, Three, Four, 5)\n"
2623 "};");
2624 verifyFormat("enum struct Enum {};");
2625 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002626 verifyFormat("enum struct X E {} d;");
2627 verifyFormat("enum struct __attribute__((...)) E {} d;");
2628 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002629 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
2630}
2631
2632TEST_F(FormatTest, FormatsEnumClass) {
2633 verifyFormat("enum class {\n"
2634 " Zero,\n"
2635 " One = 1,\n"
2636 " Two = One + 1,\n"
2637 " Three = (One + Two),\n"
2638 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2639 " Five = (One, Two, Three, Four, 5)\n"
2640 "};");
2641 verifyFormat("enum class Enum {};");
2642 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002643 verifyFormat("enum class X E {} d;");
2644 verifyFormat("enum class __attribute__((...)) E {} d;");
2645 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002646 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
2647}
2648
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002649TEST_F(FormatTest, FormatsEnumTypes) {
2650 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002651 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002652 " B\n"
2653 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00002654 verifyFormat("enum X : int { A, B };");
2655 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002656}
2657
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002658TEST_F(FormatTest, FormatsNSEnums) {
2659 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
2660 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
2661 " // Information about someDecentlyLongValue.\n"
2662 " someDecentlyLongValue,\n"
2663 " // Information about anotherDecentlyLongValue.\n"
2664 " anotherDecentlyLongValue,\n"
2665 " // Information about aThirdDecentlyLongValue.\n"
2666 " aThirdDecentlyLongValue\n"
2667 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00002668 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
2669 " a = 1,\n"
2670 " b = 2,\n"
2671 " c = 3,\n"
2672 "};");
2673 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
2674 " a = 1,\n"
2675 " b = 2,\n"
2676 " c = 3,\n"
2677 "};");
2678 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
2679 " a = 1,\n"
2680 " b = 2,\n"
2681 " c = 3,\n"
2682 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002683}
2684
Nico Weber7769a902013-01-14 05:49:49 +00002685TEST_F(FormatTest, FormatsBitfields) {
2686 verifyFormat("struct Bitfields {\n"
2687 " unsigned sClass : 8;\n"
2688 " unsigned ValueKind : 2;\n"
2689 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00002690 verifyFormat("struct A {\n"
2691 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
2692 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
2693 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00002694 verifyFormat("struct MyStruct {\n"
2695 " uchar data;\n"
2696 " uchar : 8;\n"
2697 " uchar : 8;\n"
2698 " uchar other;\n"
2699 "};");
Nico Weber7769a902013-01-14 05:49:49 +00002700}
2701
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002702TEST_F(FormatTest, FormatsNamespaces) {
2703 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002704 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002705 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002706 "}");
2707 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002708 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002709 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002710 "}");
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002711 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002712 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002713 "void f() { f(); }\n"
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002714 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002715 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002716 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002717 "void f() { f(); }");
Manuel Klimek046b9302013-02-06 16:08:09 +00002718
2719 // This code is more common than we thought; if we
2720 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002721 // its own line, which is undesirable.
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002722 verifyFormat("namespace {};");
Manuel Klimek046b9302013-02-06 16:08:09 +00002723 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002724 "class A {};\n"
Manuel Klimek046b9302013-02-06 16:08:09 +00002725 "};");
Daniel Jasper251b3c92013-07-01 11:22:57 +00002726
2727 verifyFormat("namespace {\n"
2728 "int SomeVariable = 0; // comment\n"
2729 "} // namespace");
2730 EXPECT_EQ("#ifndef HEADER_GUARD\n"
2731 "#define HEADER_GUARD\n"
2732 "namespace my_namespace {\n"
2733 "int i;\n"
2734 "} // my_namespace\n"
2735 "#endif // HEADER_GUARD",
2736 format("#ifndef HEADER_GUARD\n"
2737 " #define HEADER_GUARD\n"
2738 " namespace my_namespace {\n"
2739 "int i;\n"
2740 "} // my_namespace\n"
2741 "#endif // HEADER_GUARD"));
Daniel Jasper65ee3472013-07-31 23:16:02 +00002742
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00002743 EXPECT_EQ("namespace A::B {\n"
2744 "class C {};\n"
2745 "}",
2746 format("namespace A::B {\n"
2747 "class C {};\n"
2748 "}"));
2749
Daniel Jasper65ee3472013-07-31 23:16:02 +00002750 FormatStyle Style = getLLVMStyle();
2751 Style.NamespaceIndentation = FormatStyle::NI_All;
2752 EXPECT_EQ("namespace out {\n"
2753 " int i;\n"
2754 " namespace in {\n"
2755 " int i;\n"
2756 " } // namespace\n"
2757 "} // namespace",
2758 format("namespace out {\n"
2759 "int i;\n"
2760 "namespace in {\n"
2761 "int i;\n"
2762 "} // namespace\n"
2763 "} // namespace",
2764 Style));
2765
2766 Style.NamespaceIndentation = FormatStyle::NI_Inner;
2767 EXPECT_EQ("namespace out {\n"
2768 "int i;\n"
2769 "namespace in {\n"
2770 " int i;\n"
2771 "} // namespace\n"
2772 "} // namespace",
2773 format("namespace out {\n"
2774 "int i;\n"
2775 "namespace in {\n"
2776 "int i;\n"
2777 "} // namespace\n"
2778 "} // namespace",
2779 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002780}
2781
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002782TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00002783
Daniel Jasper40aacf42013-03-14 13:45:21 +00002784TEST_F(FormatTest, FormatsInlineASM) {
2785 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00002786 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00002787 verifyFormat(
2788 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2789 " \"cpuid\\n\\t\"\n"
2790 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00002791 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00002792 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00002793 EXPECT_EQ(
2794 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002795 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002796 " mov edx,[that] // vtable in edx\n"
2797 " mov eax,methodIndex\n"
2798 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002799 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002800 "}",
2801 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2802 " __asm {\n"
2803 " mov edx,[that] // vtable in edx\n"
2804 " mov eax,methodIndex\n"
2805 " call [edx][eax*4] // stdcall\n"
2806 " }\n"
2807 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00002808 EXPECT_EQ("_asm {\n"
2809 " xor eax, eax;\n"
2810 " cpuid;\n"
2811 "}",
2812 format("_asm {\n"
2813 " xor eax, eax;\n"
2814 " cpuid;\n"
2815 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00002816 verifyFormat("void function() {\n"
2817 " // comment\n"
2818 " asm(\"\");\n"
2819 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00002820 EXPECT_EQ("__asm {\n"
2821 "}\n"
2822 "int i;",
2823 format("__asm {\n"
2824 "}\n"
2825 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00002826}
2827
Nico Weberd5650bd2013-01-07 16:36:17 +00002828TEST_F(FormatTest, FormatTryCatch) {
2829 verifyFormat("try {\n"
2830 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002831 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002832 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002833 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002834 " exit(42);\n"
2835 "}");
2836
2837 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00002838 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002839 " return 5;\n"
2840 "}");
2841 verifyFormat("class A {\n"
2842 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002843 " A() try : a(0) {\n"
2844 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002845 " throw;\n"
2846 " }\n"
2847 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00002848
2849 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002850 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00002851}
2852
Nico Weberfac23712015-02-04 15:26:27 +00002853TEST_F(FormatTest, FormatSEHTryCatch) {
2854 verifyFormat("__try {\n"
2855 " int a = b * c;\n"
2856 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2857 " // Do nothing.\n"
2858 "}");
2859
2860 verifyFormat("__try {\n"
2861 " int a = b * c;\n"
2862 "} __finally {\n"
2863 " // Do nothing.\n"
2864 "}");
2865
2866 verifyFormat("DEBUG({\n"
2867 " __try {\n"
2868 " } __finally {\n"
2869 " }\n"
2870 "});\n");
2871}
2872
Daniel Jasper04a71a42014-05-08 11:58:24 +00002873TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2874 verifyFormat("try {\n"
2875 " f();\n"
2876 "} catch {\n"
2877 " g();\n"
2878 "}");
2879 verifyFormat("try {\n"
2880 " f();\n"
2881 "} catch (A a) MACRO(x) {\n"
2882 " g();\n"
2883 "} catch (B b) MACRO(x) {\n"
2884 " g();\n"
2885 "}");
2886}
2887
2888TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2889 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00002890 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2891 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00002892 Style.BreakBeforeBraces = BraceStyle;
2893 verifyFormat("try {\n"
2894 " // something\n"
2895 "} catch (...) {\n"
2896 " // something\n"
2897 "}",
2898 Style);
2899 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00002900 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2901 verifyFormat("try {\n"
2902 " // something\n"
2903 "}\n"
2904 "catch (...) {\n"
2905 " // something\n"
2906 "}",
2907 Style);
Nico Weberfac23712015-02-04 15:26:27 +00002908 verifyFormat("__try {\n"
2909 " // something\n"
2910 "}\n"
2911 "__finally {\n"
2912 " // something\n"
2913 "}",
2914 Style);
Nico Weber33381f52015-02-07 01:57:32 +00002915 verifyFormat("@try {\n"
2916 " // something\n"
2917 "}\n"
2918 "@finally {\n"
2919 " // something\n"
2920 "}",
2921 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00002922 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2923 verifyFormat("try\n"
2924 "{\n"
2925 " // something\n"
2926 "}\n"
2927 "catch (...)\n"
2928 "{\n"
2929 " // something\n"
2930 "}",
2931 Style);
2932 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
2933 verifyFormat("try\n"
2934 " {\n"
2935 " // something\n"
2936 " }\n"
2937 "catch (...)\n"
2938 " {\n"
2939 " // something\n"
2940 " }",
2941 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00002942 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2943 Style.BraceWrapping.BeforeCatch = true;
2944 verifyFormat("try {\n"
2945 " // something\n"
2946 "}\n"
2947 "catch (...) {\n"
2948 " // something\n"
2949 "}",
2950 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00002951}
2952
Daniel Jaspere25509f2012-12-17 11:29:41 +00002953TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002954 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00002955
Daniel Jaspera44991332015-04-29 13:06:49 +00002956 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
2957 " 100000000, "
2958 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00002959
Daniel Jasper473c62c2013-05-17 09:35:01 +00002960 // Here, everything other than the "}" would fit on a line.
2961 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002962 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002963 EXPECT_EQ("S s = {a,\n"
2964 "\n"
2965 " b};",
2966 format("S s = {\n"
2967 " a,\n"
2968 "\n"
2969 " b\n"
2970 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00002971
2972 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
2973 // line. However, the formatting looks a bit off and this probably doesn't
2974 // happen often in practice.
2975 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002976 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00002977 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00002978}
2979
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002980TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002981 verifyFormat("const struct A a = {.a = 1, .b = 2};");
2982 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
2983 " .bbbbbbbbbb = 2,\n"
2984 " .cccccccccc = 3,\n"
2985 " .dddddddddd = 4,\n"
2986 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002987 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002988 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
2989 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
2990 " .ccccccccccccccccccccccccccc = 3,\n"
2991 " .ddddddddddddddddddddddddddd = 4,\n"
2992 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002993
2994 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
2995}
2996
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002997TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002998 verifyFormat("static A x = {{{}}};\n");
2999 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
3000 " {init1, init2, init3, init4}}};",
3001 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00003002
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003003 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003004 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
3005 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
3006 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
3007 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00003008 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00003009 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
3010 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
3011 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00003012 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
3013 " {rect.fRight - rect.fLeft, rect.fBottom - "
3014 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003015
Daniel Jasper8a8ce242013-01-31 14:59:26 +00003016 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00003017 "SomeArrayOfSomeType a = {\n"
3018 " {{1, 2, 3},\n"
3019 " {1, 2, 3},\n"
3020 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
3021 " 333333333333333333333333333333},\n"
3022 " {1, 2, 3},\n"
3023 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00003024 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00003025 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00003026 " {{1, 2, 3}},\n"
3027 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00003028 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
3029 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00003030 " {{1, 2, 3}},\n"
3031 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00003032
Daniel Jaspera44991332015-04-29 13:06:49 +00003033 verifyFormat("struct {\n"
3034 " unsigned bit;\n"
3035 " const char *const name;\n"
3036 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
3037 " {kOsWin, \"Windows\"},\n"
3038 " {kOsLinux, \"Linux\"},\n"
3039 " {kOsCrOS, \"Chrome OS\"}};");
3040 verifyFormat("struct {\n"
3041 " unsigned bit;\n"
3042 " const char *const name;\n"
3043 "} kBitsToOs[] = {\n"
3044 " {kOsMac, \"Mac\"},\n"
3045 " {kOsWin, \"Windows\"},\n"
3046 " {kOsLinux, \"Linux\"},\n"
3047 " {kOsCrOS, \"Chrome OS\"},\n"
3048 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003049}
3050
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003051TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
3052 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3053 " \\\n"
3054 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
3055}
3056
Daniel Jasperda16db32013-01-07 10:48:50 +00003057TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00003058 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
3059 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00003060
3061 // Do break defaulted and deleted functions.
3062 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
3063 " default;",
3064 getLLVMStyleWithColumns(40));
3065 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
3066 " delete;",
3067 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00003068}
3069
3070TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
3071 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
3072 getLLVMStyleWithColumns(40));
3073 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
3074 getLLVMStyleWithColumns(40));
3075 EXPECT_EQ("#define Q \\\n"
3076 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
3077 " \"aaaaaaaa.cpp\"",
3078 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
3079 getLLVMStyleWithColumns(40)));
3080}
3081
3082TEST_F(FormatTest, UnderstandsLinePPDirective) {
3083 EXPECT_EQ("# 123 \"A string literal\"",
3084 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00003085}
3086
Manuel Klimek591b5802013-01-31 15:58:48 +00003087TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00003088 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00003089 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003090}
3091
3092TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
3093 EXPECT_EQ("#line 42 \"test\"\n",
3094 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003095 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
3096 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003097}
3098
3099TEST_F(FormatTest, EndOfFileEndsPPDirective) {
3100 EXPECT_EQ("#line 42 \"test\"",
3101 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003102 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003103}
3104
Daniel Jasper877615c2013-10-11 19:45:02 +00003105TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
3106 verifyFormat("#define A \\x20");
3107 verifyFormat("#define A \\ x20");
3108 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
3109 verifyFormat("#define A ''");
3110 verifyFormat("#define A ''qqq");
3111 verifyFormat("#define A `qqq");
3112 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00003113 EXPECT_EQ("const char *c = STRINGIFY(\n"
3114 "\\na : b);",
3115 format("const char * c = STRINGIFY(\n"
3116 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00003117
3118 verifyFormat("a\r\\");
3119 verifyFormat("a\v\\");
3120 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00003121}
3122
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003123TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003124 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
3125 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003126 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003127 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00003128 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00003129
3130 verifyFormat("#define A A\n#define A A");
3131 verifyFormat("#define A(X) A\n#define A A");
3132
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003133 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
3134 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003135}
3136
3137TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00003138 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003139 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003140 "#define A( \\\n"
3141 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003142 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00003143 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00003144 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003145 " #include \"a.h\"\n"
3146 "#define A(A,\\\n"
3147 " B)\n"
3148 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00003149 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003150 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003151}
3152
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003153TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00003154
3155TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
3156 EXPECT_EQ("#define A \\\n"
3157 " c; \\\n"
3158 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003159 "f;",
3160 format("#define A c; e;\n"
3161 "f;",
3162 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00003163}
3164
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003165TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00003166
Manuel Klimek1abf7892013-01-04 23:34:14 +00003167TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00003168 EXPECT_EQ("int x,\n"
3169 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003170 " y;",
3171 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00003172}
3173
Manuel Klimek09e07972013-01-05 21:34:55 +00003174TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00003175 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00003176 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00003177 verifyFormat("#define A \\\n"
3178 " { \\\n"
3179 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003180 " }",
3181 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00003182
3183 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003184 " void function##X()",
3185 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00003186
3187 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003188 " void a##b##c()",
3189 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00003190
Daniel Jasper39825ea2013-01-14 15:40:57 +00003191 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00003192}
3193
Manuel Klimekd053c5b2013-01-23 14:37:36 +00003194TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00003195 EXPECT_EQ("#define A (x)", format("#define A (x)"));
3196 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00003197}
3198
Manuel Klimek0c137952013-02-11 12:33:24 +00003199TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
3200 EXPECT_EQ("#define A b;", format("#define A \\\n"
3201 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003202 " b;",
3203 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003204 EXPECT_EQ("#define A \\\n"
3205 " \\\n"
3206 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003207 " b;",
3208 format("#define A \\\n"
3209 " \\\n"
3210 " a; \\\n"
3211 " b;",
3212 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003213 EXPECT_EQ("#define A \\\n"
3214 " a; \\\n"
3215 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003216 " b;",
3217 format("#define A \\\n"
3218 " a; \\\n"
3219 " \\\n"
3220 " b;",
3221 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003222}
3223
Daniel Jasper00475962013-02-19 17:14:38 +00003224TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003225 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00003226 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00003227 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00003228 " case 2\n",
3229 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00003230 verifyFormat("#define MACRO(a) \\\n"
3231 " if (a) \\\n"
3232 " f(); \\\n"
3233 " else \\\n"
3234 " g()",
3235 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00003236 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003237 verifyIncompleteFormat("#define STR(x) #x\n"
3238 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00003239 verifyFormat("#pragma omp threadprivate( \\\n"
3240 " y)), // expected-warning",
3241 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00003242 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00003243 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003244 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00003245 "#define b \\\n"
3246 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003247 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003248 "a",
3249 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00003250 verifyFormat("#define A \\\n"
3251 " { \\\n"
3252 " {\n"
3253 "#define B \\\n"
3254 " } \\\n"
3255 " }",
3256 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00003257 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00003258 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00003259 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00003260 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00003261}
3262
Daniel Jasper40e19212013-05-29 13:16:10 +00003263TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
3264 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
3265 EXPECT_EQ("class A : public QObject {\n"
3266 " Q_OBJECT\n"
3267 "\n"
3268 " A() {}\n"
3269 "};",
3270 format("class A : public QObject {\n"
3271 " Q_OBJECT\n"
3272 "\n"
3273 " A() {\n}\n"
3274 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00003275 EXPECT_EQ("MACRO\n"
3276 "/*static*/ int i;",
3277 format("MACRO\n"
3278 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00003279 EXPECT_EQ("SOME_MACRO\n"
3280 "namespace {\n"
3281 "void f();\n"
3282 "}",
3283 format("SOME_MACRO\n"
3284 " namespace {\n"
3285 "void f( );\n"
3286 "}"));
Daniel Jasper40e19212013-05-29 13:16:10 +00003287 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00003288 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
3289 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00003290 // Only if everything is upper case.
3291 EXPECT_EQ("class A : public QObject {\n"
3292 " Q_Object A() {}\n"
3293 "};",
3294 format("class A : public QObject {\n"
3295 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00003296 " A() {\n}\n"
3297 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00003298
3299 // Only if the next line can actually start an unwrapped line.
3300 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
3301 format("SOME_WEIRD_LOG_MACRO\n"
3302 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00003303
3304 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00003305 "(n, buffers))\n",
3306 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00003307}
3308
Alexander Kornienkode644272013-04-08 22:16:06 +00003309TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
3310 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3311 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3312 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003313 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00003314 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3315 "int *createScopDetectionPass() { return 0; }",
3316 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3317 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3318 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
3319 " class X {};\n"
3320 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3321 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003322 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
3323 // braces, so that inner block is indented one level more.
3324 EXPECT_EQ("int q() {\n"
3325 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3326 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3327 " IPC_END_MESSAGE_MAP()\n"
3328 "}",
3329 format("int q() {\n"
3330 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3331 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3332 " IPC_END_MESSAGE_MAP()\n"
3333 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00003334
Daniel Jasper352dae12014-01-03 11:50:46 +00003335 // Same inside macros.
3336 EXPECT_EQ("#define LIST(L) \\\n"
3337 " L(A) \\\n"
3338 " L(B) \\\n"
3339 " L(C)",
3340 format("#define LIST(L) \\\n"
3341 " L(A) \\\n"
3342 " L(B) \\\n"
3343 " L(C)",
3344 getGoogleStyle()));
3345
Daniel Jasper545c6522013-09-17 09:26:07 +00003346 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003347 EXPECT_EQ("int q() {\n"
3348 " f(x);\n"
3349 " f(x) {}\n"
3350 " f(x)->g();\n"
3351 " f(x)->*g();\n"
3352 " f(x).g();\n"
3353 " f(x) = x;\n"
3354 " f(x) += x;\n"
3355 " f(x) -= x;\n"
3356 " f(x) *= x;\n"
3357 " f(x) /= x;\n"
3358 " f(x) %= x;\n"
3359 " f(x) &= x;\n"
3360 " f(x) |= x;\n"
3361 " f(x) ^= x;\n"
3362 " f(x) >>= x;\n"
3363 " f(x) <<= x;\n"
3364 " f(x)[y].z();\n"
3365 " LOG(INFO) << x;\n"
3366 " ifstream(x) >> x;\n"
3367 "}\n",
3368 format("int q() {\n"
3369 " f(x)\n;\n"
3370 " f(x)\n {}\n"
3371 " f(x)\n->g();\n"
3372 " f(x)\n->*g();\n"
3373 " f(x)\n.g();\n"
3374 " f(x)\n = x;\n"
3375 " f(x)\n += x;\n"
3376 " f(x)\n -= x;\n"
3377 " f(x)\n *= x;\n"
3378 " f(x)\n /= x;\n"
3379 " f(x)\n %= x;\n"
3380 " f(x)\n &= x;\n"
3381 " f(x)\n |= x;\n"
3382 " f(x)\n ^= x;\n"
3383 " f(x)\n >>= x;\n"
3384 " f(x)\n <<= x;\n"
3385 " f(x)\n[y].z();\n"
3386 " LOG(INFO)\n << x;\n"
3387 " ifstream(x)\n >> x;\n"
3388 "}\n"));
3389 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003390 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003391 " if (1) {\n"
3392 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003393 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003394 " while (1) {\n"
3395 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003396 " F(x)\n"
3397 " G(x);\n"
3398 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003399 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003400 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003401 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003402 " }\n"
3403 "}\n",
3404 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003405 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003406 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003407 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003408 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003409 "F(x)\n"
3410 "G(x);\n"
3411 "F(x)\n"
3412 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003413 "}\n"));
3414 EXPECT_EQ("class A {\n"
3415 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00003416 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003417 " A(X x)\n" // FIXME: function-level try blocks are broken.
3418 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003419 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003420 " }\n"
3421 "};",
3422 format("class A {\n"
3423 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00003424 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003425 " A(X x)\n"
3426 " try : t(0) {} catch (...) {}\n"
3427 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00003428 EXPECT_EQ("class SomeClass {\n"
3429 "public:\n"
3430 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3431 "};",
3432 format("class SomeClass {\n"
3433 "public:\n"
3434 " SomeClass()\n"
3435 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3436 "};"));
3437 EXPECT_EQ("class SomeClass {\n"
3438 "public:\n"
3439 " SomeClass()\n"
3440 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3441 "};",
3442 format("class SomeClass {\n"
3443 "public:\n"
3444 " SomeClass()\n"
3445 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3446 "};",
3447 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00003448
3449 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00003450}
3451
Manuel Klimek4fe43002013-05-22 12:51:29 +00003452TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
3453 verifyFormat("#define A \\\n"
3454 " f({ \\\n"
3455 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003456 " });",
3457 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00003458}
3459
Manuel Klimekef2cfb12013-01-05 22:14:16 +00003460TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
3461 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
3462}
3463
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003464TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003465 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003466}
3467
Manuel Klimek1058d982013-01-06 20:07:31 +00003468TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3469 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
3470 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3471 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
3472 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3473}
Manuel Klimek1abf7892013-01-04 23:34:14 +00003474
Daniel Jaspere2408e32015-05-06 11:16:43 +00003475TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003476 EXPECT_EQ(
3477 "#define A \\\n int i; \\\n int j;",
3478 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003479 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00003480 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003481 EXPECT_EQ("/* \\ \\ \\\n*/", format("\\\n/* \\ \\ \\\n*/"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00003482 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003483}
3484
Alexander Kornienko00691cf2015-01-12 13:11:12 +00003485TEST_F(FormatTest, DontCrashOnBlockComments) {
3486 EXPECT_EQ(
3487 "int xxxxxxxxx; /* "
3488 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\n"
3489 "zzzzzz\n"
3490 "0*/",
3491 format("int xxxxxxxxx; /* "
3492 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzz\n"
3493 "0*/"));
3494}
3495
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003496TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3497 verifyFormat("#define A \\\n"
3498 " int v( \\\n"
3499 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003500 " int i;",
3501 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003502}
3503
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003504TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00003505 EXPECT_EQ(
3506 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3507 " \\\n"
3508 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3509 "\n"
3510 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3511 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3512 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
3513 "\\\n"
3514 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3515 " \n"
3516 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3517 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003518}
3519
Manuel Klimek52b15152013-01-09 15:25:02 +00003520TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3521 EXPECT_EQ("int\n"
3522 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003523 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003524 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003525 verifyFormat("functionCallTo(\n"
3526 " someOtherFunction(\n"
3527 " withSomeParameters, whichInSequence,\n"
3528 " areLongerThanALine(andAnotherCall,\n"
3529 "#define A B\n"
3530 " withMoreParamters,\n"
3531 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003532 " andMoreParameters),\n"
3533 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003534 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00003535 verifyFormat("Foo::Foo()\n"
3536 "#ifdef BAR\n"
3537 " : baz(0)\n"
3538 "#endif\n"
3539 "{\n"
3540 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00003541 verifyFormat("void f() {\n"
3542 " if (true)\n"
3543 "#ifdef A\n"
3544 " f(42);\n"
3545 " x();\n"
3546 "#else\n"
3547 " g();\n"
3548 " x();\n"
3549 "#endif\n"
3550 "}");
3551 verifyFormat("void f(param1, param2,\n"
3552 " param3,\n"
3553 "#ifdef A\n"
3554 " param4(param5,\n"
3555 "#ifdef A1\n"
3556 " param6,\n"
3557 "#ifdef A2\n"
3558 " param7),\n"
3559 "#else\n"
3560 " param8),\n"
3561 " param9,\n"
3562 "#endif\n"
3563 " param10,\n"
3564 "#endif\n"
3565 " param11)\n"
3566 "#else\n"
3567 " param12)\n"
3568 "#endif\n"
3569 "{\n"
3570 " x();\n"
3571 "}",
3572 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00003573 verifyFormat("#if 1\n"
3574 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003575 verifyFormat("#if 1\n"
3576 "#endif\n"
3577 "#if 1\n"
3578 "#else\n"
3579 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00003580 verifyFormat("DEBUG({\n"
3581 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3582 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3583 "});\n"
3584 "#if a\n"
3585 "#else\n"
3586 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00003587
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003588 verifyIncompleteFormat("void f(\n"
3589 "#if A\n"
3590 " );\n"
3591 "#else\n"
3592 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00003593}
3594
Manuel Klimek14bd9172014-01-29 08:49:02 +00003595TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3596 verifyFormat("#endif\n"
3597 "#if B");
3598}
3599
Manuel Klimek88033d72013-10-21 08:11:15 +00003600TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3601 FormatStyle SingleLine = getLLVMStyle();
3602 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00003603 verifyFormat("#if 0\n"
3604 "#elif 1\n"
3605 "#endif\n"
3606 "void foo() {\n"
3607 " if (test) foo2();\n"
3608 "}",
3609 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00003610}
3611
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003612TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00003613 verifyFormat("functionCall({ int i; });");
3614 verifyFormat("functionCall({\n"
3615 " int i;\n"
3616 " int j;\n"
3617 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00003618 verifyFormat("functionCall(\n"
3619 " {\n"
3620 " int i;\n"
3621 " int j;\n"
3622 " },\n"
3623 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00003624 verifyFormat("functionA(functionB({\n"
3625 " int i;\n"
3626 " int j;\n"
3627 " }),\n"
3628 " aaaa, bbbb, cccc);");
3629 verifyFormat("functionCall(\n"
3630 " {\n"
3631 " int i;\n"
3632 " int j;\n"
3633 " },\n"
3634 " aaaa, bbbb, // comment\n"
3635 " cccc);");
3636 verifyFormat("functionA(functionB({\n"
3637 " int i;\n"
3638 " int j;\n"
3639 " }),\n"
3640 " aaaa, bbbb, // comment\n"
3641 " cccc);");
3642 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3643 verifyFormat("functionCall(aaaa, bbbb, {\n"
3644 " int i;\n"
3645 " int j;\n"
3646 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00003647 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00003648 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00003649 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003650 " int i; // break\n"
3651 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00003652 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3653 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003654 verifyFormat("DEBUG({\n"
3655 " if (a)\n"
3656 " f();\n"
3657 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003658}
3659
3660TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003661 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003662 "int i;",
3663 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003664}
3665
3666TEST_F(FormatTest, LayoutNestedBlocks) {
3667 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3668 " struct s {\n"
3669 " int i;\n"
3670 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003671 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003672 " for (int i = 0; i < 10; ++i)\n"
3673 " return;\n"
3674 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003675 verifyFormat("call(parameter, {\n"
3676 " something();\n"
3677 " // Comment using all columns.\n"
3678 " somethingelse();\n"
3679 "});",
3680 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00003681 verifyFormat("DEBUG( //\n"
3682 " { f(); }, a);");
3683 verifyFormat("DEBUG( //\n"
3684 " {\n"
3685 " f(); //\n"
3686 " },\n"
3687 " a);");
3688
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003689 EXPECT_EQ("call(parameter, {\n"
3690 " something();\n"
3691 " // Comment too\n"
3692 " // looooooooooong.\n"
3693 " somethingElse();\n"
3694 "});",
3695 format("call(parameter, {\n"
3696 " something();\n"
3697 " // Comment too looooooooooong.\n"
3698 " somethingElse();\n"
3699 "});",
3700 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003701 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003702 EXPECT_EQ("DEBUG({ // comment\n"
3703 " int i;\n"
3704 "});",
3705 format("DEBUG({ // comment\n"
3706 "int i;\n"
3707 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003708 EXPECT_EQ("DEBUG({\n"
3709 " int i;\n"
3710 "\n"
3711 " // comment\n"
3712 " int j;\n"
3713 "});",
3714 format("DEBUG({\n"
3715 " int i;\n"
3716 "\n"
3717 " // comment\n"
3718 " int j;\n"
3719 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003720
3721 verifyFormat("DEBUG({\n"
3722 " if (a)\n"
3723 " return;\n"
3724 "});");
3725 verifyGoogleFormat("DEBUG({\n"
3726 " if (a) return;\n"
3727 "});");
3728 FormatStyle Style = getGoogleStyle();
3729 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003730 verifyFormat("Debug(aaaaa,\n"
3731 " {\n"
3732 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3733 " },\n"
3734 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003735 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003736
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003737 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3738
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003739 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003740}
3741
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003742TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3743 EXPECT_EQ("#define MACRO() \\\n"
3744 " Debug(aaa, /* force line break */ \\\n"
3745 " { \\\n"
3746 " int i; \\\n"
3747 " int j; \\\n"
3748 " })",
3749 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3750 " { int i; int j; })",
3751 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003752
3753 EXPECT_EQ("#define A \\\n"
3754 " [] { \\\n"
3755 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3756 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3757 " }",
3758 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3759 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3760 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003761}
3762
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003763TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3764 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003765 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003766 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003767}
3768
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003769TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3770 FormatStyle Style = getLLVMStyle();
3771 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3772 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3773 verifyFormat("FOO_BEGIN\n"
3774 " FOO_ENTRY\n"
3775 "FOO_END", Style);
3776 verifyFormat("FOO_BEGIN\n"
3777 " NESTED_FOO_BEGIN\n"
3778 " NESTED_FOO_ENTRY\n"
3779 " NESTED_FOO_END\n"
3780 "FOO_END", Style);
3781 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3782 " int x;\n"
3783 " x = 1;\n"
3784 "FOO_END(Baz)", Style);
3785}
3786
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003787//===----------------------------------------------------------------------===//
3788// Line break tests.
3789//===----------------------------------------------------------------------===//
3790
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003791TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003792 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003793 "void f() {\n"
3794 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3795 " parameter, parameter, parameter)),\n"
3796 " SecondLongCall(parameter));\n"
3797 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003798 verifyFormat(
3799 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3800 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3801 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3802 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3803 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003804 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3805 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3806 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3807 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003808 verifyFormat(
3809 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3810 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3811 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3812 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003813 verifyFormat("int a = bbbb && ccc &&\n"
3814 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003815 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003816 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003817}
3818
Daniel Jasperd69fc772013-05-08 14:12:04 +00003819TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3820 verifyFormat(
3821 "bool aaaaaaa =\n"
3822 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3823 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003824 verifyFormat(
3825 "bool aaaaaaa =\n"
3826 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3827 " bbbbbbbb();");
3828
Daniel Jasperd69fc772013-05-08 14:12:04 +00003829 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3830 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3831 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003832 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3833 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3834 " ccccccccc == ddddddddddd;");
3835 verifyFormat(
3836 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3837 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3838 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003839
3840 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3841 " aaaaaa) &&\n"
3842 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003843 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3844 " aaaaaa) >>\n"
3845 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003846 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003847 " SourceMgr.getSpellingColumnNumber(\n"
3848 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3849 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003850
Daniel Jasper68d888c2013-06-03 08:42:05 +00003851 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3852 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3853 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003854 verifyFormat("b = a &&\n"
3855 " // Comment\n"
3856 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003857
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003858 // If the LHS of a comparison is not a binary expression itself, the
3859 // additional linebreak confuses many people.
3860 verifyFormat(
3861 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3862 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3863 "}");
3864 verifyFormat(
3865 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3866 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3867 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003868 verifyFormat(
3869 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3870 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3871 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003872 // Even explicit parentheses stress the precedence enough to make the
3873 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003874 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3875 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3876 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003877 // This cases is borderline, but with the indentation it is still readable.
3878 verifyFormat(
3879 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3880 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3881 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3882 "}",
3883 getLLVMStyleWithColumns(75));
3884
3885 // If the LHS is a binary expression, we should still use the additional break
3886 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003887 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3888 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3889 " 5) {\n"
3890 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003891
Daniel Jasper571f1af2013-05-14 20:39:56 +00003892 FormatStyle OnePerLine = getLLVMStyle();
3893 OnePerLine.BinPackParameters = false;
3894 verifyFormat(
3895 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3896 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3897 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3898 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00003899
3900 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3901 " .aaa(aaaaaaaaaaaaa) *\n"
3902 " aaaaaaa +\n"
3903 " aaaaaaa;",
3904 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00003905}
3906
Daniel Jasper6bee6822013-04-08 20:33:42 +00003907TEST_F(FormatTest, ExpressionIndentation) {
3908 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3909 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3910 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3911 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3912 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3913 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3914 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3915 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3916 " ccccccccccccccccccccccccccccccccccccccccc;");
3917 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3918 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3919 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3920 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3921 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3922 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3923 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3924 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3925 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3926 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3927 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3928 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003929 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00003930 "} else if (aaaaa &&\n"
3931 " bbbbb > // break\n"
3932 " ccccc) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003933 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00003934
3935 // Presence of a trailing comment used to change indentation of b.
3936 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3937 " b;\n"
3938 "return aaaaaaaaaaaaaaaaaaa +\n"
3939 " b; //",
3940 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003941}
3942
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003943TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3944 // Not sure what the best system is here. Like this, the LHS can be found
3945 // immediately above an operator (everything with the same or a higher
3946 // indent). The RHS is aligned right of the operator and so compasses
3947 // everything until something with the same indent as the operator is found.
3948 // FIXME: Is this a good system?
3949 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003950 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003951 verifyFormat(
3952 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003953 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3954 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3955 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3956 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3957 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003958 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003959 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3960 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003961 Style);
3962 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003963 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3964 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003965 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3966 Style);
3967 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003968 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3969 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003970 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3971 Style);
3972 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3973 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003974 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3975 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003976 Style);
3977 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003978 "} else if (aaaaa\n"
3979 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003980 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003981 "}",
3982 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003983 verifyFormat("return (a)\n"
3984 " // comment\n"
3985 " + b;",
3986 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003987 verifyFormat(
3988 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3989 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3990 " + cc;",
3991 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003992
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003993 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3994 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3995 Style);
3996
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003997 // Forced by comments.
3998 verifyFormat(
3999 "unsigned ContentSize =\n"
4000 " sizeof(int16_t) // DWARF ARange version number\n"
4001 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4002 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
4003 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00004004
4005 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
4006 " == boost::fusion::at_c<1>(iiii).second;",
4007 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00004008
4009 Style.ColumnLimit = 60;
4010 verifyFormat("zzzzzzzzzz\n"
4011 " = bbbbbbbbbbbbbbbbb\n"
4012 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
4013 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004014}
4015
Daniel Jasper3219e432014-12-02 13:24:51 +00004016TEST_F(FormatTest, NoOperandAlignment) {
4017 FormatStyle Style = getLLVMStyle();
4018 Style.AlignOperands = false;
4019 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00004020 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4021 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4022 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4023 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4024 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4025 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4026 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4027 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4028 " > ccccccccccccccccccccccccccccccccccccccccc;",
4029 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004030
4031 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4032 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4033 " + cc;",
4034 Style);
4035 verifyFormat("int a = aa\n"
4036 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4037 " * cccccccccccccccccccccccccccccccccccc;",
4038 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00004039
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004040 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00004041 verifyFormat("return (a > b\n"
4042 " // comment1\n"
4043 " // comment2\n"
4044 " || c);",
4045 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004046}
4047
Daniel Jasperac043c92014-09-15 11:11:00 +00004048TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
4049 FormatStyle Style = getLLVMStyle();
4050 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4051 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4052 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00004053 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4054 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00004055}
4056
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004057TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004058 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004059 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
4060 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004061 verifyFormat("Constructor()\n"
4062 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004063 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004064 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004065 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004066 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004067
Daniel Jasper7b259cd2015-08-27 11:59:31 +00004068 verifyFormat("template <typename T>\n"
4069 "Constructor() : Initializer(FitsOnTheLine) {}",
4070 getLLVMStyleWithColumns(45));
4071
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004072 verifyFormat(
4073 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004074 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004075
4076 verifyFormat(
4077 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004078 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004079 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004080 verifyFormat(
4081 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004082 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004083 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00004084 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4085 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4086 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004087
4088 verifyFormat("Constructor()\n"
4089 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4090 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4091 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004092 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004093
Daniel Jasper65585ed2013-01-28 13:31:35 +00004094 verifyFormat("Constructor()\n"
4095 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004096 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00004097
Daniel Jasper62e68172013-02-25 15:59:54 +00004098 verifyFormat("Constructor(int Parameter = 0)\n"
4099 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4100 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00004101 verifyFormat("Constructor()\n"
4102 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4103 "}",
4104 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00004105 verifyFormat("Constructor()\n"
4106 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4107 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00004108
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004109 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00004110 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004111 verifyFormat("Constructor()\n"
4112 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4113 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
4114 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004115
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004116 FormatStyle OnePerLine = getLLVMStyle();
4117 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00004118 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004119 verifyFormat("SomeClass::Constructor()\n"
4120 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4121 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004122 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004123 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004124 verifyFormat("SomeClass::Constructor()\n"
4125 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4126 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004127 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004128 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004129 verifyFormat("MyClass::MyClass(int var)\n"
4130 " : some_var_(var), // 4 space indent\n"
4131 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004132 "}",
4133 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00004134 verifyFormat("Constructor()\n"
4135 " : aaaaa(aaaaaa),\n"
4136 " aaaaa(aaaaaa),\n"
4137 " aaaaa(aaaaaa),\n"
4138 " aaaaa(aaaaaa),\n"
4139 " aaaaa(aaaaaa) {}",
4140 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00004141 verifyFormat("Constructor()\n"
4142 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4143 " aaaaaaaaaaaaaaaaaaaaaa) {}",
4144 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00004145 OnePerLine.BinPackParameters = false;
4146 verifyFormat(
4147 "Constructor()\n"
4148 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4149 " aaaaaaaaaaa().aaa(),\n"
4150 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4151 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00004152 OnePerLine.ColumnLimit = 60;
4153 verifyFormat("Constructor()\n"
4154 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
4155 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4156 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00004157
4158 EXPECT_EQ("Constructor()\n"
4159 " : // Comment forcing unwanted break.\n"
4160 " aaaa(aaaa) {}",
4161 format("Constructor() :\n"
4162 " // Comment forcing unwanted break.\n"
4163 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004164}
4165
4166TEST_F(FormatTest, MemoizationTests) {
4167 // This breaks if the memoization lookup does not take \c Indent and
4168 // \c LastSpace into account.
4169 verifyFormat(
4170 "extern CFRunLoopTimerRef\n"
4171 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
4172 " CFTimeInterval interval, CFOptionFlags flags,\n"
4173 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00004174 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004175
4176 // Deep nesting somewhat works around our memoization.
4177 verifyFormat(
4178 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4179 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4180 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4181 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4182 " aaaaa())))))))))))))))))))))))))))))))))))))));",
4183 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00004184 verifyFormat(
4185 "aaaaa(\n"
4186 " aaaaa,\n"
4187 " aaaaa(\n"
4188 " aaaaa,\n"
4189 " aaaaa(\n"
4190 " aaaaa,\n"
4191 " aaaaa(\n"
4192 " aaaaa,\n"
4193 " aaaaa(\n"
4194 " aaaaa,\n"
4195 " aaaaa(\n"
4196 " aaaaa,\n"
4197 " aaaaa(\n"
4198 " aaaaa,\n"
4199 " aaaaa(\n"
4200 " aaaaa,\n"
4201 " aaaaa(\n"
4202 " aaaaa,\n"
4203 " aaaaa(\n"
4204 " aaaaa,\n"
4205 " aaaaa(\n"
4206 " aaaaa,\n"
4207 " aaaaa(\n"
4208 " aaaaa,\n"
4209 " aaaaa))))))))))));",
4210 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00004211 verifyFormat(
4212 "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"
4213 " a),\n"
4214 " a),\n"
4215 " a),\n"
4216 " a),\n"
4217 " a),\n"
4218 " a),\n"
4219 " a),\n"
4220 " a),\n"
4221 " a),\n"
4222 " a),\n"
4223 " a),\n"
4224 " a),\n"
4225 " a),\n"
4226 " a),\n"
4227 " a),\n"
4228 " a),\n"
4229 " a)",
4230 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00004231
4232 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004233 FormatStyle OnePerLine = getLLVMStyle();
4234 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004235 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00004236 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00004237 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00004238 for (unsigned i = 0, e = 80; i != e; ++i) {
4239 input += " a,\n";
4240 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004241 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004242 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004243}
4244
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004245TEST_F(FormatTest, BreaksAsHighAsPossible) {
4246 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004247 "void f() {\n"
4248 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
4249 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
4250 " f();\n"
4251 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00004252 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004253 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004254}
4255
Daniel Jasper6728fc12013-04-11 14:29:13 +00004256TEST_F(FormatTest, BreaksFunctionDeclarations) {
4257 // Principially, we break function declarations in a certain order:
4258 // 1) break amongst arguments.
4259 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
4260 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004261 verifyFormat("template <class TemplateIt>\n"
4262 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
4263 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00004264
4265 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00004266 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004267 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004268 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004269 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004270
4271 // 3) break after (.
4272 verifyFormat(
4273 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00004274 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
4275 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004276
4277 // 4) break before after nested name specifiers.
4278 verifyFormat(
4279 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004280 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
4281 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004282 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004283
4284 // However, there are exceptions, if a sufficient amount of lines can be
4285 // saved.
4286 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
4287 // more adjusting.
4288 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4289 " Cccccccccccccc cccccccccc,\n"
4290 " Cccccccccccccc cccccccccc,\n"
4291 " Cccccccccccccc cccccccccc,\n"
4292 " Cccccccccccccc cccccccccc);");
4293 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004294 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004295 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4296 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4297 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004298 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004299 verifyFormat(
4300 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4301 " Cccccccccccccc cccccccccc,\n"
4302 " Cccccccccccccc cccccccccc,\n"
4303 " Cccccccccccccc cccccccccc,\n"
4304 " Cccccccccccccc cccccccccc,\n"
4305 " Cccccccccccccc cccccccccc,\n"
4306 " Cccccccccccccc cccccccccc);");
4307 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4308 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4309 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4310 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4311 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00004312
4313 // Break after multi-line parameters.
4314 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4315 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4316 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4317 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00004318 verifyFormat("void SomeLoooooooooooongFunction(\n"
4319 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
4320 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4321 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004322
4323 // Treat overloaded operators like other functions.
4324 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4325 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00004326 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4327 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00004328 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4329 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
4330 verifyGoogleFormat(
4331 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
4332 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004333 verifyGoogleFormat(
4334 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
4335 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00004336 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4337 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4338 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
4339 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00004340 verifyGoogleFormat(
4341 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
4342 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4343 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00004344 verifyGoogleFormat(
4345 "template <typename T>\n"
4346 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4347 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
4348 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00004349
4350 FormatStyle Style = getLLVMStyle();
4351 Style.PointerAlignment = FormatStyle::PAS_Left;
4352 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4353 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
4354 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004355 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
4356 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4357 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00004358}
4359
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004360TEST_F(FormatTest, TrailingReturnType) {
4361 verifyFormat("auto foo() -> int;\n");
4362 verifyFormat("struct S {\n"
4363 " auto bar() const -> int;\n"
4364 "};");
4365 verifyFormat("template <size_t Order, typename T>\n"
4366 "auto load_img(const std::string &filename)\n"
4367 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00004368 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
4369 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00004370 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00004371 verifyFormat("template <typename T>\n"
4372 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
4373 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00004374
4375 // Not trailing return types.
4376 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004377}
4378
Daniel Jasper5be31f72013-05-21 09:16:31 +00004379TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004380 // Avoid breaking before trailing 'const' or other trailing annotations, if
4381 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00004382 FormatStyle Style = getGoogleStyle();
4383 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00004384 verifyFormat("void someLongFunction(\n"
4385 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00004386 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00004387 verifyFormat("LoooooongReturnType\n"
4388 "someLoooooooongFunction() const {}",
4389 getLLVMStyleWithColumns(47));
4390 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
4391 " const {}",
4392 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004393 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4394 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
4395 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4396 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
4397 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4398 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00004399 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
4400 " aaaaaaaaaaa aaaaa) const override;");
4401 verifyGoogleFormat(
4402 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4403 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004404
Daniel Jasper5550de62014-02-17 07:57:46 +00004405 // Even if the first parameter has to be wrapped.
4406 verifyFormat("void someLongFunction(\n"
4407 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004408 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00004409 verifyFormat("void someLongFunction(\n"
4410 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004411 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00004412 verifyFormat("void someLongFunction(\n"
4413 " int someLongParameter) override {}",
4414 Style);
4415 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004416 " int someLongParameter) OVERRIDE {}",
4417 Style);
4418 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004419 " int someLongParameter) final {}",
4420 Style);
4421 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004422 " int someLongParameter) FINAL {}",
4423 Style);
4424 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004425 " int parameter) const override {}",
4426 Style);
4427
Daniel Jaspere3f907f2014-06-02 09:52:08 +00004428 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
4429 verifyFormat("void someLongFunction(\n"
4430 " int someLongParameter) const\n"
4431 "{\n"
4432 "}",
4433 Style);
4434
Daniel Jasper5550de62014-02-17 07:57:46 +00004435 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004436 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
4437 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4438 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00004439
4440 // Breaking before function-like trailing annotations is fine to keep them
4441 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00004442 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4443 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4444 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4445 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4446 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4447 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00004448 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4449 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00004450 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004451
4452 verifyFormat(
4453 "void aaaaaaaaaaaaaaaaaa()\n"
4454 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4455 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
4456 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4457 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004458 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004459 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004460 " GUARDED_BY(aaaaaaaaaaaa);");
4461 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004462 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004463 " GUARDED_BY(aaaaaaaaaaaa);");
4464 verifyGoogleFormat(
4465 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4466 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004467 verifyGoogleFormat(
4468 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4469 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004470}
4471
Daniel Jasperf090f032015-05-18 09:47:22 +00004472TEST_F(FormatTest, FunctionAnnotations) {
4473 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004474 "int OldFunction(const string &parameter) {}");
4475 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004476 "string OldFunction(const string &parameter) {}");
4477 verifyFormat("template <typename T>\n"
4478 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4479 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004480
4481 // Not function annotations.
4482 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4483 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004484 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4485 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004486 verifyFormat("MACRO(abc).function() // wrap\n"
4487 " << abc;");
4488 verifyFormat("MACRO(abc)->function() // wrap\n"
4489 " << abc;");
4490 verifyFormat("MACRO(abc)::function() // wrap\n"
4491 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004492}
4493
Daniel Jasperf7935112012-12-03 18:12:45 +00004494TEST_F(FormatTest, BreaksDesireably) {
4495 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4496 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004497 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004498 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4499 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4500 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004501
4502 verifyFormat(
4503 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004504 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004505
4506 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4507 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4508 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004509
4510 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004511 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4512 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4513 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004514 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4515 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004516
4517 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4518 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4519
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004520 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004521 "void f() {\n"
4522 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4523 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4524 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004525 verifyFormat(
4526 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4527 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4528 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004529 "aaaaaa(aaa,\n"
4530 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4531 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jaspera44991332015-04-29 13:06:49 +00004532 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4533 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4534 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004535
Daniel Jasper739b85f2015-06-29 10:42:59 +00004536 // Indent consistently independent of call expression and unary operator.
4537 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4538 " dddddddddddddddddddddddddddddd));");
4539 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4540 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004541 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004542 " dddddddddddddddddddddddddddddd));");
4543
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004544 // This test case breaks on an incorrect memoization, i.e. an optimization not
4545 // taking into account the StopAt value.
4546 verifyFormat(
4547 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004548 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4549 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4550 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004551
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004552 verifyFormat("{\n {\n {\n"
4553 " Annotation.SpaceRequiredBefore =\n"
4554 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4555 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4556 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004557
4558 // Break on an outer level if there was a break on an inner level.
4559 EXPECT_EQ("f(g(h(a, // comment\n"
4560 " b, c),\n"
4561 " d, e),\n"
4562 " x, y);",
4563 format("f(g(h(a, // comment\n"
4564 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004565
4566 // Prefer breaking similar line breaks.
4567 verifyFormat(
4568 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4569 " NSTrackingMouseEnteredAndExited |\n"
4570 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004571}
4572
Daniel Jasper18210d72014-10-09 09:52:05 +00004573TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4574 FormatStyle NoBinPacking = getGoogleStyle();
4575 NoBinPacking.BinPackParameters = false;
4576 NoBinPacking.BinPackArguments = true;
4577 verifyFormat("void f() {\n"
4578 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4579 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4580 "}",
4581 NoBinPacking);
4582 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4583 " int aaaaaaaaaaaaaaaaaaaa,\n"
4584 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4585 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004586
Daniel Jasper00693b082016-01-09 15:56:47 +00004587 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4588 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4589 " vector<int> bbbbbbbbbbbbbbb);",
4590 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004591 // FIXME: This behavior difference is probably not wanted. However, currently
4592 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4593 // template arguments from BreakBeforeParameter being set because of the
4594 // one-per-line formatting.
4595 verifyFormat(
4596 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4597 " aaaaaaaaaa> aaaaaaaaaa);",
4598 NoBinPacking);
4599 verifyFormat(
4600 "void fffffffffff(\n"
4601 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4602 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004603}
4604
Daniel Jasper9278eb92013-01-16 14:59:02 +00004605TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004606 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004607 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004608 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004609 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4610 " aaaaaaaaaaaaaaaaaaaa,\n"
4611 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4612 NoBinPacking);
4613 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4614 " aaaaaaaaaaaaa,\n"
4615 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4616 NoBinPacking);
4617 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004618 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4619 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4620 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4621 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004622 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4623 NoBinPacking);
4624 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4625 " .aaaaaaaaaaaaaaaaaa();",
4626 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004627 verifyFormat("void f() {\n"
4628 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4629 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4630 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004631 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004632
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004633 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004634 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4635 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004636 " aaaaaaaaaaaa);",
4637 NoBinPacking);
4638 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004639 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4640 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004641 " test);",
4642 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004643
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004644 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4645 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004646 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4647 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004648 NoBinPacking);
4649 verifyFormat("a(\"a\"\n"
4650 " \"a\",\n"
4651 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004652
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004653 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004654 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004655 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004656 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004657 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004658 verifyFormat(
4659 "void f() {\n"
4660 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4661 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004662 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004663 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004664 verifyFormat(
4665 "template <class SomeType, class SomeOtherType>\n"
4666 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4667 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004668}
4669
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004670TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4671 FormatStyle Style = getLLVMStyleWithColumns(15);
4672 Style.ExperimentalAutoDetectBinPacking = true;
4673 EXPECT_EQ("aaa(aaaa,\n"
4674 " aaaa,\n"
4675 " aaaa);\n"
4676 "aaa(aaaa,\n"
4677 " aaaa,\n"
4678 " aaaa);",
4679 format("aaa(aaaa,\n" // one-per-line
4680 " aaaa,\n"
4681 " aaaa );\n"
4682 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4683 Style));
4684 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4685 " aaaa);\n"
4686 "aaa(aaaa, aaaa,\n"
4687 " aaaa);",
4688 format("aaa(aaaa, aaaa,\n" // bin-packed
4689 " aaaa );\n"
4690 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4691 Style));
4692}
4693
Daniel Jasper04468962013-01-18 10:56:38 +00004694TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004695 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4696 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4697 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4698 " .StartsWith(\".init\", ORDER_INIT)\n"
4699 " .StartsWith(\".fini\", ORDER_FINI)\n"
4700 " .StartsWith(\".hash\", ORDER_HASH)\n"
4701 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004702
Daniel Jaspereb50c672013-02-15 20:33:06 +00004703 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004704 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004705 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004706 "aaaaaaa->aaaaaaa\n"
4707 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4708 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004709 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004710 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004711 "aaaaaaa->aaaaaaa\n"
4712 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4713 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4714 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004715 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004716 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004717 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004718 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4719 " aaaaaa->aaaaaaaaaaaa()\n"
4720 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004721 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004722 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004723 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004724 "void f() {\n"
4725 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004726 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004727 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004728 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004729 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004730 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004731 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004732 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004733 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004734 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004735 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004736 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004737
4738 verifyFormat(
4739 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4740 verifyFormat("aaaaaaaaaaaaaaa()\n"
4741 " .aaaaaaaaaaaaaaa()\n"
4742 " .aaaaaaaaaaaaaaa()\n"
4743 " .aaaaaaaaaaaaaaa()\n"
4744 " .aaaaaaaaaaaaaaa();");
4745 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4746 " .aaaaaaaaaaaaaaa()\n"
4747 " .aaaaaaaaaaaaaaa()\n"
4748 " .aaaaaaaaaaaaaaa();");
4749 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4750 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4751 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004752 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4753 " ->aaaaaaaaaaaaaae(0)\n"
4754 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004755
Daniel Jasper775954b2015-04-24 10:08:09 +00004756 // Don't linewrap after very short segments.
4757 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4758 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4759 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4760 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4761 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4762 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4763 verifyFormat("aaa()\n"
4764 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4765 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4766 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4767
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004768 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4769 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4770 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4771 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4772 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004773 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004774
Daniel Jaspera41aa532014-09-19 08:01:25 +00004775 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004776 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4777 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004778
4779 // Prefer not to create "hanging" indents.
4780 verifyFormat(
4781 "return !soooooooooooooome_map\n"
4782 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4783 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004784 verifyFormat(
4785 "return aaaaaaaaaaaaaaaa\n"
4786 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4787 " .aaaa(aaaaaaaaaaaaaa);");
4788 // No hanging indent here.
4789 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4790 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4791 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4792 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004793 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4794 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4795 getLLVMStyleWithColumns(60));
4796 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4797 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4798 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4799 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004800 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4801 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4802 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004803}
4804
Daniel Jasperde5c2072012-12-24 00:13:23 +00004805TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4806 verifyFormat(
4807 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004808 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004809 verifyFormat(
4810 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4811 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4812
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004813 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004814 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004815 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4816 " ccccccccccccccccccccccccc) {\n}");
4817
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004818 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004819 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004820 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4821 " ccccccccccccccccccccccccc) {\n}");
4822
Daniel Jasperde5c2072012-12-24 00:13:23 +00004823 verifyFormat(
4824 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004825 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004826 verifyFormat(
4827 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4828 " ccccccccccccccccccccccccc) {\n}");
4829
Daniel Jasper400adc62013-02-08 15:28:42 +00004830 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4831 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4832 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4833 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004834 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4835 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4836 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4837 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4838
Daniel Jasper400adc62013-02-08 15:28:42 +00004839 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4840 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4841 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004842 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4843 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4844 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004845}
4846
Daniel Jasper43b65482013-01-23 12:27:43 +00004847TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004848 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004849 "unsigned Cost =\n"
4850 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4851 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004852 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004853 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4854 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004855
4856 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004857 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4858 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004859 verifyFormat("unsigned OriginalStartColumn =\n"
4860 " SourceMgr.getSpellingColumnNumber(\n"
4861 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4862 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004863}
4864
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004865TEST_F(FormatTest, AlignsAfterAssignments) {
4866 verifyFormat(
4867 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004868 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004869 verifyFormat(
4870 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004871 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004872 verifyFormat(
4873 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004874 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004875 verifyFormat(
4876 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004877 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004878 verifyFormat(
4879 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4880 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4881 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004882}
4883
4884TEST_F(FormatTest, AlignsAfterReturn) {
4885 verifyFormat(
4886 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4887 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4888 verifyFormat(
4889 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4890 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004891 verifyFormat(
4892 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004893 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004894 verifyFormat(
4895 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004896 " aaaaaaaaaaaaaaaaaaaaaa());");
4897 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4898 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4899 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4900 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4901 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004902 verifyFormat("return\n"
4903 " // true if code is one of a or b.\n"
4904 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004905}
4906
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004907TEST_F(FormatTest, AlignsAfterOpenBracket) {
4908 verifyFormat(
4909 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4910 " aaaaaaaaa aaaaaaa) {}");
4911 verifyFormat(
4912 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4913 " aaaaaaaaaaa aaaaaaaaa);");
4914 verifyFormat(
4915 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4916 " aaaaaaaaaaaaaaaaaaaaa));");
4917 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004918 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004919 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4920 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4921 Style);
4922 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4923 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4924 Style);
4925 verifyFormat("SomeLongVariableName->someFunction(\n"
4926 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4927 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004928 verifyFormat(
4929 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4930 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4931 Style);
4932 verifyFormat(
4933 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4934 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4935 Style);
4936 verifyFormat(
4937 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4938 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4939 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004940
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004941 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4942 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4943 " b));",
4944 Style);
4945
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004946 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4947 Style.BinPackArguments = false;
4948 Style.BinPackParameters = false;
4949 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4950 " aaaaaaaaaaa aaaaaaaa,\n"
4951 " aaaaaaaaa aaaaaaa,\n"
4952 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4953 Style);
4954 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4955 " aaaaaaaaaaa aaaaaaaaa,\n"
4956 " aaaaaaaaaaa aaaaaaaaa,\n"
4957 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4958 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004959 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4960 " aaaaaaaaaaaaaaa,\n"
4961 " aaaaaaaaaaaaaaaaaaaaa,\n"
4962 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004963 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004964 verifyFormat(
4965 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4966 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4967 Style);
4968 verifyFormat(
4969 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4970 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4971 Style);
4972 verifyFormat(
4973 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4974 " aaaaaaaaaaaaaaaaaaaaa(\n"
4975 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4976 " aaaaaaaaaaaaaaaa);",
4977 Style);
4978 verifyFormat(
4979 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4980 " aaaaaaaaaaaaaaaaaaaaa(\n"
4981 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4982 " aaaaaaaaaaaaaaaa);",
4983 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004984}
4985
Daniel Jasper3219e432014-12-02 13:24:51 +00004986TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4987 FormatStyle Style = getLLVMStyleWithColumns(40);
4988 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4989 " bbbbbbbbbbbbbbbbbbbbbb);",
4990 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004991 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004992 Style.AlignOperands = false;
4993 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4994 " bbbbbbbbbbbbbbbbbbbbbb);",
4995 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004996 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004997 Style.AlignOperands = true;
4998 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4999 " bbbbbbbbbbbbbbbbbbbbbb);",
5000 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005001 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00005002 Style.AlignOperands = false;
5003 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5004 " bbbbbbbbbbbbbbbbbbbbbb);",
5005 Style);
5006}
5007
Daniel Jasper399d24b2013-01-09 07:06:56 +00005008TEST_F(FormatTest, BreaksConditionalExpressions) {
5009 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005010 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
5011 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5012 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00005013 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005014 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
5015 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5016 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005017 verifyFormat(
5018 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
5019 " : aaaaaaaaaaaaa);");
5020 verifyFormat(
5021 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00005022 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005023 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5024 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005025 verifyFormat(
5026 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5027 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5028 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005029 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5030 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5031 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5032 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5033 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5034 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5035 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5036 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5037 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5038 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5039 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5040 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005041 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5042 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5043 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5044 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5045 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00005046 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5047 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5048 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005049 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5050 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5051 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5052 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00005053 verifyFormat(
5054 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5055 " ? aaaaaaaaaaaaaaa\n"
5056 " : aaaaaaaaaaaaaaa;");
5057 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005058 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00005059 " ? b\n"
5060 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00005061 verifyFormat("return aaaa == bbbb\n"
5062 " // comment\n"
5063 " ? aaaa\n"
5064 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005065 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005066 " format(TheLine.First,\n"
5067 " IndentForLevel[TheLine.Level] >= 0\n"
5068 " ? IndentForLevel[TheLine.Level]\n"
5069 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005070 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005071 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00005072 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5073 " ? aaaaaaaaaaaaaaa\n"
5074 " : bbbbbbbbbbbbbbb //\n"
5075 " ? ccccccccccccccc\n"
5076 " : ddddddddddddddd;");
5077 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5078 " ? aaaaaaaaaaaaaaa\n"
5079 " : (bbbbbbbbbbbbbbb //\n"
5080 " ? ccccccccccccccc\n"
5081 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005082 verifyFormat(
5083 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5084 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5085 " aaaaaaaaaaaaaaaaaaaaa +\n"
5086 " aaaaaaaaaaaaaaaaaaaaa\n"
5087 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00005088 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005089 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5090 " : aaaaaaaaaaaaaaaaaaaaaa\n"
5091 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00005092
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005093 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00005094 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005095 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00005096 "void f() {\n"
5097 " g(aaa,\n"
5098 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5099 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5100 " ? aaaaaaaaaaaaaaa\n"
5101 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005102 "}",
5103 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005104 verifyFormat(
5105 "void f() {\n"
5106 " g(aaa,\n"
5107 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5108 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5109 " ?: aaaaaaaaaaaaaaa);\n"
5110 "}",
5111 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00005112
5113 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
5114 " // comment.\n"
5115 " ccccccccccccccccccccccccccccccccccccccc\n"
5116 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5117 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00005118
5119 // Assignments in conditional expressions. Apparently not uncommon :-(.
5120 verifyFormat("return a != b\n"
5121 " // comment\n"
5122 " ? a = b\n"
5123 " : a = b;");
5124 verifyFormat("return a != b\n"
5125 " // comment\n"
5126 " ? a = a != b\n"
5127 " // comment\n"
5128 " ? a = b\n"
5129 " : a\n"
5130 " : a;\n");
5131 verifyFormat("return a != b\n"
5132 " // comment\n"
5133 " ? a\n"
5134 " : a = a != b\n"
5135 " // comment\n"
5136 " ? a = b\n"
5137 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00005138}
5139
Daniel Jasper165b29e2013-11-08 00:57:11 +00005140TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
5141 FormatStyle Style = getLLVMStyle();
5142 Style.BreakBeforeTernaryOperators = false;
5143 Style.ColumnLimit = 70;
5144 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005145 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
5146 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5147 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005148 Style);
5149 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005150 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
5151 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5152 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005153 Style);
5154 verifyFormat(
5155 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
5156 " aaaaaaaaaaaaa);",
5157 Style);
5158 verifyFormat(
5159 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5160 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5161 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5162 " aaaaaaaaaaaaa);",
5163 Style);
5164 verifyFormat(
5165 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5166 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5167 " aaaaaaaaaaaaa);",
5168 Style);
5169 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5170 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5171 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5172 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5173 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5174 Style);
5175 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5176 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5177 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5178 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5179 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5180 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5181 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5182 Style);
5183 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5184 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
5185 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5186 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5187 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5188 Style);
5189 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5190 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5191 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5192 Style);
5193 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00005194 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00005195 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5196 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5197 Style);
5198 verifyFormat(
5199 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5200 " aaaaaaaaaaaaaaa :\n"
5201 " aaaaaaaaaaaaaaa;",
5202 Style);
5203 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5204 " aaaaaaaaa ?\n"
5205 " b :\n"
5206 " c);",
5207 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00005208 verifyFormat("unsigned Indent =\n"
5209 " format(TheLine.First,\n"
5210 " IndentForLevel[TheLine.Level] >= 0 ?\n"
5211 " IndentForLevel[TheLine.Level] :\n"
5212 " TheLine * 2,\n"
5213 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
5214 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005215 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5216 " aaaaaaaaaaaaaaa :\n"
5217 " bbbbbbbbbbbbbbb ? //\n"
5218 " ccccccccccccccc :\n"
5219 " ddddddddddddddd;",
5220 Style);
5221 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5222 " aaaaaaaaaaaaaaa :\n"
5223 " (bbbbbbbbbbbbbbb ? //\n"
5224 " ccccccccccccccc :\n"
5225 " ddddddddddddddd);",
5226 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00005227 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5228 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
5229 " ccccccccccccccccccccccccccc;",
5230 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00005231 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5232 " aaaaa :\n"
5233 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
5234 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005235}
5236
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005237TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
5238 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
5239 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
5240 verifyFormat("bool a = true, b = false;");
5241
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005242 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005243 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005244 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00005245 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005246 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00005247 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005248 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00005249 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00005250 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
5251 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
5252 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5253 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
5254 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
5255 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005256
Daniel Jasperbea1ab42015-03-01 18:55:26 +00005257 FormatStyle Style = getGoogleStyle();
5258 Style.PointerAlignment = FormatStyle::PAS_Left;
5259 Style.DerivePointerAlignment = false;
5260 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5261 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
5262 " *b = bbbbbbbbbbbbbbbbbbb;",
5263 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00005264 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5265 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
5266 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00005267 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00005268 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005269}
5270
Nico Weber4a5030c2013-01-12 01:28:06 +00005271TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
5272 verifyFormat("arr[foo ? bar : baz];");
5273 verifyFormat("f()[foo ? bar : baz];");
5274 verifyFormat("(a + b)[foo ? bar : baz];");
5275 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
5276}
5277
Daniel Jasperf7935112012-12-03 18:12:45 +00005278TEST_F(FormatTest, AlignsStringLiterals) {
5279 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
5280 " \"short literal\");");
5281 verifyFormat(
5282 "looooooooooooooooooooooooongFunction(\n"
5283 " \"short literal\"\n"
5284 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005285 verifyFormat("someFunction(\"Always break between multi-line\"\n"
5286 " \" string literals\",\n"
5287 " and, other, parameters);");
Daniel Jasper240527c2017-01-16 13:13:15 +00005288 EXPECT_EQ("fun +\n"
5289 " \"1243\" /* comment */\n"
5290 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005291 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00005292 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005293 getLLVMStyleWithColumns(28)));
5294 EXPECT_EQ(
5295 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5296 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
5297 " \"aaaaaaaaaaaaaaaa\";",
5298 format("aaaaaa ="
5299 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
5300 "aaaaaaaaaaaaaaaaaaaaa\" "
5301 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper240527c2017-01-16 13:13:15 +00005302 verifyFormat("a = a +\n"
5303 " \"a\"\n"
5304 " \"a\"\n"
5305 " \"a\";");
5306 verifyFormat("f(\"a\",\n"
5307 " \"b\"\n"
5308 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005309
5310 verifyFormat(
5311 "#define LL_FORMAT \"ll\"\n"
5312 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
5313 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00005314
5315 verifyFormat("#define A(X) \\\n"
5316 " \"aaaaa\" #X \"bbbbbb\" \\\n"
5317 " \"ccccc\"",
5318 getLLVMStyleWithColumns(23));
5319 verifyFormat("#define A \"def\"\n"
5320 "f(\"abc\" A \"ghi\"\n"
5321 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005322
5323 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005324 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005325 verifyFormat("#define A(X) \\\n"
5326 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
5327 " L\"ccccc\"",
5328 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00005329
5330 verifyFormat("f(@\"a\"\n"
5331 " @\"b\");");
5332 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00005333 " @\"b\"\n"
5334 " @\"c\";");
5335 verifyFormat("NSString s = @\"a\"\n"
5336 " \"b\"\n"
5337 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00005338}
5339
Zachary Turner448592e2015-12-18 22:20:15 +00005340TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005341 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005342 // No declarations or definitions should be moved to own line.
5343 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
5344 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005345 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005346 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005347 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005348 "int f() { return 1; }\n"
5349 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005350 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00005351
5352 // All declarations and definitions should have the return type moved to its
5353 // own
5354 // line.
5355 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
5356 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005357 " int\n"
5358 " f() {\n"
5359 " return 1;\n"
5360 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005361 " int\n"
5362 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005363 "};\n"
5364 "int\n"
5365 "f() {\n"
5366 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005367 "}\n"
5368 "int\n"
5369 "g();\n",
5370 Style);
5371
5372 // Top-level definitions, and no kinds of declarations should have the
5373 // return type moved to its own line.
5374 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
5375 verifyFormat("class B {\n"
5376 " int f() { return 1; }\n"
5377 " int g();\n"
5378 "};\n"
5379 "int\n"
5380 "f() {\n"
5381 " return 1;\n"
5382 "}\n"
5383 "int g();\n",
5384 Style);
5385
5386 // Top-level definitions and declarations should have the return type moved
5387 // to its own line.
5388 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
5389 verifyFormat("class C {\n"
5390 " int f() { return 1; }\n"
5391 " int g();\n"
5392 "};\n"
5393 "int\n"
5394 "f() {\n"
5395 " return 1;\n"
5396 "}\n"
5397 "int\n"
5398 "g();\n",
5399 Style);
5400
5401 // All definitions should have the return type moved to its own line, but no
5402 // kinds of declarations.
5403 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5404 verifyFormat("class D {\n"
5405 " int\n"
5406 " f() {\n"
5407 " return 1;\n"
5408 " }\n"
5409 " int g();\n"
5410 "};\n"
5411 "int\n"
5412 "f() {\n"
5413 " return 1;\n"
5414 "}\n"
5415 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005416 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005417 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005418 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005419 " return \"\";\n"
5420 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005421 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005422 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005423 verifyFormat("template <class T>\n"
5424 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005425 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005426 " return NULL;\n"
5427 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005428 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005429 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00005430 verifyFormat("class C {\n"
5431 " int\n"
5432 " operator+() {\n"
5433 " return 1;\n"
5434 " }\n"
5435 " int\n"
5436 " operator()() {\n"
5437 " return 1;\n"
5438 " }\n"
5439 "};\n",
5440 Style);
5441 verifyFormat("void\n"
5442 "A::operator()() {}\n"
5443 "void\n"
5444 "A::operator>>() {}\n"
5445 "void\n"
5446 "A::operator+() {}\n",
5447 Style);
5448 verifyFormat("void *operator new(std::size_t s);", // No break here.
5449 Style);
5450 verifyFormat("void *\n"
5451 "operator new(std::size_t s) {}",
5452 Style);
5453 verifyFormat("void *\n"
5454 "operator delete[](void *ptr) {}",
5455 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005456 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005457 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005458 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005459 "{\n"
5460 " return \"\";\n"
5461 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005462 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005463 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005464 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005465 "T *\n" // Problem here: no line break
5466 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005467 "{\n"
5468 " return NULL;\n"
5469 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005470 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005471 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005472}
5473
Alexander Kornienko58611712013-07-04 12:02:44 +00005474TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5475 FormatStyle NoBreak = getLLVMStyle();
5476 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5477 FormatStyle Break = getLLVMStyle();
5478 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005479 verifyFormat("aaaa = \"bbbb\"\n"
5480 " \"cccc\";",
5481 NoBreak);
5482 verifyFormat("aaaa =\n"
5483 " \"bbbb\"\n"
5484 " \"cccc\";",
5485 Break);
5486 verifyFormat("aaaa(\"bbbb\"\n"
5487 " \"cccc\");",
5488 NoBreak);
5489 verifyFormat("aaaa(\n"
5490 " \"bbbb\"\n"
5491 " \"cccc\");",
5492 Break);
Daniel Jasper240527c2017-01-16 13:13:15 +00005493 verifyFormat("aaaa(qqq,\n"
5494 " \"bbbb\"\n"
5495 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005496 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005497 verifyFormat("aaaa(qqq,\n"
5498 " \"bbbb\"\n"
5499 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005500 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005501 verifyFormat("aaaa(qqq,\n"
5502 " L\"bbbb\"\n"
5503 " L\"cccc\");",
5504 Break);
Daniel Jasper240527c2017-01-16 13:13:15 +00005505 verifyFormat("aaaaa(aaaaaa,\n"
5506 " aaaaaaa(\"aaaa\"\n"
5507 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005508 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005509 verifyFormat("string s = someFunction(\n"
5510 " \"abc\"\n"
5511 " \"abc\");",
5512 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005513
Daniel Jasper3251fff2014-06-10 06:27:23 +00005514 // As we break before unary operators, breaking right after them is bad.
5515 verifyFormat("string foo = abc ? \"x\"\n"
5516 " \"blah blah blah blah blah blah\"\n"
5517 " : \"y\";",
5518 Break);
5519
Daniel Jasperc834c702013-07-17 15:38:19 +00005520 // Don't break if there is no column gain.
5521 verifyFormat("f(\"aaaa\"\n"
5522 " \"bbbb\");",
5523 Break);
5524
5525 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005526 EXPECT_EQ("x = \"a\\\n"
5527 "b\\\n"
5528 "c\";",
5529 format("x = \"a\\\n"
5530 "b\\\n"
5531 "c\";",
5532 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005533 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005534 " \"a\\\n"
5535 "b\\\n"
5536 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005537 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005538 "b\\\n"
5539 "c\";",
5540 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005541
5542 // Exempt ObjC strings for now.
5543 EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005544 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005545 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005546 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005547 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005548
5549 Break.ColumnLimit = 0;
5550 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005551}
5552
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005553TEST_F(FormatTest, AlignsPipes) {
5554 verifyFormat(
5555 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5556 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5557 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5558 verifyFormat(
5559 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5560 " << aaaaaaaaaaaaaaaaaaaa;");
5561 verifyFormat(
5562 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5563 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5564 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005565 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5566 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5567 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005568 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5569 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5570 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5571 verifyFormat(
5572 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5573 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5574 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005575 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5576 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5577 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5578 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005579 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5580 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005581 verifyFormat(
5582 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5583 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005584
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005585 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5586 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005587 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5588 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5589 " aaaaaaaaaaaaaaaaaaaaa)\n"
5590 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005591 verifyFormat("LOG_IF(aaa == //\n"
5592 " bbb)\n"
5593 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005594
Daniel Jasper467ddb12013-08-12 12:58:05 +00005595 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005596 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5597 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005598 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5599 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5600 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005601 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5602 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005603 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5604 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5605 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5606 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5607 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5608 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5609 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005610
Daniel Jasperc238c872013-04-02 14:33:13 +00005611 verifyFormat(
5612 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5613 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005614
5615 // Incomplete string literal.
5616 EXPECT_EQ("llvm::errs() << \"\n"
5617 " << a;",
5618 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005619
5620 verifyFormat("void f() {\n"
5621 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5622 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5623 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005624
5625 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005626 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5627 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5628 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005629
5630 // Handle '\n'.
5631 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5632 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5633 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5634 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5635 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5636 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5637 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005638}
5639
Daniel Jasper7209bb92016-12-13 11:16:42 +00005640TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5641 verifyFormat("return out << \"somepacket = {\\n\"\n"
5642 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5643 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5644 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5645 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5646 " << \"}\";");
5647
5648 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5649 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5650 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5651 verifyFormat(
5652 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5653 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5654 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5655 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5656 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5657 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5658 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5659 verifyFormat(
5660 "void f() {\n"
5661 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5662 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5663 "}");
5664
5665 // Breaking before the first "<<" is generally not desirable.
5666 verifyFormat(
5667 "llvm::errs()\n"
5668 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5669 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5670 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5671 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5672 getLLVMStyleWithColumns(70));
5673 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5674 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5675 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5676 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5677 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5678 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5679 getLLVMStyleWithColumns(70));
5680
5681 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5682 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5683 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5684 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5685 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5686 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005687 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5688 " (aaaa + aaaa);",
5689 getLLVMStyleWithColumns(40));
5690 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5691 " (aaaaaaa + aaaaa));",
5692 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005693 verifyFormat(
5694 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5695 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5696 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005697}
5698
Daniel Jasperf7935112012-12-03 18:12:45 +00005699TEST_F(FormatTest, UnderstandsEquals) {
5700 verifyFormat(
5701 "aaaaaaaaaaaaaaaaa =\n"
5702 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5703 verifyFormat(
5704 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005705 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005706 verifyFormat(
5707 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005708 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005709 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005710 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5711 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005712
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005713 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5714 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005715}
5716
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005717TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005718 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5719 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005720
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005721 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5722 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005723
5724 verifyFormat(
5725 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5726 " Parameter2);");
5727
5728 verifyFormat(
5729 "ShortObject->shortFunction(\n"
5730 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5731 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5732
5733 verifyFormat("loooooooooooooongFunction(\n"
5734 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5735
5736 verifyFormat(
5737 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5738 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5739
Daniel Jasper687af3b2013-02-14 14:26:07 +00005740 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5741 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005742 verifyFormat("void f() {\n"
5743 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5744 " .Times(2)\n"
5745 " .WillRepeatedly(Return(SomeValue));\n"
5746 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005747 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5748 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005749 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005750 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5751 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005752 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005753 verifyFormat("void f() {\n"
5754 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5755 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5756 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005757 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5758 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5759 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5760 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5761 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005762 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5763 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5764 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5765 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5766 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005767
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005768 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005769 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005770 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005771 verifyFormat(
5772 "aaaaaaaaaaa->aaaaaaaaa(\n"
5773 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5774 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005775
5776 verifyFormat(
5777 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5778 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005779 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5780 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5781 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5782 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005783
Daniel Jasper9b334242013-03-15 14:57:30 +00005784 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005785 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5786 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005787
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005788 FormatStyle NoBinPacking = getLLVMStyle();
5789 NoBinPacking.BinPackParameters = false;
5790 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5791 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5792 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5793 " aaaaaaaaaaaaaaaaaaa,\n"
5794 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5795 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005796
5797 // If there is a subsequent call, change to hanging indentation.
5798 verifyFormat(
5799 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5800 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5801 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5802 verifyFormat(
5803 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5804 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005805 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5806 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5807 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5808 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5809 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5810 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005811}
5812
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005813TEST_F(FormatTest, WrapsTemplateDeclarations) {
5814 verifyFormat("template <typename T>\n"
5815 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005816 verifyFormat("template <typename T>\n"
5817 "// T should be one of {A, B}.\n"
5818 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005819 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005820 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005821 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005822 verifyFormat("template <typename T>\n"
5823 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5824 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005825 verifyFormat(
5826 "template <typename T>\n"
5827 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5828 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005829 verifyFormat(
5830 "template <typename T>\n"
5831 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5832 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5833 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005834 verifyFormat("template <typename T>\n"
5835 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005836 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005837 verifyFormat(
5838 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5839 " typename T4 = char>\n"
5840 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005841 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5842 " template <typename> class cccccccccccccccccccccc,\n"
5843 " typename ddddddddddddd>\n"
5844 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005845 verifyFormat(
5846 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5847 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005848
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005849 verifyFormat("void f() {\n"
5850 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5851 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5852 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005853
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005854 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005855 verifyFormat("template <typename T> void f();");
5856 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005857 verifyFormat(
5858 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5859 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5860 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5861 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5862 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5863 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5864 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5865 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005866 EXPECT_EQ("static_cast<A< //\n"
5867 " B> *>(\n"
5868 "\n"
5869 " );",
5870 format("static_cast<A<//\n"
5871 " B>*>(\n"
5872 "\n"
5873 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005874 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5875 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005876
5877 FormatStyle AlwaysBreak = getLLVMStyle();
5878 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5879 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5880 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5881 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5882 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5883 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5884 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5885 verifyFormat("template <template <typename> class Fooooooo,\n"
5886 " template <typename> class Baaaaaaar>\n"
5887 "struct C {};",
5888 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005889 verifyFormat("template <typename T> // T can be A, B or C.\n"
5890 "struct C {};",
5891 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005892 verifyFormat("template <enum E> class A {\n"
5893 "public:\n"
5894 " E *f();\n"
5895 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005896}
5897
Daniel Jasper45797022013-01-25 10:57:27 +00005898TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5899 verifyFormat(
5900 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5901 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5902 verifyFormat(
5903 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5904 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5905 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5906
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005907 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005908 verifyFormat(
5909 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5910 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005911 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005912
Daniel Jasper45797022013-01-25 10:57:27 +00005913 verifyFormat(
5914 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005915 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005916
5917 // Breaking at nested name specifiers is generally not desirable.
5918 verifyFormat(
5919 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5920 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005921
5922 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005923 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5924 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5925 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005926 " aaaaaaaaaaaaaaaaaaaaa);",
5927 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005928
5929 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5930 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5931 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005932}
5933
Daniel Jasperf7935112012-12-03 18:12:45 +00005934TEST_F(FormatTest, UnderstandsTemplateParameters) {
5935 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005936 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005937 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5938 verifyFormat("bool x = a < 1 || 2 > a;");
5939 verifyFormat("bool x = 5 < f<int>();");
5940 verifyFormat("bool x = f<int>() > 5;");
5941 verifyFormat("bool x = 5 < a<int>::x;");
5942 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5943 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5944
5945 verifyGoogleFormat("A<A<int>> a;");
5946 verifyGoogleFormat("A<A<A<int>>> a;");
5947 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005948 verifyGoogleFormat("A<A<int> > a;");
5949 verifyGoogleFormat("A<A<A<int> > > a;");
5950 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005951 verifyGoogleFormat("A<::A<int>> a;");
5952 verifyGoogleFormat("A<::A> a;");
5953 verifyGoogleFormat("A< ::A> a;");
5954 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005955 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5956 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005957 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5958 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005959 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5960 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005961
Nico Weber7533b4d2014-09-24 17:17:32 +00005962 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5963
Daniel Jasperf7935112012-12-03 18:12:45 +00005964 verifyFormat("test >> a >> b;");
5965 verifyFormat("test << a >> b;");
5966
5967 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005968 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005969 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005970 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5971 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005972 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005973 verifyFormat("f(a.operator()<A>());");
5974 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5975 " .template operator()<A>());",
5976 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005977
5978 // Not template parameters.
5979 verifyFormat("return a < b && c > d;");
5980 verifyFormat("void f() {\n"
5981 " while (a < b && c > d) {\n"
5982 " }\n"
5983 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005984 verifyFormat("template <typename... Types>\n"
5985 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005986
5987 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5988 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5989 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005990 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005991 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005992 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005993}
5994
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005995TEST_F(FormatTest, BitshiftOperatorWidth) {
5996 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5997 " bar */",
5998 format("int a=1<<2; /* foo\n"
5999 " bar */"));
6000
6001 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
6002 " bar */",
6003 format("int b =256>>1 ; /* foo\n"
6004 " bar */"));
6005}
6006
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006007TEST_F(FormatTest, UnderstandsBinaryOperators) {
6008 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00006009 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00006010}
6011
6012TEST_F(FormatTest, UnderstandsPointersToMembers) {
6013 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006014 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006015 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006016 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006017 verifyFormat("void f() {\n"
6018 " (a->*f)();\n"
6019 " a->*x;\n"
6020 " (a.*f)();\n"
6021 " ((*a).*f)();\n"
6022 " a.*x;\n"
6023 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00006024 verifyFormat("void f() {\n"
6025 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
6026 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
6027 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00006028 verifyFormat(
6029 "(aaaaaaaaaa->*bbbbbbb)(\n"
6030 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006031 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006032 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006033 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006034}
6035
Daniel Jasper8dd40472012-12-21 09:41:31 +00006036TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00006037 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00006038 verifyFormat("f(-1, -2, -3);");
6039 verifyFormat("a[-1] = 5;");
6040 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006041 verifyFormat("if (i == -1) {\n}");
6042 verifyFormat("if (i != -1) {\n}");
6043 verifyFormat("if (i > -1) {\n}");
6044 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00006045 verifyFormat("++(a->f());");
6046 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00006047 verifyFormat("(a->f())++;");
6048 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006049 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00006050
6051 verifyFormat("a-- > b;");
6052 verifyFormat("b ? -a : c;");
6053 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006054 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00006055 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006056 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00006057
6058 verifyFormat("return -1;");
6059 verifyFormat("switch (a) {\n"
6060 "case -1:\n"
6061 " break;\n"
6062 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00006063 verifyFormat("#define X -1");
6064 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00006065
Chandler Carruthf8b72662014-03-02 12:37:31 +00006066 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
6067 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00006068
6069 verifyFormat("int a = /* confusing comment */ -1;");
6070 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
6071 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006072}
6073
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006074TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00006075 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006076 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00006077 "}");
6078 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00006079 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00006080 verifyFormat("*aaa = aaaaaaa( // break\n"
6081 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00006082}
6083
Daniel Jasper8863ada2013-08-26 08:10:17 +00006084TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00006085 verifyFormat("bool operator<();");
6086 verifyFormat("bool operator>();");
6087 verifyFormat("bool operator=();");
6088 verifyFormat("bool operator==();");
6089 verifyFormat("bool operator!=();");
6090 verifyFormat("int operator+();");
6091 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00006092 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006093 verifyFormat("bool operator();");
6094 verifyFormat("bool operator()();");
6095 verifyFormat("bool operator[]();");
6096 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006097 verifyFormat("operator int();");
6098 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006099 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006100 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006101 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006102 verifyFormat("void *operator new(std::size_t size);");
6103 verifyFormat("void *operator new[](std::size_t size);");
6104 verifyFormat("void operator delete(void *ptr);");
6105 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00006106 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
6107 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00006108 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00006109 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006110
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006111 verifyFormat(
6112 "ostream &operator<<(ostream &OutputStream,\n"
6113 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00006114 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
6115 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
6116 " return left.group < right.group;\n"
6117 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00006118 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00006119 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006120
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006121 verifyGoogleFormat("operator void*();");
6122 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00006123 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00006124
6125 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00006126 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
6127 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006128}
6129
Daniel Jasper1c220482015-02-25 10:30:06 +00006130TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00006131 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
6132 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
6133 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
6134 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
6135 verifyFormat("Deleted &operator=(const Deleted &) &;");
6136 verifyFormat("Deleted &operator=(const Deleted &) &&;");
6137 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
6138 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
6139 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
6140 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
6141 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00006142 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00006143 verifyFormat("template <typename T>\n"
6144 "void F(T) && = delete;",
6145 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00006146
Daniel Jasperaf642c62015-08-25 13:40:51 +00006147 FormatStyle AlignLeft = getLLVMStyle();
6148 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00006149 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00006150 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
6151 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
6152 AlignLeft);
6153 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
6154 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006155 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
6156 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
6157 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
6158 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00006159 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00006160
6161 FormatStyle Spaces = getLLVMStyle();
6162 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006163 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
6164 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
6165 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
6166 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006167
6168 Spaces.SpacesInCStyleCastParentheses = false;
6169 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006170 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
6171 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
6172 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
6173 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006174}
6175
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006176TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00006177 verifyFormat("void f() {\n"
6178 " A *a = new A;\n"
6179 " A *a = new (placement) A;\n"
6180 " delete a;\n"
6181 " delete (A *)a;\n"
6182 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00006183 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6184 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00006185 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6186 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6187 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00006188 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006189}
6190
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006191TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006192 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006193 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006194 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006195 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006196 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006197 verifyIndependentOfContext("int a = b * 10;");
6198 verifyIndependentOfContext("int a = 10 * b;");
6199 verifyIndependentOfContext("int a = b * c;");
6200 verifyIndependentOfContext("int a += b * c;");
6201 verifyIndependentOfContext("int a -= b * c;");
6202 verifyIndependentOfContext("int a *= b * c;");
6203 verifyIndependentOfContext("int a /= b * c;");
6204 verifyIndependentOfContext("int a = *b;");
6205 verifyIndependentOfContext("int a = *b * c;");
6206 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00006207 verifyIndependentOfContext("int a = b * (10);");
6208 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006209 verifyIndependentOfContext("return 10 * b;");
6210 verifyIndependentOfContext("return *b * *c;");
6211 verifyIndependentOfContext("return a & ~b;");
6212 verifyIndependentOfContext("f(b ? *c : *d);");
6213 verifyIndependentOfContext("int a = b ? *c : *d;");
6214 verifyIndependentOfContext("*b = a;");
6215 verifyIndependentOfContext("a * ~b;");
6216 verifyIndependentOfContext("a * !b;");
6217 verifyIndependentOfContext("a * +b;");
6218 verifyIndependentOfContext("a * -b;");
6219 verifyIndependentOfContext("a * ++b;");
6220 verifyIndependentOfContext("a * --b;");
6221 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00006222 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006223 verifyIndependentOfContext("f() * b;");
6224 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006225 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006226 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00006227 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006228 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00006229 verifyIndependentOfContext("return sizeof(int **);");
6230 verifyIndependentOfContext("return sizeof(int ******);");
6231 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00006232 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006233 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00006234 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00006235 verifyGoogleFormat("return sizeof(int**);");
6236 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
6237 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006238 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00006239 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00006240 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00006241 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00006242 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00006243 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00006244 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00006245 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00006246 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00006247 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00006248 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00006249 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00006250 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00006251 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00006252 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00006253 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00006254 verifyFormat("void f(const MyOverride &override);");
6255 verifyFormat("void f(const MyFinal &final);");
6256 verifyIndependentOfContext("bool a = f() && override.f();");
6257 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00006258
Daniel Jasper5b49f472013-01-23 12:10:53 +00006259 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00006260
Daniel Jasper5b49f472013-01-23 12:10:53 +00006261 verifyIndependentOfContext("A<int *> a;");
6262 verifyIndependentOfContext("A<int **> a;");
6263 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00006264 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006265 verifyIndependentOfContext(
6266 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006267 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00006268 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00006269 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00006270 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00006271 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00006272
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00006273 verifyFormat(
6274 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6275 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6276
Daniel Jasper1f5d6372016-06-13 14:45:12 +00006277 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00006278 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00006279 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006280 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00006281 verifyGoogleFormat("A<int*> a;");
6282 verifyGoogleFormat("A<int**> a;");
6283 verifyGoogleFormat("A<int*, int*> a;");
6284 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006285 verifyGoogleFormat("f(b ? *c : *d);");
6286 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00006287 verifyGoogleFormat("Type* t = **x;");
6288 verifyGoogleFormat("Type* t = *++*x;");
6289 verifyGoogleFormat("*++*x;");
6290 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
6291 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006292 verifyGoogleFormat(
6293 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00006294 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00006295 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
6296 verifyGoogleFormat("template <typename T>\n"
6297 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00006298
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006299 FormatStyle Left = getLLVMStyle();
6300 Left.PointerAlignment = FormatStyle::PAS_Left;
6301 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00006302 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00006303 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006304
Daniel Jasper5b49f472013-01-23 12:10:53 +00006305 verifyIndependentOfContext("a = *(x + y);");
6306 verifyIndependentOfContext("a = &(x + y);");
6307 verifyIndependentOfContext("*(x + y).call();");
6308 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006309 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00006310
Daniel Jasper5b49f472013-01-23 12:10:53 +00006311 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00006312 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00006313 "int *MyValues = {\n"
6314 " *A, // Operator detection might be confused by the '{'\n"
6315 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00006316 "};");
Nico Weber80a82762013-01-17 17:17:19 +00006317
Daniel Jasper5b49f472013-01-23 12:10:53 +00006318 verifyIndependentOfContext("if (int *a = &b)");
6319 verifyIndependentOfContext("if (int &a = *b)");
6320 verifyIndependentOfContext("if (a & b[i])");
6321 verifyIndependentOfContext("if (a::b::c::d & b[i])");
6322 verifyIndependentOfContext("if (*b[i])");
6323 verifyIndependentOfContext("if (int *a = (&b))");
6324 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00006325 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00006326 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00006327 verifyFormat("void f() {\n"
6328 " for (const int &v : Values) {\n"
6329 " }\n"
6330 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006331 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
6332 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00006333 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00006334
Daniel Jaspera98da3d2013-11-07 19:56:07 +00006335 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006336 verifyFormat("#define MACRO \\\n"
6337 " int *i = a * b; \\\n"
6338 " void f(a *b);",
6339 getLLVMStyleWithColumns(19));
6340
Daniel Jasper97b89482013-03-13 07:49:51 +00006341 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006342 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006343 verifyIndependentOfContext("T **t = new T *;");
6344 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00006345 verifyGoogleFormat("A = new SomeType*[Length]();");
6346 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006347 verifyGoogleFormat("T** t = new T*;");
6348 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006349
Daniel Jasper990ff972013-05-07 14:17:18 +00006350 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006351 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00006352 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00006353 verifyFormat("STATIC_ASSERT((a & b) == 0);");
6354 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006355 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006356 "typename t::if<x && y>::type f() {}");
6357 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006358 verifyFormat("vector<int *> v;");
6359 verifyFormat("vector<int *const> v;");
6360 verifyFormat("vector<int *const **const *> v;");
6361 verifyFormat("vector<int *volatile> v;");
6362 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006363 verifyFormat("foo<b && false>();");
6364 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00006365 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00006366 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00006367 "template <class T,\n"
6368 " class = typename std::enable_if<\n"
6369 " std::is_integral<T>::value &&\n"
6370 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006371 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00006372 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006373 verifyFormat(
6374 "template <class T,\n"
6375 " class = typename ::std::enable_if<\n"
6376 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6377 "void F();",
6378 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006379
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006380 verifyIndependentOfContext("MACRO(int *i);");
6381 verifyIndependentOfContext("MACRO(auto *a);");
6382 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006383 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006384 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006385 // FIXME: Is there a way to make this work?
6386 // verifyIndependentOfContext("MACRO(A *a);");
6387
Daniel Jasper32ccb032014-06-23 07:36:18 +00006388 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006389 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006390
Daniel Jasper866468a2014-04-14 13:15:29 +00006391 EXPECT_EQ("#define OP(x) \\\n"
6392 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6393 " return s << a.DebugString(); \\\n"
6394 " }",
6395 format("#define OP(x) \\\n"
6396 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6397 " return s << a.DebugString(); \\\n"
6398 " }",
6399 getLLVMStyleWithColumns(50)));
6400
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006401 // FIXME: We cannot handle this case yet; we might be able to figure out that
6402 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006403 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006404
6405 FormatStyle PointerMiddle = getLLVMStyle();
6406 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6407 verifyFormat("delete *x;", PointerMiddle);
6408 verifyFormat("int * x;", PointerMiddle);
6409 verifyFormat("template <int * y> f() {}", PointerMiddle);
6410 verifyFormat("int * f(int * a) {}", PointerMiddle);
6411 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6412 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6413 verifyFormat("A<int *> a;", PointerMiddle);
6414 verifyFormat("A<int **> a;", PointerMiddle);
6415 verifyFormat("A<int *, int *> a;", PointerMiddle);
6416 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006417 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6418 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006419 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006420
6421 // Member function reference qualifiers aren't binary operators.
6422 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006423 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006424 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006425 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006426 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006427 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006428}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006429
Daniel Jasperee6d6502013-07-17 20:25:02 +00006430TEST_F(FormatTest, UnderstandsAttributes) {
6431 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006432 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6433 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006434 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006435 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006436 verifyFormat("__attribute__((nodebug)) void\n"
6437 "foo() {}\n",
6438 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006439}
6440
Daniel Jasper10cd5812013-05-06 06:35:44 +00006441TEST_F(FormatTest, UnderstandsEllipsis) {
6442 verifyFormat("int printf(const char *fmt, ...);");
6443 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006444 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6445
6446 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006447 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006448 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006449}
6450
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006451TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006452 EXPECT_EQ("int *a;\n"
6453 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006454 "int *a;",
6455 format("int *a;\n"
6456 "int* a;\n"
6457 "int *a;",
6458 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006459 EXPECT_EQ("int* a;\n"
6460 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006461 "int* a;",
6462 format("int* a;\n"
6463 "int* a;\n"
6464 "int *a;",
6465 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006466 EXPECT_EQ("int *a;\n"
6467 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006468 "int *a;",
6469 format("int *a;\n"
6470 "int * a;\n"
6471 "int * a;",
6472 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006473 EXPECT_EQ("auto x = [] {\n"
6474 " int *a;\n"
6475 " int *a;\n"
6476 " int *a;\n"
6477 "};",
6478 format("auto x=[]{int *a;\n"
6479 "int * a;\n"
6480 "int * a;};",
6481 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006482}
6483
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006484TEST_F(FormatTest, UnderstandsRvalueReferences) {
6485 verifyFormat("int f(int &&a) {}");
6486 verifyFormat("int f(int a, char &&b) {}");
6487 verifyFormat("void f() { int &&a = b; }");
6488 verifyGoogleFormat("int f(int a, char&& b) {}");
6489 verifyGoogleFormat("void f() { int&& a = b; }");
6490
Daniel Jasper1eff9082013-05-27 16:36:33 +00006491 verifyIndependentOfContext("A<int &&> a;");
6492 verifyIndependentOfContext("A<int &&, int &&> a;");
6493 verifyGoogleFormat("A<int&&> a;");
6494 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006495
6496 // Not rvalue references:
6497 verifyFormat("template <bool B, bool C> class A {\n"
6498 " static_assert(B && C, \"Something is wrong\");\n"
6499 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006500 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6501 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006502 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006503}
6504
Manuel Klimekc1237a82013-01-23 14:08:21 +00006505TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6506 verifyFormat("void f() {\n"
6507 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006508 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006509 "}",
6510 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006511}
6512
Daniel Jasperef906a92013-01-13 08:01:36 +00006513TEST_F(FormatTest, FormatsCasts) {
6514 verifyFormat("Type *A = static_cast<Type *>(P);");
6515 verifyFormat("Type *A = (Type *)P;");
6516 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6517 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006518 verifyFormat("int a = (int)2.0f;");
6519 verifyFormat("x[(int32)y];");
6520 verifyFormat("x = (int32)y;");
6521 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6522 verifyFormat("int a = (int)*b;");
6523 verifyFormat("int a = (int)2.0f;");
6524 verifyFormat("int a = (int)~0;");
6525 verifyFormat("int a = (int)++a;");
6526 verifyFormat("int a = (int)sizeof(int);");
6527 verifyFormat("int a = (int)+2;");
6528 verifyFormat("my_int a = (my_int)2.0f;");
6529 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006530 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006531 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006532 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006533 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006534 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006535
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006536 verifyFormat("void f() { my_int a = (my_int)*b; }");
6537 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6538 verifyFormat("my_int a = (my_int)~0;");
6539 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006540 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006541 verifyFormat("my_int a = (my_int)1;");
6542 verifyFormat("my_int a = (my_int *)1;");
6543 verifyFormat("my_int a = (const my_int)-1;");
6544 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006545 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006546 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006547 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006548 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006549
6550 // FIXME: single value wrapped with paren will be treated as cast.
6551 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006552
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006553 verifyFormat("{ (void)F; }");
6554
Daniel Jasper998cabc2013-07-18 14:46:07 +00006555 // Don't break after a cast's
6556 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6557 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6558 " bbbbbbbbbbbbbbbbbbbbbb);");
6559
Daniel Jasperef906a92013-01-13 08:01:36 +00006560 // These are not casts.
6561 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006562 verifyFormat("f(foo)->b;");
6563 verifyFormat("f(foo).b;");
6564 verifyFormat("f(foo)(b);");
6565 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006566 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006567 verifyFormat("(*funptr)(foo)[4];");
6568 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006569 verifyFormat("void f(int *);");
6570 verifyFormat("void f(int *) = 0;");
6571 verifyFormat("void f(SmallVector<int>) {}");
6572 verifyFormat("void f(SmallVector<int>);");
6573 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006574 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006575 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006576 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006577 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6578 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006579 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006580
Daniel Jasperba0bda92013-02-23 08:07:18 +00006581 // These are not casts, but at some point were confused with casts.
6582 verifyFormat("virtual void foo(int *) override;");
6583 verifyFormat("virtual void foo(char &) const;");
6584 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006585 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006586 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006587 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006588 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006589
6590 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6591 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006592 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006593 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006594 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6595 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6596 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006597}
6598
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006599TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006600 verifyFormat("A<bool()> a;");
6601 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006602 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006603 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006604 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006605 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006606 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006607 verifyFormat("template <class CallbackClass>\n"
6608 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006609
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006610 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6611 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006612 verifyGoogleFormat(
6613 "template <class CallbackClass>\n"
6614 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006615
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006616 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006617 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006618 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006619 verifyFormat("some_var = function(*some_pointer_var)[0];");
6620 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006621 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006622 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006623}
6624
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006625TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6626 verifyFormat("A (*foo_)[6];");
6627 verifyFormat("vector<int> (*foo_)[6];");
6628}
6629
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006630TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6631 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6632 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6633 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6634 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006635 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6636 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006637
6638 // Different ways of ()-initializiation.
6639 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6640 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6641 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6642 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6643 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6644 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006645 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6646 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006647}
6648
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006649TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006650 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006651 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006652 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006653 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006654 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006655 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006656 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6657 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006658 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6659 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006660 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6661 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006662 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6663 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006664 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6665 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006666 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6667 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6668 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6669 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006670 FormatStyle Indented = getLLVMStyle();
6671 Indented.IndentWrappedFunctionNames = true;
6672 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6673 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6674 Indented);
6675 verifyFormat(
6676 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6677 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6678 Indented);
6679 verifyFormat(
6680 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6681 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6682 Indented);
6683 verifyFormat(
6684 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6685 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6686 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006687
6688 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006689 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6690 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6691 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006692
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006693 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006694 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006695 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006696 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6697 " SourceLocation L, IdentifierIn *II,\n"
6698 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006699 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006700 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006701 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006702 " const SomeType<string, SomeOtherTemplateParameter>\n"
6703 " &ReallyReallyLongParameterName,\n"
6704 " const SomeType<string, SomeOtherTemplateParameter>\n"
6705 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006706 verifyFormat("template <typename A>\n"
6707 "SomeLoooooooooooooooooooooongType<\n"
6708 " typename some_namespace::SomeOtherType<A>::Type>\n"
6709 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006710
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006711 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006712 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6713 " aaaaaaaaaaaaaaaaaaaaaaa;");
6714 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006715 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6716 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006717 verifyGoogleFormat(
6718 "some_namespace::LongReturnType\n"
6719 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006720 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006721
6722 verifyGoogleFormat("template <typename T>\n"
6723 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006724 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006725 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6726 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006727
6728 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006729 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6730 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006731 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6732 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6733 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6734 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6735 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6736 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6737 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006738}
6739
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006740TEST_F(FormatTest, FormatsArrays) {
6741 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6742 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006743 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6744 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006745 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6746 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006747 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6748 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6749 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6750 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6751 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6752 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6753 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6754 verifyFormat(
6755 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6756 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6757 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006758 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6759 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006760
6761 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6762 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006763 verifyFormat(
6764 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6765 " .aaaaaaa[0]\n"
6766 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006767 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006768
6769 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006770
6771 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6772 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006773}
6774
Daniel Jaspere9de2602012-12-06 09:56:08 +00006775TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6776 verifyFormat("(a)->b();");
6777 verifyFormat("--a;");
6778}
6779
Daniel Jasper8b529712012-12-04 13:02:32 +00006780TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006781 verifyFormat("#include <string>\n"
6782 "#include <a/b/c.h>\n"
6783 "#include \"a/b/string\"\n"
6784 "#include \"string.h\"\n"
6785 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006786 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006787 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006788 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006789 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006790 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006791 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
6792 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006793 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6794 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006795
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006796 verifyFormat("#import <string>");
6797 verifyFormat("#import <a/b/c.h>");
6798 verifyFormat("#import \"a/b/string\"");
6799 verifyFormat("#import \"string.h\"");
6800 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006801 verifyFormat("#if __has_include(<strstream>)\n"
6802 "#include <strstream>\n"
6803 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006804
Daniel Jasper343643b2014-08-13 08:29:18 +00006805 verifyFormat("#define MY_IMPORT <a/b>");
6806
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006807 // Protocol buffer definition or missing "#".
6808 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6809 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006810
6811 FormatStyle Style = getLLVMStyle();
6812 Style.AlwaysBreakBeforeMultilineStrings = true;
6813 Style.ColumnLimit = 0;
6814 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006815
6816 // But 'import' might also be a regular C++ namespace.
6817 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6818 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006819}
6820
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006821//===----------------------------------------------------------------------===//
6822// Error recovery tests.
6823//===----------------------------------------------------------------------===//
6824
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006825TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006826 FormatStyle NoBinPacking = getLLVMStyle();
6827 NoBinPacking.BinPackParameters = false;
6828 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6829 " double *min_x,\n"
6830 " double *max_x,\n"
6831 " double *min_y,\n"
6832 " double *max_y,\n"
6833 " double *min_z,\n"
6834 " double *max_z, ) {}",
6835 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006836}
6837
Daniel Jasper83a54d22013-01-10 09:26:47 +00006838TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006839 verifyFormat("void f() { return; }\n42");
6840 verifyFormat("void f() {\n"
6841 " if (0)\n"
6842 " return;\n"
6843 "}\n"
6844 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006845 verifyFormat("void f() { return }\n42");
6846 verifyFormat("void f() {\n"
6847 " if (0)\n"
6848 " return\n"
6849 "}\n"
6850 "42");
6851}
6852
6853TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6854 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6855 EXPECT_EQ("void f() {\n"
6856 " if (a)\n"
6857 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006858 "}",
6859 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006860 EXPECT_EQ("namespace N {\n"
6861 "void f()\n"
6862 "}",
6863 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006864 EXPECT_EQ("namespace N {\n"
6865 "void f() {}\n"
6866 "void g()\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006867 "}",
6868 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006869}
6870
Daniel Jasper2df93312013-01-09 10:16:05 +00006871TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6872 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006873 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006874 " b;",
6875 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006876 verifyFormat("function(\n"
6877 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006878 " LoooooooooooongArgument);\n",
6879 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006880}
6881
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006882TEST_F(FormatTest, IncorrectAccessSpecifier) {
6883 verifyFormat("public:");
6884 verifyFormat("class A {\n"
6885 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006886 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006887 "};");
6888 verifyFormat("public\n"
6889 "int qwerty;");
6890 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006891 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006892 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006893 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006894 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006895 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006896}
Daniel Jasperf7935112012-12-03 18:12:45 +00006897
Daniel Jasper291f9362013-03-20 15:58:10 +00006898TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6899 verifyFormat("{");
6900 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006901 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006902}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006903
6904TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006905 verifyFormat("do {\n}");
6906 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006907 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006908 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006909 "wheeee(fun);");
6910 verifyFormat("do {\n"
6911 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006912 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006913}
6914
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006915TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006916 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006917 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006918 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006919 verifyFormat("while {\n foo;\n foo();\n}");
6920 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006921}
6922
Daniel Jasperc0880a92013-01-04 18:52:56 +00006923TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006924 verifyIncompleteFormat("namespace {\n"
6925 "class Foo { Foo (\n"
6926 "};\n"
6927 "} // comment");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006928}
6929
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006930TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006931 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006932 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6933 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006934 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006935
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006936 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006937 " {\n"
6938 " breakme(\n"
6939 " qwe);\n"
6940 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006941 format("{\n"
6942 " {\n"
6943 " breakme(qwe);\n"
6944 "}\n",
6945 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006946}
6947
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006948TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006949 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006950 " avariable,\n"
6951 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006952 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006953}
6954
Manuel Klimek762dd182013-01-21 10:07:49 +00006955TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006956 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006957}
6958
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006959TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006960 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006961 verifyFormat("vector<int> x{\n"
6962 " 1, 2, 3, 4,\n"
6963 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006964 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6965 verifyFormat("f({1, 2});");
6966 verifyFormat("auto v = Foo{-1};");
6967 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6968 verifyFormat("Class::Class : member{1, 2, 3} {}");
6969 verifyFormat("new vector<int>{1, 2, 3};");
6970 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006971 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006972 verifyFormat("return {arg1, arg2};");
6973 verifyFormat("return {arg1, SomeType{parameter}};");
6974 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6975 verifyFormat("new T{arg1, arg2};");
6976 verifyFormat("f(MyMap[{composite, key}]);");
6977 verifyFormat("class Class {\n"
6978 " T member = {arg1, arg2};\n"
6979 "};");
6980 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006981 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6982 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006983
Daniel Jasper438059e2014-05-22 12:11:13 +00006984 verifyFormat("int foo(int i) { return fo1{}(i); }");
6985 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006986 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006987 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006988 verifyFormat("Node n{1, Node{1000}, //\n"
6989 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006990 verifyFormat("Aaaa aaaaaaa{\n"
6991 " {\n"
6992 " aaaa,\n"
6993 " },\n"
6994 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006995 verifyFormat("class C : public D {\n"
6996 " SomeClass SC{2};\n"
6997 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006998 verifyFormat("class C : public A {\n"
6999 " class D : public B {\n"
7000 " void f() { int i{2}; }\n"
7001 " };\n"
7002 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00007003 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00007004
Daniel Jaspere4ada022016-12-13 10:05:03 +00007005 // Cases where distinguising braced lists and blocks is hard.
7006 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
7007 verifyFormat("void f() {\n"
7008 " return; // comment\n"
7009 "}\n"
7010 "SomeType t;");
7011 verifyFormat("void f() {\n"
7012 " if (a) {\n"
7013 " f();\n"
7014 " }\n"
7015 "}\n"
7016 "SomeType t;");
7017
Daniel Jasper08434342015-05-26 07:26:26 +00007018 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007019 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00007020 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007021 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
7022 " bbbbb,\n"
7023 " ccccc,\n"
7024 " ddddd,\n"
7025 " eeeee,\n"
7026 " ffffff,\n"
7027 " ggggg,\n"
7028 " hhhhhh,\n"
7029 " iiiiii,\n"
7030 " jjjjjj,\n"
7031 " kkkkkk};",
7032 NoBinPacking);
7033 verifyFormat("const Aaaaaa aaaaa = {\n"
7034 " aaaaa,\n"
7035 " bbbbb,\n"
7036 " ccccc,\n"
7037 " ddddd,\n"
7038 " eeeee,\n"
7039 " ffffff,\n"
7040 " ggggg,\n"
7041 " hhhhhh,\n"
7042 " iiiiii,\n"
7043 " jjjjjj,\n"
7044 " kkkkkk,\n"
7045 "};",
7046 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00007047 verifyFormat(
7048 "const Aaaaaa aaaaa = {\n"
7049 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
7050 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
7051 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
7052 "};",
7053 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007054
Chandler Carruthf8b72662014-03-02 12:37:31 +00007055 // FIXME: The alignment of these trailing comments might be bad. Then again,
7056 // this might be utterly useless in real code.
7057 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00007058 " : some_value{ //\n"
7059 " aaaaaaa, //\n"
7060 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00007061
Chandler Carruthf8b72662014-03-02 12:37:31 +00007062 // In braced lists, the first comment is always assumed to belong to the
7063 // first element. Thus, it can be moved to the next or previous line as
7064 // appropriate.
7065 EXPECT_EQ("function({// First element:\n"
7066 " 1,\n"
7067 " // Second element:\n"
7068 " 2});",
7069 format("function({\n"
7070 " // First element:\n"
7071 " 1,\n"
7072 " // Second element:\n"
7073 " 2});"));
7074 EXPECT_EQ("std::vector<int> MyNumbers{\n"
7075 " // First element:\n"
7076 " 1,\n"
7077 " // Second element:\n"
7078 " 2};",
7079 format("std::vector<int> MyNumbers{// First element:\n"
7080 " 1,\n"
7081 " // Second element:\n"
7082 " 2};",
7083 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00007084 // A trailing comma should still lead to an enforced line break.
7085 EXPECT_EQ("vector<int> SomeVector = {\n"
7086 " // aaa\n"
7087 " 1, 2,\n"
7088 "};",
7089 format("vector<int> SomeVector = { // aaa\n"
7090 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00007091
Chandler Carruthf8b72662014-03-02 12:37:31 +00007092 FormatStyle ExtraSpaces = getLLVMStyle();
7093 ExtraSpaces.Cpp11BracedListStyle = false;
7094 ExtraSpaces.ColumnLimit = 75;
7095 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
7096 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
7097 verifyFormat("f({ 1, 2 });", ExtraSpaces);
7098 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
7099 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
7100 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
7101 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
7102 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
7103 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
7104 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
7105 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
7106 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
7107 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
7108 verifyFormat("class Class {\n"
7109 " T member = { arg1, arg2 };\n"
7110 "};",
7111 ExtraSpaces);
7112 verifyFormat(
7113 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7114 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
7115 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
7116 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
7117 ExtraSpaces);
7118 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00007119 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007120 ExtraSpaces);
7121 verifyFormat(
7122 "someFunction(OtherParam,\n"
7123 " BracedList{ // comment 1 (Forcing interesting break)\n"
7124 " param1, param2,\n"
7125 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00007126 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007127 ExtraSpaces);
7128 verifyFormat(
7129 "std::this_thread::sleep_for(\n"
7130 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
7131 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00007132 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00007133 " aaaaaaa,\n"
7134 " aaaaaaaaaa,\n"
7135 " aaaaa,\n"
7136 " aaaaaaaaaaaaaaa,\n"
7137 " aaa,\n"
7138 " aaaaaaaaaa,\n"
7139 " a,\n"
7140 " aaaaaaaaaaaaaaaaaaaaa,\n"
7141 " aaaaaaaaaaaa,\n"
7142 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
7143 " aaaaaaa,\n"
7144 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007145 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00007146}
7147
Daniel Jasper33b909c2013-10-25 14:29:37 +00007148TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007149 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7150 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7151 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7152 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7153 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7154 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007155 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007156 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00007157 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007158 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7159 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007160 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007161 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7162 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7163 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
7164 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7165 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7166 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7167 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007168 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007169 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7170 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007171 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7172 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7173 " // Separating comment.\n"
7174 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
7175 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7176 " // Leading comment\n"
7177 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7178 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007179 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7180 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007181 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00007182 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7183 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007184 getLLVMStyleWithColumns(38));
7185 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007186 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
7187 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007188 verifyFormat(
7189 "static unsigned SomeValues[10][3] = {\n"
7190 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
7191 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
7192 verifyFormat("static auto fields = new vector<string>{\n"
7193 " \"aaaaaaaaaaaaa\",\n"
7194 " \"aaaaaaaaaaaaa\",\n"
7195 " \"aaaaaaaaaaaa\",\n"
7196 " \"aaaaaaaaaaaaaa\",\n"
7197 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7198 " \"aaaaaaaaaaaa\",\n"
7199 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7200 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00007201 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
7202 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
7203 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
7204 " 3, cccccccccccccccccccccc};",
7205 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00007206
7207 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00007208 verifyFormat("vector<int> x = {\n"
7209 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
7210 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00007211 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00007212 verifyFormat("vector<int> x = {\n"
7213 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00007214 "};",
7215 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00007216 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7217 " 1, 1, 1, 1,\n"
7218 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00007219 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007220
Daniel Jasper60c27072015-05-13 08:16:00 +00007221 // Trailing comment in the first line.
7222 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
7223 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
7224 " 111111111, 222222222, 3333333333, 444444444, //\n"
7225 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00007226 // Trailing comment in the last line.
7227 verifyFormat("int aaaaa[] = {\n"
7228 " 1, 2, 3, // comment\n"
7229 " 4, 5, 6 // comment\n"
7230 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00007231
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007232 // With nested lists, we should either format one item per line or all nested
7233 // lists one on line.
7234 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007235 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
7236 " {aaaaaaaaaaaaaaaaaaa},\n"
7237 " {aaaaaaaaaaaaaaaaaaaaa},\n"
7238 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00007239 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00007240 verifyFormat(
7241 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007242 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
7243 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
7244 " {aaa, aaa},\n"
7245 " {aaa, aaa},\n"
7246 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
7247 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7248 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00007249
7250 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007251 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
7252 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00007253
7254 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00007255
Daniel Jaspereb65e912015-12-21 18:31:15 +00007256 // No braced initializer here.
7257 verifyFormat("void f() {\n"
7258 " struct Dummy {};\n"
7259 " f(v);\n"
7260 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00007261
7262 // Long lists should be formatted in columns even if they are nested.
7263 verifyFormat(
7264 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7265 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7266 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7267 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7268 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7269 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00007270
7271 // Allow "single-column" layout even if that violates the column limit. There
7272 // isn't going to be a better way.
7273 verifyFormat("std::vector<int> a = {\n"
7274 " aaaaaaaa,\n"
7275 " aaaaaaaa,\n"
7276 " aaaaaaaa,\n"
7277 " aaaaaaaa,\n"
7278 " aaaaaaaaaa,\n"
7279 " aaaaaaaa,\n"
7280 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
7281 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00007282 verifyFormat("vector<int> aaaa = {\n"
7283 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7284 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7285 " aaaaaa.aaaaaaa,\n"
7286 " aaaaaa.aaaaaaa,\n"
7287 " aaaaaa.aaaaaaa,\n"
7288 " aaaaaa.aaaaaaa,\n"
7289 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007290
7291 // Don't create hanging lists.
7292 verifyFormat("someFunction(Param,\n"
7293 " {List1, List2,\n"
7294 " List3});",
7295 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00007296 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
7297 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007298}
7299
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007300TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007301 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00007302 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007303
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007304 verifyFormat("void f() { return 42; }");
7305 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007306 " return 42;\n"
7307 "}",
7308 DoNotMerge);
7309 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007310 " // Comment\n"
7311 "}");
7312 verifyFormat("{\n"
7313 "#error {\n"
7314 " int a;\n"
7315 "}");
7316 verifyFormat("{\n"
7317 " int a;\n"
7318 "#error {\n"
7319 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00007320 verifyFormat("void f() {} // comment");
7321 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00007322 verifyFormat("void f() {\n"
7323 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007324 DoNotMerge);
7325 verifyFormat("void f() {\n"
7326 " int a;\n"
7327 "} // comment",
7328 DoNotMerge);
7329 verifyFormat("void f() {\n"
7330 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00007331 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007332
7333 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7334 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7335
7336 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7337 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007338 verifyFormat("class C {\n"
7339 " C()\n"
7340 " : iiiiiiii(nullptr),\n"
7341 " kkkkkkk(nullptr),\n"
7342 " mmmmmmm(nullptr),\n"
7343 " nnnnnnn(nullptr) {}\n"
7344 "};",
7345 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007346
7347 FormatStyle NoColumnLimit = getLLVMStyle();
7348 NoColumnLimit.ColumnLimit = 0;
7349 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7350 EXPECT_EQ("class C {\n"
7351 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007352 "};",
7353 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007354 EXPECT_EQ("A()\n"
7355 " : b(0) {\n"
7356 "}",
7357 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7358
7359 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007360 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7361 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007362 EXPECT_EQ("A()\n"
7363 " : b(0) {\n"
7364 "}",
7365 format("A():b(0){}", DoNotMergeNoColumnLimit));
7366 EXPECT_EQ("A()\n"
7367 " : b(0) {\n"
7368 "}",
7369 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007370
7371 verifyFormat("#define A \\\n"
7372 " void f() { \\\n"
7373 " int i; \\\n"
7374 " }",
7375 getLLVMStyleWithColumns(20));
7376 verifyFormat("#define A \\\n"
7377 " void f() { int i; }",
7378 getLLVMStyleWithColumns(21));
7379 verifyFormat("#define A \\\n"
7380 " void f() { \\\n"
7381 " int i; \\\n"
7382 " } \\\n"
7383 " int j;",
7384 getLLVMStyleWithColumns(22));
7385 verifyFormat("#define A \\\n"
7386 " void f() { int i; } \\\n"
7387 " int j;",
7388 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007389}
7390
Daniel Jasperd74cf402014-04-08 12:46:38 +00007391TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7392 FormatStyle MergeInlineOnly = getLLVMStyle();
7393 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7394 verifyFormat("class C {\n"
7395 " int f() { return 42; }\n"
7396 "};",
7397 MergeInlineOnly);
7398 verifyFormat("int f() {\n"
7399 " return 42;\n"
7400 "}",
7401 MergeInlineOnly);
7402}
7403
Manuel Klimeke01bab52013-01-15 13:38:33 +00007404TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7405 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007406 verifyFormat("struct foo a = {bar};\nint n;");
7407 verifyFormat("class foo a = {bar};\nint n;");
7408 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007409
7410 // Elaborate types inside function definitions.
7411 verifyFormat("struct foo f() {}\nint n;");
7412 verifyFormat("class foo f() {}\nint n;");
7413 verifyFormat("union foo f() {}\nint n;");
7414
7415 // Templates.
7416 verifyFormat("template <class X> void f() {}\nint n;");
7417 verifyFormat("template <struct X> void f() {}\nint n;");
7418 verifyFormat("template <union X> void f() {}\nint n;");
7419
7420 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007421 verifyFormat("struct {\n} n;");
7422 verifyFormat(
7423 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007424 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007425 verifyFormat("class MACRO Z {\n} n;");
7426 verifyFormat("class MACRO(X) Z {\n} n;");
7427 verifyFormat("class __attribute__(X) Z {\n} n;");
7428 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007429 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007430 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007431 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7432 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007433
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007434 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007435 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007436
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007437 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007438 verifyFormat(
7439 "template <typename F>\n"
7440 "Matcher(const Matcher<F> &Other,\n"
7441 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7442 " !is_same<F, T>::value>::type * = 0)\n"
7443 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7444
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007445 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007446 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007447 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007448
7449 // FIXME:
7450 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007451 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007452
Manuel Klimeke01bab52013-01-15 13:38:33 +00007453 // Elaborate types where incorrectly parsing the structural element would
7454 // break the indent.
7455 verifyFormat("if (true)\n"
7456 " class X x;\n"
7457 "else\n"
7458 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007459
7460 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007461 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007462}
7463
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007464TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007465 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7466 format("#error Leave all white!!!!! space* alone!\n"));
7467 EXPECT_EQ(
7468 "#warning Leave all white!!!!! space* alone!\n",
7469 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007470 EXPECT_EQ("#error 1", format(" # error 1"));
7471 EXPECT_EQ("#warning 1", format(" # warning 1"));
7472}
7473
Daniel Jasper4431aa92013-04-23 13:54:04 +00007474TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007475 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007476 verifyFormat("#if (AAAA && BBBB)");
7477 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007478 // FIXME: Come up with a better indentation for #elif.
7479 verifyFormat(
7480 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7481 " defined(BBBBBBBB)\n"
7482 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7483 " defined(BBBBBBBB)\n"
7484 "#endif",
7485 getLLVMStyleWithColumns(65));
7486}
7487
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007488TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7489 FormatStyle AllowsMergedIf = getGoogleStyle();
7490 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7491 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7492 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007493 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7494 EXPECT_EQ("if (true) return 42;",
7495 format("if (true)\nreturn 42;", AllowsMergedIf));
7496 FormatStyle ShortMergedIf = AllowsMergedIf;
7497 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007498 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007499 " if (true) return 42;",
7500 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007501 verifyFormat("#define A \\\n"
7502 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007503 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007504 "#define B",
7505 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007506 verifyFormat("#define A \\\n"
7507 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007508 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007509 "g();",
7510 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007511 verifyFormat("{\n"
7512 "#ifdef A\n"
7513 " // Comment\n"
7514 " if (true) continue;\n"
7515 "#endif\n"
7516 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007517 " if (true) continue;\n"
7518 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007519 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007520 ShortMergedIf.ColumnLimit = 29;
7521 verifyFormat("#define A \\\n"
7522 " if (aaaaaaaaaa) return 1; \\\n"
7523 " return 2;",
7524 ShortMergedIf);
7525 ShortMergedIf.ColumnLimit = 28;
7526 verifyFormat("#define A \\\n"
7527 " if (aaaaaaaaaa) \\\n"
7528 " return 1; \\\n"
7529 " return 2;",
7530 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007531}
7532
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007533TEST_F(FormatTest, BlockCommentsInControlLoops) {
7534 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7535 " f();\n"
7536 "}");
7537 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7538 " f();\n"
7539 "} /* another comment */ else /* comment #3 */ {\n"
7540 " g();\n"
7541 "}");
7542 verifyFormat("while (0) /* a comment in a strange place */ {\n"
7543 " f();\n"
7544 "}");
7545 verifyFormat("for (;;) /* a comment in a strange place */ {\n"
7546 " f();\n"
7547 "}");
7548 verifyFormat("do /* a comment in a strange place */ {\n"
7549 " f();\n"
7550 "} /* another comment */ while (0);");
7551}
7552
7553TEST_F(FormatTest, BlockComments) {
7554 EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
7555 format("/* *//* */ /* */\n/* *//* */ /* */"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007556 EXPECT_EQ("/* */ a /* */ b;", format(" /* */ a/* */ b;"));
Daniel Jaspera49393f2013-08-28 09:07:32 +00007557 EXPECT_EQ("#define A /*123*/ \\\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007558 " b\n"
7559 "/* */\n"
7560 "someCall(\n"
7561 " parameter);",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00007562 format("#define A /*123*/ b\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007563 "/* */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007564 "someCall(parameter);",
7565 getLLVMStyleWithColumns(15)));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007566
7567 EXPECT_EQ("#define A\n"
7568 "/* */ someCall(\n"
7569 " parameter);",
7570 format("#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007571 "/* */someCall(parameter);",
7572 getLLVMStyleWithColumns(15)));
Daniel Jasper51fb2b22013-05-30 06:40:07 +00007573 EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007574 EXPECT_EQ("/*\n"
7575 "*\n"
7576 " * aaaaaa\n"
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00007577 " * aaaaaa\n"
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007578 "*/",
7579 format("/*\n"
7580 "*\n"
7581 " * aaaaaa aaaaaa\n"
7582 "*/",
7583 getLLVMStyleWithColumns(10)));
Daniel Jasperce257f22013-05-30 17:27:48 +00007584 EXPECT_EQ("/*\n"
7585 "**\n"
7586 "* aaaaaa\n"
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007587 "*aaaaaa\n"
Daniel Jasperce257f22013-05-30 17:27:48 +00007588 "*/",
7589 format("/*\n"
7590 "**\n"
7591 "* aaaaaa aaaaaa\n"
7592 "*/",
7593 getLLVMStyleWithColumns(10)));
Daniel Jasperacadc8e2016-06-08 09:45:08 +00007594 EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7595 " /* line 1\n"
7596 " bbbbbbbbbbbb */\n"
7597 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7598 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7599 " /* line 1\n"
7600 " bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7601 getLLVMStyleWithColumns(50)));
Daniel Jasper1f140982013-02-04 07:32:14 +00007602
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007603 FormatStyle NoBinPacking = getLLVMStyle();
7604 NoBinPacking.BinPackParameters = false;
Daniel Jasper1f140982013-02-04 07:32:14 +00007605 EXPECT_EQ("someFunction(1, /* comment 1 */\n"
7606 " 2, /* comment 2 */\n"
7607 " 3, /* comment 3 */\n"
Daniel Jasper14e40ec2013-02-04 08:34:57 +00007608 " aaaa,\n"
7609 " bbbb);",
Daniel Jasper1f140982013-02-04 07:32:14 +00007610 format("someFunction (1, /* comment 1 */\n"
7611 " 2, /* comment 2 */ \n"
7612 " 3, /* comment 3 */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007613 "aaaa, bbbb );",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007614 NoBinPacking));
Daniel Jasper38396592013-02-06 15:23:09 +00007615 verifyFormat(
7616 "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7617 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7618 EXPECT_EQ(
7619 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7620 " aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7621 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
7622 format(
7623 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7624 " aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7625 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
Daniel Jasper94f0e132013-02-06 20:07:35 +00007626 EXPECT_EQ(
7627 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7628 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7629 "int cccccccccccccccccccccccccccccc; /* comment */\n",
7630 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7631 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7632 "int cccccccccccccccccccccccccccccc; /* comment */\n"));
Daniel Jasper022612d2013-07-01 09:34:09 +00007633
7634 verifyFormat("void f(int * /* unused */) {}");
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007635
7636 EXPECT_EQ("/*\n"
7637 " **\n"
7638 " */",
7639 format("/*\n"
7640 " **\n"
7641 " */"));
7642 EXPECT_EQ("/*\n"
7643 " *q\n"
7644 " */",
7645 format("/*\n"
7646 " *q\n"
7647 " */"));
7648 EXPECT_EQ("/*\n"
7649 " * q\n"
7650 " */",
7651 format("/*\n"
7652 " * q\n"
7653 " */"));
7654 EXPECT_EQ("/*\n"
7655 " **/",
7656 format("/*\n"
7657 " **/"));
7658 EXPECT_EQ("/*\n"
7659 " ***/",
7660 format("/*\n"
7661 " ***/"));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007662}
7663
Manuel Klimek82b836a2013-02-06 16:40:56 +00007664TEST_F(FormatTest, BlockCommentsInMacros) {
7665 EXPECT_EQ("#define A \\\n"
7666 " { \\\n"
7667 " /* one line */ \\\n"
7668 " someCall();",
7669 format("#define A { \\\n"
7670 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007671 " someCall();",
7672 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007673 EXPECT_EQ("#define A \\\n"
7674 " { \\\n"
7675 " /* previous */ \\\n"
7676 " /* one line */ \\\n"
7677 " someCall();",
7678 format("#define A { \\\n"
7679 " /* previous */ \\\n"
7680 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007681 " someCall();",
7682 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007683}
7684
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007685TEST_F(FormatTest, BlockCommentsAtEndOfLine) {
7686 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007687 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007688 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007689 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007690 "};",
7691 getLLVMStyleWithColumns(15)));
7692 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007693 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007694 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007695 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007696 "};",
7697 getLLVMStyleWithColumns(15)));
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007698 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007699 " 1111 /* a\n"
Krasimir Georgiev91834222017-01-25 13:58:58 +00007700 " */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007701 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007702 format("a = {1111 /* a */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007703 "};",
7704 getLLVMStyleWithColumns(15)));
7705}
7706
Manuel Klimek82b836a2013-02-06 16:40:56 +00007707TEST_F(FormatTest, IndentLineCommentsInStartOfBlockAtEndOfFile) {
Manuel Klimek82b836a2013-02-06 16:40:56 +00007708 verifyFormat("{\n"
Marianne Mailhot-Sarrasin03137c62016-04-14 14:56:49 +00007709 " // a\n"
7710 " // b");
Manuel Klimek82b836a2013-02-06 16:40:56 +00007711}
7712
Manuel Klimekd33516e2013-01-23 10:09:28 +00007713TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007714 verifyFormat("void f(int *a);");
7715 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007716 verifyFormat("class A {\n void f(int *a);\n};");
7717 verifyFormat("class A {\n int *a;\n};");
7718 verifyFormat("namespace a {\n"
7719 "namespace b {\n"
7720 "class A {\n"
7721 " void f() {}\n"
7722 " int *a;\n"
7723 "};\n"
7724 "}\n"
7725 "}");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007726}
7727
Manuel Klimekd33516e2013-01-23 10:09:28 +00007728TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7729 verifyFormat("while");
7730 verifyFormat("operator");
7731}
7732
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007733TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7734 // This code would be painfully slow to format if we didn't skip it.
7735 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
7736 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7737 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7738 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7739 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7740 "A(1, 1)\n"
7741 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7742 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7743 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7744 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7745 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7746 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7747 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7748 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7749 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7750 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7751 // Deeply nested part is untouched, rest is formatted.
7752 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7753 format(std::string("int i;\n") + Code + "int j;\n",
7754 getLLVMStyle(), IC_ExpectIncomplete));
7755}
7756
Nico Weber7e6a7a12013-01-08 17:56:31 +00007757//===----------------------------------------------------------------------===//
7758// Objective-C tests.
7759//===----------------------------------------------------------------------===//
7760
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007761TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7762 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7763 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7764 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007765 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007766 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7767 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7768 format("-(NSInteger)Method3:(id)anObject;"));
7769 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7770 format("-(NSInteger)Method4:(id)anObject;"));
7771 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7772 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7773 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7774 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007775 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7776 "forAllCells:(BOOL)flag;",
7777 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7778 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007779
7780 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007781 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7782 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007783 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7784 " inRange:(NSRange)range\n"
7785 " outRange:(NSRange)out_range\n"
7786 " outRange1:(NSRange)out_range1\n"
7787 " outRange2:(NSRange)out_range2\n"
7788 " outRange3:(NSRange)out_range3\n"
7789 " outRange4:(NSRange)out_range4\n"
7790 " outRange5:(NSRange)out_range5\n"
7791 " outRange6:(NSRange)out_range6\n"
7792 " outRange7:(NSRange)out_range7\n"
7793 " outRange8:(NSRange)out_range8\n"
7794 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007795
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007796 // When the function name has to be wrapped.
7797 FormatStyle Style = getLLVMStyle();
7798 Style.IndentWrappedFunctionNames = false;
7799 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7800 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7801 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7802 "}",
7803 Style);
7804 Style.IndentWrappedFunctionNames = true;
7805 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7806 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7807 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7808 "}",
7809 Style);
7810
Nico Weberd6f962f2013-01-10 20:18:33 +00007811 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007812 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007813 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7814 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007815 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007816
Daniel Jasper37194282013-05-28 08:33:00 +00007817 verifyFormat("- (int (*)())foo:(int (*)())f;");
7818 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007819
7820 // If there's no return type (very rare in practice!), LLVM and Google style
7821 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007822 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007823 verifyFormat("- foo:(int)f;");
7824 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007825}
7826
Nico Weber0588b502013-02-07 00:19:29 +00007827
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007828TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007829 EXPECT_EQ("\"some text \"\n"
7830 "\"other\";",
7831 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007832 EXPECT_EQ("\"some text \"\n"
7833 "\"other\";",
7834 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007835 EXPECT_EQ(
7836 "#define A \\\n"
7837 " \"some \" \\\n"
7838 " \"text \" \\\n"
7839 " \"other\";",
7840 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7841 EXPECT_EQ(
7842 "#define A \\\n"
7843 " \"so \" \\\n"
7844 " \"text \" \\\n"
7845 " \"other\";",
7846 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7847
7848 EXPECT_EQ("\"some text\"",
7849 format("\"some text\"", getLLVMStyleWithColumns(1)));
7850 EXPECT_EQ("\"some text\"",
7851 format("\"some text\"", getLLVMStyleWithColumns(11)));
7852 EXPECT_EQ("\"some \"\n"
7853 "\"text\"",
7854 format("\"some text\"", getLLVMStyleWithColumns(10)));
7855 EXPECT_EQ("\"some \"\n"
7856 "\"text\"",
7857 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007858 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007859 "\" tex\"\n"
7860 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007861 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007862 EXPECT_EQ("\"some\"\n"
7863 "\" tex\"\n"
7864 "\" and\"",
7865 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7866 EXPECT_EQ("\"some\"\n"
7867 "\"/tex\"\n"
7868 "\"/and\"",
7869 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007870
7871 EXPECT_EQ("variable =\n"
7872 " \"long string \"\n"
7873 " \"literal\";",
7874 format("variable = \"long string literal\";",
7875 getLLVMStyleWithColumns(20)));
7876
7877 EXPECT_EQ("variable = f(\n"
7878 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007879 " \"literal\",\n"
7880 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007881 " loooooooooooooooooooong);",
7882 format("variable = f(\"long string literal\", short, "
7883 "loooooooooooooooooooong);",
7884 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007885
Daniel Jaspera44991332015-04-29 13:06:49 +00007886 EXPECT_EQ(
7887 "f(g(\"long string \"\n"
7888 " \"literal\"),\n"
7889 " b);",
7890 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007891 EXPECT_EQ("f(g(\"long string \"\n"
7892 " \"literal\",\n"
7893 " a),\n"
7894 " b);",
7895 format("f(g(\"long string literal\", a), b);",
7896 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007897 EXPECT_EQ(
7898 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00007899 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007900 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7901 EXPECT_EQ("f(\"one two three four five six \"\n"
7902 " \"seven\".split(\n"
7903 " really_looooong_variable));",
7904 format("f(\"one two three four five six seven\"."
7905 "split(really_looooong_variable));",
7906 getLLVMStyleWithColumns(33)));
7907
7908 EXPECT_EQ("f(\"some \"\n"
7909 " \"text\",\n"
7910 " other);",
7911 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00007912
7913 // Only break as a last resort.
7914 verifyFormat(
7915 "aaaaaaaaaaaaaaaaaaaa(\n"
7916 " aaaaaaaaaaaaaaaaaaaa,\n"
7917 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00007918
Daniel Jaspera44991332015-04-29 13:06:49 +00007919 EXPECT_EQ("\"splitmea\"\n"
7920 "\"trandomp\"\n"
7921 "\"oint\"",
7922 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00007923
Daniel Jaspera44991332015-04-29 13:06:49 +00007924 EXPECT_EQ("\"split/\"\n"
7925 "\"pathat/\"\n"
7926 "\"slashes\"",
7927 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007928
Daniel Jaspera44991332015-04-29 13:06:49 +00007929 EXPECT_EQ("\"split/\"\n"
7930 "\"pathat/\"\n"
7931 "\"slashes\"",
7932 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00007933 EXPECT_EQ("\"split at \"\n"
7934 "\"spaces/at/\"\n"
7935 "\"slashes.at.any$\"\n"
7936 "\"non-alphanumeric%\"\n"
7937 "\"1111111111characte\"\n"
7938 "\"rs\"",
7939 format("\"split at "
7940 "spaces/at/"
7941 "slashes.at."
7942 "any$non-"
7943 "alphanumeric%"
7944 "1111111111characte"
7945 "rs\"",
7946 getLLVMStyleWithColumns(20)));
7947
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007948 // Verify that splitting the strings understands
7949 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00007950 EXPECT_EQ(
7951 "aaaaaaaaaaaa(\n"
7952 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
7953 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
7954 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
7955 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7956 "aaaaaaaaaaaaaaaaaaaaaa\");",
7957 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00007958 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7959 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
7960 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
7961 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7962 "aaaaaaaaaaaaaaaaaaaaaa\";",
7963 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00007964 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7965 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7966 format("llvm::outs() << "
7967 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
7968 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00007969 EXPECT_EQ("ffff(\n"
7970 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7971 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7972 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
7973 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7974 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007975
Daniel Jaspere1a7b762016-02-01 11:21:02 +00007976 FormatStyle Style = getLLVMStyleWithColumns(12);
7977 Style.BreakStringLiterals = false;
7978 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
7979
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007980 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
7981 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00007982 EXPECT_EQ("#define A \\\n"
7983 " \"some \" \\\n"
7984 " \"text \" \\\n"
7985 " \"other\";",
7986 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007987}
7988
Manuel Klimek9e321992015-07-28 15:50:24 +00007989TEST_F(FormatTest, FullyRemoveEmptyLines) {
7990 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
7991 NoEmptyLines.MaxEmptyLinesToKeep = 0;
7992 EXPECT_EQ("int i = a(b());",
7993 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
7994}
7995
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007996TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
7997 EXPECT_EQ(
7998 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7999 "(\n"
8000 " \"x\t\");",
8001 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8002 "aaaaaaa("
8003 "\"x\t\");"));
8004}
8005
Daniel Jasper174b0122014-01-09 14:18:12 +00008006TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00008007 EXPECT_EQ(
8008 "u8\"utf8 string \"\n"
8009 "u8\"literal\";",
8010 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8011 EXPECT_EQ(
8012 "u\"utf16 string \"\n"
8013 "u\"literal\";",
8014 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8015 EXPECT_EQ(
8016 "U\"utf32 string \"\n"
8017 "U\"literal\";",
8018 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8019 EXPECT_EQ("L\"wide string \"\n"
8020 "L\"literal\";",
8021 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00008022 EXPECT_EQ("@\"NSString \"\n"
8023 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00008024 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00008025
8026 // This input makes clang-format try to split the incomplete unicode escape
8027 // sequence, which used to lead to a crasher.
8028 verifyNoCrash(
8029 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8030 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008031}
8032
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00008033TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8034 FormatStyle Style = getGoogleStyleWithColumns(15);
8035 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8036 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8037 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8038 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8039 EXPECT_EQ("u8R\"x(raw literal)x\";",
8040 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008041}
8042
8043TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8044 FormatStyle Style = getLLVMStyleWithColumns(20);
8045 EXPECT_EQ(
8046 "_T(\"aaaaaaaaaaaaaa\")\n"
8047 "_T(\"aaaaaaaaaaaaaa\")\n"
8048 "_T(\"aaaaaaaaaaaa\")",
8049 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
8050 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
8051 " _T(\"aaaaaa\"),\n"
8052 " z);",
8053 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8054
8055 // FIXME: Handle embedded spaces in one iteration.
8056 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8057 // "_T(\"aaaaaaaaaaaaa\")\n"
8058 // "_T(\"aaaaaaaaaaaaa\")\n"
8059 // "_T(\"a\")",
8060 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8061 // getLLVMStyleWithColumns(20)));
8062 EXPECT_EQ(
8063 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8064 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008065 EXPECT_EQ("f(\n"
8066 "#if !TEST\n"
8067 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8068 "#endif\n"
8069 " );",
8070 format("f(\n"
8071 "#if !TEST\n"
8072 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8073 "#endif\n"
8074 ");"));
8075 EXPECT_EQ("f(\n"
8076 "\n"
8077 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8078 format("f(\n"
8079 "\n"
8080 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008081}
8082
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008083TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008084 EXPECT_EQ(
8085 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8086 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8087 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8088 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8089 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8090 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8091}
8092
8093TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8094 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008095 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008096 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8097 "multiline raw string literal xxxxxxxxxxxxxx\n"
8098 ")x\",\n"
8099 " a),\n"
8100 " b);",
8101 format("fffffffffff(g(R\"x(\n"
8102 "multiline raw string literal xxxxxxxxxxxxxx\n"
8103 ")x\", a), b);",
8104 getGoogleStyleWithColumns(20)));
8105 EXPECT_EQ("fffffffffff(\n"
8106 " g(R\"x(qqq\n"
8107 "multiline raw string literal xxxxxxxxxxxxxx\n"
8108 ")x\",\n"
8109 " a),\n"
8110 " b);",
8111 format("fffffffffff(g(R\"x(qqq\n"
8112 "multiline raw string literal xxxxxxxxxxxxxx\n"
8113 ")x\", a), b);",
8114 getGoogleStyleWithColumns(20)));
8115
8116 EXPECT_EQ("fffffffffff(R\"x(\n"
8117 "multiline raw string literal xxxxxxxxxxxxxx\n"
8118 ")x\");",
8119 format("fffffffffff(R\"x(\n"
8120 "multiline raw string literal xxxxxxxxxxxxxx\n"
8121 ")x\");",
8122 getGoogleStyleWithColumns(20)));
8123 EXPECT_EQ("fffffffffff(R\"x(\n"
8124 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008125 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008126 format("fffffffffff(R\"x(\n"
8127 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008128 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008129 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008130 EXPECT_EQ("fffffffffff(\n"
8131 " R\"x(\n"
8132 "multiline raw string literal xxxxxxxxxxxxxx\n"
8133 ")x\" +\n"
8134 " bbbbbb);",
8135 format("fffffffffff(\n"
8136 " R\"x(\n"
8137 "multiline raw string literal xxxxxxxxxxxxxx\n"
8138 ")x\" + bbbbbb);",
8139 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008140}
8141
Alexander Kornienkobe633902013-06-14 11:46:10 +00008142TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008143 verifyFormat("string a = \"unterminated;");
8144 EXPECT_EQ("function(\"unterminated,\n"
8145 " OtherParameter);",
8146 format("function( \"unterminated,\n"
8147 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008148}
8149
8150TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008151 FormatStyle Style = getLLVMStyle();
8152 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008153 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008154 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008155}
8156
Daniel Jaspera44991332015-04-29 13:06:49 +00008157TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008158
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008159TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8160 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8161 " \"ddeeefff\");",
8162 format("someFunction(\"aaabbbcccdddeeefff\");",
8163 getLLVMStyleWithColumns(25)));
8164 EXPECT_EQ("someFunction1234567890(\n"
8165 " \"aaabbbcccdddeeefff\");",
8166 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8167 getLLVMStyleWithColumns(26)));
8168 EXPECT_EQ("someFunction1234567890(\n"
8169 " \"aaabbbcccdddeeeff\"\n"
8170 " \"f\");",
8171 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8172 getLLVMStyleWithColumns(25)));
8173 EXPECT_EQ("someFunction1234567890(\n"
8174 " \"aaabbbcccdddeeeff\"\n"
8175 " \"f\");",
8176 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8177 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008178 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8179 " \"ddde \"\n"
8180 " \"efff\");",
8181 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008182 getLLVMStyleWithColumns(25)));
8183 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8184 " \"ddeeefff\");",
8185 format("someFunction(\"aaabbbccc ddeeefff\");",
8186 getLLVMStyleWithColumns(25)));
8187 EXPECT_EQ("someFunction1234567890(\n"
8188 " \"aaabb \"\n"
8189 " \"cccdddeeefff\");",
8190 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8191 getLLVMStyleWithColumns(25)));
8192 EXPECT_EQ("#define A \\\n"
8193 " string s = \\\n"
8194 " \"123456789\" \\\n"
8195 " \"0\"; \\\n"
8196 " int i;",
8197 format("#define A string s = \"1234567890\"; int i;",
8198 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008199 // FIXME: Put additional penalties on breaking at non-whitespace locations.
8200 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8201 " \"dddeeeff\"\n"
8202 " \"f\");",
8203 format("someFunction(\"aaabbbcc dddeeefff\");",
8204 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008205}
8206
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008207TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008208 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8209 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008210 EXPECT_EQ("\"test\"\n"
8211 "\"\\n\"",
8212 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8213 EXPECT_EQ("\"tes\\\\\"\n"
8214 "\"n\"",
8215 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8216 EXPECT_EQ("\"\\\\\\\\\"\n"
8217 "\"\\n\"",
8218 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008219 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008220 EXPECT_EQ("\"\\uff01\"\n"
8221 "\"test\"",
8222 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8223 EXPECT_EQ("\"\\Uff01ff02\"",
8224 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8225 EXPECT_EQ("\"\\x000000000001\"\n"
8226 "\"next\"",
8227 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8228 EXPECT_EQ("\"\\x000000000001next\"",
8229 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8230 EXPECT_EQ("\"\\x000000000001\"",
8231 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8232 EXPECT_EQ("\"test\"\n"
8233 "\"\\000000\"\n"
8234 "\"000001\"",
8235 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8236 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008237 "\"00000000\"\n"
8238 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008239 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008240}
8241
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008242TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8243 verifyFormat("void f() {\n"
8244 " return g() {}\n"
8245 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008246 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008247 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008248 "}");
8249}
8250
Manuel Klimek421147e2014-01-24 09:25:23 +00008251TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8252 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008253 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008254}
8255
Manuel Klimek13b97d82013-05-13 08:42:42 +00008256TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8257 verifyFormat("class X {\n"
8258 " void f() {\n"
8259 " }\n"
8260 "};",
8261 getLLVMStyleWithColumns(12));
8262}
8263
8264TEST_F(FormatTest, ConfigurableIndentWidth) {
8265 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8266 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008267 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008268 verifyFormat("void f() {\n"
8269 " someFunction();\n"
8270 " if (true) {\n"
8271 " f();\n"
8272 " }\n"
8273 "}",
8274 EightIndent);
8275 verifyFormat("class X {\n"
8276 " void f() {\n"
8277 " }\n"
8278 "};",
8279 EightIndent);
8280 verifyFormat("int x[] = {\n"
8281 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008282 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008283 EightIndent);
8284}
8285
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008286TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008287 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008288 "f();",
8289 getLLVMStyleWithColumns(8));
8290}
8291
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008292TEST_F(FormatTest, ConfigurableUseOfTab) {
8293 FormatStyle Tab = getLLVMStyleWithColumns(42);
8294 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008295 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008296 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008297
8298 EXPECT_EQ("if (aaaaaaaa && // q\n"
8299 " bb)\t\t// w\n"
8300 "\t;",
8301 format("if (aaaaaaaa &&// q\n"
8302 "bb)// w\n"
8303 ";",
8304 Tab));
8305 EXPECT_EQ("if (aaa && bbb) // w\n"
8306 "\t;",
8307 format("if(aaa&&bbb)// w\n"
8308 ";",
8309 Tab));
8310
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008311 verifyFormat("class X {\n"
8312 "\tvoid f() {\n"
8313 "\t\tsomeFunction(parameter1,\n"
8314 "\t\t\t parameter2);\n"
8315 "\t}\n"
8316 "};",
8317 Tab);
8318 verifyFormat("#define A \\\n"
8319 "\tvoid f() { \\\n"
8320 "\t\tsomeFunction( \\\n"
8321 "\t\t parameter1, \\\n"
8322 "\t\t parameter2); \\\n"
8323 "\t}",
8324 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008325
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008326 Tab.TabWidth = 4;
8327 Tab.IndentWidth = 8;
8328 verifyFormat("class TabWidth4Indent8 {\n"
8329 "\t\tvoid f() {\n"
8330 "\t\t\t\tsomeFunction(parameter1,\n"
8331 "\t\t\t\t\t\t\t parameter2);\n"
8332 "\t\t}\n"
8333 "};",
8334 Tab);
8335
8336 Tab.TabWidth = 4;
8337 Tab.IndentWidth = 4;
8338 verifyFormat("class TabWidth4Indent4 {\n"
8339 "\tvoid f() {\n"
8340 "\t\tsomeFunction(parameter1,\n"
8341 "\t\t\t\t\t parameter2);\n"
8342 "\t}\n"
8343 "};",
8344 Tab);
8345
8346 Tab.TabWidth = 8;
8347 Tab.IndentWidth = 4;
8348 verifyFormat("class TabWidth8Indent4 {\n"
8349 " void f() {\n"
8350 "\tsomeFunction(parameter1,\n"
8351 "\t\t parameter2);\n"
8352 " }\n"
8353 "};",
8354 Tab);
8355
Alexander Kornienko39856b72013-09-10 09:38:25 +00008356 Tab.TabWidth = 8;
8357 Tab.IndentWidth = 8;
8358 EXPECT_EQ("/*\n"
8359 "\t a\t\tcomment\n"
8360 "\t in multiple lines\n"
8361 " */",
8362 format(" /*\t \t \n"
8363 " \t \t a\t\tcomment\t \t\n"
8364 " \t \t in multiple lines\t\n"
8365 " \t */",
8366 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008367
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008368 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008369 verifyFormat("{\n"
8370 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8371 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8372 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8373 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8374 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8375 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008376 "};",
8377 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008378 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008379 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008380 "\ta2,\n"
8381 "\ta3\n"
8382 "};",
8383 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008384 EXPECT_EQ("if (aaaaaaaa && // q\n"
8385 " bb) // w\n"
8386 "\t;",
8387 format("if (aaaaaaaa &&// q\n"
8388 "bb)// w\n"
8389 ";",
8390 Tab));
8391 verifyFormat("class X {\n"
8392 "\tvoid f() {\n"
8393 "\t\tsomeFunction(parameter1,\n"
8394 "\t\t parameter2);\n"
8395 "\t}\n"
8396 "};",
8397 Tab);
8398 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008399 "\tQ(\n"
8400 "\t {\n"
8401 "\t\t int a;\n"
8402 "\t\t someFunction(aaaaaaaa,\n"
8403 "\t\t bbbbbbb);\n"
8404 "\t },\n"
8405 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008406 "}",
8407 Tab);
8408 EXPECT_EQ("{\n"
8409 "\t/* aaaa\n"
8410 "\t bbbb */\n"
8411 "}",
8412 format("{\n"
8413 "/* aaaa\n"
8414 " bbbb */\n"
8415 "}",
8416 Tab));
8417 EXPECT_EQ("{\n"
8418 "\t/*\n"
8419 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8420 "\t bbbbbbbbbbbbb\n"
8421 "\t*/\n"
8422 "}",
8423 format("{\n"
8424 "/*\n"
8425 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8426 "*/\n"
8427 "}",
8428 Tab));
8429 EXPECT_EQ("{\n"
8430 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8431 "\t// bbbbbbbbbbbbb\n"
8432 "}",
8433 format("{\n"
8434 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8435 "}",
8436 Tab));
8437 EXPECT_EQ("{\n"
8438 "\t/*\n"
8439 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8440 "\t bbbbbbbbbbbbb\n"
8441 "\t*/\n"
8442 "}",
8443 format("{\n"
8444 "\t/*\n"
8445 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8446 "\t*/\n"
8447 "}",
8448 Tab));
8449 EXPECT_EQ("{\n"
8450 "\t/*\n"
8451 "\n"
8452 "\t*/\n"
8453 "}",
8454 format("{\n"
8455 "\t/*\n"
8456 "\n"
8457 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008458 "}",
8459 Tab));
8460 EXPECT_EQ("{\n"
8461 "\t/*\n"
8462 " asdf\n"
8463 "\t*/\n"
8464 "}",
8465 format("{\n"
8466 "\t/*\n"
8467 " asdf\n"
8468 "\t*/\n"
8469 "}",
8470 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008471
8472 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008473 EXPECT_EQ("/*\n"
8474 " a\t\tcomment\n"
8475 " in multiple lines\n"
8476 " */",
8477 format(" /*\t \t \n"
8478 " \t \t a\t\tcomment\t \t\n"
8479 " \t \t in multiple lines\t\n"
8480 " \t */",
8481 Tab));
8482 EXPECT_EQ("/* some\n"
8483 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008484 format(" \t \t /* some\n"
8485 " \t \t comment */",
8486 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008487 EXPECT_EQ("int a; /* some\n"
8488 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008489 format(" \t \t int a; /* some\n"
8490 " \t \t comment */",
8491 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008492
Alexander Kornienko39856b72013-09-10 09:38:25 +00008493 EXPECT_EQ("int a; /* some\n"
8494 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008495 format(" \t \t int\ta; /* some\n"
8496 " \t \t comment */",
8497 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008498 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8499 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008500 format(" \t \t f(\"\t\t\"); /* some\n"
8501 " \t \t comment */",
8502 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008503 EXPECT_EQ("{\n"
8504 " /*\n"
8505 " * Comment\n"
8506 " */\n"
8507 " int i;\n"
8508 "}",
8509 format("{\n"
8510 "\t/*\n"
8511 "\t * Comment\n"
8512 "\t */\n"
8513 "\t int i;\n"
8514 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008515
8516 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8517 Tab.TabWidth = 8;
8518 Tab.IndentWidth = 8;
8519 EXPECT_EQ("if (aaaaaaaa && // q\n"
8520 " bb) // w\n"
8521 "\t;",
8522 format("if (aaaaaaaa &&// q\n"
8523 "bb)// w\n"
8524 ";",
8525 Tab));
8526 EXPECT_EQ("if (aaa && bbb) // w\n"
8527 "\t;",
8528 format("if(aaa&&bbb)// w\n"
8529 ";",
8530 Tab));
8531 verifyFormat("class X {\n"
8532 "\tvoid f() {\n"
8533 "\t\tsomeFunction(parameter1,\n"
8534 "\t\t\t parameter2);\n"
8535 "\t}\n"
8536 "};",
8537 Tab);
8538 verifyFormat("#define A \\\n"
8539 "\tvoid f() { \\\n"
8540 "\t\tsomeFunction( \\\n"
8541 "\t\t parameter1, \\\n"
8542 "\t\t parameter2); \\\n"
8543 "\t}",
8544 Tab);
8545 Tab.TabWidth = 4;
8546 Tab.IndentWidth = 8;
8547 verifyFormat("class TabWidth4Indent8 {\n"
8548 "\t\tvoid f() {\n"
8549 "\t\t\t\tsomeFunction(parameter1,\n"
8550 "\t\t\t\t\t\t\t parameter2);\n"
8551 "\t\t}\n"
8552 "};",
8553 Tab);
8554 Tab.TabWidth = 4;
8555 Tab.IndentWidth = 4;
8556 verifyFormat("class TabWidth4Indent4 {\n"
8557 "\tvoid f() {\n"
8558 "\t\tsomeFunction(parameter1,\n"
8559 "\t\t\t\t\t parameter2);\n"
8560 "\t}\n"
8561 "};",
8562 Tab);
8563 Tab.TabWidth = 8;
8564 Tab.IndentWidth = 4;
8565 verifyFormat("class TabWidth8Indent4 {\n"
8566 " void f() {\n"
8567 "\tsomeFunction(parameter1,\n"
8568 "\t\t parameter2);\n"
8569 " }\n"
8570 "};",
8571 Tab);
8572 Tab.TabWidth = 8;
8573 Tab.IndentWidth = 8;
8574 EXPECT_EQ("/*\n"
8575 "\t a\t\tcomment\n"
8576 "\t in multiple lines\n"
8577 " */",
8578 format(" /*\t \t \n"
8579 " \t \t a\t\tcomment\t \t\n"
8580 " \t \t in multiple lines\t\n"
8581 " \t */",
8582 Tab));
8583 verifyFormat("{\n"
8584 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8585 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8586 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8587 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8588 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8589 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8590 "};",
8591 Tab);
8592 verifyFormat("enum AA {\n"
8593 "\ta1, // Force multiple lines\n"
8594 "\ta2,\n"
8595 "\ta3\n"
8596 "};",
8597 Tab);
8598 EXPECT_EQ("if (aaaaaaaa && // q\n"
8599 " bb) // w\n"
8600 "\t;",
8601 format("if (aaaaaaaa &&// q\n"
8602 "bb)// w\n"
8603 ";",
8604 Tab));
8605 verifyFormat("class X {\n"
8606 "\tvoid f() {\n"
8607 "\t\tsomeFunction(parameter1,\n"
8608 "\t\t\t parameter2);\n"
8609 "\t}\n"
8610 "};",
8611 Tab);
8612 verifyFormat("{\n"
8613 "\tQ(\n"
8614 "\t {\n"
8615 "\t\t int a;\n"
8616 "\t\t someFunction(aaaaaaaa,\n"
8617 "\t\t\t\t bbbbbbb);\n"
8618 "\t },\n"
8619 "\t p);\n"
8620 "}",
8621 Tab);
8622 EXPECT_EQ("{\n"
8623 "\t/* aaaa\n"
8624 "\t bbbb */\n"
8625 "}",
8626 format("{\n"
8627 "/* aaaa\n"
8628 " bbbb */\n"
8629 "}",
8630 Tab));
8631 EXPECT_EQ("{\n"
8632 "\t/*\n"
8633 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8634 "\t bbbbbbbbbbbbb\n"
8635 "\t*/\n"
8636 "}",
8637 format("{\n"
8638 "/*\n"
8639 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8640 "*/\n"
8641 "}",
8642 Tab));
8643 EXPECT_EQ("{\n"
8644 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8645 "\t// bbbbbbbbbbbbb\n"
8646 "}",
8647 format("{\n"
8648 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8649 "}",
8650 Tab));
8651 EXPECT_EQ("{\n"
8652 "\t/*\n"
8653 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8654 "\t bbbbbbbbbbbbb\n"
8655 "\t*/\n"
8656 "}",
8657 format("{\n"
8658 "\t/*\n"
8659 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8660 "\t*/\n"
8661 "}",
8662 Tab));
8663 EXPECT_EQ("{\n"
8664 "\t/*\n"
8665 "\n"
8666 "\t*/\n"
8667 "}",
8668 format("{\n"
8669 "\t/*\n"
8670 "\n"
8671 "\t*/\n"
8672 "}",
8673 Tab));
8674 EXPECT_EQ("{\n"
8675 "\t/*\n"
8676 " asdf\n"
8677 "\t*/\n"
8678 "}",
8679 format("{\n"
8680 "\t/*\n"
8681 " asdf\n"
8682 "\t*/\n"
8683 "}",
8684 Tab));
8685 EXPECT_EQ("/*\n"
8686 "\t a\t\tcomment\n"
8687 "\t in multiple lines\n"
8688 " */",
8689 format(" /*\t \t \n"
8690 " \t \t a\t\tcomment\t \t\n"
8691 " \t \t in multiple lines\t\n"
8692 " \t */",
8693 Tab));
8694 EXPECT_EQ("/* some\n"
8695 " comment */",
8696 format(" \t \t /* some\n"
8697 " \t \t comment */",
8698 Tab));
8699 EXPECT_EQ("int a; /* some\n"
8700 " comment */",
8701 format(" \t \t int a; /* some\n"
8702 " \t \t comment */",
8703 Tab));
8704 EXPECT_EQ("int a; /* some\n"
8705 "comment */",
8706 format(" \t \t int\ta; /* some\n"
8707 " \t \t comment */",
8708 Tab));
8709 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8710 " comment */",
8711 format(" \t \t f(\"\t\t\"); /* some\n"
8712 " \t \t comment */",
8713 Tab));
8714 EXPECT_EQ("{\n"
8715 " /*\n"
8716 " * Comment\n"
8717 " */\n"
8718 " int i;\n"
8719 "}",
8720 format("{\n"
8721 "\t/*\n"
8722 "\t * Comment\n"
8723 "\t */\n"
8724 "\t int i;\n"
8725 "}"));
8726 Tab.AlignConsecutiveAssignments = true;
8727 Tab.AlignConsecutiveDeclarations = true;
8728 Tab.TabWidth = 4;
8729 Tab.IndentWidth = 4;
8730 verifyFormat("class Assign {\n"
8731 "\tvoid f() {\n"
8732 "\t\tint x = 123;\n"
8733 "\t\tint random = 4;\n"
8734 "\t\tstd::string alphabet =\n"
8735 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8736 "\t}\n"
8737 "};",
8738 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008739}
8740
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008741TEST_F(FormatTest, CalculatesOriginalColumn) {
8742 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8743 "q\"; /* some\n"
8744 " comment */",
8745 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8746 "q\"; /* some\n"
8747 " comment */",
8748 getLLVMStyle()));
8749 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8750 "/* some\n"
8751 " comment */",
8752 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8753 " /* some\n"
8754 " comment */",
8755 getLLVMStyle()));
8756 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8757 "qqq\n"
8758 "/* some\n"
8759 " comment */",
8760 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8761 "qqq\n"
8762 " /* some\n"
8763 " comment */",
8764 getLLVMStyle()));
8765 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8766 "wwww; /* some\n"
8767 " comment */",
8768 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8769 "wwww; /* some\n"
8770 " comment */",
8771 getLLVMStyle()));
8772}
8773
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008774TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008775 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008776 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008777
8778 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008779 " continue;",
8780 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008781 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008782 " continue;",
8783 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008784 verifyFormat("if(true)\n"
8785 " f();\n"
8786 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008787 " f();",
8788 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008789 verifyFormat("do {\n"
8790 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008791 "} while(something());",
8792 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008793 verifyFormat("switch(x) {\n"
8794 "default:\n"
8795 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008796 "}",
8797 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008798 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008799 verifyFormat("size_t x = sizeof(x);", NoSpace);
8800 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8801 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8802 verifyFormat("alignas(128) char a[128];", NoSpace);
8803 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8804 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8805 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008806 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008807 verifyFormat("T A::operator()();", NoSpace);
8808 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008809
8810 FormatStyle Space = getLLVMStyle();
8811 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8812
8813 verifyFormat("int f ();", Space);
8814 verifyFormat("void f (int a, T b) {\n"
8815 " while (true)\n"
8816 " continue;\n"
8817 "}",
8818 Space);
8819 verifyFormat("if (true)\n"
8820 " f ();\n"
8821 "else if (true)\n"
8822 " f ();",
8823 Space);
8824 verifyFormat("do {\n"
8825 " do_something ();\n"
8826 "} while (something ());",
8827 Space);
8828 verifyFormat("switch (x) {\n"
8829 "default:\n"
8830 " break;\n"
8831 "}",
8832 Space);
8833 verifyFormat("A::A () : a (1) {}", Space);
8834 verifyFormat("void f () __attribute__ ((asdf));", Space);
8835 verifyFormat("*(&a + 1);\n"
8836 "&((&a)[1]);\n"
8837 "a[(b + c) * d];\n"
8838 "(((a + 1) * 2) + 3) * 4;",
8839 Space);
8840 verifyFormat("#define A(x) x", Space);
8841 verifyFormat("#define A (x) x", Space);
8842 verifyFormat("#if defined(x)\n"
8843 "#endif",
8844 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008845 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008846 verifyFormat("size_t x = sizeof (x);", Space);
8847 verifyFormat("auto f (int x) -> decltype (x);", Space);
8848 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8849 verifyFormat("alignas (128) char a[128];", Space);
8850 verifyFormat("size_t x = alignof (MyType);", Space);
8851 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8852 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008853 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008854 verifyFormat("T A::operator() ();", Space);
8855 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008856}
8857
8858TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8859 FormatStyle Spaces = getLLVMStyle();
8860
8861 Spaces.SpacesInParentheses = true;
8862 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008863 verifyFormat("call();", Spaces);
8864 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008865 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8866 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008867 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008868 " continue;",
8869 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008870 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008871 " continue;",
8872 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008873 verifyFormat("if ( true )\n"
8874 " f();\n"
8875 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008876 " f();",
8877 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008878 verifyFormat("do {\n"
8879 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008880 "} while ( something() );",
8881 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008882 verifyFormat("switch ( x ) {\n"
8883 "default:\n"
8884 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008885 "}",
8886 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008887
8888 Spaces.SpacesInParentheses = false;
8889 Spaces.SpacesInCStyleCastParentheses = true;
8890 verifyFormat("Type *A = ( Type * )P;", Spaces);
8891 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8892 verifyFormat("x = ( int32 )y;", Spaces);
8893 verifyFormat("int a = ( int )(2.0f);", Spaces);
8894 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8895 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8896 verifyFormat("#define x (( int )-1)", Spaces);
8897
Daniel Jasper92e09822015-03-18 12:59:19 +00008898 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008899 Spaces.SpacesInParentheses = false;
8900 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008901 Spaces.SpacesInCStyleCastParentheses = true;
8902 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008903 verifyFormat("call( );", Spaces);
8904 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008905 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008906 " continue;",
8907 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008908 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008909 " continue;",
8910 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008911 verifyFormat("if (true)\n"
8912 " f( );\n"
8913 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008914 " f( );",
8915 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008916 verifyFormat("do {\n"
8917 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008918 "} while (something( ));",
8919 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008920 verifyFormat("switch (x) {\n"
8921 "default:\n"
8922 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008923 "}",
8924 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008925
Daniel Jasper92e09822015-03-18 12:59:19 +00008926 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008927 Spaces.SpaceAfterCStyleCast = true;
8928 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008929 verifyFormat("call( );", Spaces);
8930 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008931 verifyFormat("while (( bool ) 1)\n"
8932 " continue;",
8933 Spaces);
8934 verifyFormat("for (;;)\n"
8935 " continue;",
8936 Spaces);
8937 verifyFormat("if (true)\n"
8938 " f( );\n"
8939 "else if (true)\n"
8940 " f( );",
8941 Spaces);
8942 verifyFormat("do {\n"
8943 " do_something(( int ) i);\n"
8944 "} while (something( ));",
8945 Spaces);
8946 verifyFormat("switch (x) {\n"
8947 "default:\n"
8948 " break;\n"
8949 "}",
8950 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008951
8952 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008953 Spaces.SpacesInCStyleCastParentheses = false;
8954 Spaces.SpaceAfterCStyleCast = true;
8955 verifyFormat("while ((bool) 1)\n"
8956 " continue;",
8957 Spaces);
8958 verifyFormat("do {\n"
8959 " do_something((int) i);\n"
8960 "} while (something( ));",
8961 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008962}
8963
Daniel Jasperad981f82014-08-26 11:41:14 +00008964TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8965 verifyFormat("int a[5];");
8966 verifyFormat("a[3] += 42;");
8967
8968 FormatStyle Spaces = getLLVMStyle();
8969 Spaces.SpacesInSquareBrackets = true;
8970 // Lambdas unchanged.
8971 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8972 verifyFormat("return [i, args...] {};", Spaces);
8973
8974 // Not lambdas.
8975 verifyFormat("int a[ 5 ];", Spaces);
8976 verifyFormat("a[ 3 ] += 42;", Spaces);
8977 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
8978 verifyFormat("double &operator[](int i) { return 0; }\n"
8979 "int i;",
8980 Spaces);
8981 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
8982 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
8983 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
8984}
8985
Daniel Jasperd94bff32013-09-25 15:15:02 +00008986TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
8987 verifyFormat("int a = 5;");
8988 verifyFormat("a += 42;");
8989 verifyFormat("a or_eq 8;");
8990
8991 FormatStyle Spaces = getLLVMStyle();
8992 Spaces.SpaceBeforeAssignmentOperators = false;
8993 verifyFormat("int a= 5;", Spaces);
8994 verifyFormat("a+= 42;", Spaces);
8995 verifyFormat("a or_eq 8;", Spaces);
8996}
8997
Daniel Jaspera44991332015-04-29 13:06:49 +00008998TEST_F(FormatTest, AlignConsecutiveAssignments) {
8999 FormatStyle Alignment = getLLVMStyle();
9000 Alignment.AlignConsecutiveAssignments = false;
9001 verifyFormat("int a = 5;\n"
9002 "int oneTwoThree = 123;",
9003 Alignment);
9004 verifyFormat("int a = 5;\n"
9005 "int oneTwoThree = 123;",
9006 Alignment);
9007
9008 Alignment.AlignConsecutiveAssignments = true;
9009 verifyFormat("int a = 5;\n"
9010 "int oneTwoThree = 123;",
9011 Alignment);
9012 verifyFormat("int a = method();\n"
9013 "int oneTwoThree = 133;",
9014 Alignment);
9015 verifyFormat("a &= 5;\n"
9016 "bcd *= 5;\n"
9017 "ghtyf += 5;\n"
9018 "dvfvdb -= 5;\n"
9019 "a /= 5;\n"
9020 "vdsvsv %= 5;\n"
9021 "sfdbddfbdfbb ^= 5;\n"
9022 "dvsdsv |= 5;\n"
9023 "int dsvvdvsdvvv = 123;",
9024 Alignment);
9025 verifyFormat("int i = 1, j = 10;\n"
9026 "something = 2000;",
9027 Alignment);
9028 verifyFormat("something = 2000;\n"
9029 "int i = 1, j = 10;\n",
9030 Alignment);
9031 verifyFormat("something = 2000;\n"
9032 "another = 911;\n"
9033 "int i = 1, j = 10;\n"
9034 "oneMore = 1;\n"
9035 "i = 2;",
9036 Alignment);
9037 verifyFormat("int a = 5;\n"
9038 "int one = 1;\n"
9039 "method();\n"
9040 "int oneTwoThree = 123;\n"
9041 "int oneTwo = 12;",
9042 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009043 verifyFormat("int oneTwoThree = 123;\n"
9044 "int oneTwo = 12;\n"
9045 "method();\n",
9046 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009047 verifyFormat("int oneTwoThree = 123; // comment\n"
9048 "int oneTwo = 12; // comment",
9049 Alignment);
9050 EXPECT_EQ("int a = 5;\n"
9051 "\n"
9052 "int oneTwoThree = 123;",
9053 format("int a = 5;\n"
9054 "\n"
9055 "int oneTwoThree= 123;",
9056 Alignment));
9057 EXPECT_EQ("int a = 5;\n"
9058 "int one = 1;\n"
9059 "\n"
9060 "int oneTwoThree = 123;",
9061 format("int a = 5;\n"
9062 "int one = 1;\n"
9063 "\n"
9064 "int oneTwoThree = 123;",
9065 Alignment));
9066 EXPECT_EQ("int a = 5;\n"
9067 "int one = 1;\n"
9068 "\n"
9069 "int oneTwoThree = 123;\n"
9070 "int oneTwo = 12;",
9071 format("int a = 5;\n"
9072 "int one = 1;\n"
9073 "\n"
9074 "int oneTwoThree = 123;\n"
9075 "int oneTwo = 12;",
9076 Alignment));
9077 Alignment.AlignEscapedNewlinesLeft = true;
9078 verifyFormat("#define A \\\n"
9079 " int aaaa = 12; \\\n"
9080 " int b = 23; \\\n"
9081 " int ccc = 234; \\\n"
9082 " int dddddddddd = 2345;",
9083 Alignment);
9084 Alignment.AlignEscapedNewlinesLeft = false;
9085 verifyFormat("#define A "
9086 " \\\n"
9087 " int aaaa = 12; "
9088 " \\\n"
9089 " int b = 23; "
9090 " \\\n"
9091 " int ccc = 234; "
9092 " \\\n"
9093 " int dddddddddd = 2345;",
9094 Alignment);
9095 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9096 "k = 4, int l = 5,\n"
9097 " int m = 6) {\n"
9098 " int j = 10;\n"
9099 " otherThing = 1;\n"
9100 "}",
9101 Alignment);
9102 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9103 " int i = 1;\n"
9104 " int j = 2;\n"
9105 " int big = 10000;\n"
9106 "}",
9107 Alignment);
9108 verifyFormat("class C {\n"
9109 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009110 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009111 " virtual void f() = 0;\n"
9112 "};",
9113 Alignment);
9114 verifyFormat("int i = 1;\n"
9115 "if (SomeType t = getSomething()) {\n"
9116 "}\n"
9117 "int j = 2;\n"
9118 "int big = 10000;",
9119 Alignment);
9120 verifyFormat("int j = 7;\n"
9121 "for (int k = 0; k < N; ++k) {\n"
9122 "}\n"
9123 "int j = 2;\n"
9124 "int big = 10000;\n"
9125 "}",
9126 Alignment);
9127 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9128 verifyFormat("int i = 1;\n"
9129 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9130 " = someLooooooooooooooooongFunction();\n"
9131 "int j = 2;",
9132 Alignment);
9133 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9134 verifyFormat("int i = 1;\n"
9135 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9136 " someLooooooooooooooooongFunction();\n"
9137 "int j = 2;",
9138 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009139
9140 verifyFormat("auto lambda = []() {\n"
9141 " auto i = 0;\n"
9142 " return 0;\n"
9143 "};\n"
9144 "int i = 0;\n"
9145 "auto v = type{\n"
9146 " i = 1, //\n"
9147 " (i = 2), //\n"
9148 " i = 3 //\n"
9149 "};",
9150 Alignment);
9151
Daniel Jaspera44991332015-04-29 13:06:49 +00009152 // FIXME: Should align all three assignments
9153 verifyFormat(
9154 "int i = 1;\n"
9155 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9156 " loooooooooooooooooooooongParameterB);\n"
9157 "int j = 2;",
9158 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009159
9160 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9161 " typename B = very_long_type_name_1,\n"
9162 " typename T_2 = very_long_type_name_2>\n"
9163 "auto foo() {}\n",
9164 Alignment);
9165 verifyFormat("int a, b = 1;\n"
9166 "int c = 2;\n"
9167 "int dd = 3;\n",
9168 Alignment);
9169 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9170 "float b[1][] = {{3.f}};\n",
9171 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009172}
9173
Daniel Jaspere12597c2015-10-01 10:06:54 +00009174TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9175 FormatStyle Alignment = getLLVMStyle();
9176 Alignment.AlignConsecutiveDeclarations = false;
9177 verifyFormat("float const a = 5;\n"
9178 "int oneTwoThree = 123;",
9179 Alignment);
9180 verifyFormat("int a = 5;\n"
9181 "float const oneTwoThree = 123;",
9182 Alignment);
9183
9184 Alignment.AlignConsecutiveDeclarations = true;
9185 verifyFormat("float const a = 5;\n"
9186 "int oneTwoThree = 123;",
9187 Alignment);
9188 verifyFormat("int a = method();\n"
9189 "float const oneTwoThree = 133;",
9190 Alignment);
9191 verifyFormat("int i = 1, j = 10;\n"
9192 "something = 2000;",
9193 Alignment);
9194 verifyFormat("something = 2000;\n"
9195 "int i = 1, j = 10;\n",
9196 Alignment);
9197 verifyFormat("float something = 2000;\n"
9198 "double another = 911;\n"
9199 "int i = 1, j = 10;\n"
9200 "const int *oneMore = 1;\n"
9201 "unsigned i = 2;",
9202 Alignment);
9203 verifyFormat("float a = 5;\n"
9204 "int one = 1;\n"
9205 "method();\n"
9206 "const double oneTwoThree = 123;\n"
9207 "const unsigned int oneTwo = 12;",
9208 Alignment);
9209 verifyFormat("int oneTwoThree{0}; // comment\n"
9210 "unsigned oneTwo; // comment",
9211 Alignment);
9212 EXPECT_EQ("float const a = 5;\n"
9213 "\n"
9214 "int oneTwoThree = 123;",
9215 format("float const a = 5;\n"
9216 "\n"
9217 "int oneTwoThree= 123;",
9218 Alignment));
9219 EXPECT_EQ("float a = 5;\n"
9220 "int one = 1;\n"
9221 "\n"
9222 "unsigned oneTwoThree = 123;",
9223 format("float a = 5;\n"
9224 "int one = 1;\n"
9225 "\n"
9226 "unsigned oneTwoThree = 123;",
9227 Alignment));
9228 EXPECT_EQ("float a = 5;\n"
9229 "int one = 1;\n"
9230 "\n"
9231 "unsigned oneTwoThree = 123;\n"
9232 "int oneTwo = 12;",
9233 format("float a = 5;\n"
9234 "int one = 1;\n"
9235 "\n"
9236 "unsigned oneTwoThree = 123;\n"
9237 "int oneTwo = 12;",
9238 Alignment));
9239 Alignment.AlignConsecutiveAssignments = true;
9240 verifyFormat("float something = 2000;\n"
9241 "double another = 911;\n"
9242 "int i = 1, j = 10;\n"
9243 "const int *oneMore = 1;\n"
9244 "unsigned i = 2;",
9245 Alignment);
9246 verifyFormat("int oneTwoThree = {0}; // comment\n"
9247 "unsigned oneTwo = 0; // comment",
9248 Alignment);
9249 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9250 " int const i = 1;\n"
9251 " int * j = 2;\n"
9252 " int big = 10000;\n"
9253 "\n"
9254 " unsigned oneTwoThree = 123;\n"
9255 " int oneTwo = 12;\n"
9256 " method();\n"
9257 " float k = 2;\n"
9258 " int ll = 10000;\n"
9259 "}",
9260 format("void SomeFunction(int parameter= 0) {\n"
9261 " int const i= 1;\n"
9262 " int *j=2;\n"
9263 " int big = 10000;\n"
9264 "\n"
9265 "unsigned oneTwoThree =123;\n"
9266 "int oneTwo = 12;\n"
9267 " method();\n"
9268 "float k= 2;\n"
9269 "int ll=10000;\n"
9270 "}",
9271 Alignment));
9272 Alignment.AlignConsecutiveAssignments = false;
9273 Alignment.AlignEscapedNewlinesLeft = true;
9274 verifyFormat("#define A \\\n"
9275 " int aaaa = 12; \\\n"
9276 " float b = 23; \\\n"
9277 " const int ccc = 234; \\\n"
9278 " unsigned dddddddddd = 2345;",
9279 Alignment);
9280 Alignment.AlignEscapedNewlinesLeft = false;
9281 Alignment.ColumnLimit = 30;
9282 verifyFormat("#define A \\\n"
9283 " int aaaa = 12; \\\n"
9284 " float b = 23; \\\n"
9285 " const int ccc = 234; \\\n"
9286 " int dddddddddd = 2345;",
9287 Alignment);
9288 Alignment.ColumnLimit = 80;
9289 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9290 "k = 4, int l = 5,\n"
9291 " int m = 6) {\n"
9292 " const int j = 10;\n"
9293 " otherThing = 1;\n"
9294 "}",
9295 Alignment);
9296 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9297 " int const i = 1;\n"
9298 " int * j = 2;\n"
9299 " int big = 10000;\n"
9300 "}",
9301 Alignment);
9302 verifyFormat("class C {\n"
9303 "public:\n"
9304 " int i = 1;\n"
9305 " virtual void f() = 0;\n"
9306 "};",
9307 Alignment);
9308 verifyFormat("float i = 1;\n"
9309 "if (SomeType t = getSomething()) {\n"
9310 "}\n"
9311 "const unsigned j = 2;\n"
9312 "int big = 10000;",
9313 Alignment);
9314 verifyFormat("float j = 7;\n"
9315 "for (int k = 0; k < N; ++k) {\n"
9316 "}\n"
9317 "unsigned j = 2;\n"
9318 "int big = 10000;\n"
9319 "}",
9320 Alignment);
9321 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9322 verifyFormat("float i = 1;\n"
9323 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9324 " = someLooooooooooooooooongFunction();\n"
9325 "int j = 2;",
9326 Alignment);
9327 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9328 verifyFormat("int i = 1;\n"
9329 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9330 " someLooooooooooooooooongFunction();\n"
9331 "int j = 2;",
9332 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009333
9334 Alignment.AlignConsecutiveAssignments = true;
9335 verifyFormat("auto lambda = []() {\n"
9336 " auto ii = 0;\n"
9337 " float j = 0;\n"
9338 " return 0;\n"
9339 "};\n"
9340 "int i = 0;\n"
9341 "float i2 = 0;\n"
9342 "auto v = type{\n"
9343 " i = 1, //\n"
9344 " (i = 2), //\n"
9345 " i = 3 //\n"
9346 "};",
9347 Alignment);
9348 Alignment.AlignConsecutiveAssignments = false;
9349
Daniel Jaspere12597c2015-10-01 10:06:54 +00009350 // FIXME: Should align all three declarations
9351 verifyFormat(
9352 "int i = 1;\n"
9353 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9354 " loooooooooooooooooooooongParameterB);\n"
9355 "int j = 2;",
9356 Alignment);
9357
9358 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9359 // We expect declarations and assignments to align, as long as it doesn't
9360 // exceed the column limit, starting a new alignemnt sequence whenever it
9361 // happens.
9362 Alignment.AlignConsecutiveAssignments = true;
9363 Alignment.ColumnLimit = 30;
9364 verifyFormat("float ii = 1;\n"
9365 "unsigned j = 2;\n"
9366 "int someVerylongVariable = 1;\n"
9367 "AnotherLongType ll = 123456;\n"
9368 "VeryVeryLongType k = 2;\n"
9369 "int myvar = 1;",
9370 Alignment);
9371 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009372 Alignment.AlignConsecutiveAssignments = false;
9373
9374 verifyFormat(
9375 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9376 " typename LongType, typename B>\n"
9377 "auto foo() {}\n",
9378 Alignment);
9379 verifyFormat("float a, b = 1;\n"
9380 "int c = 2;\n"
9381 "int dd = 3;\n",
9382 Alignment);
9383 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9384 "float b[1][] = {{3.f}};\n",
9385 Alignment);
9386 Alignment.AlignConsecutiveAssignments = true;
9387 verifyFormat("float a, b = 1;\n"
9388 "int c = 2;\n"
9389 "int dd = 3;\n",
9390 Alignment);
9391 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9392 "float b[1][] = {{3.f}};\n",
9393 Alignment);
9394 Alignment.AlignConsecutiveAssignments = false;
9395
9396 Alignment.ColumnLimit = 30;
9397 Alignment.BinPackParameters = false;
9398 verifyFormat("void foo(float a,\n"
9399 " float b,\n"
9400 " int c,\n"
9401 " uint32_t *d) {\n"
9402 " int * e = 0;\n"
9403 " float f = 0;\n"
9404 " double g = 0;\n"
9405 "}\n"
9406 "void bar(ino_t a,\n"
9407 " int b,\n"
9408 " uint32_t *c,\n"
9409 " bool d) {}\n",
9410 Alignment);
9411 Alignment.BinPackParameters = true;
9412 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009413}
9414
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009415TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009416 FormatStyle LinuxBraceStyle = getLLVMStyle();
9417 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009418 verifyFormat("namespace a\n"
9419 "{\n"
9420 "class A\n"
9421 "{\n"
9422 " void f()\n"
9423 " {\n"
9424 " if (true) {\n"
9425 " a();\n"
9426 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009427 " } else {\n"
9428 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009429 " }\n"
9430 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009431 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009432 "};\n"
9433 "struct B {\n"
9434 " int x;\n"
9435 "};\n"
9436 "}\n",
9437 LinuxBraceStyle);
9438 verifyFormat("enum X {\n"
9439 " Y = 0,\n"
9440 "}\n",
9441 LinuxBraceStyle);
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 " {\n"
9450 " MyFavoriteType Value;\n"
9451 " } Class;\n"
9452 "}\n",
9453 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009454}
9455
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009456TEST_F(FormatTest, MozillaBraceBreaking) {
9457 FormatStyle MozillaBraceStyle = getLLVMStyle();
9458 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
9459 verifyFormat("namespace a {\n"
9460 "class A\n"
9461 "{\n"
9462 " void f()\n"
9463 " {\n"
9464 " if (true) {\n"
9465 " a();\n"
9466 " b();\n"
9467 " }\n"
9468 " }\n"
9469 " void g() { return; }\n"
9470 "};\n"
9471 "enum E\n"
9472 "{\n"
9473 " A,\n"
9474 " // foo\n"
9475 " B,\n"
9476 " C\n"
9477 "};\n"
9478 "struct B\n"
9479 "{\n"
9480 " int x;\n"
9481 "};\n"
9482 "}\n",
9483 MozillaBraceStyle);
9484 verifyFormat("struct S\n"
9485 "{\n"
9486 " int Type;\n"
9487 " union\n"
9488 " {\n"
9489 " int x;\n"
9490 " double y;\n"
9491 " } Value;\n"
9492 " class C\n"
9493 " {\n"
9494 " MyFavoriteType Value;\n"
9495 " } Class;\n"
9496 "}\n",
9497 MozillaBraceStyle);
9498}
9499
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009500TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009501 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9502 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009503 verifyFormat("namespace a {\n"
9504 "class A {\n"
9505 " void f()\n"
9506 " {\n"
9507 " if (true) {\n"
9508 " a();\n"
9509 " b();\n"
9510 " }\n"
9511 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009512 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009513 "};\n"
9514 "struct B {\n"
9515 " int x;\n"
9516 "};\n"
9517 "}\n",
9518 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009519
Daniel Jasperd9670872014-08-05 12:06:20 +00009520 verifyFormat("void foo()\n"
9521 "{\n"
9522 " if (a) {\n"
9523 " a();\n"
9524 " }\n"
9525 " else {\n"
9526 " b();\n"
9527 " }\n"
9528 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009529 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009530
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009531 verifyFormat("#ifdef _DEBUG\n"
9532 "int foo(int i = 0)\n"
9533 "#else\n"
9534 "int foo(int i = 5)\n"
9535 "#endif\n"
9536 "{\n"
9537 " return i;\n"
9538 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009539 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009540
9541 verifyFormat("void foo() {}\n"
9542 "void bar()\n"
9543 "#ifdef _DEBUG\n"
9544 "{\n"
9545 " foo();\n"
9546 "}\n"
9547 "#else\n"
9548 "{\n"
9549 "}\n"
9550 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009551 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009552
9553 verifyFormat("void foobar() { int i = 5; }\n"
9554 "#ifdef _DEBUG\n"
9555 "void bar() {}\n"
9556 "#else\n"
9557 "void bar() { foobar(); }\n"
9558 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009559 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009560}
9561
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009562TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009563 FormatStyle AllmanBraceStyle = getLLVMStyle();
9564 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009565 verifyFormat("namespace a\n"
9566 "{\n"
9567 "class A\n"
9568 "{\n"
9569 " void f()\n"
9570 " {\n"
9571 " if (true)\n"
9572 " {\n"
9573 " a();\n"
9574 " b();\n"
9575 " }\n"
9576 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009577 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009578 "};\n"
9579 "struct B\n"
9580 "{\n"
9581 " int x;\n"
9582 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009583 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009584 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009585
9586 verifyFormat("void f()\n"
9587 "{\n"
9588 " if (true)\n"
9589 " {\n"
9590 " a();\n"
9591 " }\n"
9592 " else if (false)\n"
9593 " {\n"
9594 " b();\n"
9595 " }\n"
9596 " else\n"
9597 " {\n"
9598 " c();\n"
9599 " }\n"
9600 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009601 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009602
9603 verifyFormat("void f()\n"
9604 "{\n"
9605 " for (int i = 0; i < 10; ++i)\n"
9606 " {\n"
9607 " a();\n"
9608 " }\n"
9609 " while (false)\n"
9610 " {\n"
9611 " b();\n"
9612 " }\n"
9613 " do\n"
9614 " {\n"
9615 " c();\n"
9616 " } while (false)\n"
9617 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009618 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009619
9620 verifyFormat("void f(int a)\n"
9621 "{\n"
9622 " switch (a)\n"
9623 " {\n"
9624 " case 0:\n"
9625 " break;\n"
9626 " case 1:\n"
9627 " {\n"
9628 " break;\n"
9629 " }\n"
9630 " case 2:\n"
9631 " {\n"
9632 " }\n"
9633 " break;\n"
9634 " default:\n"
9635 " break;\n"
9636 " }\n"
9637 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009638 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009639
9640 verifyFormat("enum X\n"
9641 "{\n"
9642 " Y = 0,\n"
9643 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009644 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009645 verifyFormat("enum X\n"
9646 "{\n"
9647 " Y = 0\n"
9648 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009649 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009650
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009651 verifyFormat("@interface BSApplicationController ()\n"
9652 "{\n"
9653 "@private\n"
9654 " id _extraIvar;\n"
9655 "}\n"
9656 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009657 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009658
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009659 verifyFormat("#ifdef _DEBUG\n"
9660 "int foo(int i = 0)\n"
9661 "#else\n"
9662 "int foo(int i = 5)\n"
9663 "#endif\n"
9664 "{\n"
9665 " return i;\n"
9666 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009667 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009668
9669 verifyFormat("void foo() {}\n"
9670 "void bar()\n"
9671 "#ifdef _DEBUG\n"
9672 "{\n"
9673 " foo();\n"
9674 "}\n"
9675 "#else\n"
9676 "{\n"
9677 "}\n"
9678 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009679 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009680
9681 verifyFormat("void foobar() { int i = 5; }\n"
9682 "#ifdef _DEBUG\n"
9683 "void bar() {}\n"
9684 "#else\n"
9685 "void bar() { foobar(); }\n"
9686 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009687 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009688
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009689 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009690 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009691 " // ...\n"
9692 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009693 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009694 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009695 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009696 " // ...\n"
9697 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009698 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009699 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009700 // .. or dict literals.
9701 verifyFormat("void f()\n"
9702 "{\n"
9703 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
9704 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009705 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009706 verifyFormat("int f()\n"
9707 "{ // comment\n"
9708 " return 42;\n"
9709 "}",
9710 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009711
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009712 AllmanBraceStyle.ColumnLimit = 19;
9713 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9714 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009715 verifyFormat("void f()\n"
9716 "{\n"
9717 " int i;\n"
9718 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009719 AllmanBraceStyle);
9720 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009721
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009722 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009723 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9724 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9725 verifyFormat("void f(bool b)\n"
9726 "{\n"
9727 " if (b)\n"
9728 " {\n"
9729 " return;\n"
9730 " }\n"
9731 "}\n",
9732 BreakBeforeBraceShortIfs);
9733 verifyFormat("void f(bool b)\n"
9734 "{\n"
9735 " if (b) return;\n"
9736 "}\n",
9737 BreakBeforeBraceShortIfs);
9738 verifyFormat("void f(bool b)\n"
9739 "{\n"
9740 " while (b)\n"
9741 " {\n"
9742 " return;\n"
9743 " }\n"
9744 "}\n",
9745 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009746}
9747
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009748TEST_F(FormatTest, GNUBraceBreaking) {
9749 FormatStyle GNUBraceStyle = getLLVMStyle();
9750 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9751 verifyFormat("namespace a\n"
9752 "{\n"
9753 "class A\n"
9754 "{\n"
9755 " void f()\n"
9756 " {\n"
9757 " int a;\n"
9758 " {\n"
9759 " int b;\n"
9760 " }\n"
9761 " if (true)\n"
9762 " {\n"
9763 " a();\n"
9764 " b();\n"
9765 " }\n"
9766 " }\n"
9767 " void g() { return; }\n"
9768 "}\n"
9769 "}",
9770 GNUBraceStyle);
9771
9772 verifyFormat("void f()\n"
9773 "{\n"
9774 " if (true)\n"
9775 " {\n"
9776 " a();\n"
9777 " }\n"
9778 " else if (false)\n"
9779 " {\n"
9780 " b();\n"
9781 " }\n"
9782 " else\n"
9783 " {\n"
9784 " c();\n"
9785 " }\n"
9786 "}\n",
9787 GNUBraceStyle);
9788
9789 verifyFormat("void f()\n"
9790 "{\n"
9791 " for (int i = 0; i < 10; ++i)\n"
9792 " {\n"
9793 " a();\n"
9794 " }\n"
9795 " while (false)\n"
9796 " {\n"
9797 " b();\n"
9798 " }\n"
9799 " do\n"
9800 " {\n"
9801 " c();\n"
9802 " }\n"
9803 " while (false);\n"
9804 "}\n",
9805 GNUBraceStyle);
9806
9807 verifyFormat("void f(int a)\n"
9808 "{\n"
9809 " switch (a)\n"
9810 " {\n"
9811 " case 0:\n"
9812 " break;\n"
9813 " case 1:\n"
9814 " {\n"
9815 " break;\n"
9816 " }\n"
9817 " case 2:\n"
9818 " {\n"
9819 " }\n"
9820 " break;\n"
9821 " default:\n"
9822 " break;\n"
9823 " }\n"
9824 "}\n",
9825 GNUBraceStyle);
9826
9827 verifyFormat("enum X\n"
9828 "{\n"
9829 " Y = 0,\n"
9830 "}\n",
9831 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009832
9833 verifyFormat("@interface BSApplicationController ()\n"
9834 "{\n"
9835 "@private\n"
9836 " id _extraIvar;\n"
9837 "}\n"
9838 "@end\n",
9839 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009840
9841 verifyFormat("#ifdef _DEBUG\n"
9842 "int foo(int i = 0)\n"
9843 "#else\n"
9844 "int foo(int i = 5)\n"
9845 "#endif\n"
9846 "{\n"
9847 " return i;\n"
9848 "}",
9849 GNUBraceStyle);
9850
9851 verifyFormat("void foo() {}\n"
9852 "void bar()\n"
9853 "#ifdef _DEBUG\n"
9854 "{\n"
9855 " foo();\n"
9856 "}\n"
9857 "#else\n"
9858 "{\n"
9859 "}\n"
9860 "#endif",
9861 GNUBraceStyle);
9862
9863 verifyFormat("void foobar() { int i = 5; }\n"
9864 "#ifdef _DEBUG\n"
9865 "void bar() {}\n"
9866 "#else\n"
9867 "void bar() { foobar(); }\n"
9868 "#endif",
9869 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009870}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009871
9872TEST_F(FormatTest, WebKitBraceBreaking) {
9873 FormatStyle WebKitBraceStyle = getLLVMStyle();
9874 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
9875 verifyFormat("namespace a {\n"
9876 "class A {\n"
9877 " void f()\n"
9878 " {\n"
9879 " if (true) {\n"
9880 " a();\n"
9881 " b();\n"
9882 " }\n"
9883 " }\n"
9884 " void g() { return; }\n"
9885 "};\n"
9886 "enum E {\n"
9887 " A,\n"
9888 " // foo\n"
9889 " B,\n"
9890 " C\n"
9891 "};\n"
9892 "struct B {\n"
9893 " int x;\n"
9894 "};\n"
9895 "}\n",
9896 WebKitBraceStyle);
9897 verifyFormat("struct S {\n"
9898 " int Type;\n"
9899 " union {\n"
9900 " int x;\n"
9901 " double y;\n"
9902 " } Value;\n"
9903 " class C {\n"
9904 " MyFavoriteType Value;\n"
9905 " } Class;\n"
9906 "};\n",
9907 WebKitBraceStyle);
9908}
9909
Manuel Klimekd5735502013-08-12 03:51:17 +00009910TEST_F(FormatTest, CatchExceptionReferenceBinding) {
9911 verifyFormat("void f() {\n"
9912 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00009913 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00009914 " }\n"
9915 "}\n",
9916 getLLVMStyle());
9917}
9918
Daniel Jasper9613c812013-08-07 16:29:23 +00009919TEST_F(FormatTest, UnderstandsPragmas) {
9920 verifyFormat("#pragma omp reduction(| : var)");
9921 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00009922
9923 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
9924 "(including parentheses).",
9925 format("#pragma mark Any non-hyphenated or hyphenated string "
9926 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +00009927}
9928
Daniel Jasperee4a8a12015-04-22 09:45:42 +00009929TEST_F(FormatTest, UnderstandPragmaOption) {
9930 verifyFormat("#pragma option -C -A");
9931
9932 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
9933}
9934
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009935#define EXPECT_ALL_STYLES_EQUAL(Styles) \
9936 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +00009937 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
9938 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +00009939
9940TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009941 SmallVector<FormatStyle, 3> Styles;
9942 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009943
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009944 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009945 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
9946 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
9947 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009948
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009949 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009950 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
9951 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
9952 EXPECT_ALL_STYLES_EQUAL(Styles);
9953
Nico Weber514ecc82014-02-02 20:50:45 +00009954 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009955 EXPECT_TRUE(
9956 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
9957 EXPECT_TRUE(
9958 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
9959 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009960
Nico Weber514ecc82014-02-02 20:50:45 +00009961 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009962 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
9963 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
9964 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009965
9966 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009967 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
9968 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
9969 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009970
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009971 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009972 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
9973 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
9974 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009975
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +00009976 Styles[0] = getGNUStyle();
9977 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
9978 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
9979 EXPECT_ALL_STYLES_EQUAL(Styles);
9980
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009981 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
9982}
9983
9984TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
9985 SmallVector<FormatStyle, 8> Styles;
9986 Styles.resize(2);
9987
9988 Styles[0] = getGoogleStyle();
9989 Styles[1] = getLLVMStyle();
9990 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9991 EXPECT_ALL_STYLES_EQUAL(Styles);
9992
9993 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +00009994 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009995 Styles[1] = getLLVMStyle();
9996 Styles[1].Language = FormatStyle::LK_JavaScript;
9997 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9998
9999 Styles[2] = getLLVMStyle();
10000 Styles[2].Language = FormatStyle::LK_JavaScript;
10001 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10002 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010003 &Styles[2])
10004 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010005
10006 Styles[3] = getLLVMStyle();
10007 Styles[3].Language = FormatStyle::LK_JavaScript;
10008 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10009 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010010 &Styles[3])
10011 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010012
10013 Styles[4] = getLLVMStyle();
10014 Styles[4].Language = FormatStyle::LK_JavaScript;
10015 EXPECT_EQ(0, parseConfiguration("---\n"
10016 "BasedOnStyle: LLVM\n"
10017 "IndentWidth: 123\n"
10018 "---\n"
10019 "BasedOnStyle: Google\n"
10020 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010021 &Styles[4])
10022 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010023 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010024}
10025
Daniel Jasper91881d92014-09-29 08:07:46 +000010026#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010027 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010028 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010029 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010030 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010031 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010032
Daniel Jasper91881d92014-09-29 08:07:46 +000010033#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10034
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010035#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10036 Style.STRUCT.FIELD = false; \
10037 EXPECT_EQ(0, \
10038 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10039 .value()); \
10040 EXPECT_TRUE(Style.STRUCT.FIELD); \
10041 EXPECT_EQ(0, \
10042 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10043 .value()); \
10044 EXPECT_FALSE(Style.STRUCT.FIELD);
10045
10046#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10047 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10048
Daniel Jasper00853002014-09-16 16:22:30 +000010049#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10050 EXPECT_NE(VALUE, Style.FIELD); \
10051 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10052 EXPECT_EQ(VALUE, Style.FIELD)
10053
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010054TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010055 FormatStyle Style = {};
10056 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010057 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +000010058 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010059 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010060 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010061 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010062 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010063 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010064 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010065 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010066 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010067 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010068 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010069 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010070 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010071 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +000010072 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010073 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010074 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010075 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010076 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010077 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010078 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010079 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010080 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010081 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010082 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010083 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010084 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010085 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010086 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010087 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010088 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010089 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010090 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010091 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010092 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010093 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010094 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010095
10096 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10097 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10098 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10099 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10100 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10101 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10102 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10103 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
10104 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10105 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10106 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010107}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010108
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010109#undef CHECK_PARSE_BOOL
10110
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010111TEST_F(FormatTest, ParsesConfiguration) {
10112 FormatStyle Style = {};
10113 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010114 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010115 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10116 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010117 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010118 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10119 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010120 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10121 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010122 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10123 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10124 PenaltyReturnTypeOnItsOwnLine, 1234u);
10125 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10126 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010127 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010128 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010129 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010130
Daniel Jasper553d4872014-06-17 12:40:34 +000010131 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010132 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10133 FormatStyle::PAS_Left);
10134 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10135 FormatStyle::PAS_Right);
10136 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10137 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010138 // For backward compatibility:
10139 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10140 FormatStyle::PAS_Left);
10141 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10142 FormatStyle::PAS_Right);
10143 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10144 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010145
Alexander Kornienkod6538332013-05-07 15:32:14 +000010146 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010147 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10148 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010149 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10150 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10151 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10152
Daniel Jasperac043c92014-09-15 11:11:00 +000010153 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010154 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10155 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010156 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10157 FormatStyle::BOS_None);
10158 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10159 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010160 // For backward compatibility:
10161 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10162 FormatStyle::BOS_None);
10163 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10164 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010165
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010166 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10167 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10168 FormatStyle::BAS_Align);
10169 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10170 FormatStyle::BAS_DontAlign);
10171 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10172 FormatStyle::BAS_AlwaysBreak);
10173 // For backward compatibility:
10174 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10175 FormatStyle::BAS_DontAlign);
10176 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10177 FormatStyle::BAS_Align);
10178
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010179 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010180 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10181 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10182 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010183 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10184 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010185 // For backward compatibility:
10186 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10187 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010188
Daniel Jasperd74cf402014-04-08 12:46:38 +000010189 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010190 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10191 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10192 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10193 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010194 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10195 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010196 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10197 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010198 // For backward compatibility:
10199 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10200 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10201 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10202 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010203
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010204 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10205 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10206 FormatStyle::SBPO_Never);
10207 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10208 FormatStyle::SBPO_Always);
10209 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10210 FormatStyle::SBPO_ControlStatements);
10211 // For backward compatibility:
10212 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10213 FormatStyle::SBPO_Never);
10214 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10215 FormatStyle::SBPO_ControlStatements);
10216
Alexander Kornienkod6538332013-05-07 15:32:14 +000010217 Style.ColumnLimit = 123;
10218 FormatStyle BaseStyle = getLLVMStyle();
10219 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10220 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10221
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010222 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10223 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10224 FormatStyle::BS_Attach);
10225 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10226 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010227 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10228 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010229 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10230 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010231 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10232 FormatStyle::BS_Allman);
10233 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010234 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10235 FormatStyle::BS_WebKit);
10236 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10237 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010238
Zachary Turner448592e2015-12-18 22:20:15 +000010239 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10240 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10241 FormatStyle::RTBS_None);
10242 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10243 FormatStyle::RTBS_All);
10244 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010245 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010246 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10247 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10248 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10249 AlwaysBreakAfterReturnType,
10250 FormatStyle::RTBS_TopLevelDefinitions);
10251
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010252 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10253 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10254 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10255 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10256 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10257 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10258 AlwaysBreakAfterDefinitionReturnType,
10259 FormatStyle::DRTBS_TopLevel);
10260
Daniel Jasper65ee3472013-07-31 23:16:02 +000010261 Style.NamespaceIndentation = FormatStyle::NI_All;
10262 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10263 FormatStyle::NI_None);
10264 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10265 FormatStyle::NI_Inner);
10266 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10267 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010268
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010269 // FIXME: This is required because parsing a configuration simply overwrites
10270 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010271 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010272 std::vector<std::string> BoostForeach;
10273 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010274 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010275 std::vector<std::string> BoostAndQForeach;
10276 BoostAndQForeach.push_back("BOOST_FOREACH");
10277 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010278 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10279 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010280
10281 Style.IncludeCategories.clear();
10282 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10283 {".*", 1}};
10284 CHECK_PARSE("IncludeCategories:\n"
10285 " - Regex: abc/.*\n"
10286 " Priority: 2\n"
10287 " - Regex: .*\n"
10288 " Priority: 1",
10289 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010290 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010291}
10292
10293TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10294 FormatStyle Style = {};
10295 Style.Language = FormatStyle::LK_Cpp;
10296 CHECK_PARSE("Language: Cpp\n"
10297 "IndentWidth: 12",
10298 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010299 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10300 "IndentWidth: 34",
10301 &Style),
10302 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010303 EXPECT_EQ(12u, Style.IndentWidth);
10304 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10305 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10306
10307 Style.Language = FormatStyle::LK_JavaScript;
10308 CHECK_PARSE("Language: JavaScript\n"
10309 "IndentWidth: 12",
10310 IndentWidth, 12u);
10311 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010312 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10313 "IndentWidth: 34",
10314 &Style),
10315 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010316 EXPECT_EQ(23u, Style.IndentWidth);
10317 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10318 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10319
10320 CHECK_PARSE("BasedOnStyle: LLVM\n"
10321 "IndentWidth: 67",
10322 IndentWidth, 67u);
10323
10324 CHECK_PARSE("---\n"
10325 "Language: JavaScript\n"
10326 "IndentWidth: 12\n"
10327 "---\n"
10328 "Language: Cpp\n"
10329 "IndentWidth: 34\n"
10330 "...\n",
10331 IndentWidth, 12u);
10332
10333 Style.Language = FormatStyle::LK_Cpp;
10334 CHECK_PARSE("---\n"
10335 "Language: JavaScript\n"
10336 "IndentWidth: 12\n"
10337 "---\n"
10338 "Language: Cpp\n"
10339 "IndentWidth: 34\n"
10340 "...\n",
10341 IndentWidth, 34u);
10342 CHECK_PARSE("---\n"
10343 "IndentWidth: 78\n"
10344 "---\n"
10345 "Language: JavaScript\n"
10346 "IndentWidth: 56\n"
10347 "...\n",
10348 IndentWidth, 78u);
10349
10350 Style.ColumnLimit = 123;
10351 Style.IndentWidth = 234;
10352 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10353 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010354 EXPECT_FALSE(parseConfiguration("---\n"
10355 "IndentWidth: 456\n"
10356 "BreakBeforeBraces: Allman\n"
10357 "---\n"
10358 "Language: JavaScript\n"
10359 "IndentWidth: 111\n"
10360 "TabWidth: 111\n"
10361 "---\n"
10362 "Language: Cpp\n"
10363 "BreakBeforeBraces: Stroustrup\n"
10364 "TabWidth: 789\n"
10365 "...\n",
10366 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010367 EXPECT_EQ(123u, Style.ColumnLimit);
10368 EXPECT_EQ(456u, Style.IndentWidth);
10369 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10370 EXPECT_EQ(789u, Style.TabWidth);
10371
Rafael Espindola1f243172014-06-12 11:35:17 +000010372 EXPECT_EQ(parseConfiguration("---\n"
10373 "Language: JavaScript\n"
10374 "IndentWidth: 56\n"
10375 "---\n"
10376 "IndentWidth: 78\n"
10377 "...\n",
10378 &Style),
10379 ParseError::Error);
10380 EXPECT_EQ(parseConfiguration("---\n"
10381 "Language: JavaScript\n"
10382 "IndentWidth: 56\n"
10383 "---\n"
10384 "Language: JavaScript\n"
10385 "IndentWidth: 78\n"
10386 "...\n",
10387 &Style),
10388 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010389
10390 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10391}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010392
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010393#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010394
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010395TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10396 FormatStyle Style = {};
10397 Style.Language = FormatStyle::LK_JavaScript;
10398 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010399 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010400 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010401
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010402 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010403 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010404 "BasedOnStyle: Google\n"
10405 "---\n"
10406 "Language: JavaScript\n"
10407 "IndentWidth: 76\n"
10408 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010409 &Style)
10410 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010411 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010412 EXPECT_EQ(76u, Style.IndentWidth);
10413 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10414}
10415
Alexander Kornienkod6538332013-05-07 15:32:14 +000010416TEST_F(FormatTest, ConfigurationRoundTripTest) {
10417 FormatStyle Style = getLLVMStyle();
10418 std::string YAML = configurationAsText(Style);
10419 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010420 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010421 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10422 EXPECT_EQ(Style, ParsedStyle);
10423}
10424
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010425TEST_F(FormatTest, WorksFor8bitEncodings) {
10426 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10427 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10428 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10429 "\"\xef\xee\xf0\xf3...\"",
10430 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10431 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10432 "\xef\xee\xf0\xf3...\"",
10433 getLLVMStyleWithColumns(12)));
10434}
10435
Alexander Kornienko393e3082013-11-13 14:04:17 +000010436TEST_F(FormatTest, HandlesUTF8BOM) {
10437 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10438 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10439 format("\xef\xbb\xbf#include <iostream>"));
10440 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10441 format("\xef\xbb\xbf\n#include <iostream>"));
10442}
10443
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010444// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10445#if !defined(_MSC_VER)
10446
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010447TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10448 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10449 getLLVMStyleWithColumns(35));
10450 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010451 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010452 verifyFormat("// Однажды в студёную зимнюю пору...",
10453 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010454 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010455 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10456 getLLVMStyleWithColumns(39));
10457 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010458 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010459}
10460
10461TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010462 // Non-printable characters' width is currently considered to be the length in
10463 // bytes in UTF8. The characters can be displayed in very different manner
10464 // (zero-width, single width with a substitution glyph, expanded to their code
10465 // (e.g. "<8d>"), so there's no single correct way to handle them.
10466 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010467 "\"\xc2\x8d\";",
10468 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010469 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010470 "\"\xc2\x8d\";",
10471 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010472 EXPECT_EQ("\"Однажды, в \"\n"
10473 "\"студёную \"\n"
10474 "\"зимнюю \"\n"
10475 "\"пору,\"",
10476 format("\"Однажды, в студёную зимнюю пору,\"",
10477 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010478 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010479 "\"一 二 三 \"\n"
10480 "\"四 五六 \"\n"
10481 "\"七 八 九 \"\n"
10482 "\"十\"",
10483 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010484 EXPECT_EQ("\"一\t二 \"\n"
10485 "\"\t三 \"\n"
10486 "\"四 五\t六 \"\n"
10487 "\"\t七 \"\n"
10488 "\"八九十\tqq\"",
10489 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10490 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010491
10492 // UTF8 character in an escape sequence.
10493 EXPECT_EQ("\"aaaaaa\"\n"
10494 "\"\\\xC2\x8D\"",
10495 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010496}
10497
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010498TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10499 EXPECT_EQ("const char *sssss =\n"
10500 " \"一二三四五六七八\\\n"
10501 " 九 十\";",
10502 format("const char *sssss = \"一二三四五六七八\\\n"
10503 " 九 十\";",
10504 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010505}
10506
10507TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010508 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10509 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010510 EXPECT_EQ("// Я из лесу\n"
10511 "// вышел; был\n"
10512 "// сильный\n"
10513 "// мороз.",
10514 format("// Я из лесу вышел; был сильный мороз.",
10515 getLLVMStyleWithColumns(13)));
10516 EXPECT_EQ("// 一二三\n"
10517 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010518 "// 八 九\n"
10519 "// 十",
10520 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010521}
10522
10523TEST_F(FormatTest, SplitsUTF8BlockComments) {
10524 EXPECT_EQ("/* Гляжу,\n"
10525 " * поднимается\n"
10526 " * медленно в\n"
10527 " * гору\n"
10528 " * Лошадка,\n"
10529 " * везущая\n"
10530 " * хворосту\n"
10531 " * воз. */",
10532 format("/* Гляжу, поднимается медленно в гору\n"
10533 " * Лошадка, везущая хворосту воз. */",
10534 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010535 EXPECT_EQ(
10536 "/* 一二三\n"
10537 " * 四五六七\n"
10538 " * 八 九\n"
10539 " * 十 */",
10540 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010541 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10542 " * 𝕓𝕪𝕥𝕖\n"
10543 " * 𝖀𝕿𝕱-𝟠 */",
10544 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010545}
10546
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010547#endif // _MSC_VER
10548
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010549TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10550 FormatStyle Style = getLLVMStyle();
10551
10552 Style.ConstructorInitializerIndentWidth = 4;
10553 verifyFormat(
10554 "SomeClass::Constructor()\n"
10555 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10556 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10557 Style);
10558
10559 Style.ConstructorInitializerIndentWidth = 2;
10560 verifyFormat(
10561 "SomeClass::Constructor()\n"
10562 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10563 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10564 Style);
10565
10566 Style.ConstructorInitializerIndentWidth = 0;
10567 verifyFormat(
10568 "SomeClass::Constructor()\n"
10569 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10570 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10571 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010572 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10573 verifyFormat(
10574 "SomeLongTemplateVariableName<\n"
10575 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10576 Style);
10577 verifyFormat(
10578 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10579 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10580 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010581}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010582
Daniel Jasper00853002014-09-16 16:22:30 +000010583TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10584 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010585 Style.BreakConstructorInitializersBeforeComma = true;
10586 Style.ConstructorInitializerIndentWidth = 4;
10587 verifyFormat("SomeClass::Constructor()\n"
10588 " : a(a)\n"
10589 " , b(b)\n"
10590 " , c(c) {}",
10591 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010592 verifyFormat("SomeClass::Constructor()\n"
10593 " : a(a) {}",
10594 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010595
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010596 Style.ColumnLimit = 0;
10597 verifyFormat("SomeClass::Constructor()\n"
10598 " : a(a) {}",
10599 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010600 verifyFormat("SomeClass::Constructor() noexcept\n"
10601 " : a(a) {}",
10602 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010603 verifyFormat("SomeClass::Constructor()\n"
10604 " : a(a)\n"
10605 " , b(b)\n"
10606 " , c(c) {}",
10607 Style);
10608 verifyFormat("SomeClass::Constructor()\n"
10609 " : a(a) {\n"
10610 " foo();\n"
10611 " bar();\n"
10612 "}",
10613 Style);
10614
Daniel Jasperd74cf402014-04-08 12:46:38 +000010615 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010616 verifyFormat("SomeClass::Constructor()\n"
10617 " : a(a)\n"
10618 " , b(b)\n"
10619 " , c(c) {\n}",
10620 Style);
10621 verifyFormat("SomeClass::Constructor()\n"
10622 " : a(a) {\n}",
10623 Style);
10624
10625 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010626 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010627 Style.ConstructorInitializerIndentWidth = 2;
10628 verifyFormat("SomeClass::Constructor()\n"
10629 " : a(a)\n"
10630 " , b(b)\n"
10631 " , c(c) {}",
10632 Style);
10633
10634 Style.ConstructorInitializerIndentWidth = 0;
10635 verifyFormat("SomeClass::Constructor()\n"
10636 ": a(a)\n"
10637 ", b(b)\n"
10638 ", c(c) {}",
10639 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010640
10641 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10642 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010643 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10644 verifyFormat(
10645 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10646 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010647 verifyFormat(
10648 "SomeClass::Constructor()\n"
10649 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10650 Style);
10651 Style.ConstructorInitializerIndentWidth = 4;
10652 Style.ColumnLimit = 60;
10653 verifyFormat("SomeClass::Constructor()\n"
10654 " : aaaaaaaa(aaaaaaaa)\n"
10655 " , aaaaaaaa(aaaaaaaa)\n"
10656 " , aaaaaaaa(aaaaaaaa) {}",
10657 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010658}
10659
Daniel Jasper38efc132014-10-21 07:51:54 +000010660TEST_F(FormatTest, Destructors) {
10661 verifyFormat("void F(int &i) { i.~int(); }");
10662 verifyFormat("void F(int &i) { i->~int(); }");
10663}
10664
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010665TEST_F(FormatTest, FormatsWithWebKitStyle) {
10666 FormatStyle Style = getWebKitStyle();
10667
10668 // Don't indent in outer namespaces.
10669 verifyFormat("namespace outer {\n"
10670 "int i;\n"
10671 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010672 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010673 "} // namespace inner\n"
10674 "} // namespace outer\n"
10675 "namespace other_outer {\n"
10676 "int i;\n"
10677 "}",
10678 Style);
10679
10680 // Don't indent case labels.
10681 verifyFormat("switch (variable) {\n"
10682 "case 1:\n"
10683 "case 2:\n"
10684 " doSomething();\n"
10685 " break;\n"
10686 "default:\n"
10687 " ++variable;\n"
10688 "}",
10689 Style);
10690
10691 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010692 EXPECT_EQ("void f()\n"
10693 "{\n"
10694 " if (aaaaaaaaaaaaaaaa\n"
10695 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10696 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10697 " return;\n"
10698 "}",
10699 format("void f() {\n"
10700 "if (aaaaaaaaaaaaaaaa\n"
10701 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10702 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10703 "return;\n"
10704 "}",
10705 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010706
Daniel Jasper35995672014-04-29 14:05:20 +000010707 // Allow functions on a single line.
10708 verifyFormat("void f() { return; }", Style);
10709
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010710 // Constructor initializers are formatted one per line with the "," on the
10711 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010712 verifyFormat("Constructor()\n"
10713 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10714 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010715 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010716 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10717 "{\n"
10718 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010719 Style);
10720 verifyFormat("SomeClass::Constructor()\n"
10721 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010722 "{\n"
10723 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010724 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010725 EXPECT_EQ("SomeClass::Constructor()\n"
10726 " : a(a)\n"
10727 "{\n"
10728 "}",
10729 format("SomeClass::Constructor():a(a){}", Style));
10730 verifyFormat("SomeClass::Constructor()\n"
10731 " : a(a)\n"
10732 " , b(b)\n"
10733 " , c(c)\n"
10734 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010735 "}",
10736 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010737 verifyFormat("SomeClass::Constructor()\n"
10738 " : a(a)\n"
10739 "{\n"
10740 " foo();\n"
10741 " bar();\n"
10742 "}",
10743 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010744
Daniel Jasper65ee3472013-07-31 23:16:02 +000010745 // Access specifiers should be aligned left.
10746 verifyFormat("class C {\n"
10747 "public:\n"
10748 " int i;\n"
10749 "};",
10750 Style);
10751
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010752 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010753 verifyFormat("int a; // Do not\n"
10754 "double b; // align comments.",
10755 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010756
Daniel Jasper3219e432014-12-02 13:24:51 +000010757 // Do not align operands.
10758 EXPECT_EQ("ASSERT(aaaa\n"
10759 " || bbbb);",
10760 format("ASSERT ( aaaa\n||bbbb);", Style));
10761
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010762 // Accept input's line breaks.
10763 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10764 " || bbbbbbbbbbbbbbb) {\n"
10765 " i++;\n"
10766 "}",
10767 format("if (aaaaaaaaaaaaaaa\n"
10768 "|| bbbbbbbbbbbbbbb) { i++; }",
10769 Style));
10770 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10771 " i++;\n"
10772 "}",
10773 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010774
10775 // Don't automatically break all macro definitions (llvm.org/PR17842).
10776 verifyFormat("#define aNumber 10", Style);
10777 // However, generally keep the line breaks that the user authored.
10778 EXPECT_EQ("#define aNumber \\\n"
10779 " 10",
10780 format("#define aNumber \\\n"
10781 " 10",
10782 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010783
10784 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010785 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10786 " copyItems:YES];",
10787 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10788 "copyItems:YES];",
10789 Style));
10790 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10791 " copyItems:YES];",
10792 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10793 " copyItems:YES];",
10794 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010795 // FIXME: This does not seem right, there should be more indentation before
10796 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010797 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010798 " @\"a\",\n"
10799 " @\"a\"\n"
10800 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010801 " copyItems:YES];",
10802 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10803 " @\"a\",\n"
10804 " @\"a\"\n"
10805 " ]\n"
10806 " copyItems:YES];",
10807 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010808 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010809 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10810 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010811 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10812 " copyItems:YES];",
10813 Style));
10814
10815 verifyFormat("[self.a b:c c:d];", Style);
10816 EXPECT_EQ("[self.a b:c\n"
10817 " c:d];",
10818 format("[self.a b:c\n"
10819 "c:d];",
10820 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010821}
10822
Manuel Klimekffdeb592013-09-03 15:10:01 +000010823TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010824 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10825 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10826 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10827 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10828 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010829 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010830 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010831 verifyFormat("void f() {\n"
10832 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10833 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010834 verifyFormat("void f() {\n"
10835 " other(x.begin(), //\n"
10836 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000010837 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010838 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000010839 verifyFormat("SomeFunction([]() { // A cool function...\n"
10840 " return 43;\n"
10841 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000010842 EXPECT_EQ("SomeFunction([]() {\n"
10843 "#define A a\n"
10844 " return 43;\n"
10845 "});",
10846 format("SomeFunction([](){\n"
10847 "#define A a\n"
10848 "return 43;\n"
10849 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000010850 verifyFormat("void f() {\n"
10851 " SomeFunction([](decltype(x), A *a) {});\n"
10852 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010853 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10854 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000010855 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10856 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
10857 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000010858 verifyFormat("Constructor()\n"
10859 " : Field([] { // comment\n"
10860 " int i;\n"
10861 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000010862 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
10863 " return some_parameter.size();\n"
10864 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000010865 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
10866 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000010867 verifyFormat("int i = aaaaaa ? 1 //\n"
10868 " : [] {\n"
10869 " return 2; //\n"
10870 " }();");
10871 verifyFormat("llvm::errs() << \"number of twos is \"\n"
10872 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
10873 " return x == 2; // force break\n"
10874 " });");
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000010875 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n"
10876 " int iiiiiiiiiiii) {\n"
10877 " return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n"
10878 "});",
10879 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000010880 verifyFormat("SomeFunction({[&] {\n"
10881 " // comment\n"
10882 " },\n"
10883 " [&] {\n"
10884 " // comment\n"
10885 " }});");
10886 verifyFormat("SomeFunction({[&] {\n"
10887 " // comment\n"
10888 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000010889 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
10890 " [&]() { return true; },\n"
10891 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010892
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010893 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000010894 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000010895 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000010896 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
10897 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010898 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000010899 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010900 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
10901 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000010902 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010903 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
10904 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010905 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010906 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000010907 verifyFormat(
10908 "aaaaaaaaaaaaaaaaaaaaaa(\n"
10909 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
10910 " return aaaaaaaaaaaaaaaaa;\n"
10911 " });",
10912 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000010913 verifyFormat("[]() //\n"
10914 " -> int {\n"
10915 " return 1; //\n"
10916 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010917
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010918 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000010919 verifyFormat("SomeFunction(\n"
10920 " []() {\n"
10921 " int i = 42;\n"
10922 " return i;\n"
10923 " },\n"
10924 " []() {\n"
10925 " int j = 43;\n"
10926 " return j;\n"
10927 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010928
Daniel Jasperda18fd82014-06-10 06:39:03 +000010929 // More complex introducers.
10930 verifyFormat("return [i, args...] {};");
10931
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010932 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000010933 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000010934 verifyFormat("double &operator[](int i) { return 0; }\n"
10935 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000010936 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000010937 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000010938 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000010939
10940 // Other corner cases.
10941 verifyFormat("void f() {\n"
10942 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
10943 " );\n"
10944 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000010945
10946 // Lambdas created through weird macros.
10947 verifyFormat("void f() {\n"
10948 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000010949 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000010950 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000010951
10952 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
10953 " doo_dah();\n"
10954 " doo_dah();\n"
10955 " })) {\n"
10956 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000010957 verifyFormat("auto lambda = []() {\n"
10958 " int a = 2\n"
10959 "#if A\n"
10960 " + 2\n"
10961 "#endif\n"
10962 " ;\n"
10963 "};");
Manuel Klimekffdeb592013-09-03 15:10:01 +000010964}
10965
Manuel Klimek516e0542013-09-04 13:25:30 +000010966TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000010967 FormatStyle ShortBlocks = getLLVMStyle();
10968 ShortBlocks.AllowShortBlocksOnASingleLine = true;
10969 verifyFormat("int (^Block)(int, int);", ShortBlocks);
10970 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
10971 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
10972 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
10973 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
10974 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000010975
Daniel Jasper76284682014-10-22 09:12:44 +000010976 verifyFormat("foo(^{ bar(); });", ShortBlocks);
10977 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
10978 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000010979
Daniel Jasper76284682014-10-22 09:12:44 +000010980 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010981 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010982 "}];");
10983 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010984 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010985 "}]};");
10986 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010987 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010988 "}];");
10989 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010990 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010991 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000010992 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010993 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010994 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010995 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010996 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010997
10998 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010999 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011000 "}];",
11001 getLLVMStyleWithColumns(60));
11002 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011003 " NSString *path = [self sessionFilePath];\n"
11004 " if (path) {\n"
11005 " // ...\n"
11006 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011007 "});");
11008 verifyFormat("[[SessionService sharedService]\n"
11009 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011010 " if (window) {\n"
11011 " [self windowDidLoad:window];\n"
11012 " } else {\n"
11013 " [self errorLoadingWindow];\n"
11014 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011015 " }];");
11016 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011017 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011018 "};\n",
11019 getLLVMStyleWithColumns(40));
11020 verifyFormat("[[SessionService sharedService]\n"
11021 " loadWindowWithCompletionBlock: //\n"
11022 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011023 " if (window) {\n"
11024 " [self windowDidLoad:window];\n"
11025 " } else {\n"
11026 " [self errorLoadingWindow];\n"
11027 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011028 " }];",
11029 getLLVMStyleWithColumns(60));
11030 verifyFormat("[myObject doSomethingWith:arg1\n"
11031 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011032 " // ...\n"
11033 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011034 " }\n"
11035 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011036 " // ...\n"
11037 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011038 " }\n"
11039 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011040 " // ...\n"
11041 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011042 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011043 verifyFormat("[myObject doSomethingWith:arg1\n"
11044 " firstBlock:-1\n"
11045 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011046 " // ...\n"
11047 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011048 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011049
11050 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011051 " @autoreleasepool {\n"
11052 " if (a) {\n"
11053 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011054 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011055 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011056 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011057 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011058 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11059 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011060
11061 FormatStyle FourIndent = getLLVMStyle();
11062 FourIndent.ObjCBlockIndentWidth = 4;
11063 verifyFormat("[operation setCompletionBlock:^{\n"
11064 " [self onOperationDone];\n"
11065 "}];",
11066 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011067}
11068
Daniel Jasper289afc02015-04-23 09:23:17 +000011069TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11070 FormatStyle ZeroColumn = getLLVMStyle();
11071 ZeroColumn.ColumnLimit = 0;
11072
11073 verifyFormat("[[SessionService sharedService] "
11074 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11075 " if (window) {\n"
11076 " [self windowDidLoad:window];\n"
11077 " } else {\n"
11078 " [self errorLoadingWindow];\n"
11079 " }\n"
11080 "}];",
11081 ZeroColumn);
11082 EXPECT_EQ("[[SessionService sharedService]\n"
11083 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11084 " if (window) {\n"
11085 " [self windowDidLoad:window];\n"
11086 " } else {\n"
11087 " [self errorLoadingWindow];\n"
11088 " }\n"
11089 " }];",
11090 format("[[SessionService sharedService]\n"
11091 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11092 " if (window) {\n"
11093 " [self windowDidLoad:window];\n"
11094 " } else {\n"
11095 " [self errorLoadingWindow];\n"
11096 " }\n"
11097 "}];",
11098 ZeroColumn));
11099 verifyFormat("[myObject doSomethingWith:arg1\n"
11100 " firstBlock:^(Foo *a) {\n"
11101 " // ...\n"
11102 " int i;\n"
11103 " }\n"
11104 " secondBlock:^(Bar *b) {\n"
11105 " // ...\n"
11106 " int i;\n"
11107 " }\n"
11108 " thirdBlock:^Foo(Bar *b) {\n"
11109 " // ...\n"
11110 " int i;\n"
11111 " }];",
11112 ZeroColumn);
11113 verifyFormat("f(^{\n"
11114 " @autoreleasepool {\n"
11115 " if (a) {\n"
11116 " g();\n"
11117 " }\n"
11118 " }\n"
11119 "});",
11120 ZeroColumn);
11121 verifyFormat("void (^largeBlock)(void) = ^{\n"
11122 " // ...\n"
11123 "};",
11124 ZeroColumn);
11125
11126 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11127 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011128 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011129 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11130 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11131 " int i;\n"
11132 "};",
11133 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11134}
11135
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011136TEST_F(FormatTest, SupportsCRLF) {
11137 EXPECT_EQ("int a;\r\n"
11138 "int b;\r\n"
11139 "int c;\r\n",
11140 format("int a;\r\n"
11141 " int b;\r\n"
11142 " int c;\r\n",
11143 getLLVMStyle()));
11144 EXPECT_EQ("int a;\r\n"
11145 "int b;\r\n"
11146 "int c;\r\n",
11147 format("int a;\r\n"
11148 " int b;\n"
11149 " int c;\r\n",
11150 getLLVMStyle()));
11151 EXPECT_EQ("int a;\n"
11152 "int b;\n"
11153 "int c;\n",
11154 format("int a;\r\n"
11155 " int b;\n"
11156 " int c;\n",
11157 getLLVMStyle()));
11158 EXPECT_EQ("\"aaaaaaa \"\r\n"
11159 "\"bbbbbbb\";\r\n",
11160 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11161 EXPECT_EQ("#define A \\\r\n"
11162 " b; \\\r\n"
11163 " c; \\\r\n"
11164 " d;\r\n",
11165 format("#define A \\\r\n"
11166 " b; \\\r\n"
11167 " c; d; \r\n",
11168 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011169
11170 EXPECT_EQ("/*\r\n"
11171 "multi line block comments\r\n"
11172 "should not introduce\r\n"
11173 "an extra carriage return\r\n"
11174 "*/\r\n",
11175 format("/*\r\n"
11176 "multi line block comments\r\n"
11177 "should not introduce\r\n"
11178 "an extra carriage return\r\n"
11179 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011180}
11181
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011182TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11183 verifyFormat("MY_CLASS(C) {\n"
11184 " int i;\n"
11185 " int j;\n"
11186 "};");
11187}
11188
Daniel Jasper6633ab82013-10-18 10:38:14 +000011189TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11190 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11191 TwoIndent.ContinuationIndentWidth = 2;
11192
11193 EXPECT_EQ("int i =\n"
11194 " longFunction(\n"
11195 " arg);",
11196 format("int i = longFunction(arg);", TwoIndent));
11197
11198 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11199 SixIndent.ContinuationIndentWidth = 6;
11200
11201 EXPECT_EQ("int i =\n"
11202 " longFunction(\n"
11203 " arg);",
11204 format("int i = longFunction(arg);", SixIndent));
11205}
11206
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011207TEST_F(FormatTest, SpacesInAngles) {
11208 FormatStyle Spaces = getLLVMStyle();
11209 Spaces.SpacesInAngles = true;
11210
11211 verifyFormat("static_cast< int >(arg);", Spaces);
11212 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11213 verifyFormat("f< int, float >();", Spaces);
11214 verifyFormat("template <> g() {}", Spaces);
11215 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011216 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11217 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11218 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011219
11220 Spaces.Standard = FormatStyle::LS_Cpp03;
11221 Spaces.SpacesInAngles = true;
11222 verifyFormat("A< A< int > >();", Spaces);
11223
11224 Spaces.SpacesInAngles = false;
11225 verifyFormat("A<A<int> >();", Spaces);
11226
11227 Spaces.Standard = FormatStyle::LS_Cpp11;
11228 Spaces.SpacesInAngles = true;
11229 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011230
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011231 Spaces.SpacesInAngles = false;
11232 verifyFormat("A<A<int>>();", Spaces);
11233}
11234
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011235TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11236 FormatStyle Style = getLLVMStyle();
11237 Style.SpaceAfterTemplateKeyword = false;
11238 verifyFormat("template<int> void foo();", Style);
11239}
11240
Jacques Pienaarfc275112015-02-18 23:48:37 +000011241TEST_F(FormatTest, TripleAngleBrackets) {
11242 verifyFormat("f<<<1, 1>>>();");
11243 verifyFormat("f<<<1, 1, 1, s>>>();");
11244 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011245 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011246 verifyFormat("f<param><<<1, 1>>>();");
11247 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011248 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011249 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11250 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011251 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11252 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011253}
11254
11255TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011256 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011257 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011258 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11259 "aaallvm::outs() <<");
11260 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11261 "aaaallvm::outs()\n <<");
11262}
11263
Manuel Klimek819788d2014-03-18 11:22:45 +000011264TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11265 std::string code = "#if A\n"
11266 "#if B\n"
11267 "a.\n"
11268 "#endif\n"
11269 " a = 1;\n"
11270 "#else\n"
11271 "#endif\n"
11272 "#if C\n"
11273 "#else\n"
11274 "#endif\n";
11275 EXPECT_EQ(code, format(code));
11276}
11277
Manuel Klimek68b03042014-04-14 09:14:11 +000011278TEST_F(FormatTest, HandleConflictMarkers) {
11279 // Git/SVN conflict markers.
11280 EXPECT_EQ("int a;\n"
11281 "void f() {\n"
11282 " callme(some(parameter1,\n"
11283 "<<<<<<< text by the vcs\n"
11284 " parameter2),\n"
11285 "||||||| text by the vcs\n"
11286 " parameter2),\n"
11287 " parameter3,\n"
11288 "======= text by the vcs\n"
11289 " parameter2, parameter3),\n"
11290 ">>>>>>> text by the vcs\n"
11291 " otherparameter);\n",
11292 format("int a;\n"
11293 "void f() {\n"
11294 " callme(some(parameter1,\n"
11295 "<<<<<<< text by the vcs\n"
11296 " parameter2),\n"
11297 "||||||| text by the vcs\n"
11298 " parameter2),\n"
11299 " parameter3,\n"
11300 "======= text by the vcs\n"
11301 " parameter2,\n"
11302 " parameter3),\n"
11303 ">>>>>>> text by the vcs\n"
11304 " otherparameter);\n"));
11305
11306 // Perforce markers.
11307 EXPECT_EQ("void f() {\n"
11308 " function(\n"
11309 ">>>> text by the vcs\n"
11310 " parameter,\n"
11311 "==== text by the vcs\n"
11312 " parameter,\n"
11313 "==== text by the vcs\n"
11314 " parameter,\n"
11315 "<<<< text by the vcs\n"
11316 " parameter);\n",
11317 format("void f() {\n"
11318 " function(\n"
11319 ">>>> text by the vcs\n"
11320 " parameter,\n"
11321 "==== text by the vcs\n"
11322 " parameter,\n"
11323 "==== text by the vcs\n"
11324 " parameter,\n"
11325 "<<<< text by the vcs\n"
11326 " parameter);\n"));
11327
11328 EXPECT_EQ("<<<<<<<\n"
11329 "|||||||\n"
11330 "=======\n"
11331 ">>>>>>>",
11332 format("<<<<<<<\n"
11333 "|||||||\n"
11334 "=======\n"
11335 ">>>>>>>"));
11336
11337 EXPECT_EQ("<<<<<<<\n"
11338 "|||||||\n"
11339 "int i;\n"
11340 "=======\n"
11341 ">>>>>>>",
11342 format("<<<<<<<\n"
11343 "|||||||\n"
11344 "int i;\n"
11345 "=======\n"
11346 ">>>>>>>"));
11347
11348 // FIXME: Handle parsing of macros around conflict markers correctly:
11349 EXPECT_EQ("#define Macro \\\n"
11350 "<<<<<<<\n"
11351 "Something \\\n"
11352 "|||||||\n"
11353 "Else \\\n"
11354 "=======\n"
11355 "Other \\\n"
11356 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011357 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011358 format("#define Macro \\\n"
11359 "<<<<<<<\n"
11360 " Something \\\n"
11361 "|||||||\n"
11362 " Else \\\n"
11363 "=======\n"
11364 " Other \\\n"
11365 ">>>>>>>\n"
11366 " End\n"
11367 "int i;\n"));
11368}
11369
Daniel Jasper471894432014-08-06 13:40:26 +000011370TEST_F(FormatTest, DisableRegions) {
11371 EXPECT_EQ("int i;\n"
11372 "// clang-format off\n"
11373 " int j;\n"
11374 "// clang-format on\n"
11375 "int k;",
11376 format(" int i;\n"
11377 " // clang-format off\n"
11378 " int j;\n"
11379 " // clang-format on\n"
11380 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011381 EXPECT_EQ("int i;\n"
11382 "/* clang-format off */\n"
11383 " int j;\n"
11384 "/* clang-format on */\n"
11385 "int k;",
11386 format(" int i;\n"
11387 " /* clang-format off */\n"
11388 " int j;\n"
11389 " /* clang-format on */\n"
11390 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011391
11392 // Don't reflow comments within disabled regions.
11393 EXPECT_EQ(
11394 "// clang-format off\n"
11395 "// long long long long long long line\n"
11396 "/* clang-format on */\n"
11397 "/* long long long\n"
11398 " * long long long\n"
11399 " * line */\n"
11400 "int i;\n"
11401 "/* clang-format off */\n"
11402 "/* long long long long long long line */\n",
11403 format("// clang-format off\n"
11404 "// long long long long long long line\n"
11405 "/* clang-format on */\n"
11406 "/* long long long long long long line */\n"
11407 "int i;\n"
11408 "/* clang-format off */\n"
11409 "/* long long long long long long line */\n",
11410 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011411}
11412
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011413TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11414 format("? ) =");
11415 verifyNoCrash("#define a\\\n /**/}");
11416}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011417
Daniel Jasper498f5582015-12-25 08:53:31 +000011418TEST_F(FormatTest, FormatsTableGenCode) {
11419 FormatStyle Style = getLLVMStyle();
11420 Style.Language = FormatStyle::LK_TableGen;
11421 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11422}
11423
Nico Weberb2673a12016-11-10 21:49:25 +000011424TEST_F(FormatTest, ArrayOfTemplates) {
11425 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11426 format("auto a = new unique_ptr<int > [ 10];"));
11427
11428 FormatStyle Spaces = getLLVMStyle();
11429 Spaces.SpacesInSquareBrackets = true;
11430 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11431 format("auto a = new unique_ptr<int > [10];", Spaces));
11432}
11433
11434TEST_F(FormatTest, ArrayAsTemplateType) {
11435 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11436 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11437
11438 FormatStyle Spaces = getLLVMStyle();
11439 Spaces.SpacesInSquareBrackets = true;
11440 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11441 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11442}
11443
Eric Liu547d8792016-03-24 13:22:42 +000011444TEST(FormatStyle, GetStyleOfFile) {
11445 vfs::InMemoryFileSystem FS;
11446 // Test 1: format file in the same directory.
11447 ASSERT_TRUE(
11448 FS.addFile("/a/.clang-format", 0,
11449 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11450 ASSERT_TRUE(
11451 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011452 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011453 ASSERT_TRUE((bool)Style1);
11454 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011455
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011456 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011457 ASSERT_TRUE(
11458 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011459 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011460 ASSERT_TRUE((bool)Style2);
11461 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011462
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011463 // Test 2.2: no format on 'none' fallback style.
11464 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11465 ASSERT_TRUE((bool)Style2);
11466 ASSERT_EQ(*Style2, getNoStyle());
11467
11468 // Test 2.3: format if config is found with no based style while fallback is
11469 // 'none'.
11470 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11471 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11472 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11473 ASSERT_TRUE((bool)Style2);
11474 ASSERT_EQ(*Style2, getLLVMStyle());
11475
11476 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11477 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11478 ASSERT_TRUE((bool)Style2);
11479 ASSERT_EQ(*Style2, getLLVMStyle());
11480
Eric Liu547d8792016-03-24 13:22:42 +000011481 // Test 3: format file in parent directory.
11482 ASSERT_TRUE(
11483 FS.addFile("/c/.clang-format", 0,
11484 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11485 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11486 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011487 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011488 ASSERT_TRUE((bool)Style3);
11489 ASSERT_EQ(*Style3, getGoogleStyle());
11490
11491 // Test 4: error on invalid fallback style
11492 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11493 ASSERT_FALSE((bool)Style4);
11494 llvm::consumeError(Style4.takeError());
11495
11496 // Test 5: error on invalid yaml on command line
11497 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11498 ASSERT_FALSE((bool)Style5);
11499 llvm::consumeError(Style5.takeError());
11500
11501 // Test 6: error on invalid style
11502 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11503 ASSERT_FALSE((bool)Style6);
11504 llvm::consumeError(Style6.takeError());
11505
11506 // Test 7: found config file, error on parsing it
11507 ASSERT_TRUE(
11508 FS.addFile("/d/.clang-format", 0,
11509 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11510 "InvalidKey: InvalidValue")));
11511 ASSERT_TRUE(
11512 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11513 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11514 ASSERT_FALSE((bool)Style7);
11515 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011516}
11517
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011518TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11519 // Column limit is 20.
11520 std::string Code = "Type *a =\n"
11521 " new Type();\n"
11522 "g(iiiii, 0, jjjjj,\n"
11523 " 0, kkkkk, 0, mm);\n"
11524 "int bad = format ;";
11525 std::string Expected = "auto a = new Type();\n"
11526 "g(iiiii, nullptr,\n"
11527 " jjjjj, nullptr,\n"
11528 " kkkkk, nullptr,\n"
11529 " mm);\n"
11530 "int bad = format ;";
11531 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011532 tooling::Replacements Replaces = toReplacements(
11533 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11534 "auto "),
11535 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11536 "nullptr"),
11537 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11538 "nullptr"),
11539 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11540 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011541
11542 format::FormatStyle Style = format::getLLVMStyle();
11543 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011544 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11545 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11546 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11547 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11548 EXPECT_TRUE(static_cast<bool>(Result));
11549 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011550}
11551
Eric Liubaf58c22016-05-18 13:43:48 +000011552TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11553 std::string Code = "#include \"a.h\"\n"
11554 "#include \"c.h\"\n"
11555 "\n"
11556 "int main() {\n"
11557 " return 0;\n"
11558 "}";
11559 std::string Expected = "#include \"a.h\"\n"
11560 "#include \"b.h\"\n"
11561 "#include \"c.h\"\n"
11562 "\n"
11563 "int main() {\n"
11564 " return 0;\n"
11565 "}";
11566 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011567 tooling::Replacements Replaces = toReplacements(
11568 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11569 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011570
11571 format::FormatStyle Style = format::getLLVMStyle();
11572 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011573 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11574 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11575 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11576 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11577 EXPECT_TRUE(static_cast<bool>(Result));
11578 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011579}
11580
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011581TEST_F(FormatTest, AllignTrailingComments) {
11582 EXPECT_EQ("#define MACRO(V) \\\n"
11583 " V(Rt2) /* one more char */ \\\n"
11584 " V(Rs) /* than here */ \\\n"
11585 "/* comment 3 */\n",
11586 format("#define MACRO(V)\\\n"
11587 "V(Rt2) /* one more char */ \\\n"
11588 "V(Rs) /* than here */ \\\n"
11589 "/* comment 3 */ \\\n",
11590 getLLVMStyleWithColumns(40)));
11591}
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011592} // end namespace
11593} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011594} // end namespace clang