blob: 1097514a985cd991a363634bdad646af04958ca3 [file] [log] [blame]
Daniel Jasperf7935112012-12-03 18:12:45 +00001//===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Chandler Carruth320d9662012-12-04 09:45:34 +000010#include "clang/Format/Format.h"
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011
Eric Liu40ef2fb2016-08-01 10:16:37 +000012#include "../Tooling/ReplacementTest.h"
Manuel Klimekb12e5a52016-03-01 12:37:30 +000013#include "FormatTestUtils.h"
14
15#include "clang/Frontend/TextDiagnosticPrinter.h"
Chandler Carruth4b417452013-01-19 08:09:44 +000016#include "llvm/Support/Debug.h"
Eric Liu547d8792016-03-24 13:22:42 +000017#include "llvm/Support/MemoryBuffer.h"
Chandler Carruth4b417452013-01-19 08:09:44 +000018#include "gtest/gtest.h"
Manuel Klimek24998102013-01-16 14:55:28 +000019
Chandler Carruth10346662014-04-22 03:17:02 +000020#define DEBUG_TYPE "format-test"
21
Eric Liu40ef2fb2016-08-01 10:16:37 +000022using clang::tooling::ReplacementTest;
23using clang::tooling::toReplacements;
24
Daniel Jasperf7935112012-12-03 18:12:45 +000025namespace clang {
26namespace format {
Daniel Jasperd246a5a2015-06-15 15:25:11 +000027namespace {
Daniel Jasperf7935112012-12-03 18:12:45 +000028
Daniel Jaspera44991332015-04-29 13:06:49 +000029FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); }
Nico Weber514ecc82014-02-02 20:50:45 +000030
Daniel Jasperf7935112012-12-03 18:12:45 +000031class FormatTest : public ::testing::Test {
32protected:
Manuel Klimekec5c3db2015-05-07 12:26:30 +000033 enum IncompleteCheck {
34 IC_ExpectComplete,
35 IC_ExpectIncomplete,
36 IC_DoNotCheck
37 };
38
Daniel Jasperd246a5a2015-06-15 15:25:11 +000039 std::string format(llvm::StringRef Code,
40 const FormatStyle &Style = getLLVMStyle(),
Manuel Klimekec5c3db2015-05-07 12:26:30 +000041 IncompleteCheck CheckIncomplete = IC_ExpectComplete) {
Manuel Klimek24998102013-01-16 14:55:28 +000042 DEBUG(llvm::errs() << "---\n");
Manuel Klimek71814b42013-10-11 21:25:45 +000043 DEBUG(llvm::errs() << Code << "\n\n");
Daniel Jasperd246a5a2015-06-15 15:25:11 +000044 std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
Manuel Klimekec5c3db2015-05-07 12:26:30 +000045 bool IncompleteFormat = false;
46 tooling::Replacements Replaces =
47 reformat(Style, Code, Ranges, "<stdin>", &IncompleteFormat);
48 if (CheckIncomplete != IC_DoNotCheck) {
49 bool ExpectedIncompleteFormat = CheckIncomplete == IC_ExpectIncomplete;
50 EXPECT_EQ(ExpectedIncompleteFormat, IncompleteFormat) << Code << "\n\n";
51 }
Daniel Jasperec04c0d2013-05-16 10:40:07 +000052 ReplacementCount = Replaces.size();
Eric Liu4f8d9942016-07-11 13:53:12 +000053 auto Result = applyAllReplacements(Code, Replaces);
54 EXPECT_TRUE(static_cast<bool>(Result));
55 DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
56 return *Result;
Daniel Jasperf7935112012-12-03 18:12:45 +000057 }
58
Manuel Klimekb69e3c62013-01-02 18:33:23 +000059 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
60 FormatStyle Style = getLLVMStyle();
61 Style.ColumnLimit = ColumnLimit;
62 return Style;
63 }
64
Daniel Jasper1b750ed2013-01-14 16:24:39 +000065 FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
66 FormatStyle Style = getGoogleStyle();
67 Style.ColumnLimit = ColumnLimit;
68 return Style;
69 }
70
Manuel Klimekb69e3c62013-01-02 18:33:23 +000071 void verifyFormat(llvm::StringRef Code,
72 const FormatStyle &Style = getLLVMStyle()) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000073 EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
Daniel Jasperf7935112012-12-03 18:12:45 +000074 }
75
Manuel Klimekec5c3db2015-05-07 12:26:30 +000076 void verifyIncompleteFormat(llvm::StringRef Code,
77 const FormatStyle &Style = getLLVMStyle()) {
78 EXPECT_EQ(Code.str(),
79 format(test::messUp(Code), Style, IC_ExpectIncomplete));
80 }
81
Daniel Jasperf7935112012-12-03 18:12:45 +000082 void verifyGoogleFormat(llvm::StringRef Code) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000083 verifyFormat(Code, getGoogleStyle());
Daniel Jasperf7935112012-12-03 18:12:45 +000084 }
Daniel Jasper5b49f472013-01-23 12:10:53 +000085
86 void verifyIndependentOfContext(llvm::StringRef text) {
87 verifyFormat(text);
88 verifyFormat(llvm::Twine("void f() { " + text + " }").str());
89 }
Daniel Jasper7b038a22013-01-30 09:46:12 +000090
Daniel Jasper675b4f82015-01-19 10:51:23 +000091 /// \brief Verify that clang-format does not crash on the given input.
92 void verifyNoCrash(llvm::StringRef Code,
93 const FormatStyle &Style = getLLVMStyle()) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +000094 format(Code, Style, IC_DoNotCheck);
Daniel Jasper675b4f82015-01-19 10:51:23 +000095 }
96
Daniel Jasper7b038a22013-01-30 09:46:12 +000097 int ReplacementCount;
Daniel Jasperf7935112012-12-03 18:12:45 +000098};
99
Manuel Klimek52b15152013-01-09 15:25:02 +0000100TEST_F(FormatTest, MessUp) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +0000101 EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
102 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
103 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
104 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
105 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
Manuel Klimek52b15152013-01-09 15:25:02 +0000106}
107
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000108//===----------------------------------------------------------------------===//
109// Basic function tests.
110//===----------------------------------------------------------------------===//
111
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +0000112TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000113 EXPECT_EQ(";", format(";"));
114}
115
116TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
117 EXPECT_EQ("int i;", format(" int i;"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +0000118 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000119 EXPECT_EQ("int i;\nint j;", format(" int i; int j;"));
120 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;"));
121}
122
123TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
124 EXPECT_EQ("int i;", format("int\ni;"));
125}
126
127TEST_F(FormatTest, FormatsNestedBlockStatements) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000128 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000129}
130
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000131TEST_F(FormatTest, FormatsNestedCall) {
132 verifyFormat("Method(f1, f2(f3));");
133 verifyFormat("Method(f1(f2, f3()));");
Daniel Jasper48cb3b92013-01-13 08:19:51 +0000134 verifyFormat("Method(f1(f2, (f3())));");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000135}
136
Daniel Jasper14556742013-02-07 21:08:36 +0000137TEST_F(FormatTest, NestedNameSpecifiers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +0000138 verifyFormat("vector<::Type> v;");
Daniel Jasper14556742013-02-07 21:08:36 +0000139 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
Daniel Jasper11be8ac2013-08-28 07:07:07 +0000140 verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
Daniel Jasperf322eb52014-10-23 20:22:22 +0000141 verifyFormat("bool a = 2 < ::SomeFunction();");
Daniel Jasper736c14f2013-01-16 07:19:28 +0000142}
143
Daniel Jasper7b038a22013-01-30 09:46:12 +0000144TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
145 EXPECT_EQ("if (a) {\n"
146 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000147 "}",
148 format("if(a){f();}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000149 EXPECT_EQ(4, ReplacementCount);
150 EXPECT_EQ("if (a) {\n"
151 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000152 "}",
153 format("if (a) {\n"
154 " f();\n"
155 "}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000156 EXPECT_EQ(0, ReplacementCount);
Daniel Jasperd6e61882015-06-17 12:23:15 +0000157 EXPECT_EQ("/*\r\n"
158 "\r\n"
159 "*/\r\n",
160 format("/*\r\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +0000161 "\r\n"
162 "*/\r\n"));
Daniel Jasperd6e61882015-06-17 12:23:15 +0000163 EXPECT_EQ(0, ReplacementCount);
Daniel Jasper7b038a22013-01-30 09:46:12 +0000164}
165
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000166TEST_F(FormatTest, RemovesEmptyLines) {
167 EXPECT_EQ("class C {\n"
168 " int i;\n"
169 "};",
170 format("class C {\n"
171 " int i;\n"
172 "\n"
173 "};"));
174
Nico Weber34272652014-11-13 16:25:37 +0000175 // Don't remove empty lines at the start of namespaces or extern "C" blocks.
Daniel Jasper01b35482014-03-21 13:03:33 +0000176 EXPECT_EQ("namespace N {\n"
177 "\n"
178 "int i;\n"
179 "}",
180 format("namespace N {\n"
181 "\n"
182 "int i;\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000183 "}",
184 getGoogleStyle()));
Nico Weber34272652014-11-13 16:25:37 +0000185 EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
186 "\n"
187 "int i;\n"
188 "}",
189 format("extern /**/ \"C\" /**/ {\n"
190 "\n"
191 "int i;\n"
192 "}",
193 getGoogleStyle()));
194
195 // ...but do keep inlining and removing empty lines for non-block extern "C"
196 // functions.
197 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
198 EXPECT_EQ("extern \"C\" int f() {\n"
199 " int i = 42;\n"
200 " return i;\n"
201 "}",
202 format("extern \"C\" int f() {\n"
203 "\n"
204 " int i = 42;\n"
205 " return i;\n"
206 "}",
207 getGoogleStyle()));
Daniel Jasper01b35482014-03-21 13:03:33 +0000208
Daniel Jasper11164bd2014-03-21 12:58:53 +0000209 // Remove empty lines at the beginning and end of blocks.
210 EXPECT_EQ("void f() {\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000211 "\n"
212 " if (a) {\n"
213 "\n"
214 " f();\n"
215 " }\n"
216 "}",
217 format("void f() {\n"
218 "\n"
219 " if (a) {\n"
220 "\n"
221 " f();\n"
222 "\n"
223 " }\n"
224 "\n"
225 "}",
226 getLLVMStyle()));
227 EXPECT_EQ("void f() {\n"
Daniel Jasper11164bd2014-03-21 12:58:53 +0000228 " if (a) {\n"
229 " f();\n"
230 " }\n"
231 "}",
232 format("void f() {\n"
233 "\n"
234 " if (a) {\n"
235 "\n"
236 " f();\n"
237 "\n"
238 " }\n"
239 "\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000240 "}",
241 getGoogleStyle()));
Daniel Jasper11164bd2014-03-21 12:58:53 +0000242
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000243 // Don't remove empty lines in more complex control statements.
244 EXPECT_EQ("void f() {\n"
245 " if (a) {\n"
246 " f();\n"
247 "\n"
248 " } else if (b) {\n"
249 " f();\n"
250 " }\n"
251 "}",
252 format("void f() {\n"
253 " if (a) {\n"
254 " f();\n"
255 "\n"
256 " } else if (b) {\n"
257 " f();\n"
258 "\n"
259 " }\n"
260 "\n"
261 "}"));
262
263 // FIXME: This is slightly inconsistent.
264 EXPECT_EQ("namespace {\n"
265 "int i;\n"
266 "}",
267 format("namespace {\n"
268 "int i;\n"
269 "\n"
270 "}"));
271 EXPECT_EQ("namespace {\n"
272 "int i;\n"
273 "\n"
274 "} // namespace",
275 format("namespace {\n"
276 "int i;\n"
277 "\n"
278 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000279
280 FormatStyle Style = getLLVMStyle();
281 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
282 Style.MaxEmptyLinesToKeep = 2;
283 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
284 Style.BraceWrapping.AfterClass = true;
285 Style.BraceWrapping.AfterFunction = true;
286 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
287
288 EXPECT_EQ("class Foo\n"
289 "{\n"
290 " Foo() {}\n"
291 "\n"
292 " void funk() {}\n"
293 "};",
294 format("class Foo\n"
295 "{\n"
296 " Foo()\n"
297 " {\n"
298 " }\n"
299 "\n"
300 " void funk() {}\n"
301 "};",
302 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000303}
304
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000305TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000306 verifyFormat("x = (a) and (b);");
307 verifyFormat("x = (a) or (b);");
308 verifyFormat("x = (a) bitand (b);");
309 verifyFormat("x = (a) bitor (b);");
310 verifyFormat("x = (a) not_eq (b);");
311 verifyFormat("x = (a) and_eq (b);");
312 verifyFormat("x = (a) or_eq (b);");
313 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000314}
315
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000316//===----------------------------------------------------------------------===//
317// Tests for control statements.
318//===----------------------------------------------------------------------===//
319
Daniel Jaspercdd06622013-05-14 10:31:09 +0000320TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000321 verifyFormat("if (true)\n f();\ng();");
322 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000323 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000324
Daniel Jasper3a685df2013-05-16 12:12:21 +0000325 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000326 AllowsMergedIf.AlignEscapedNewlinesLeft = true;
Daniel Jasperced17f82013-01-16 15:44:34 +0000327 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
328 verifyFormat("if (a)\n"
329 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000330 " f();",
331 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000332 verifyFormat("{\n"
333 " if (a)\n"
334 " label:\n"
335 " f();\n"
336 "}",
337 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000338 verifyFormat("#define A \\\n"
339 " if (a) \\\n"
340 " label: \\\n"
341 " f()",
342 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000343 verifyFormat("if (a)\n"
344 " ;",
345 AllowsMergedIf);
346 verifyFormat("if (a)\n"
347 " if (b) return;",
348 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000349
Daniel Jasper3a685df2013-05-16 12:12:21 +0000350 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000351 " f();\n",
352 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000353 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000354 " f();",
355 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000356 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000357 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000358 "}",
359 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000360 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000361 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000362 "}",
363 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000364
365 AllowsMergedIf.ColumnLimit = 14;
366 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000367 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000368 " return;",
369 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000370
371 AllowsMergedIf.ColumnLimit = 13;
372 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000373}
374
Daniel Jasper3a685df2013-05-16 12:12:21 +0000375TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
376 FormatStyle AllowsMergedLoops = getLLVMStyle();
377 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
378 verifyFormat("while (true) continue;", AllowsMergedLoops);
379 verifyFormat("for (;;) continue;", AllowsMergedLoops);
380 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
381 verifyFormat("while (true)\n"
382 " ;",
383 AllowsMergedLoops);
384 verifyFormat("for (;;)\n"
385 " ;",
386 AllowsMergedLoops);
387 verifyFormat("for (;;)\n"
388 " for (;;) continue;",
389 AllowsMergedLoops);
390 verifyFormat("for (;;) // Can't merge this\n"
391 " continue;",
392 AllowsMergedLoops);
393 verifyFormat("for (;;) /* still don't merge */\n"
394 " continue;",
395 AllowsMergedLoops);
396}
397
Daniel Jasper17605d32014-05-14 09:33:35 +0000398TEST_F(FormatTest, FormatShortBracedStatements) {
399 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
400 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
401
402 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
403 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
404
405 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
406 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
407 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
408 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
409 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
410 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
411 verifyFormat("if (true) { //\n"
412 " f();\n"
413 "}",
414 AllowSimpleBracedStatements);
415 verifyFormat("if (true) {\n"
416 " f();\n"
417 " f();\n"
418 "}",
419 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000420 verifyFormat("if (true) {\n"
421 " f();\n"
422 "} else {\n"
423 " f();\n"
424 "}",
425 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000426
Daniel Jasperbd630732014-05-22 13:25:26 +0000427 verifyFormat("template <int> struct A2 {\n"
428 " struct B {};\n"
429 "};",
430 AllowSimpleBracedStatements);
431
Daniel Jasper17605d32014-05-14 09:33:35 +0000432 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
433 verifyFormat("if (true) {\n"
434 " f();\n"
435 "}",
436 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000437 verifyFormat("if (true) {\n"
438 " f();\n"
439 "} else {\n"
440 " f();\n"
441 "}",
442 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000443
444 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
445 verifyFormat("while (true) {\n"
446 " f();\n"
447 "}",
448 AllowSimpleBracedStatements);
449 verifyFormat("for (;;) {\n"
450 " f();\n"
451 "}",
452 AllowSimpleBracedStatements);
453}
454
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000455TEST_F(FormatTest, ParseIfElse) {
456 verifyFormat("if (true)\n"
457 " if (true)\n"
458 " if (true)\n"
459 " f();\n"
460 " else\n"
461 " g();\n"
462 " else\n"
463 " h();\n"
464 "else\n"
465 " i();");
466 verifyFormat("if (true)\n"
467 " if (true)\n"
468 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000469 " if (true)\n"
470 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000471 " } else {\n"
472 " g();\n"
473 " }\n"
474 " else\n"
475 " h();\n"
476 "else {\n"
477 " i();\n"
478 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000479 verifyFormat("void f() {\n"
480 " if (a) {\n"
481 " } else {\n"
482 " }\n"
483 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000484}
485
486TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000487 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000488 verifyFormat("if (a)\n"
489 " f();\n"
490 "else if (b)\n"
491 " g();\n"
492 "else\n"
493 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000494 verifyFormat("if (a) {\n"
495 " f();\n"
496 "}\n"
497 "// or else ..\n"
498 "else {\n"
499 " g()\n"
500 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000501
502 verifyFormat("if (a) {\n"
503 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
504 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
505 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000506 verifyFormat("if (a) {\n"
507 "} else if (\n"
508 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
509 "}",
510 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000511}
512
Daniel Jasperf7935112012-12-03 18:12:45 +0000513TEST_F(FormatTest, FormatsForLoop) {
514 verifyFormat(
515 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000516 " ++VeryVeryLongLoopVariable)\n"
517 " ;");
518 verifyFormat("for (;;)\n"
519 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000520 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000521 verifyFormat("for (;;) {\n"
522 " f();\n"
523 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000524 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000525
526 verifyFormat(
527 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
528 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000529 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000530
531 verifyFormat(
532 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000533 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000534 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
535 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000536 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000537 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
538 " I = FD->getDeclsInPrototypeScope().begin(),\n"
539 " E = FD->getDeclsInPrototypeScope().end();\n"
540 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000541 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
542 " I = Container.begin(),\n"
543 " E = Container.end();\n"
544 " I != E; ++I) {\n}",
545 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000546
Daniel Jasper48c62f92013-01-28 17:30:17 +0000547 verifyFormat(
548 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
549 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000550 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
551 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000552 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000553 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
554 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
555 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000556 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
557 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
558 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000559 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
560 " aaaaaaaaaa);\n"
561 " iter; ++iter) {\n"
562 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000563 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
564 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
565 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
566 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000567
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000568 FormatStyle NoBinPacking = getLLVMStyle();
569 NoBinPacking.BinPackParameters = false;
570 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
571 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
572 " aaaaaaaaaaaaaaaa,\n"
573 " aaaaaaaaaaaaaaaa,\n"
574 " aaaaaaaaaaaaaaaa);\n"
575 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
576 "}",
577 NoBinPacking);
578 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000579 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
580 " E = UnwrappedLines.end();\n"
581 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000582 " ++I) {\n}",
583 NoBinPacking);
Daniel Jasperf7935112012-12-03 18:12:45 +0000584}
585
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000586TEST_F(FormatTest, RangeBasedForLoops) {
587 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
588 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
589 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
590 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000591 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
592 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000593 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
594 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000595}
596
Daniel Jaspere1e43192014-04-01 12:55:11 +0000597TEST_F(FormatTest, ForEachLoops) {
598 verifyFormat("void f() {\n"
599 " foreach (Item *item, itemlist) {}\n"
600 " Q_FOREACH (Item *item, itemlist) {}\n"
601 " BOOST_FOREACH (Item *item, itemlist) {}\n"
602 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
603 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000604
605 // As function-like macros.
606 verifyFormat("#define foreach(x, y)\n"
607 "#define Q_FOREACH(x, y)\n"
608 "#define BOOST_FOREACH(x, y)\n"
609 "#define UNKNOWN_FOREACH(x, y)\n");
610
611 // Not as function-like macros.
612 verifyFormat("#define foreach (x, y)\n"
613 "#define Q_FOREACH (x, y)\n"
614 "#define BOOST_FOREACH (x, y)\n"
615 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000616}
617
Daniel Jasperf7935112012-12-03 18:12:45 +0000618TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000619 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000620 verifyFormat("while (true)\n"
621 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000622 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000623 verifyFormat("while () {\n"
624 " f();\n"
625 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000626}
627
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000628TEST_F(FormatTest, FormatsDoWhile) {
629 verifyFormat("do {\n"
630 " do_something();\n"
631 "} while (something());");
632 verifyFormat("do\n"
633 " do_something();\n"
634 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000635}
636
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000637TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000638 verifyFormat("switch (x) {\n"
639 "case 1:\n"
640 " f();\n"
641 " break;\n"
642 "case kFoo:\n"
643 "case ns::kBar:\n"
644 "case kBaz:\n"
645 " break;\n"
646 "default:\n"
647 " g();\n"
648 " break;\n"
649 "}");
650 verifyFormat("switch (x) {\n"
651 "case 1: {\n"
652 " f();\n"
653 " break;\n"
654 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000655 "case 2: {\n"
656 " break;\n"
657 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000658 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000659 verifyFormat("switch (x) {\n"
660 "case 1: {\n"
661 " f();\n"
662 " {\n"
663 " g();\n"
664 " h();\n"
665 " }\n"
666 " break;\n"
667 "}\n"
668 "}");
669 verifyFormat("switch (x) {\n"
670 "case 1: {\n"
671 " f();\n"
672 " if (foo) {\n"
673 " g();\n"
674 " h();\n"
675 " }\n"
676 " break;\n"
677 "}\n"
678 "}");
679 verifyFormat("switch (x) {\n"
680 "case 1: {\n"
681 " f();\n"
682 " g();\n"
683 "} break;\n"
684 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000685 verifyFormat("switch (test)\n"
686 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000687 verifyFormat("switch (x) {\n"
688 "default: {\n"
689 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000690 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000691 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000692 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000693 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000694 "// if 1, do f()\n"
695 "case 1:\n"
696 " f();\n"
697 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000698 verifyFormat("switch (x) {\n"
699 "case 1:\n"
700 " // Do amazing stuff\n"
701 " {\n"
702 " f();\n"
703 " g();\n"
704 " }\n"
705 " break;\n"
706 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000707 verifyFormat("#define A \\\n"
708 " switch (x) { \\\n"
709 " case a: \\\n"
710 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000711 " }",
712 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000713 verifyFormat("#define OPERATION_CASE(name) \\\n"
714 " case OP_name: \\\n"
715 " return operations::Operation##name\n",
716 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000717 verifyFormat("switch (x) {\n"
718 "case 1:;\n"
719 "default:;\n"
720 " int i;\n"
721 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000722
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000723 verifyGoogleFormat("switch (x) {\n"
724 " case 1:\n"
725 " f();\n"
726 " break;\n"
727 " case kFoo:\n"
728 " case ns::kBar:\n"
729 " case kBaz:\n"
730 " break;\n"
731 " default:\n"
732 " g();\n"
733 " break;\n"
734 "}");
735 verifyGoogleFormat("switch (x) {\n"
736 " case 1: {\n"
737 " f();\n"
738 " break;\n"
739 " }\n"
740 "}");
741 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000742 " ;");
743
744 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
745 " case OP_name: \\\n"
746 " return operations::Operation##name\n");
747 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
748 " // Get the correction operation class.\n"
749 " switch (OpCode) {\n"
750 " CASE(Add);\n"
751 " CASE(Subtract);\n"
752 " default:\n"
753 " return operations::Unknown;\n"
754 " }\n"
755 "#undef OPERATION_CASE\n"
756 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000757 verifyFormat("DEBUG({\n"
758 " switch (x) {\n"
759 " case A:\n"
760 " f();\n"
761 " break;\n"
762 " // On B:\n"
763 " case B:\n"
764 " g();\n"
765 " break;\n"
766 " }\n"
767 "});");
Daniel Jasper031e2402014-04-28 07:48:36 +0000768 verifyFormat("switch (a) {\n"
769 "case (b):\n"
770 " return;\n"
771 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000772
773 verifyFormat("switch (a) {\n"
774 "case some_namespace::\n"
775 " some_constant:\n"
776 " return;\n"
777 "}",
778 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000779}
780
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000781TEST_F(FormatTest, CaseRanges) {
782 verifyFormat("switch (x) {\n"
783 "case 'A' ... 'Z':\n"
784 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000785 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000786 " break;\n"
787 "}");
788}
789
Daniel Jasperb87899b2014-09-10 13:11:45 +0000790TEST_F(FormatTest, ShortCaseLabels) {
791 FormatStyle Style = getLLVMStyle();
792 Style.AllowShortCaseLabelsOnASingleLine = true;
793 verifyFormat("switch (a) {\n"
794 "case 1: x = 1; break;\n"
795 "case 2: return;\n"
796 "case 3:\n"
797 "case 4:\n"
798 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +0000799 "case 6: // comment\n"
800 " return;\n"
801 "case 7:\n"
802 " // comment\n"
803 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +0000804 "case 8:\n"
805 " x = 8; // comment\n"
806 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000807 "default: y = 1; break;\n"
808 "}",
809 Style);
810 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +0000811 "#if FOO\n"
812 "case 0: return 0;\n"
813 "#endif\n"
814 "}",
815 Style);
816 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000817 "case 1: {\n"
818 "}\n"
819 "case 2: {\n"
820 " return;\n"
821 "}\n"
822 "case 3: {\n"
823 " x = 1;\n"
824 " return;\n"
825 "}\n"
826 "case 4:\n"
827 " if (x)\n"
828 " return;\n"
829 "}",
830 Style);
831 Style.ColumnLimit = 21;
832 verifyFormat("switch (a) {\n"
833 "case 1: x = 1; break;\n"
834 "case 2: return;\n"
835 "case 3:\n"
836 "case 4:\n"
837 "case 5: return;\n"
838 "default:\n"
839 " y = 1;\n"
840 " break;\n"
841 "}",
842 Style);
843}
844
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000845TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000846 verifyFormat("void f() {\n"
847 " some_code();\n"
848 "test_label:\n"
849 " some_other_code();\n"
850 " {\n"
851 " some_more_code();\n"
852 " another_label:\n"
853 " some_more_code();\n"
854 " }\n"
855 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +0000856 verifyFormat("{\n"
857 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000858 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +0000859 " some_other_code();\n"
860 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000861 verifyFormat("{\n"
862 " some_code();\n"
863 "test_label:;\n"
864 " int i = 0;\n"
865 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000866}
867
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000868//===----------------------------------------------------------------------===//
869// Tests for comments.
870//===----------------------------------------------------------------------===//
871
872TEST_F(FormatTest, UnderstandsSingleLineComments) {
Daniel Jasper55213652013-03-22 10:01:29 +0000873 verifyFormat("//* */");
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000874 verifyFormat("// line 1\n"
875 "// line 2\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000876 "void f() {}\n");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000877
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000878 verifyFormat("void f() {\n"
879 " // Doesn't do anything\n"
880 "}");
Daniel Jasper185de242013-07-11 13:48:16 +0000881 verifyFormat("SomeObject\n"
882 " // Calling someFunction on SomeObject\n"
883 " .someFunction();");
Daniel Jaspera0407742014-02-11 10:08:11 +0000884 verifyFormat("auto result = SomeObject\n"
885 " // Calling someFunction on SomeObject\n"
886 " .someFunction();");
Daniel Jasperaa701fa2013-01-18 08:44:07 +0000887 verifyFormat("void f(int i, // some comment (probably for i)\n"
888 " int j, // some comment (probably for j)\n"
Daniel Jasper942ee722013-01-13 16:10:20 +0000889 " int k); // some comment (probably for k)");
890 verifyFormat("void f(int i,\n"
891 " // some comment (probably for j)\n"
892 " int j,\n"
893 " // some comment (probably for k)\n"
894 " int k);");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000895
Daniel Jasperaa701fa2013-01-18 08:44:07 +0000896 verifyFormat("int i // This is a fancy variable\n"
897 " = 5; // with nicely aligned comment.");
898
899 verifyFormat("// Leading comment.\n"
900 "int a; // Trailing comment.");
901 verifyFormat("int a; // Trailing comment\n"
902 " // on 2\n"
903 " // or 3 lines.\n"
904 "int b;");
905 verifyFormat("int a; // Trailing comment\n"
906 "\n"
907 "// Leading comment.\n"
908 "int b;");
909 verifyFormat("int a; // Comment.\n"
910 " // More details.\n"
911 "int bbbb; // Another comment.");
912 verifyFormat(
913 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
914 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // comment\n"
915 "int cccccccccccccccccccccccccccccc; // comment\n"
916 "int ddd; // looooooooooooooooooooooooong comment\n"
917 "int aaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
918 "int bbbbbbbbbbbbbbbbbbbbb; // comment\n"
919 "int ccccccccccccccccccc; // comment");
920
Daniel Jasper997b08c2013-01-18 09:19:33 +0000921 verifyFormat("#include \"a\" // comment\n"
922 "#include \"a/b/c\" // comment");
923 verifyFormat("#include <a> // comment\n"
924 "#include <a/b/c> // comment");
Daniel Jasper98857842013-10-30 13:54:53 +0000925 EXPECT_EQ("#include \"a\" // comment\n"
Manuel Klimek5c24cca2013-05-23 10:56:37 +0000926 "#include \"a/b/c\" // comment",
927 format("#include \\\n"
928 " \"a\" // comment\n"
929 "#include \"a/b/c\" // comment"));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000930
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000931 verifyFormat("enum E {\n"
932 " // comment\n"
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000933 " VAL_A, // comment\n"
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000934 " VAL_B\n"
935 "};");
Daniel Jaspere25509f2012-12-17 11:29:41 +0000936
Krasimir Georgiev753625b2017-01-31 13:32:38 +0000937 EXPECT_EQ("enum A {\n"
938 " // line a\n"
939 " a,\n"
940 " b, // line b\n"
941 "\n"
942 " // line c\n"
943 " c\n"
944 "};",
945 format("enum A {\n"
946 " // line a\n"
947 " a,\n"
948 " b, // line b\n"
949 "\n"
950 " // line c\n"
951 " c\n"
952 "};",
953 getLLVMStyleWithColumns(20)));
954
Daniel Jaspere25509f2012-12-17 11:29:41 +0000955 verifyFormat(
956 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000957 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // Trailing comment");
Daniel Jasperd8bb2db2013-01-09 09:33:39 +0000958 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
959 " // Comment inside a statement.\n"
960 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper4281c5a2014-10-07 14:45:34 +0000961 verifyFormat("SomeFunction(a,\n"
962 " // comment\n"
963 " b + x);");
964 verifyFormat("SomeFunction(a, a,\n"
965 " // comment\n"
966 " b + x);");
Daniel Jasper38396592013-02-06 15:23:09 +0000967 verifyFormat(
968 "bool aaaaaaaaaaaaa = // comment\n"
969 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
970 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Manuel Klimekc74d2922013-01-07 08:54:53 +0000971
Daniel Jasper525264c2013-02-13 19:25:54 +0000972 verifyFormat("int aaaa; // aaaaa\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000973 "int aa; // aaaaaaa",
974 getLLVMStyleWithColumns(20));
Daniel Jasper525264c2013-02-13 19:25:54 +0000975
Daniel Jasper304a9862013-01-21 22:49:20 +0000976 EXPECT_EQ("void f() { // This does something ..\n"
977 "}\n"
978 "int a; // This is unrelated",
979 format("void f() { // This does something ..\n"
980 " }\n"
981 "int a; // This is unrelated"));
Daniel Jasper251b3c92013-07-01 11:22:57 +0000982 EXPECT_EQ("class C {\n"
983 " void f() { // This does something ..\n"
984 " } // awesome..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +0000985 "\n"
Daniel Jasper251b3c92013-07-01 11:22:57 +0000986 " int a; // This is unrelated\n"
987 "};",
988 format("class C{void f() { // This does something ..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +0000989 " } // awesome..\n"
990 " \n"
Daniel Jasper251b3c92013-07-01 11:22:57 +0000991 "int a; // This is unrelated\n"
992 "};"));
Daniel Jasper304a9862013-01-21 22:49:20 +0000993
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000994 EXPECT_EQ("int i; // single line trailing comment",
Manuel Klimekc74d2922013-01-07 08:54:53 +0000995 format("int i;\\\n// single line trailing comment"));
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000996
997 verifyGoogleFormat("int a; // Trailing comment.");
Daniel Jasperddaa9be2013-01-29 19:41:55 +0000998
999 verifyFormat("someFunction(anotherFunction( // Force break.\n"
1000 " parameter));");
Daniel Jaspera885dbe2013-02-05 09:34:14 +00001001
1002 verifyGoogleFormat("#endif // HEADER_GUARD");
Daniel Jasperf79f9352013-02-06 22:04:05 +00001003
1004 verifyFormat("const char *test[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001005 " // A\n"
1006 " \"aaaa\",\n"
1007 " // B\n"
1008 " \"aaaaa\"};");
Daniel Jaspereef30492013-02-11 12:36:37 +00001009 verifyGoogleFormat(
1010 "aaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001011 " aaaaaaaaaaaaaaaaaaaaaa); // 81_cols_with_this_comment");
Alexander Kornienkob1be9d62013-04-03 12:38:53 +00001012 EXPECT_EQ("D(a, {\n"
1013 " // test\n"
1014 " int a;\n"
1015 "});",
1016 format("D(a, {\n"
1017 "// test\n"
1018 "int a;\n"
1019 "});"));
Manuel Klimekc5730802013-05-23 11:42:52 +00001020
1021 EXPECT_EQ("lineWith(); // comment\n"
1022 "// at start\n"
1023 "otherLine();",
1024 format("lineWith(); // comment\n"
1025 "// at start\n"
1026 "otherLine();"));
1027 EXPECT_EQ("lineWith(); // comment\n"
Daniel Jasperbb37a2f2016-02-01 11:20:55 +00001028 "/*\n"
1029 " * at start */\n"
1030 "otherLine();",
1031 format("lineWith(); // comment\n"
1032 "/*\n"
1033 " * at start */\n"
1034 "otherLine();"));
1035 EXPECT_EQ("lineWith(); // comment\n"
Manuel Klimekc5730802013-05-23 11:42:52 +00001036 " // at start\n"
1037 "otherLine();",
1038 format("lineWith(); // comment\n"
1039 " // at start\n"
1040 "otherLine();"));
Manuel Klimekb27375f2013-05-23 19:54:43 +00001041
1042 EXPECT_EQ("lineWith(); // comment\n"
1043 "// at start\n"
1044 "otherLine(); // comment",
1045 format("lineWith(); // comment\n"
1046 "// at start\n"
1047 "otherLine(); // comment"));
Manuel Klimek75ef31f2013-05-23 20:46:07 +00001048 EXPECT_EQ("lineWith();\n"
1049 "// at start\n"
1050 "otherLine(); // comment",
1051 format("lineWith();\n"
1052 " // at start\n"
1053 "otherLine(); // comment"));
1054 EXPECT_EQ("// first\n"
1055 "// at start\n"
1056 "otherLine(); // comment",
1057 format("// first\n"
1058 " // at start\n"
1059 "otherLine(); // comment"));
1060 EXPECT_EQ("f();\n"
1061 "// first\n"
1062 "// at start\n"
1063 "otherLine(); // comment",
1064 format("f();\n"
1065 "// first\n"
1066 " // at start\n"
1067 "otherLine(); // comment"));
Daniel Jasper0e93cdb2013-11-08 23:31:14 +00001068 verifyFormat("f(); // comment\n"
1069 "// first\n"
1070 "// at start\n"
1071 "otherLine();");
1072 EXPECT_EQ("f(); // comment\n"
1073 "// first\n"
1074 "// at start\n"
1075 "otherLine();",
1076 format("f(); // comment\n"
1077 "// first\n"
1078 " // at start\n"
1079 "otherLine();"));
1080 EXPECT_EQ("f(); // comment\n"
1081 " // first\n"
1082 "// at start\n"
1083 "otherLine();",
1084 format("f(); // comment\n"
1085 " // first\n"
1086 "// at start\n"
1087 "otherLine();"));
Daniel Jasper49532102015-01-07 14:00:11 +00001088 EXPECT_EQ("void f() {\n"
1089 " lineWith(); // comment\n"
1090 " // at start\n"
1091 "}",
1092 format("void f() {\n"
1093 " lineWith(); // comment\n"
1094 " // at start\n"
1095 "}"));
Benjamin Kramerdab50462016-01-11 16:27:16 +00001096 EXPECT_EQ("int xy; // a\n"
1097 "int z; // b",
1098 format("int xy; // a\n"
1099 "int z; //b"));
1100 EXPECT_EQ("int xy; // a\n"
1101 "int z; // bb",
1102 format("int xy; // a\n"
1103 "int z; //bb",
1104 getLLVMStyleWithColumns(12)));
Daniel Jasper66935022014-04-27 10:03:19 +00001105
Daniel Jaspera44991332015-04-29 13:06:49 +00001106 verifyFormat("#define A \\\n"
1107 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1108 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1109 getLLVMStyleWithColumns(60));
Daniel Jasper66935022014-04-27 10:03:19 +00001110 verifyFormat(
1111 "#define A \\\n"
1112 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1113 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1114 getLLVMStyleWithColumns(61));
Daniel Jasper8acf8222014-05-07 09:23:05 +00001115
1116 verifyFormat("if ( // This is some comment\n"
1117 " x + 3) {\n"
1118 "}");
1119 EXPECT_EQ("if ( // This is some comment\n"
1120 " // spanning two lines\n"
1121 " x + 3) {\n"
1122 "}",
1123 format("if( // This is some comment\n"
1124 " // spanning two lines\n"
1125 " x + 3) {\n"
1126 "}"));
Daniel Jasper9b79efb2015-01-19 11:49:32 +00001127
1128 verifyNoCrash("/\\\n/");
1129 verifyNoCrash("/\\\n* */");
Daniel Jasper62c78f52015-05-06 08:58:57 +00001130 // The 0-character somehow makes the lexer return a proper comment.
1131 verifyNoCrash(StringRef("/*\\\0\n/", 6));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001132}
1133
Daniel Jasper14e58e52014-03-21 11:58:45 +00001134TEST_F(FormatTest, KeepsParameterWithTrailingCommentsOnTheirOwnLine) {
1135 EXPECT_EQ("SomeFunction(a,\n"
1136 " b, // comment\n"
1137 " c);",
1138 format("SomeFunction(a,\n"
1139 " b, // comment\n"
1140 " c);"));
Daniel Jasper28df0a32014-03-21 12:15:40 +00001141 EXPECT_EQ("SomeFunction(a, b,\n"
1142 " // comment\n"
1143 " c);",
1144 format("SomeFunction(a,\n"
1145 " b,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001146 " // comment\n"
Daniel Jasper28df0a32014-03-21 12:15:40 +00001147 " c);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001148 EXPECT_EQ("SomeFunction(a, b, // comment (unclear relation)\n"
1149 " c);",
1150 format("SomeFunction(a, b, // comment (unclear relation)\n"
1151 " c);"));
1152 EXPECT_EQ("SomeFunction(a, // comment\n"
1153 " b,\n"
1154 " c); // comment",
1155 format("SomeFunction(a, // comment\n"
1156 " b,\n"
1157 " c); // comment"));
Daniel Jasper35e41222016-11-29 09:40:01 +00001158 EXPECT_EQ("aaaaaaaaaa(aaaa(aaaa,\n"
1159 " aaaa), //\n"
1160 " aaaa, bbbbb);",
1161 format("aaaaaaaaaa(aaaa(aaaa,\n"
1162 "aaaa), //\n"
1163 "aaaa, bbbbb);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001164}
1165
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001166TEST_F(FormatTest, RemovesTrailingWhitespaceOfComments) {
1167 EXPECT_EQ("// comment", format("// comment "));
1168 EXPECT_EQ("int aaaaaaa, bbbbbbb; // comment",
1169 format("int aaaaaaa, bbbbbbb; // comment ",
1170 getLLVMStyleWithColumns(33)));
Alexander Kornienko9ab4a772013-09-06 17:24:54 +00001171 EXPECT_EQ("// comment\\\n", format("// comment\\\n \t \v \f "));
1172 EXPECT_EQ("// comment \\\n", format("// comment \\\n \t \v \f "));
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001173}
1174
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001175TEST_F(FormatTest, UnderstandsBlockComments) {
Nico Weber8084cff2013-06-26 00:15:19 +00001176 verifyFormat("f(/*noSpaceAfterParameterNamingComment=*/true);");
Daniel Jasper2b2c9672016-05-08 18:14:01 +00001177 verifyFormat("void f() { g(/*aaa=*/x, /*bbb=*/!y, /*c=*/::c); }");
Daniel Jasper38c82402013-11-29 09:27:43 +00001178 EXPECT_EQ("f(aaaaaaaaaaaaaaaaaaaaaaaaa, /* Trailing comment for aa... */\n"
1179 " bbbbbbbbbbbbbbbbbbbbbbbbb);",
1180 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \\\n"
1181 "/* Trailing comment for aa... */\n"
1182 " bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001183 EXPECT_EQ(
1184 "f(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1185 " /* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);",
1186 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \n"
1187 "/* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper61a40782013-06-06 16:08:57 +00001188 EXPECT_EQ(
1189 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1190 " aaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001191 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001192 "}",
1193 format("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1194 " aaaaaaaaaaaaaaaaaa ,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001195 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001196 "}"));
Daniel Jasper99302ed2016-05-27 08:59:34 +00001197 verifyFormat("f(/* aaaaaaaaaaaaaaaaaa = */\n"
1198 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperddaa9be2013-01-29 19:41:55 +00001199
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00001200 FormatStyle NoBinPacking = getLLVMStyle();
1201 NoBinPacking.BinPackParameters = false;
1202 verifyFormat("aaaaaaaa(/* parameter 1 */ aaaaaa,\n"
1203 " /* parameter 2 */ aaaaaa,\n"
1204 " /* parameter 3 */ aaaaaa,\n"
1205 " /* parameter 4 */ aaaaaa);",
1206 NoBinPacking);
Daniel Jasper03b1bc72014-03-28 15:06:01 +00001207
1208 // Aligning block comments in macros.
1209 verifyGoogleFormat("#define A \\\n"
1210 " int i; /*a*/ \\\n"
1211 " int jjj; /*b*/");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001212}
1213
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001214TEST_F(FormatTest, AlignsBlockComments) {
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001215 EXPECT_EQ("/*\n"
1216 " * Really multi-line\n"
1217 " * comment.\n"
1218 " */\n"
1219 "void f() {}",
1220 format(" /*\n"
1221 " * Really multi-line\n"
1222 " * comment.\n"
1223 " */\n"
1224 " void f() {}"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001225 EXPECT_EQ("class C {\n"
1226 " /*\n"
1227 " * Another multi-line\n"
1228 " * comment.\n"
1229 " */\n"
1230 " void f() {}\n"
1231 "};",
1232 format("class C {\n"
1233 "/*\n"
1234 " * Another multi-line\n"
1235 " * comment.\n"
1236 " */\n"
1237 "void f() {}\n"
1238 "};"));
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001239 EXPECT_EQ("/*\n"
1240 " 1. This is a comment with non-trivial formatting.\n"
1241 " 1.1. We have to indent/outdent all lines equally\n"
1242 " 1.1.1. to keep the formatting.\n"
1243 " */",
1244 format(" /*\n"
1245 " 1. This is a comment with non-trivial formatting.\n"
1246 " 1.1. We have to indent/outdent all lines equally\n"
1247 " 1.1.1. to keep the formatting.\n"
1248 " */"));
1249 EXPECT_EQ("/*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001250 "Don't try to outdent if there's not enough indentation.\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001251 "*/",
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001252 format(" /*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001253 " Don't try to outdent if there's not enough indentation.\n"
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001254 " */"));
Manuel Klimek281dcbe2013-05-28 08:55:01 +00001255
1256 EXPECT_EQ("int i; /* Comment with empty...\n"
1257 " *\n"
1258 " * line. */",
1259 format("int i; /* Comment with empty...\n"
1260 " *\n"
1261 " * line. */"));
Alexander Kornienko67d9c8c2014-04-17 16:12:46 +00001262 EXPECT_EQ("int foobar = 0; /* comment */\n"
1263 "int bar = 0; /* multiline\n"
1264 " comment 1 */\n"
1265 "int baz = 0; /* multiline\n"
1266 " comment 2 */\n"
1267 "int bzz = 0; /* multiline\n"
1268 " comment 3 */",
1269 format("int foobar = 0; /* comment */\n"
1270 "int bar = 0; /* multiline\n"
1271 " comment 1 */\n"
1272 "int baz = 0; /* multiline\n"
1273 " comment 2 */\n"
1274 "int bzz = 0; /* multiline\n"
1275 " comment 3 */"));
1276 EXPECT_EQ("int foobar = 0; /* comment */\n"
1277 "int bar = 0; /* multiline\n"
1278 " comment */\n"
1279 "int baz = 0; /* multiline\n"
1280 "comment */",
1281 format("int foobar = 0; /* comment */\n"
1282 "int bar = 0; /* multiline\n"
1283 "comment */\n"
1284 "int baz = 0; /* multiline\n"
1285 "comment */"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001286}
1287
Daniel Jaspera0a50392015-12-01 13:28:53 +00001288TEST_F(FormatTest, CommentReflowingCanBeTurnedOff) {
1289 FormatStyle Style = getLLVMStyleWithColumns(20);
1290 Style.ReflowComments = false;
1291 verifyFormat("// aaaaaaaaa aaaaaaaaaa aaaaaaaaaa", Style);
1292 verifyFormat("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa */", Style);
1293}
1294
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001295TEST_F(FormatTest, CorrectlyHandlesLengthOfBlockComments) {
1296 EXPECT_EQ("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1297 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */",
1298 format("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1299 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */"));
Alexander Kornienkoaa620e12013-07-01 13:42:42 +00001300 EXPECT_EQ(
1301 "void ffffffffffff(\n"
1302 " int aaaaaaaa, int bbbbbbbb,\n"
1303 " int cccccccccccc) { /*\n"
1304 " aaaaaaaaaa\n"
1305 " aaaaaaaaaaaaa\n"
1306 " bbbbbbbbbbbbbb\n"
1307 " bbbbbbbbbb\n"
1308 " */\n"
1309 "}",
1310 format("void ffffffffffff(int aaaaaaaa, int bbbbbbbb, int cccccccccccc)\n"
1311 "{ /*\n"
1312 " aaaaaaaaaa aaaaaaaaaaaaa\n"
1313 " bbbbbbbbbbbbbb bbbbbbbbbb\n"
1314 " */\n"
1315 "}",
1316 getLLVMStyleWithColumns(40)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001317}
1318
Alexander Kornienko94042342013-07-16 23:47:22 +00001319TEST_F(FormatTest, DontBreakNonTrailingBlockComments) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00001320 EXPECT_EQ("void ffffffffff(\n"
1321 " int aaaaa /* test */);",
Alexander Kornienko94042342013-07-16 23:47:22 +00001322 format("void ffffffffff(int aaaaa /* test */);",
1323 getLLVMStyleWithColumns(35)));
1324}
1325
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001326TEST_F(FormatTest, SplitsLongCxxComments) {
1327 EXPECT_EQ("// A comment that\n"
1328 "// doesn't fit on\n"
1329 "// one line",
1330 format("// A comment that doesn't fit on one line",
1331 getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001332 EXPECT_EQ("/// A comment that\n"
1333 "/// doesn't fit on\n"
1334 "/// one line",
1335 format("/// A comment that doesn't fit on one line",
1336 getLLVMStyleWithColumns(20)));
1337 EXPECT_EQ("//! A comment that\n"
1338 "//! doesn't fit on\n"
1339 "//! one line",
1340 format("//! A comment that doesn't fit on one line",
1341 getLLVMStyleWithColumns(20)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00001342 EXPECT_EQ("// a b c d\n"
1343 "// e f g\n"
1344 "// h i j k",
Daniel Jaspera44991332015-04-29 13:06:49 +00001345 format("// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
1346 EXPECT_EQ(
1347 "// a b c d\n"
1348 "// e f g\n"
1349 "// h i j k",
1350 format("\\\n// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001351 EXPECT_EQ("if (true) // A comment that\n"
1352 " // doesn't fit on\n"
1353 " // one line",
1354 format("if (true) // A comment that doesn't fit on one line ",
1355 getLLVMStyleWithColumns(30)));
1356 EXPECT_EQ("// Don't_touch_leading_whitespace",
1357 format("// Don't_touch_leading_whitespace",
1358 getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001359 EXPECT_EQ("// Add leading\n"
1360 "// whitespace",
1361 format("//Add leading whitespace", getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001362 EXPECT_EQ("/// Add leading\n"
1363 "/// whitespace",
1364 format("///Add leading whitespace", getLLVMStyleWithColumns(20)));
1365 EXPECT_EQ("//! Add leading\n"
1366 "//! whitespace",
1367 format("//!Add leading whitespace", getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001368 EXPECT_EQ("// whitespace", format("//whitespace", getLLVMStyle()));
1369 EXPECT_EQ("// Even if it makes the line exceed the column\n"
1370 "// limit",
1371 format("//Even if it makes the line exceed the column limit",
1372 getLLVMStyleWithColumns(51)));
1373 EXPECT_EQ("//--But not here", format("//--But not here", getLLVMStyle()));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001374
1375 EXPECT_EQ("// aa bb cc dd",
1376 format("// aa bb cc dd ",
1377 getLLVMStyleWithColumns(15)));
1378
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001379 EXPECT_EQ("// A comment before\n"
1380 "// a macro\n"
1381 "// definition\n"
1382 "#define a b",
1383 format("// A comment before a macro definition\n"
1384 "#define a b",
1385 getLLVMStyleWithColumns(20)));
Daniel Jaspere068ac72014-10-27 17:13:59 +00001386 EXPECT_EQ("void ffffff(\n"
1387 " int aaaaaaaaa, // wwww\n"
1388 " int bbbbbbbbbb, // xxxxxxx\n"
1389 " // yyyyyyyyyy\n"
1390 " int c, int d, int e) {}",
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001391 format("void ffffff(\n"
1392 " int aaaaaaaaa, // wwww\n"
Daniel Jasper19a541e2013-12-19 16:45:34 +00001393 " int bbbbbbbbbb, // xxxxxxx yyyyyyyyyy\n"
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001394 " int c, int d, int e) {}",
1395 getLLVMStyleWithColumns(40)));
Alexander Kornienkob93062e2013-06-20 13:58:37 +00001396 EXPECT_EQ("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1397 format("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1398 getLLVMStyleWithColumns(20)));
Alexander Kornienko3abbb8a2013-11-12 17:30:49 +00001399 EXPECT_EQ(
1400 "#define XXX // a b c d\n"
1401 " // e f g h",
1402 format("#define XXX // a b c d e f g h", getLLVMStyleWithColumns(22)));
1403 EXPECT_EQ(
1404 "#define XXX // q w e r\n"
1405 " // t y u i",
1406 format("#define XXX //q w e r t y u i", getLLVMStyleWithColumns(22)));
Krasimir Georgieve518e0b2017-01-30 21:00:01 +00001407 EXPECT_EQ("{\n"
1408 " //\n"
1409 " //\\\n"
1410 " // long 1 2 3 4\n"
1411 " // 5\n"
1412 "}",
1413 format("{\n"
1414 " //\n"
1415 " //\\\n"
1416 " // long 1 2 3 4 5\n"
1417 "}",
1418 getLLVMStyleWithColumns(20)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001419}
Manuel Klimek9043c742013-05-27 15:23:34 +00001420
Alexander Kornienko4504f932014-03-10 13:14:56 +00001421TEST_F(FormatTest, PreservesHangingIndentInCxxComments) {
1422 EXPECT_EQ("// A comment\n"
1423 "// that doesn't\n"
1424 "// fit on one\n"
1425 "// line",
1426 format("// A comment that doesn't fit on one line",
1427 getLLVMStyleWithColumns(20)));
1428 EXPECT_EQ("/// A comment\n"
1429 "/// that doesn't\n"
1430 "/// fit on one\n"
1431 "/// line",
1432 format("/// A comment that doesn't fit on one line",
1433 getLLVMStyleWithColumns(20)));
1434}
1435
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001436TEST_F(FormatTest, DontSplitLineCommentsWithEscapedNewlines) {
1437 EXPECT_EQ("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1438 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1439 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1440 format("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1441 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1442 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
1443 EXPECT_EQ("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1444 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1445 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1446 format("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1447 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1448 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1449 getLLVMStyleWithColumns(50)));
1450 // FIXME: One day we might want to implement adjustment of leading whitespace
1451 // of the consecutive lines in this kind of comment:
Daniel Jasper4355e7f2014-07-09 07:50:33 +00001452 EXPECT_EQ("double\n"
1453 " a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1454 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1455 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1456 format("double a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1457 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1458 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001459 getLLVMStyleWithColumns(49)));
1460}
1461
Alexander Kornienkoce9161a2014-01-02 15:13:14 +00001462TEST_F(FormatTest, DontSplitLineCommentsWithPragmas) {
1463 FormatStyle Pragmas = getLLVMStyleWithColumns(30);
1464 Pragmas.CommentPragmas = "^ IWYU pragma:";
1465 EXPECT_EQ(
1466 "// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb",
1467 format("// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb", Pragmas));
1468 EXPECT_EQ(
1469 "/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */",
1470 format("/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */", Pragmas));
1471}
1472
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001473TEST_F(FormatTest, PriorityOfCommentBreaking) {
Daniel Jasper2739af32013-08-28 10:03:58 +00001474 EXPECT_EQ("if (xxx ==\n"
1475 " yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001476 " zzz)\n"
1477 " q();",
1478 format("if (xxx == yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
1479 " zzz) q();",
1480 getLLVMStyleWithColumns(40)));
1481 EXPECT_EQ("if (xxxxxxxxxx ==\n"
1482 " yyy && // aaaaaa bbbbbbbb cccc\n"
1483 " zzz)\n"
1484 " q();",
1485 format("if (xxxxxxxxxx == yyy && // aaaaaa bbbbbbbb cccc\n"
1486 " zzz) q();",
1487 getLLVMStyleWithColumns(40)));
1488 EXPECT_EQ("if (xxxxxxxxxx &&\n"
1489 " yyy || // aaaaaa bbbbbbbb cccc\n"
1490 " zzz)\n"
1491 " q();",
1492 format("if (xxxxxxxxxx && yyy || // aaaaaa bbbbbbbb cccc\n"
1493 " zzz) q();",
1494 getLLVMStyleWithColumns(40)));
Daniel Jasper19a541e2013-12-19 16:45:34 +00001495 EXPECT_EQ("fffffffff(\n"
1496 " &xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1497 " zzz);",
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001498 format("fffffffff(&xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1499 " zzz);",
1500 getLLVMStyleWithColumns(40)));
Manuel Klimek9043c742013-05-27 15:23:34 +00001501}
1502
1503TEST_F(FormatTest, MultiLineCommentsInDefines) {
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001504 EXPECT_EQ("#define A(x) /* \\\n"
1505 " a comment \\\n"
1506 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001507 " f();",
1508 format("#define A(x) /* \\\n"
1509 " a comment \\\n"
1510 " inside */ \\\n"
1511 " f();",
1512 getLLVMStyleWithColumns(17)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001513 EXPECT_EQ("#define A( \\\n"
1514 " x) /* \\\n"
1515 " a comment \\\n"
1516 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001517 " f();",
1518 format("#define A( \\\n"
1519 " x) /* \\\n"
1520 " a comment \\\n"
1521 " inside */ \\\n"
1522 " f();",
1523 getLLVMStyleWithColumns(17)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001524}
1525
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001526TEST_F(FormatTest, ParsesCommentsAdjacentToPPDirectives) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001527 EXPECT_EQ("namespace {}\n// Test\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001528 format("namespace {}\n // Test\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001529 EXPECT_EQ("namespace {}\n/* Test */\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001530 format("namespace {}\n /* Test */\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001531 EXPECT_EQ("namespace {}\n/* Test */ #define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001532 format("namespace {}\n /* Test */ #define A"));
1533}
1534
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001535TEST_F(FormatTest, SplitsLongLinesInComments) {
1536 EXPECT_EQ("/* This is a long\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001537 " * comment that\n"
1538 " * doesn't\n"
1539 " * fit on one line.\n"
1540 " */",
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001541 format("/* "
1542 "This is a long "
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001543 "comment that "
1544 "doesn't "
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001545 "fit on one line. */",
1546 getLLVMStyleWithColumns(20)));
Daniel Jaspera44991332015-04-29 13:06:49 +00001547 EXPECT_EQ(
1548 "/* a b c d\n"
1549 " * e f g\n"
1550 " * h i j k\n"
1551 " */",
1552 format("/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
1553 EXPECT_EQ(
1554 "/* a b c d\n"
1555 " * e f g\n"
1556 " * h i j k\n"
1557 " */",
1558 format("\\\n/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001559 EXPECT_EQ("/*\n"
1560 "This is a long\n"
1561 "comment that doesn't\n"
1562 "fit on one line.\n"
1563 "*/",
1564 format("/*\n"
1565 "This is a long "
1566 "comment that doesn't "
1567 "fit on one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001568 "*/",
1569 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001570 EXPECT_EQ("/*\n"
1571 " * This is a long\n"
1572 " * comment that\n"
1573 " * doesn't fit on\n"
1574 " * one line.\n"
1575 " */",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001576 format("/* \n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001577 " * This is a long "
1578 " comment that "
1579 " doesn't fit on "
1580 " one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001581 " */",
1582 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001583 EXPECT_EQ("/*\n"
1584 " * This_is_a_comment_with_words_that_dont_fit_on_one_line\n"
1585 " * so_it_should_be_broken\n"
1586 " * wherever_a_space_occurs\n"
1587 " */",
1588 format("/*\n"
1589 " * This_is_a_comment_with_words_that_dont_fit_on_one_line "
1590 " so_it_should_be_broken "
1591 " wherever_a_space_occurs \n"
1592 " */",
1593 getLLVMStyleWithColumns(20)));
1594 EXPECT_EQ("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001595 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001596 " */",
1597 format("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001598 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001599 " */",
1600 getLLVMStyleWithColumns(20)));
1601 EXPECT_EQ("{\n"
1602 " /*\n"
1603 " This is another\n"
1604 " long comment that\n"
1605 " doesn't fit on one\n"
1606 " line 1234567890\n"
1607 " */\n"
1608 "}",
1609 format("{\n"
1610 "/*\n"
1611 "This is another "
1612 " long comment that "
1613 " doesn't fit on one"
1614 " line 1234567890\n"
1615 "*/\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001616 "}",
1617 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001618 EXPECT_EQ("{\n"
1619 " /*\n"
1620 " * This i s\n"
1621 " * another comment\n"
1622 " * t hat doesn' t\n"
1623 " * fit on one l i\n"
1624 " * n e\n"
1625 " */\n"
1626 "}",
1627 format("{\n"
1628 "/*\n"
1629 " * This i s"
1630 " another comment"
1631 " t hat doesn' t"
1632 " fit on one l i"
1633 " n e\n"
1634 " */\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001635 "}",
1636 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001637 EXPECT_EQ("/*\n"
1638 " * This is a long\n"
1639 " * comment that\n"
1640 " * doesn't fit on\n"
1641 " * one line\n"
1642 " */",
1643 format(" /*\n"
1644 " * This is a long comment that doesn't fit on one line\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001645 " */",
1646 getLLVMStyleWithColumns(20)));
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001647 EXPECT_EQ("{\n"
1648 " if (something) /* This is a\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001649 " long\n"
1650 " comment */\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001651 " ;\n"
1652 "}",
1653 format("{\n"
1654 " if (something) /* This is a long comment */\n"
1655 " ;\n"
1656 "}",
1657 getLLVMStyleWithColumns(30)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001658
1659 EXPECT_EQ("/* A comment before\n"
1660 " * a macro\n"
1661 " * definition */\n"
1662 "#define a b",
1663 format("/* A comment before a macro definition */\n"
1664 "#define a b",
1665 getLLVMStyleWithColumns(20)));
1666
1667 EXPECT_EQ("/* some comment\n"
1668 " * a comment\n"
1669 "* that we break\n"
1670 " * another comment\n"
1671 "* we have to break\n"
1672 "* a left comment\n"
1673 " */",
1674 format(" /* some comment\n"
1675 " * a comment that we break\n"
1676 " * another comment we have to break\n"
1677 "* a left comment\n"
1678 " */",
1679 getLLVMStyleWithColumns(20)));
1680
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00001681 EXPECT_EQ("/**\n"
1682 " * multiline block\n"
1683 " * comment\n"
1684 " *\n"
1685 " */",
1686 format("/**\n"
1687 " * multiline block comment\n"
1688 " *\n"
1689 " */",
1690 getLLVMStyleWithColumns(20)));
1691
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001692 EXPECT_EQ("/*\n"
1693 "\n"
1694 "\n"
1695 " */\n",
1696 format(" /* \n"
1697 " \n"
1698 " \n"
1699 " */\n"));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001700
1701 EXPECT_EQ("/* a a */",
1702 format("/* a a */", getLLVMStyleWithColumns(15)));
1703 EXPECT_EQ("/* a a bc */",
1704 format("/* a a bc */", getLLVMStyleWithColumns(15)));
1705 EXPECT_EQ("/* aaa aaa\n"
1706 " * aaaaa */",
1707 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
1708 EXPECT_EQ("/* aaa aaa\n"
1709 " * aaaaa */",
1710 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001711}
1712
1713TEST_F(FormatTest, SplitsLongLinesInCommentsInPreprocessor) {
1714 EXPECT_EQ("#define X \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001715 " /* \\\n"
1716 " Test \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001717 " Macro comment \\\n"
1718 " with a long \\\n"
1719 " line \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001720 " */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001721 " A + B",
1722 format("#define X \\\n"
1723 " /*\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001724 " Test\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001725 " Macro comment with a long line\n"
1726 " */ \\\n"
1727 " A + B",
1728 getLLVMStyleWithColumns(20)));
1729 EXPECT_EQ("#define X \\\n"
1730 " /* Macro comment \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001731 " with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001732 " line */ \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001733 " A + B",
1734 format("#define X \\\n"
1735 " /* Macro comment with a long\n"
1736 " line */ \\\n"
1737 " A + B",
1738 getLLVMStyleWithColumns(20)));
1739 EXPECT_EQ("#define X \\\n"
1740 " /* Macro comment \\\n"
1741 " * with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001742 " * line */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001743 " A + B",
1744 format("#define X \\\n"
1745 " /* Macro comment with a long line */ \\\n"
1746 " A + B",
1747 getLLVMStyleWithColumns(20)));
1748}
1749
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001750TEST_F(FormatTest, CommentsInStaticInitializers) {
1751 EXPECT_EQ(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001752 "static SomeType type = {aaaaaaaaaaaaaaaaaaaa, /* comment */\n"
1753 " aaaaaaaaaaaaaaaaaaaa /* comment */,\n"
1754 " /* comment */ aaaaaaaaaaaaaaaaaaaa,\n"
1755 " aaaaaaaaaaaaaaaaaaaa, // comment\n"
1756 " aaaaaaaaaaaaaaaaaaaa};",
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001757 format("static SomeType type = { aaaaaaaaaaaaaaaaaaaa , /* comment */\n"
1758 " aaaaaaaaaaaaaaaaaaaa /* comment */ ,\n"
1759 " /* comment */ aaaaaaaaaaaaaaaaaaaa ,\n"
1760 " aaaaaaaaaaaaaaaaaaaa , // comment\n"
1761 " aaaaaaaaaaaaaaaaaaaa };"));
Chandler Carruthf8b72662014-03-02 12:37:31 +00001762 verifyFormat("static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1763 " bbbbbbbbbbb, ccccccccccc};");
1764 verifyFormat("static SomeType type = {aaaaaaaaaaa,\n"
1765 " // comment for bb....\n"
1766 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001767 verifyGoogleFormat(
Daniel Jaspere5777d22013-05-23 10:15:45 +00001768 "static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1769 " bbbbbbbbbbb, ccccccccccc};");
1770 verifyGoogleFormat("static SomeType type = {aaaaaaaaaaa,\n"
1771 " // comment for bb....\n"
1772 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001773
Chandler Carruthf8b72662014-03-02 12:37:31 +00001774 verifyFormat("S s = {{a, b, c}, // Group #1\n"
1775 " {d, e, f}, // Group #2\n"
1776 " {g, h, i}}; // Group #3");
1777 verifyFormat("S s = {{// Group #1\n"
1778 " a, b, c},\n"
1779 " {// Group #2\n"
1780 " d, e, f},\n"
1781 " {// Group #3\n"
1782 " g, h, i}};");
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001783
1784 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001785 " // Some comment\n"
1786 " a,\n"
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001787 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001788 " // Comment after empty line\n"
1789 " b}",
Daniel Jasperfb5e2412013-02-26 13:10:34 +00001790 format("S s = {\n"
1791 " // Some comment\n"
1792 " a,\n"
1793 " \n"
1794 " // Comment after empty line\n"
1795 " b\n"
1796 "}"));
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001797 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001798 " /* Some comment */\n"
1799 " a,\n"
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001800 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001801 " /* Comment after empty line */\n"
1802 " b}",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001803 format("S s = {\n"
1804 " /* Some comment */\n"
1805 " a,\n"
1806 " \n"
1807 " /* Comment after empty line */\n"
1808 " b\n"
1809 "}"));
Daniel Jaspera400cab2013-02-28 15:04:12 +00001810 verifyFormat("const uint8_t aaaaaaaaaaaaaaaaaaaaaa[0] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001811 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1812 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1813 " 0x00, 0x00, 0x00, 0x00}; // comment\n");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001814}
1815
Krasimir Georgiev84321612017-01-30 19:18:55 +00001816TEST_F(FormatTest, LineCommentsAfterRightBrace) {
1817 EXPECT_EQ("if (true) { // comment about branch\n"
1818 " // comment about f\n"
1819 " f();\n"
1820 "}",
1821 format("if (true) { // comment about branch\n"
1822 " // comment about f\n"
1823 " f();\n"
1824 "}",
1825 getLLVMStyleWithColumns(80)));
1826 EXPECT_EQ("if (1) { // if line 1\n"
1827 " // if line 2\n"
1828 " // if line 3\n"
1829 " // f line 1\n"
1830 " // f line 2\n"
1831 " f();\n"
1832 "} else { // else line 1\n"
1833 " // else line 2\n"
1834 " // else line 3\n"
1835 " // g line 1\n"
1836 " g();\n"
1837 "}",
1838 format("if (1) { // if line 1\n"
1839 " // if line 2\n"
1840 " // if line 3\n"
1841 " // f line 1\n"
1842 " // f line 2\n"
1843 " f();\n"
1844 "} else { // else line 1\n"
1845 " // else line 2\n"
1846 " // else line 3\n"
1847 " // g line 1\n"
1848 " g();\n"
1849 "}"));
1850 EXPECT_EQ("do { // line 1\n"
1851 " // line 2\n"
1852 " // line 3\n"
1853 " f();\n"
1854 "} while (true);",
1855 format("do { // line 1\n"
1856 " // line 2\n"
1857 " // line 3\n"
1858 " f();\n"
1859 "} while (true);",
1860 getLLVMStyleWithColumns(80)));
1861 EXPECT_EQ("while (a < b) { // line 1\n"
1862 " // line 2\n"
1863 " // line 3\n"
1864 " f();\n"
1865 "}",
1866 format("while (a < b) {// line 1\n"
1867 " // line 2\n"
1868 " // line 3\n"
1869 " f();\n"
1870 "}",
1871 getLLVMStyleWithColumns(80)));
1872}
1873
Krasimir Georgiev91834222017-01-25 13:58:58 +00001874TEST_F(FormatTest, ReflowsComments) {
1875 // Break a long line and reflow with the full next line.
1876 EXPECT_EQ("// long long long\n"
1877 "// long long",
1878 format("// long long long long\n"
1879 "// long",
1880 getLLVMStyleWithColumns(20)));
1881
1882 // Keep the trailing newline while reflowing.
1883 EXPECT_EQ("// long long long\n"
1884 "// long long\n",
1885 format("// long long long long\n"
1886 "// long\n",
1887 getLLVMStyleWithColumns(20)));
1888
1889 // Break a long line and reflow with a part of the next line.
1890 EXPECT_EQ("// long long long\n"
1891 "// long long\n"
1892 "// long_long",
1893 format("// long long long long\n"
1894 "// long long_long",
1895 getLLVMStyleWithColumns(20)));
1896
1897 // Break but do not reflow if the first word from the next line is too long.
1898 EXPECT_EQ("// long long long\n"
1899 "// long\n"
1900 "// long_long_long\n",
1901 format("// long long long long\n"
1902 "// long_long_long\n",
1903 getLLVMStyleWithColumns(20)));
1904
1905 // Don't break or reflow short lines.
1906 verifyFormat("// long\n"
1907 "// long long long lo\n"
1908 "// long long long lo\n"
1909 "// long",
1910 getLLVMStyleWithColumns(20));
1911
1912 // Keep prefixes and decorations while reflowing.
1913 EXPECT_EQ("/// long long long\n"
1914 "/// long long\n",
1915 format("/// long long long long\n"
1916 "/// long\n",
1917 getLLVMStyleWithColumns(20)));
1918 EXPECT_EQ("//! long long long\n"
1919 "//! long long\n",
1920 format("//! long long long long\n"
1921 "//! long\n",
1922 getLLVMStyleWithColumns(20)));
1923 EXPECT_EQ("/* long long long\n"
1924 " * long long */",
1925 format("/* long long long long\n"
1926 " * long */",
1927 getLLVMStyleWithColumns(20)));
1928
1929 // Don't bring leading whitespace up while reflowing.
1930 EXPECT_EQ("/* long long long\n"
1931 " * long long long\n"
1932 " */",
1933 format("/* long long long long\n"
1934 " * long long\n"
1935 " */",
1936 getLLVMStyleWithColumns(20)));
1937
1938 // Reflow the last line of a block comment with its trailing '*/'.
1939 EXPECT_EQ("/* long long long\n"
1940 " long long */",
1941 format("/* long long long long\n"
1942 " long */",
1943 getLLVMStyleWithColumns(20)));
1944
1945 // Reflow two short lines; keep the postfix of the last one.
1946 EXPECT_EQ("/* long long long\n"
1947 " * long long long */",
1948 format("/* long long long long\n"
1949 " * long\n"
1950 " * long */",
1951 getLLVMStyleWithColumns(20)));
1952
1953 // Put the postfix of the last short reflow line on a newline if it doesn't
1954 // fit.
1955 EXPECT_EQ("/* long long long\n"
1956 " * long long longg\n"
1957 " */",
1958 format("/* long long long long\n"
1959 " * long\n"
1960 " * longg */",
1961 getLLVMStyleWithColumns(20)));
1962
Krasimir Georgievaf1b9622017-01-31 14:31:44 +00001963 // Reflow lines with leading whitespace.
1964 EXPECT_EQ("{\n"
1965 " /*\n"
1966 " * long long long\n"
1967 " * long long long\n"
1968 " * long long long\n"
1969 " */\n"
1970 "}",
1971 format("{\n"
1972 "/*\n"
1973 " * long long long long\n"
1974 " * long\n"
1975 " * long long long long\n"
1976 " */\n"
1977 "}",
1978 getLLVMStyleWithColumns(20)));
1979
Krasimir Georgiev91834222017-01-25 13:58:58 +00001980 // Break single line block comments that are first in the line with ' *'
1981 // decoration.
1982 EXPECT_EQ("/* long long long\n"
1983 " * long */",
1984 format("/* long long long long */", getLLVMStyleWithColumns(20)));
1985
1986 // Break single line block comment that are not first in the line with ' '
1987 // decoration.
1988 EXPECT_EQ("int i; /* long long\n"
1989 " long */",
1990 format("int i; /* long long long */", getLLVMStyleWithColumns(20)));
1991
1992 // Reflow a line that goes just over the column limit.
1993 EXPECT_EQ("// long long long\n"
1994 "// lon long",
1995 format("// long long long lon\n"
1996 "// long",
1997 getLLVMStyleWithColumns(20)));
1998
1999 // Stop reflowing if the next line has a different indentation than the
2000 // previous line.
2001 EXPECT_EQ("// long long long\n"
2002 "// long\n"
2003 "// long long\n"
2004 "// long",
2005 format("// long long long long\n"
2006 "// long long\n"
2007 "// long",
2008 getLLVMStyleWithColumns(20)));
2009
2010 // Reflow into the last part of a really long line that has been broken into
2011 // multiple lines.
2012 EXPECT_EQ("// long long long\n"
2013 "// long long long\n"
2014 "// long long long\n",
2015 format("// long long long long long long long long\n"
2016 "// long\n",
2017 getLLVMStyleWithColumns(20)));
2018
2019 // Break the first line, then reflow the beginning of the second and third
2020 // line up.
2021 EXPECT_EQ("// long long long\n"
2022 "// lon1 lon2 lon2\n"
2023 "// lon2 lon3 lon3",
2024 format("// long long long lon1\n"
2025 "// lon2 lon2 lon2\n"
2026 "// lon3 lon3",
2027 getLLVMStyleWithColumns(20)));
2028
2029 // Reflow the beginning of the second line, then break the rest.
2030 EXPECT_EQ("// long long long\n"
2031 "// lon1 lon2 lon2\n"
2032 "// lon2 lon2 lon2\n"
2033 "// lon3",
2034 format("// long long long lon1\n"
2035 "// lon2 lon2 lon2 lon2 lon2 lon3",
2036 getLLVMStyleWithColumns(20)));
2037
2038 // Shrink the first line, then reflow the second line up.
2039 EXPECT_EQ("// long long long", format("// long long\n"
2040 "// long",
2041 getLLVMStyleWithColumns(20)));
2042
2043 // Don't shrink leading whitespace.
2044 EXPECT_EQ("int i; /// a",
2045 format("int i; /// a", getLLVMStyleWithColumns(20)));
2046
2047 // Shrink trailing whitespace if there is no postfix and reflow.
2048 EXPECT_EQ("// long long long\n"
2049 "// long long",
2050 format("// long long long long \n"
2051 "// long",
2052 getLLVMStyleWithColumns(20)));
2053
2054 // Shrink trailing whitespace to a single one if there is postfix.
2055 EXPECT_EQ("/* long long long */",
2056 format("/* long long long */", getLLVMStyleWithColumns(20)));
2057
2058 // Break a block comment postfix if exceeding the line limit.
2059 EXPECT_EQ("/* long\n"
2060 " */",
2061 format("/* long */", getLLVMStyleWithColumns(20)));
2062
2063 // Reflow indented comments.
2064 EXPECT_EQ("{\n"
2065 " // long long long\n"
2066 " // long long\n"
2067 " int i; /* long lon\n"
2068 " g long\n"
2069 " */\n"
2070 "}",
2071 format("{\n"
2072 " // long long long long\n"
2073 " // long\n"
2074 " int i; /* long lon g\n"
2075 " long */\n"
2076 "}",
2077 getLLVMStyleWithColumns(20)));
2078
2079 // Don't realign trailing comments after reflow has happened.
2080 EXPECT_EQ("// long long long\n"
2081 "// long long\n"
2082 "long i; // long",
2083 format("// long long long long\n"
2084 "// long\n"
2085 "long i; // long",
2086 getLLVMStyleWithColumns(20)));
2087 EXPECT_EQ("// long long long\n"
2088 "// longng long long\n"
2089 "// long lo",
2090 format("// long long long longng\n"
2091 "// long long long\n"
2092 "// lo",
2093 getLLVMStyleWithColumns(20)));
2094
2095 // Reflow lines after a broken line.
2096 EXPECT_EQ("int a; // Trailing\n"
2097 " // comment on\n"
2098 " // 2 or 3\n"
2099 " // lines.\n",
2100 format("int a; // Trailing comment\n"
2101 " // on 2\n"
2102 " // or 3\n"
2103 " // lines.\n",
2104 getLLVMStyleWithColumns(20)));
2105 EXPECT_EQ("/// This long line\n"
2106 "/// gets reflown.\n",
2107 format("/// This long line gets\n"
2108 "/// reflown.\n",
2109 getLLVMStyleWithColumns(20)));
2110 EXPECT_EQ("//! This long line\n"
2111 "//! gets reflown.\n",
2112 format(" //! This long line gets\n"
2113 " //! reflown.\n",
2114 getLLVMStyleWithColumns(20)));
2115 EXPECT_EQ("/* This long line\n"
2116 " * gets reflown.\n"
2117 " */\n",
2118 format("/* This long line gets\n"
2119 " * reflown.\n"
2120 " */\n",
2121 getLLVMStyleWithColumns(20)));
2122
2123 // Reflow after indentation makes a line too long.
2124 EXPECT_EQ("{\n"
2125 " // long long long\n"
2126 " // lo long\n"
2127 "}\n",
2128 format("{\n"
2129 "// long long long lo\n"
2130 "// long\n"
2131 "}\n",
2132 getLLVMStyleWithColumns(20)));
2133
2134 // Break and reflow multiple lines.
2135 EXPECT_EQ("/*\n"
2136 " * Reflow the end of\n"
2137 " * line by 11 22 33\n"
2138 " * 4.\n"
2139 " */\n",
2140 format("/*\n"
2141 " * Reflow the end of line\n"
2142 " * by\n"
2143 " * 11\n"
2144 " * 22\n"
2145 " * 33\n"
2146 " * 4.\n"
2147 " */\n",
2148 getLLVMStyleWithColumns(20)));
2149 EXPECT_EQ("/// First line gets\n"
2150 "/// broken. Second\n"
2151 "/// line gets\n"
2152 "/// reflown and\n"
2153 "/// broken. Third\n"
2154 "/// gets reflown.\n",
2155 format("/// First line gets broken.\n"
2156 "/// Second line gets reflown and broken.\n"
2157 "/// Third gets reflown.\n",
2158 getLLVMStyleWithColumns(20)));
2159 EXPECT_EQ("int i; // first long\n"
2160 " // long snd\n"
2161 " // long.\n",
2162 format("int i; // first long long\n"
2163 " // snd long.\n",
2164 getLLVMStyleWithColumns(20)));
2165 EXPECT_EQ("{\n"
2166 " // first long line\n"
2167 " // line second\n"
2168 " // long line line\n"
2169 " // third long line\n"
2170 " // line\n"
2171 "}\n",
2172 format("{\n"
2173 " // first long line line\n"
2174 " // second long line line\n"
2175 " // third long line line\n"
2176 "}\n",
2177 getLLVMStyleWithColumns(20)));
2178 EXPECT_EQ("int i; /* first line\n"
2179 " * second\n"
2180 " * line third\n"
2181 " * line\n"
2182 " */",
2183 format("int i; /* first line\n"
2184 " * second line\n"
2185 " * third line\n"
2186 " */",
2187 getLLVMStyleWithColumns(20)));
2188
2189 // Reflow the last two lines of a section that starts with a line having
2190 // different indentation.
2191 EXPECT_EQ(
2192 "// long\n"
2193 "// long long long\n"
2194 "// long long",
2195 format("// long\n"
2196 "// long long long long\n"
2197 "// long",
2198 getLLVMStyleWithColumns(20)));
2199
2200 // Keep the block comment endling '*/' while reflowing.
2201 EXPECT_EQ("/* Long long long\n"
2202 " * line short */\n",
2203 format("/* Long long long line\n"
2204 " * short */\n",
2205 getLLVMStyleWithColumns(20)));
2206
2207 // Don't reflow between separate blocks of comments.
2208 EXPECT_EQ("/* First comment\n"
2209 " * block will */\n"
2210 "/* Snd\n"
2211 " */\n",
2212 format("/* First comment block\n"
2213 " * will */\n"
2214 "/* Snd\n"
2215 " */\n",
2216 getLLVMStyleWithColumns(20)));
2217
2218 // Don't reflow across blank comment lines.
2219 EXPECT_EQ("int i; // This long\n"
2220 " // line gets\n"
2221 " // broken.\n"
2222 " // \n"
2223 " // keep.\n",
2224 format("int i; // This long line gets broken.\n"
2225 " // \n"
2226 " // keep.\n",
2227 getLLVMStyleWithColumns(20)));
2228 EXPECT_EQ("{\n"
2229 " /// long long long\n"
2230 " /// long long\n"
2231 " ///\n"
2232 " /// long\n"
2233 "}",
2234 format("{\n"
2235 " /// long long long long\n"
2236 " /// long\n"
2237 " ///\n"
2238 " /// long\n"
2239 "}",
2240 getLLVMStyleWithColumns(20)));
2241 EXPECT_EQ("//! long long long\n"
2242 "//! long\n"
2243 "\n"
2244 "//! long",
2245 format("//! long long long long\n"
2246 "\n"
2247 "//! long",
2248 getLLVMStyleWithColumns(20)));
2249 EXPECT_EQ("/* long long long\n"
2250 " long\n"
2251 "\n"
2252 " long */",
2253 format("/* long long long long\n"
2254 "\n"
2255 " long */",
2256 getLLVMStyleWithColumns(20)));
2257 EXPECT_EQ("/* long long long\n"
2258 " * long\n"
2259 " *\n"
2260 " * long */",
2261 format("/* long long long long\n"
2262 " *\n"
2263 " * long */",
2264 getLLVMStyleWithColumns(20)));
2265
2266 // Don't reflow lines having content that is a single character.
2267 EXPECT_EQ("// long long long\n"
2268 "// long\n"
2269 "// l",
2270 format("// long long long long\n"
2271 "// l",
2272 getLLVMStyleWithColumns(20)));
2273
2274 // Don't reflow lines starting with two punctuation characters.
2275 EXPECT_EQ("// long long long\n"
2276 "// long\n"
2277 "// ... --- ...",
2278 format(
2279 "// long long long long\n"
2280 "// ... --- ...",
2281 getLLVMStyleWithColumns(20)));
Krasimir Georgiev8f62cf72017-01-31 11:38:02 +00002282
2283 // Don't reflow lines starting with '@'.
2284 EXPECT_EQ("// long long long\n"
2285 "// long\n"
2286 "// @param arg",
2287 format("// long long long long\n"
2288 "// @param arg",
2289 getLLVMStyleWithColumns(20)));
2290
Krasimir Georgiev91834222017-01-25 13:58:58 +00002291 // Reflow lines that have a non-punctuation character among their first 2
2292 // characters.
2293 EXPECT_EQ("// long long long\n"
2294 "// long 'long'",
2295 format(
2296 "// long long long long\n"
2297 "// 'long'",
2298 getLLVMStyleWithColumns(20)));
2299
2300 // Don't reflow between separate blocks of comments.
2301 EXPECT_EQ("/* First comment\n"
2302 " * block will */\n"
2303 "/* Snd\n"
2304 " */\n",
2305 format("/* First comment block\n"
2306 " * will */\n"
2307 "/* Snd\n"
2308 " */\n",
2309 getLLVMStyleWithColumns(20)));
2310
2311 // Don't reflow lines having different indentation.
2312 EXPECT_EQ("// long long long\n"
2313 "// long\n"
2314 "// long",
2315 format("// long long long long\n"
2316 "// long",
2317 getLLVMStyleWithColumns(20)));
2318
2319 // Don't break or reflow after implicit string literals.
2320 verifyFormat("#include <t> // l l l\n"
2321 " // l",
2322 getLLVMStyleWithColumns(20));
2323
2324 // Don't break or reflow comments on import lines.
2325 EXPECT_EQ("#include \"t\" /* l l l\n"
2326 " * l */",
2327 format("#include \"t\" /* l l l\n"
2328 " * l */",
2329 getLLVMStyleWithColumns(20)));
2330
2331 // Don't reflow between different trailing comment sections.
2332 EXPECT_EQ("int i; // long long\n"
2333 " // long\n"
2334 "int j; // long long\n"
2335 " // long\n",
2336 format("int i; // long long long\n"
2337 "int j; // long long long\n",
2338 getLLVMStyleWithColumns(20)));
2339
2340 // Don't reflow if the first word on the next line is longer than the
2341 // available space at current line.
2342 EXPECT_EQ("int i; // trigger\n"
2343 " // reflow\n"
2344 " // longsec\n",
2345 format("int i; // trigger reflow\n"
2346 " // longsec\n",
2347 getLLVMStyleWithColumns(20)));
2348
2349 // Keep empty comment lines.
2350 EXPECT_EQ("/**/", format(" /**/", getLLVMStyleWithColumns(20)));
2351 EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
2352 EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
2353 EXPECT_EQ("//", format(" // ", getLLVMStyleWithColumns(20)));
2354 EXPECT_EQ("///", format(" /// ", getLLVMStyleWithColumns(20)));
2355}
2356
Alexander Kornienkof2e02122013-05-24 18:24:24 +00002357TEST_F(FormatTest, IgnoresIf0Contents) {
2358 EXPECT_EQ("#if 0\n"
2359 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
2360 "#endif\n"
2361 "void f() {}",
2362 format("#if 0\n"
2363 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
2364 "#endif\n"
2365 "void f( ) { }"));
2366 EXPECT_EQ("#if false\n"
2367 "void f( ) { }\n"
2368 "#endif\n"
2369 "void g() {}\n",
2370 format("#if false\n"
2371 "void f( ) { }\n"
2372 "#endif\n"
2373 "void g( ) { }\n"));
2374 EXPECT_EQ("enum E {\n"
2375 " One,\n"
2376 " Two,\n"
2377 "#if 0\n"
2378 "Three,\n"
2379 " Four,\n"
2380 "#endif\n"
2381 " Five\n"
2382 "};",
2383 format("enum E {\n"
2384 " One,Two,\n"
2385 "#if 0\n"
2386 "Three,\n"
2387 " Four,\n"
2388 "#endif\n"
2389 " Five};"));
2390 EXPECT_EQ("enum F {\n"
2391 " One,\n"
2392 "#if 1\n"
2393 " Two,\n"
2394 "#if 0\n"
2395 "Three,\n"
2396 " Four,\n"
2397 "#endif\n"
2398 " Five\n"
2399 "#endif\n"
2400 "};",
2401 format("enum F {\n"
2402 "One,\n"
2403 "#if 1\n"
2404 "Two,\n"
2405 "#if 0\n"
2406 "Three,\n"
2407 " Four,\n"
2408 "#endif\n"
2409 "Five\n"
2410 "#endif\n"
2411 "};"));
2412 EXPECT_EQ("enum G {\n"
2413 " One,\n"
2414 "#if 0\n"
2415 "Two,\n"
2416 "#else\n"
2417 " Three,\n"
2418 "#endif\n"
2419 " Four\n"
2420 "};",
2421 format("enum G {\n"
2422 "One,\n"
2423 "#if 0\n"
2424 "Two,\n"
2425 "#else\n"
2426 "Three,\n"
2427 "#endif\n"
2428 "Four\n"
2429 "};"));
2430 EXPECT_EQ("enum H {\n"
2431 " One,\n"
2432 "#if 0\n"
2433 "#ifdef Q\n"
2434 "Two,\n"
2435 "#else\n"
2436 "Three,\n"
2437 "#endif\n"
2438 "#endif\n"
2439 " Four\n"
2440 "};",
2441 format("enum H {\n"
2442 "One,\n"
2443 "#if 0\n"
2444 "#ifdef Q\n"
2445 "Two,\n"
2446 "#else\n"
2447 "Three,\n"
2448 "#endif\n"
2449 "#endif\n"
2450 "Four\n"
2451 "};"));
2452 EXPECT_EQ("enum I {\n"
2453 " One,\n"
2454 "#if /* test */ 0 || 1\n"
2455 "Two,\n"
2456 "Three,\n"
2457 "#endif\n"
2458 " Four\n"
2459 "};",
2460 format("enum I {\n"
2461 "One,\n"
2462 "#if /* test */ 0 || 1\n"
2463 "Two,\n"
2464 "Three,\n"
2465 "#endif\n"
2466 "Four\n"
2467 "};"));
2468 EXPECT_EQ("enum J {\n"
2469 " One,\n"
2470 "#if 0\n"
2471 "#if 0\n"
2472 "Two,\n"
2473 "#else\n"
2474 "Three,\n"
2475 "#endif\n"
2476 "Four,\n"
2477 "#endif\n"
2478 " Five\n"
2479 "};",
2480 format("enum J {\n"
2481 "One,\n"
2482 "#if 0\n"
2483 "#if 0\n"
2484 "Two,\n"
2485 "#else\n"
2486 "Three,\n"
2487 "#endif\n"
2488 "Four,\n"
2489 "#endif\n"
2490 "Five\n"
2491 "};"));
Alexander Kornienkof2e02122013-05-24 18:24:24 +00002492}
2493
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002494//===----------------------------------------------------------------------===//
2495// Tests for classes, namespaces, etc.
2496//===----------------------------------------------------------------------===//
2497
2498TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002499 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002500}
2501
2502TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
2503 verifyFormat("class A {\n"
2504 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00002505 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002506 "protected:\n"
2507 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002508 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002509 "};");
2510 verifyGoogleFormat("class A {\n"
2511 " public:\n"
2512 " protected:\n"
2513 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002514 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002515 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00002516 verifyFormat("class A {\n"
2517 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002518 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00002519 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002520 " void f2() {}\n"
2521 "protected slots:\n"
2522 " void f3() {}\n"
2523 "protected Q_SLOTS:\n"
2524 " void f4() {}\n"
2525 "private slots:\n"
2526 " void f5() {}\n"
2527 "private Q_SLOTS:\n"
2528 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00002529 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002530 " void g1();\n"
2531 "Q_SIGNALS:\n"
2532 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00002533 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00002534
2535 // Don't interpret 'signals' the wrong way.
2536 verifyFormat("signals.set();");
2537 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00002538 verifyFormat("{\n"
2539 " signals.set(); // This needs indentation.\n"
2540 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00002541 verifyFormat("void f() {\n"
2542 "label:\n"
2543 " signals.baz();\n"
2544 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002545}
2546
Alexander Kornienkofd433362013-03-27 17:08:02 +00002547TEST_F(FormatTest, SeparatesLogicalBlocks) {
2548 EXPECT_EQ("class A {\n"
2549 "public:\n"
2550 " void f();\n"
2551 "\n"
2552 "private:\n"
2553 " void g() {}\n"
2554 " // test\n"
2555 "protected:\n"
2556 " int h;\n"
2557 "};",
2558 format("class A {\n"
2559 "public:\n"
2560 "void f();\n"
2561 "private:\n"
2562 "void g() {}\n"
2563 "// test\n"
2564 "protected:\n"
2565 "int h;\n"
2566 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00002567 EXPECT_EQ("class A {\n"
2568 "protected:\n"
2569 "public:\n"
2570 " void f();\n"
2571 "};",
2572 format("class A {\n"
2573 "protected:\n"
2574 "\n"
2575 "public:\n"
2576 "\n"
2577 " void f();\n"
2578 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00002579
2580 // Even ensure proper spacing inside macros.
2581 EXPECT_EQ("#define B \\\n"
2582 " class A { \\\n"
2583 " protected: \\\n"
2584 " public: \\\n"
2585 " void f(); \\\n"
2586 " };",
2587 format("#define B \\\n"
2588 " class A { \\\n"
2589 " protected: \\\n"
2590 " \\\n"
2591 " public: \\\n"
2592 " \\\n"
2593 " void f(); \\\n"
2594 " };",
2595 getGoogleStyle()));
2596 // But don't remove empty lines after macros ending in access specifiers.
2597 EXPECT_EQ("#define A private:\n"
2598 "\n"
2599 "int i;",
2600 format("#define A private:\n"
2601 "\n"
2602 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00002603}
2604
Daniel Jasper83193602013-04-05 17:22:09 +00002605TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002606 verifyFormat("class A : public B {};");
2607 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002608
2609 verifyFormat(
2610 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002611 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00002612 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
2613 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002614 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002615 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002616 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002617 verifyFormat("class AAAAAAAAAAAA : public B,\n"
2618 " public C,\n"
2619 " public D,\n"
2620 " public E,\n"
2621 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002622 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00002623
2624 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002625 " ReallyReallyLongClassName {\n"
2626 " int i;\n"
2627 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00002628 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00002629 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
2630 " aaaaaaaaaaaaaaaa> {};");
2631 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
2632 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
2633 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00002634 verifyFormat("template <class R, class C>\n"
2635 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
2636 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00002637 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00002638}
2639
Manuel Klimek28cacc72013-01-07 18:10:23 +00002640TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002641 verifyFormat("class A {\n} a, b;");
2642 verifyFormat("struct A {\n} a, b;");
2643 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00002644}
2645
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002646TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002647 verifyFormat("enum {\n"
2648 " Zero,\n"
2649 " One = 1,\n"
2650 " Two = One + 1,\n"
2651 " Three = (One + Two),\n"
2652 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2653 " Five = (One, Two, Three, Four, 5)\n"
2654 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002655 verifyGoogleFormat("enum {\n"
2656 " Zero,\n"
2657 " One = 1,\n"
2658 " Two = One + 1,\n"
2659 " Three = (One + Two),\n"
2660 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2661 " Five = (One, Two, Three, Four, 5)\n"
2662 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002663 verifyFormat("enum Enum {};");
2664 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002665 verifyFormat("enum X E {} d;");
2666 verifyFormat("enum __attribute__((...)) E {} d;");
2667 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00002668 verifyFormat("enum {\n"
2669 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002670 "};",
2671 getLLVMStyleWithColumns(30));
2672
2673 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00002674 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002675
2676 EXPECT_EQ("enum KeepEmptyLines {\n"
2677 " ONE,\n"
2678 "\n"
2679 " TWO,\n"
2680 "\n"
2681 " THREE\n"
2682 "}",
2683 format("enum KeepEmptyLines {\n"
2684 " ONE,\n"
2685 "\n"
2686 " TWO,\n"
2687 "\n"
2688 "\n"
2689 " THREE\n"
2690 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00002691 verifyFormat("enum E { // comment\n"
2692 " ONE,\n"
2693 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00002694 "};\n"
2695 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002696 // Not enums.
2697 verifyFormat("enum X f() {\n"
2698 " a();\n"
2699 " return 42;\n"
2700 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00002701 verifyFormat("enum X Type::f() {\n"
2702 " a();\n"
2703 " return 42;\n"
2704 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002705 verifyFormat("enum ::X f() {\n"
2706 " a();\n"
2707 " return 42;\n"
2708 "}");
2709 verifyFormat("enum ns::X f() {\n"
2710 " a();\n"
2711 " return 42;\n"
2712 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002713}
2714
Daniel Jasperb7150872013-08-30 10:10:19 +00002715TEST_F(FormatTest, FormatsEnumsWithErrors) {
2716 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002717 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002718 " Two = 1;\n"
2719 "};");
2720 verifyFormat("namespace n {\n"
2721 "enum Type {\n"
2722 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002723 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002724 " int i;\n"
2725 "}\n"
2726 "void g() {}");
2727}
2728
Daniel Jasper2b41a822013-08-20 12:42:50 +00002729TEST_F(FormatTest, FormatsEnumStruct) {
2730 verifyFormat("enum struct {\n"
2731 " Zero,\n"
2732 " One = 1,\n"
2733 " Two = One + 1,\n"
2734 " Three = (One + Two),\n"
2735 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2736 " Five = (One, Two, Three, Four, 5)\n"
2737 "};");
2738 verifyFormat("enum struct Enum {};");
2739 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002740 verifyFormat("enum struct X E {} d;");
2741 verifyFormat("enum struct __attribute__((...)) E {} d;");
2742 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002743 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
2744}
2745
2746TEST_F(FormatTest, FormatsEnumClass) {
2747 verifyFormat("enum class {\n"
2748 " Zero,\n"
2749 " One = 1,\n"
2750 " Two = One + 1,\n"
2751 " Three = (One + Two),\n"
2752 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2753 " Five = (One, Two, Three, Four, 5)\n"
2754 "};");
2755 verifyFormat("enum class Enum {};");
2756 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002757 verifyFormat("enum class X E {} d;");
2758 verifyFormat("enum class __attribute__((...)) E {} d;");
2759 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002760 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
2761}
2762
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002763TEST_F(FormatTest, FormatsEnumTypes) {
2764 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002765 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002766 " B\n"
2767 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00002768 verifyFormat("enum X : int { A, B };");
2769 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002770}
2771
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002772TEST_F(FormatTest, FormatsNSEnums) {
2773 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
2774 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
2775 " // Information about someDecentlyLongValue.\n"
2776 " someDecentlyLongValue,\n"
2777 " // Information about anotherDecentlyLongValue.\n"
2778 " anotherDecentlyLongValue,\n"
2779 " // Information about aThirdDecentlyLongValue.\n"
2780 " aThirdDecentlyLongValue\n"
2781 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00002782 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
2783 " a = 1,\n"
2784 " b = 2,\n"
2785 " c = 3,\n"
2786 "};");
2787 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
2788 " a = 1,\n"
2789 " b = 2,\n"
2790 " c = 3,\n"
2791 "};");
2792 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
2793 " a = 1,\n"
2794 " b = 2,\n"
2795 " c = 3,\n"
2796 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002797}
2798
Nico Weber7769a902013-01-14 05:49:49 +00002799TEST_F(FormatTest, FormatsBitfields) {
2800 verifyFormat("struct Bitfields {\n"
2801 " unsigned sClass : 8;\n"
2802 " unsigned ValueKind : 2;\n"
2803 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00002804 verifyFormat("struct A {\n"
2805 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
2806 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
2807 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00002808 verifyFormat("struct MyStruct {\n"
2809 " uchar data;\n"
2810 " uchar : 8;\n"
2811 " uchar : 8;\n"
2812 " uchar other;\n"
2813 "};");
Nico Weber7769a902013-01-14 05:49:49 +00002814}
2815
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002816TEST_F(FormatTest, FormatsNamespaces) {
2817 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002818 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002819 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002820 "}");
2821 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002822 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002823 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002824 "}");
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002825 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002826 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002827 "void f() { f(); }\n"
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002828 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002829 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002830 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002831 "void f() { f(); }");
Manuel Klimek046b9302013-02-06 16:08:09 +00002832
2833 // This code is more common than we thought; if we
2834 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002835 // its own line, which is undesirable.
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002836 verifyFormat("namespace {};");
Manuel Klimek046b9302013-02-06 16:08:09 +00002837 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002838 "class A {};\n"
Manuel Klimek046b9302013-02-06 16:08:09 +00002839 "};");
Daniel Jasper251b3c92013-07-01 11:22:57 +00002840
2841 verifyFormat("namespace {\n"
2842 "int SomeVariable = 0; // comment\n"
2843 "} // namespace");
2844 EXPECT_EQ("#ifndef HEADER_GUARD\n"
2845 "#define HEADER_GUARD\n"
2846 "namespace my_namespace {\n"
2847 "int i;\n"
2848 "} // my_namespace\n"
2849 "#endif // HEADER_GUARD",
2850 format("#ifndef HEADER_GUARD\n"
2851 " #define HEADER_GUARD\n"
2852 " namespace my_namespace {\n"
2853 "int i;\n"
2854 "} // my_namespace\n"
2855 "#endif // HEADER_GUARD"));
Daniel Jasper65ee3472013-07-31 23:16:02 +00002856
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00002857 EXPECT_EQ("namespace A::B {\n"
2858 "class C {};\n"
2859 "}",
2860 format("namespace A::B {\n"
2861 "class C {};\n"
2862 "}"));
2863
Daniel Jasper65ee3472013-07-31 23:16:02 +00002864 FormatStyle Style = getLLVMStyle();
2865 Style.NamespaceIndentation = FormatStyle::NI_All;
2866 EXPECT_EQ("namespace out {\n"
2867 " int i;\n"
2868 " namespace in {\n"
2869 " int i;\n"
2870 " } // namespace\n"
2871 "} // namespace",
2872 format("namespace out {\n"
2873 "int i;\n"
2874 "namespace in {\n"
2875 "int i;\n"
2876 "} // namespace\n"
2877 "} // namespace",
2878 Style));
2879
2880 Style.NamespaceIndentation = FormatStyle::NI_Inner;
2881 EXPECT_EQ("namespace out {\n"
2882 "int i;\n"
2883 "namespace in {\n"
2884 " int i;\n"
2885 "} // namespace\n"
2886 "} // namespace",
2887 format("namespace out {\n"
2888 "int i;\n"
2889 "namespace in {\n"
2890 "int i;\n"
2891 "} // namespace\n"
2892 "} // namespace",
2893 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002894}
2895
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002896TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00002897
Daniel Jasper40aacf42013-03-14 13:45:21 +00002898TEST_F(FormatTest, FormatsInlineASM) {
2899 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00002900 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00002901 verifyFormat(
2902 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2903 " \"cpuid\\n\\t\"\n"
2904 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00002905 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00002906 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00002907 EXPECT_EQ(
2908 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002909 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002910 " mov edx,[that] // vtable in edx\n"
2911 " mov eax,methodIndex\n"
2912 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002913 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002914 "}",
2915 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2916 " __asm {\n"
2917 " mov edx,[that] // vtable in edx\n"
2918 " mov eax,methodIndex\n"
2919 " call [edx][eax*4] // stdcall\n"
2920 " }\n"
2921 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00002922 EXPECT_EQ("_asm {\n"
2923 " xor eax, eax;\n"
2924 " cpuid;\n"
2925 "}",
2926 format("_asm {\n"
2927 " xor eax, eax;\n"
2928 " cpuid;\n"
2929 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00002930 verifyFormat("void function() {\n"
2931 " // comment\n"
2932 " asm(\"\");\n"
2933 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00002934 EXPECT_EQ("__asm {\n"
2935 "}\n"
2936 "int i;",
2937 format("__asm {\n"
2938 "}\n"
2939 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00002940}
2941
Nico Weberd5650bd2013-01-07 16:36:17 +00002942TEST_F(FormatTest, FormatTryCatch) {
2943 verifyFormat("try {\n"
2944 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002945 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002946 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002947 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002948 " exit(42);\n"
2949 "}");
2950
2951 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00002952 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002953 " return 5;\n"
2954 "}");
2955 verifyFormat("class A {\n"
2956 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002957 " A() try : a(0) {\n"
2958 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002959 " throw;\n"
2960 " }\n"
2961 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00002962
2963 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002964 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00002965}
2966
Nico Weberfac23712015-02-04 15:26:27 +00002967TEST_F(FormatTest, FormatSEHTryCatch) {
2968 verifyFormat("__try {\n"
2969 " int a = b * c;\n"
2970 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2971 " // Do nothing.\n"
2972 "}");
2973
2974 verifyFormat("__try {\n"
2975 " int a = b * c;\n"
2976 "} __finally {\n"
2977 " // Do nothing.\n"
2978 "}");
2979
2980 verifyFormat("DEBUG({\n"
2981 " __try {\n"
2982 " } __finally {\n"
2983 " }\n"
2984 "});\n");
2985}
2986
Daniel Jasper04a71a42014-05-08 11:58:24 +00002987TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2988 verifyFormat("try {\n"
2989 " f();\n"
2990 "} catch {\n"
2991 " g();\n"
2992 "}");
2993 verifyFormat("try {\n"
2994 " f();\n"
2995 "} catch (A a) MACRO(x) {\n"
2996 " g();\n"
2997 "} catch (B b) MACRO(x) {\n"
2998 " g();\n"
2999 "}");
3000}
3001
3002TEST_F(FormatTest, FormatTryCatchBraceStyles) {
3003 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00003004 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
3005 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00003006 Style.BreakBeforeBraces = BraceStyle;
3007 verifyFormat("try {\n"
3008 " // something\n"
3009 "} catch (...) {\n"
3010 " // something\n"
3011 "}",
3012 Style);
3013 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00003014 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
3015 verifyFormat("try {\n"
3016 " // something\n"
3017 "}\n"
3018 "catch (...) {\n"
3019 " // something\n"
3020 "}",
3021 Style);
Nico Weberfac23712015-02-04 15:26:27 +00003022 verifyFormat("__try {\n"
3023 " // something\n"
3024 "}\n"
3025 "__finally {\n"
3026 " // something\n"
3027 "}",
3028 Style);
Nico Weber33381f52015-02-07 01:57:32 +00003029 verifyFormat("@try {\n"
3030 " // something\n"
3031 "}\n"
3032 "@finally {\n"
3033 " // something\n"
3034 "}",
3035 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00003036 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3037 verifyFormat("try\n"
3038 "{\n"
3039 " // something\n"
3040 "}\n"
3041 "catch (...)\n"
3042 "{\n"
3043 " // something\n"
3044 "}",
3045 Style);
3046 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
3047 verifyFormat("try\n"
3048 " {\n"
3049 " // something\n"
3050 " }\n"
3051 "catch (...)\n"
3052 " {\n"
3053 " // something\n"
3054 " }",
3055 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00003056 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
3057 Style.BraceWrapping.BeforeCatch = true;
3058 verifyFormat("try {\n"
3059 " // something\n"
3060 "}\n"
3061 "catch (...) {\n"
3062 " // something\n"
3063 "}",
3064 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00003065}
3066
Daniel Jaspere25509f2012-12-17 11:29:41 +00003067TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003068 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00003069
Daniel Jaspera44991332015-04-29 13:06:49 +00003070 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
3071 " 100000000, "
3072 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00003073
Daniel Jasper473c62c2013-05-17 09:35:01 +00003074 // Here, everything other than the "}" would fit on a line.
3075 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003076 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00003077 EXPECT_EQ("S s = {a,\n"
3078 "\n"
3079 " b};",
3080 format("S s = {\n"
3081 " a,\n"
3082 "\n"
3083 " b\n"
3084 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00003085
3086 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
3087 // line. However, the formatting looks a bit off and this probably doesn't
3088 // happen often in practice.
3089 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003090 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00003091 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00003092}
3093
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003094TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003095 verifyFormat("const struct A a = {.a = 1, .b = 2};");
3096 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
3097 " .bbbbbbbbbb = 2,\n"
3098 " .cccccccccc = 3,\n"
3099 " .dddddddddd = 4,\n"
3100 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003101 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003102 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
3103 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
3104 " .ccccccccccccccccccccccccccc = 3,\n"
3105 " .ddddddddddddddddddddddddddd = 4,\n"
3106 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003107
3108 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
3109}
3110
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003111TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003112 verifyFormat("static A x = {{{}}};\n");
3113 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
3114 " {init1, init2, init3, init4}}};",
3115 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00003116
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003117 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003118 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
3119 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
3120 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
3121 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00003122 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00003123 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
3124 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
3125 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00003126 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
3127 " {rect.fRight - rect.fLeft, rect.fBottom - "
3128 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003129
Daniel Jasper8a8ce242013-01-31 14:59:26 +00003130 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00003131 "SomeArrayOfSomeType a = {\n"
3132 " {{1, 2, 3},\n"
3133 " {1, 2, 3},\n"
3134 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
3135 " 333333333333333333333333333333},\n"
3136 " {1, 2, 3},\n"
3137 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00003138 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00003139 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00003140 " {{1, 2, 3}},\n"
3141 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00003142 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
3143 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00003144 " {{1, 2, 3}},\n"
3145 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00003146
Daniel Jaspera44991332015-04-29 13:06:49 +00003147 verifyFormat("struct {\n"
3148 " unsigned bit;\n"
3149 " const char *const name;\n"
3150 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
3151 " {kOsWin, \"Windows\"},\n"
3152 " {kOsLinux, \"Linux\"},\n"
3153 " {kOsCrOS, \"Chrome OS\"}};");
3154 verifyFormat("struct {\n"
3155 " unsigned bit;\n"
3156 " const char *const name;\n"
3157 "} kBitsToOs[] = {\n"
3158 " {kOsMac, \"Mac\"},\n"
3159 " {kOsWin, \"Windows\"},\n"
3160 " {kOsLinux, \"Linux\"},\n"
3161 " {kOsCrOS, \"Chrome OS\"},\n"
3162 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003163}
3164
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003165TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
3166 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3167 " \\\n"
3168 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
3169}
3170
Daniel Jasperda16db32013-01-07 10:48:50 +00003171TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00003172 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
3173 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00003174
3175 // Do break defaulted and deleted functions.
3176 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
3177 " default;",
3178 getLLVMStyleWithColumns(40));
3179 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
3180 " delete;",
3181 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00003182}
3183
3184TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
3185 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
3186 getLLVMStyleWithColumns(40));
3187 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
3188 getLLVMStyleWithColumns(40));
3189 EXPECT_EQ("#define Q \\\n"
3190 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
3191 " \"aaaaaaaa.cpp\"",
3192 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
3193 getLLVMStyleWithColumns(40)));
3194}
3195
3196TEST_F(FormatTest, UnderstandsLinePPDirective) {
3197 EXPECT_EQ("# 123 \"A string literal\"",
3198 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00003199}
3200
Manuel Klimek591b5802013-01-31 15:58:48 +00003201TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00003202 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00003203 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003204}
3205
3206TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
3207 EXPECT_EQ("#line 42 \"test\"\n",
3208 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003209 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
3210 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003211}
3212
3213TEST_F(FormatTest, EndOfFileEndsPPDirective) {
3214 EXPECT_EQ("#line 42 \"test\"",
3215 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003216 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003217}
3218
Daniel Jasper877615c2013-10-11 19:45:02 +00003219TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
3220 verifyFormat("#define A \\x20");
3221 verifyFormat("#define A \\ x20");
3222 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
3223 verifyFormat("#define A ''");
3224 verifyFormat("#define A ''qqq");
3225 verifyFormat("#define A `qqq");
3226 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00003227 EXPECT_EQ("const char *c = STRINGIFY(\n"
3228 "\\na : b);",
3229 format("const char * c = STRINGIFY(\n"
3230 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00003231
3232 verifyFormat("a\r\\");
3233 verifyFormat("a\v\\");
3234 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00003235}
3236
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003237TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003238 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
3239 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003240 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003241 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00003242 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00003243
3244 verifyFormat("#define A A\n#define A A");
3245 verifyFormat("#define A(X) A\n#define A A");
3246
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003247 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
3248 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003249}
3250
3251TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00003252 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003253 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003254 "#define A( \\\n"
3255 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003256 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00003257 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00003258 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003259 " #include \"a.h\"\n"
3260 "#define A(A,\\\n"
3261 " B)\n"
3262 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00003263 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003264 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003265}
3266
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003267TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00003268
3269TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
3270 EXPECT_EQ("#define A \\\n"
3271 " c; \\\n"
3272 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003273 "f;",
3274 format("#define A c; e;\n"
3275 "f;",
3276 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00003277}
3278
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003279TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00003280
Manuel Klimek1abf7892013-01-04 23:34:14 +00003281TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00003282 EXPECT_EQ("int x,\n"
3283 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003284 " y;",
3285 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00003286}
3287
Manuel Klimek09e07972013-01-05 21:34:55 +00003288TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00003289 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00003290 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00003291 verifyFormat("#define A \\\n"
3292 " { \\\n"
3293 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003294 " }",
3295 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00003296
3297 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003298 " void function##X()",
3299 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00003300
3301 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003302 " void a##b##c()",
3303 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00003304
Daniel Jasper39825ea2013-01-14 15:40:57 +00003305 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00003306}
3307
Manuel Klimekd053c5b2013-01-23 14:37:36 +00003308TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00003309 EXPECT_EQ("#define A (x)", format("#define A (x)"));
3310 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00003311}
3312
Manuel Klimek0c137952013-02-11 12:33:24 +00003313TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
3314 EXPECT_EQ("#define A b;", format("#define A \\\n"
3315 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003316 " b;",
3317 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003318 EXPECT_EQ("#define A \\\n"
3319 " \\\n"
3320 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003321 " b;",
3322 format("#define A \\\n"
3323 " \\\n"
3324 " a; \\\n"
3325 " b;",
3326 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003327 EXPECT_EQ("#define A \\\n"
3328 " a; \\\n"
3329 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003330 " b;",
3331 format("#define A \\\n"
3332 " a; \\\n"
3333 " \\\n"
3334 " b;",
3335 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003336}
3337
Daniel Jasper00475962013-02-19 17:14:38 +00003338TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003339 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00003340 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00003341 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00003342 " case 2\n",
3343 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00003344 verifyFormat("#define MACRO(a) \\\n"
3345 " if (a) \\\n"
3346 " f(); \\\n"
3347 " else \\\n"
3348 " g()",
3349 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00003350 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003351 verifyIncompleteFormat("#define STR(x) #x\n"
3352 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00003353 verifyFormat("#pragma omp threadprivate( \\\n"
3354 " y)), // expected-warning",
3355 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00003356 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00003357 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003358 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00003359 "#define b \\\n"
3360 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003361 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003362 "a",
3363 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00003364 verifyFormat("#define A \\\n"
3365 " { \\\n"
3366 " {\n"
3367 "#define B \\\n"
3368 " } \\\n"
3369 " }",
3370 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00003371 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00003372 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00003373 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00003374 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00003375}
3376
Daniel Jasper40e19212013-05-29 13:16:10 +00003377TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
3378 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
3379 EXPECT_EQ("class A : public QObject {\n"
3380 " Q_OBJECT\n"
3381 "\n"
3382 " A() {}\n"
3383 "};",
3384 format("class A : public QObject {\n"
3385 " Q_OBJECT\n"
3386 "\n"
3387 " A() {\n}\n"
3388 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00003389 EXPECT_EQ("MACRO\n"
3390 "/*static*/ int i;",
3391 format("MACRO\n"
3392 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00003393 EXPECT_EQ("SOME_MACRO\n"
3394 "namespace {\n"
3395 "void f();\n"
3396 "}",
3397 format("SOME_MACRO\n"
3398 " namespace {\n"
3399 "void f( );\n"
3400 "}"));
Daniel Jasper40e19212013-05-29 13:16:10 +00003401 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00003402 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
3403 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00003404 // Only if everything is upper case.
3405 EXPECT_EQ("class A : public QObject {\n"
3406 " Q_Object A() {}\n"
3407 "};",
3408 format("class A : public QObject {\n"
3409 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00003410 " A() {\n}\n"
3411 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00003412
3413 // Only if the next line can actually start an unwrapped line.
3414 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
3415 format("SOME_WEIRD_LOG_MACRO\n"
3416 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00003417
3418 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00003419 "(n, buffers))\n",
3420 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00003421}
3422
Alexander Kornienkode644272013-04-08 22:16:06 +00003423TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
3424 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3425 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3426 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003427 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00003428 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3429 "int *createScopDetectionPass() { return 0; }",
3430 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3431 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3432 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
3433 " class X {};\n"
3434 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3435 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003436 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
3437 // braces, so that inner block is indented one level more.
3438 EXPECT_EQ("int q() {\n"
3439 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3440 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3441 " IPC_END_MESSAGE_MAP()\n"
3442 "}",
3443 format("int q() {\n"
3444 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3445 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3446 " IPC_END_MESSAGE_MAP()\n"
3447 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00003448
Daniel Jasper352dae12014-01-03 11:50:46 +00003449 // Same inside macros.
3450 EXPECT_EQ("#define LIST(L) \\\n"
3451 " L(A) \\\n"
3452 " L(B) \\\n"
3453 " L(C)",
3454 format("#define LIST(L) \\\n"
3455 " L(A) \\\n"
3456 " L(B) \\\n"
3457 " L(C)",
3458 getGoogleStyle()));
3459
Daniel Jasper545c6522013-09-17 09:26:07 +00003460 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003461 EXPECT_EQ("int q() {\n"
3462 " f(x);\n"
3463 " f(x) {}\n"
3464 " f(x)->g();\n"
3465 " f(x)->*g();\n"
3466 " f(x).g();\n"
3467 " f(x) = x;\n"
3468 " f(x) += x;\n"
3469 " f(x) -= x;\n"
3470 " f(x) *= x;\n"
3471 " f(x) /= x;\n"
3472 " f(x) %= x;\n"
3473 " f(x) &= x;\n"
3474 " f(x) |= x;\n"
3475 " f(x) ^= x;\n"
3476 " f(x) >>= x;\n"
3477 " f(x) <<= x;\n"
3478 " f(x)[y].z();\n"
3479 " LOG(INFO) << x;\n"
3480 " ifstream(x) >> x;\n"
3481 "}\n",
3482 format("int q() {\n"
3483 " f(x)\n;\n"
3484 " f(x)\n {}\n"
3485 " f(x)\n->g();\n"
3486 " f(x)\n->*g();\n"
3487 " f(x)\n.g();\n"
3488 " f(x)\n = x;\n"
3489 " f(x)\n += x;\n"
3490 " f(x)\n -= x;\n"
3491 " f(x)\n *= x;\n"
3492 " f(x)\n /= x;\n"
3493 " f(x)\n %= x;\n"
3494 " f(x)\n &= x;\n"
3495 " f(x)\n |= x;\n"
3496 " f(x)\n ^= x;\n"
3497 " f(x)\n >>= x;\n"
3498 " f(x)\n <<= x;\n"
3499 " f(x)\n[y].z();\n"
3500 " LOG(INFO)\n << x;\n"
3501 " ifstream(x)\n >> x;\n"
3502 "}\n"));
3503 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003504 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003505 " if (1) {\n"
3506 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003507 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003508 " while (1) {\n"
3509 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003510 " F(x)\n"
3511 " G(x);\n"
3512 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003513 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003514 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003515 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003516 " }\n"
3517 "}\n",
3518 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003519 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003520 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003521 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003522 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003523 "F(x)\n"
3524 "G(x);\n"
3525 "F(x)\n"
3526 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003527 "}\n"));
3528 EXPECT_EQ("class A {\n"
3529 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00003530 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003531 " A(X x)\n" // FIXME: function-level try blocks are broken.
3532 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003533 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003534 " }\n"
3535 "};",
3536 format("class A {\n"
3537 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00003538 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003539 " A(X x)\n"
3540 " try : t(0) {} catch (...) {}\n"
3541 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00003542 EXPECT_EQ("class SomeClass {\n"
3543 "public:\n"
3544 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3545 "};",
3546 format("class SomeClass {\n"
3547 "public:\n"
3548 " SomeClass()\n"
3549 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3550 "};"));
3551 EXPECT_EQ("class SomeClass {\n"
3552 "public:\n"
3553 " SomeClass()\n"
3554 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3555 "};",
3556 format("class SomeClass {\n"
3557 "public:\n"
3558 " SomeClass()\n"
3559 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3560 "};",
3561 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00003562
3563 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00003564}
3565
Manuel Klimek4fe43002013-05-22 12:51:29 +00003566TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
3567 verifyFormat("#define A \\\n"
3568 " f({ \\\n"
3569 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003570 " });",
3571 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00003572}
3573
Manuel Klimekef2cfb12013-01-05 22:14:16 +00003574TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
3575 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
3576}
3577
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003578TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003579 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003580}
3581
Manuel Klimek1058d982013-01-06 20:07:31 +00003582TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3583 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
3584 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3585 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
3586 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3587}
Manuel Klimek1abf7892013-01-04 23:34:14 +00003588
Daniel Jaspere2408e32015-05-06 11:16:43 +00003589TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003590 EXPECT_EQ(
3591 "#define A \\\n int i; \\\n int j;",
3592 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003593 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00003594 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003595 EXPECT_EQ("/* \\ \\ \\\n*/", format("\\\n/* \\ \\ \\\n*/"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00003596 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003597}
3598
Alexander Kornienko00691cf2015-01-12 13:11:12 +00003599TEST_F(FormatTest, DontCrashOnBlockComments) {
3600 EXPECT_EQ(
3601 "int xxxxxxxxx; /* "
3602 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\n"
3603 "zzzzzz\n"
3604 "0*/",
3605 format("int xxxxxxxxx; /* "
3606 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzz\n"
3607 "0*/"));
3608}
3609
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003610TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3611 verifyFormat("#define A \\\n"
3612 " int v( \\\n"
3613 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003614 " int i;",
3615 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003616}
3617
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003618TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00003619 EXPECT_EQ(
3620 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3621 " \\\n"
3622 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3623 "\n"
3624 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3625 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3626 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
3627 "\\\n"
3628 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3629 " \n"
3630 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3631 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003632}
3633
Manuel Klimek52b15152013-01-09 15:25:02 +00003634TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3635 EXPECT_EQ("int\n"
3636 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003637 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003638 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003639 verifyFormat("functionCallTo(\n"
3640 " someOtherFunction(\n"
3641 " withSomeParameters, whichInSequence,\n"
3642 " areLongerThanALine(andAnotherCall,\n"
3643 "#define A B\n"
3644 " withMoreParamters,\n"
3645 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003646 " andMoreParameters),\n"
3647 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003648 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00003649 verifyFormat("Foo::Foo()\n"
3650 "#ifdef BAR\n"
3651 " : baz(0)\n"
3652 "#endif\n"
3653 "{\n"
3654 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00003655 verifyFormat("void f() {\n"
3656 " if (true)\n"
3657 "#ifdef A\n"
3658 " f(42);\n"
3659 " x();\n"
3660 "#else\n"
3661 " g();\n"
3662 " x();\n"
3663 "#endif\n"
3664 "}");
3665 verifyFormat("void f(param1, param2,\n"
3666 " param3,\n"
3667 "#ifdef A\n"
3668 " param4(param5,\n"
3669 "#ifdef A1\n"
3670 " param6,\n"
3671 "#ifdef A2\n"
3672 " param7),\n"
3673 "#else\n"
3674 " param8),\n"
3675 " param9,\n"
3676 "#endif\n"
3677 " param10,\n"
3678 "#endif\n"
3679 " param11)\n"
3680 "#else\n"
3681 " param12)\n"
3682 "#endif\n"
3683 "{\n"
3684 " x();\n"
3685 "}",
3686 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00003687 verifyFormat("#if 1\n"
3688 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003689 verifyFormat("#if 1\n"
3690 "#endif\n"
3691 "#if 1\n"
3692 "#else\n"
3693 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00003694 verifyFormat("DEBUG({\n"
3695 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3696 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3697 "});\n"
3698 "#if a\n"
3699 "#else\n"
3700 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00003701
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003702 verifyIncompleteFormat("void f(\n"
3703 "#if A\n"
3704 " );\n"
3705 "#else\n"
3706 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00003707}
3708
Manuel Klimek14bd9172014-01-29 08:49:02 +00003709TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3710 verifyFormat("#endif\n"
3711 "#if B");
3712}
3713
Manuel Klimek88033d72013-10-21 08:11:15 +00003714TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3715 FormatStyle SingleLine = getLLVMStyle();
3716 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00003717 verifyFormat("#if 0\n"
3718 "#elif 1\n"
3719 "#endif\n"
3720 "void foo() {\n"
3721 " if (test) foo2();\n"
3722 "}",
3723 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00003724}
3725
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003726TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00003727 verifyFormat("functionCall({ int i; });");
3728 verifyFormat("functionCall({\n"
3729 " int i;\n"
3730 " int j;\n"
3731 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00003732 verifyFormat("functionCall(\n"
3733 " {\n"
3734 " int i;\n"
3735 " int j;\n"
3736 " },\n"
3737 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00003738 verifyFormat("functionA(functionB({\n"
3739 " int i;\n"
3740 " int j;\n"
3741 " }),\n"
3742 " aaaa, bbbb, cccc);");
3743 verifyFormat("functionCall(\n"
3744 " {\n"
3745 " int i;\n"
3746 " int j;\n"
3747 " },\n"
3748 " aaaa, bbbb, // comment\n"
3749 " cccc);");
3750 verifyFormat("functionA(functionB({\n"
3751 " int i;\n"
3752 " int j;\n"
3753 " }),\n"
3754 " aaaa, bbbb, // comment\n"
3755 " cccc);");
3756 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3757 verifyFormat("functionCall(aaaa, bbbb, {\n"
3758 " int i;\n"
3759 " int j;\n"
3760 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00003761 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00003762 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00003763 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003764 " int i; // break\n"
3765 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00003766 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3767 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003768 verifyFormat("DEBUG({\n"
3769 " if (a)\n"
3770 " f();\n"
3771 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003772}
3773
3774TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003775 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003776 "int i;",
3777 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003778}
3779
3780TEST_F(FormatTest, LayoutNestedBlocks) {
3781 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3782 " struct s {\n"
3783 " int i;\n"
3784 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003785 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003786 " for (int i = 0; i < 10; ++i)\n"
3787 " return;\n"
3788 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003789 verifyFormat("call(parameter, {\n"
3790 " something();\n"
3791 " // Comment using all columns.\n"
3792 " somethingelse();\n"
3793 "});",
3794 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00003795 verifyFormat("DEBUG( //\n"
3796 " { f(); }, a);");
3797 verifyFormat("DEBUG( //\n"
3798 " {\n"
3799 " f(); //\n"
3800 " },\n"
3801 " a);");
3802
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003803 EXPECT_EQ("call(parameter, {\n"
3804 " something();\n"
3805 " // Comment too\n"
3806 " // looooooooooong.\n"
3807 " somethingElse();\n"
3808 "});",
3809 format("call(parameter, {\n"
3810 " something();\n"
3811 " // Comment too looooooooooong.\n"
3812 " somethingElse();\n"
3813 "});",
3814 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003815 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003816 EXPECT_EQ("DEBUG({ // comment\n"
3817 " int i;\n"
3818 "});",
3819 format("DEBUG({ // comment\n"
3820 "int i;\n"
3821 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003822 EXPECT_EQ("DEBUG({\n"
3823 " int i;\n"
3824 "\n"
3825 " // comment\n"
3826 " int j;\n"
3827 "});",
3828 format("DEBUG({\n"
3829 " int i;\n"
3830 "\n"
3831 " // comment\n"
3832 " int j;\n"
3833 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003834
3835 verifyFormat("DEBUG({\n"
3836 " if (a)\n"
3837 " return;\n"
3838 "});");
3839 verifyGoogleFormat("DEBUG({\n"
3840 " if (a) return;\n"
3841 "});");
3842 FormatStyle Style = getGoogleStyle();
3843 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003844 verifyFormat("Debug(aaaaa,\n"
3845 " {\n"
3846 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3847 " },\n"
3848 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003849 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003850
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003851 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3852
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003853 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003854}
3855
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003856TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3857 EXPECT_EQ("#define MACRO() \\\n"
3858 " Debug(aaa, /* force line break */ \\\n"
3859 " { \\\n"
3860 " int i; \\\n"
3861 " int j; \\\n"
3862 " })",
3863 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3864 " { int i; int j; })",
3865 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003866
3867 EXPECT_EQ("#define A \\\n"
3868 " [] { \\\n"
3869 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3870 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3871 " }",
3872 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3873 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3874 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003875}
3876
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003877TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3878 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003879 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003880 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003881}
3882
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003883TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3884 FormatStyle Style = getLLVMStyle();
3885 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3886 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3887 verifyFormat("FOO_BEGIN\n"
3888 " FOO_ENTRY\n"
3889 "FOO_END", Style);
3890 verifyFormat("FOO_BEGIN\n"
3891 " NESTED_FOO_BEGIN\n"
3892 " NESTED_FOO_ENTRY\n"
3893 " NESTED_FOO_END\n"
3894 "FOO_END", Style);
3895 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3896 " int x;\n"
3897 " x = 1;\n"
3898 "FOO_END(Baz)", Style);
3899}
3900
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003901//===----------------------------------------------------------------------===//
3902// Line break tests.
3903//===----------------------------------------------------------------------===//
3904
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003905TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003906 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003907 "void f() {\n"
3908 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3909 " parameter, parameter, parameter)),\n"
3910 " SecondLongCall(parameter));\n"
3911 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003912 verifyFormat(
3913 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3914 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3915 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3916 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3917 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003918 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3919 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3920 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3921 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003922 verifyFormat(
3923 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3924 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3925 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3926 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003927 verifyFormat("int a = bbbb && ccc &&\n"
3928 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003929 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003930 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003931}
3932
Daniel Jasperd69fc772013-05-08 14:12:04 +00003933TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3934 verifyFormat(
3935 "bool aaaaaaa =\n"
3936 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3937 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003938 verifyFormat(
3939 "bool aaaaaaa =\n"
3940 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3941 " bbbbbbbb();");
3942
Daniel Jasperd69fc772013-05-08 14:12:04 +00003943 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3944 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3945 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003946 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3947 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3948 " ccccccccc == ddddddddddd;");
3949 verifyFormat(
3950 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3951 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3952 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003953
3954 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3955 " aaaaaa) &&\n"
3956 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003957 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3958 " aaaaaa) >>\n"
3959 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003960 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003961 " SourceMgr.getSpellingColumnNumber(\n"
3962 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3963 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003964
Daniel Jasper68d888c2013-06-03 08:42:05 +00003965 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3966 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3967 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003968 verifyFormat("b = a &&\n"
3969 " // Comment\n"
3970 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003971
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003972 // If the LHS of a comparison is not a binary expression itself, the
3973 // additional linebreak confuses many people.
3974 verifyFormat(
3975 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3976 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3977 "}");
3978 verifyFormat(
3979 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3980 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3981 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003982 verifyFormat(
3983 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3984 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3985 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003986 // Even explicit parentheses stress the precedence enough to make the
3987 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003988 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3989 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3990 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003991 // This cases is borderline, but with the indentation it is still readable.
3992 verifyFormat(
3993 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3994 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3995 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3996 "}",
3997 getLLVMStyleWithColumns(75));
3998
3999 // If the LHS is a binary expression, we should still use the additional break
4000 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00004001 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4002 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4003 " 5) {\n"
4004 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00004005
Daniel Jasper571f1af2013-05-14 20:39:56 +00004006 FormatStyle OnePerLine = getLLVMStyle();
4007 OnePerLine.BinPackParameters = false;
4008 verifyFormat(
4009 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4010 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4011 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
4012 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00004013
4014 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
4015 " .aaa(aaaaaaaaaaaaa) *\n"
4016 " aaaaaaa +\n"
4017 " aaaaaaa;",
4018 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00004019}
4020
Daniel Jasper6bee6822013-04-08 20:33:42 +00004021TEST_F(FormatTest, ExpressionIndentation) {
4022 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4023 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4024 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4025 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4026 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4027 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
4028 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4029 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
4030 " ccccccccccccccccccccccccccccccccccccccccc;");
4031 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4032 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4033 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4034 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4035 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4036 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4037 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4038 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4039 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4040 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4041 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4042 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00004043 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00004044 "} else if (aaaaa &&\n"
4045 " bbbbb > // break\n"
4046 " ccccc) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00004047 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00004048
4049 // Presence of a trailing comment used to change indentation of b.
4050 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
4051 " b;\n"
4052 "return aaaaaaaaaaaaaaaaaaa +\n"
4053 " b; //",
4054 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00004055}
4056
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004057TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
4058 // Not sure what the best system is here. Like this, the LHS can be found
4059 // immediately above an operator (everything with the same or a higher
4060 // indent). The RHS is aligned right of the operator and so compasses
4061 // everything until something with the same indent as the operator is found.
4062 // FIXME: Is this a good system?
4063 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00004064 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004065 verifyFormat(
4066 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004067 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4068 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4069 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4070 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4071 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004072 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004073 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4074 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004075 Style);
4076 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004077 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4078 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004079 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4080 Style);
4081 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004082 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4083 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004084 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4085 Style);
4086 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4087 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004088 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4089 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004090 Style);
4091 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004092 "} else if (aaaaa\n"
4093 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004094 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004095 "}",
4096 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00004097 verifyFormat("return (a)\n"
4098 " // comment\n"
4099 " + b;",
4100 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004101 verifyFormat(
4102 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4103 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4104 " + cc;",
4105 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00004106
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00004107 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4108 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4109 Style);
4110
Daniel Jasper9e5ede02013-11-08 19:56:28 +00004111 // Forced by comments.
4112 verifyFormat(
4113 "unsigned ContentSize =\n"
4114 " sizeof(int16_t) // DWARF ARange version number\n"
4115 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4116 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
4117 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00004118
4119 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
4120 " == boost::fusion::at_c<1>(iiii).second;",
4121 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00004122
4123 Style.ColumnLimit = 60;
4124 verifyFormat("zzzzzzzzzz\n"
4125 " = bbbbbbbbbbbbbbbbb\n"
4126 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
4127 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004128}
4129
Daniel Jasper3219e432014-12-02 13:24:51 +00004130TEST_F(FormatTest, NoOperandAlignment) {
4131 FormatStyle Style = getLLVMStyle();
4132 Style.AlignOperands = false;
4133 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00004134 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4135 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4136 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4137 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4138 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4139 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4140 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4141 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4142 " > ccccccccccccccccccccccccccccccccccccccccc;",
4143 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004144
4145 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4146 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4147 " + cc;",
4148 Style);
4149 verifyFormat("int a = aa\n"
4150 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4151 " * cccccccccccccccccccccccccccccccccccc;",
4152 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00004153
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004154 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00004155 verifyFormat("return (a > b\n"
4156 " // comment1\n"
4157 " // comment2\n"
4158 " || c);",
4159 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004160}
4161
Daniel Jasperac043c92014-09-15 11:11:00 +00004162TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
4163 FormatStyle Style = getLLVMStyle();
4164 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4165 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4166 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00004167 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4168 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00004169}
4170
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004171TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004172 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004173 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
4174 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004175 verifyFormat("Constructor()\n"
4176 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004177 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004178 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004179 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004180 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004181
Daniel Jasper7b259cd2015-08-27 11:59:31 +00004182 verifyFormat("template <typename T>\n"
4183 "Constructor() : Initializer(FitsOnTheLine) {}",
4184 getLLVMStyleWithColumns(45));
4185
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004186 verifyFormat(
4187 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004188 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004189
4190 verifyFormat(
4191 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004192 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004193 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004194 verifyFormat(
4195 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004196 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004197 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00004198 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4199 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4200 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004201
4202 verifyFormat("Constructor()\n"
4203 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4204 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4205 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004206 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004207
Daniel Jasper65585ed2013-01-28 13:31:35 +00004208 verifyFormat("Constructor()\n"
4209 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004210 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00004211
Daniel Jasper62e68172013-02-25 15:59:54 +00004212 verifyFormat("Constructor(int Parameter = 0)\n"
4213 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4214 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00004215 verifyFormat("Constructor()\n"
4216 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4217 "}",
4218 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00004219 verifyFormat("Constructor()\n"
4220 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4221 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00004222
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004223 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00004224 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004225 verifyFormat("Constructor()\n"
4226 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4227 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
4228 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004229
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004230 FormatStyle OnePerLine = getLLVMStyle();
4231 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00004232 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004233 verifyFormat("SomeClass::Constructor()\n"
4234 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4235 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004236 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004237 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004238 verifyFormat("SomeClass::Constructor()\n"
4239 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4240 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004241 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004242 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004243 verifyFormat("MyClass::MyClass(int var)\n"
4244 " : some_var_(var), // 4 space indent\n"
4245 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004246 "}",
4247 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00004248 verifyFormat("Constructor()\n"
4249 " : aaaaa(aaaaaa),\n"
4250 " aaaaa(aaaaaa),\n"
4251 " aaaaa(aaaaaa),\n"
4252 " aaaaa(aaaaaa),\n"
4253 " aaaaa(aaaaaa) {}",
4254 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00004255 verifyFormat("Constructor()\n"
4256 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4257 " aaaaaaaaaaaaaaaaaaaaaa) {}",
4258 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00004259 OnePerLine.BinPackParameters = false;
4260 verifyFormat(
4261 "Constructor()\n"
4262 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4263 " aaaaaaaaaaa().aaa(),\n"
4264 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4265 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00004266 OnePerLine.ColumnLimit = 60;
4267 verifyFormat("Constructor()\n"
4268 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
4269 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4270 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00004271
4272 EXPECT_EQ("Constructor()\n"
4273 " : // Comment forcing unwanted break.\n"
4274 " aaaa(aaaa) {}",
4275 format("Constructor() :\n"
4276 " // Comment forcing unwanted break.\n"
4277 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004278}
4279
4280TEST_F(FormatTest, MemoizationTests) {
4281 // This breaks if the memoization lookup does not take \c Indent and
4282 // \c LastSpace into account.
4283 verifyFormat(
4284 "extern CFRunLoopTimerRef\n"
4285 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
4286 " CFTimeInterval interval, CFOptionFlags flags,\n"
4287 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00004288 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004289
4290 // Deep nesting somewhat works around our memoization.
4291 verifyFormat(
4292 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4293 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4294 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4295 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4296 " aaaaa())))))))))))))))))))))))))))))))))))))));",
4297 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00004298 verifyFormat(
4299 "aaaaa(\n"
4300 " aaaaa,\n"
4301 " aaaaa(\n"
4302 " aaaaa,\n"
4303 " aaaaa(\n"
4304 " aaaaa,\n"
4305 " aaaaa(\n"
4306 " aaaaa,\n"
4307 " aaaaa(\n"
4308 " aaaaa,\n"
4309 " aaaaa(\n"
4310 " aaaaa,\n"
4311 " aaaaa(\n"
4312 " aaaaa,\n"
4313 " aaaaa(\n"
4314 " aaaaa,\n"
4315 " aaaaa(\n"
4316 " aaaaa,\n"
4317 " aaaaa(\n"
4318 " aaaaa,\n"
4319 " aaaaa(\n"
4320 " aaaaa,\n"
4321 " aaaaa(\n"
4322 " aaaaa,\n"
4323 " aaaaa))))))))))));",
4324 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00004325 verifyFormat(
4326 "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"
4327 " a),\n"
4328 " a),\n"
4329 " a),\n"
4330 " a),\n"
4331 " a),\n"
4332 " a),\n"
4333 " a),\n"
4334 " a),\n"
4335 " a),\n"
4336 " a),\n"
4337 " a),\n"
4338 " a),\n"
4339 " a),\n"
4340 " a),\n"
4341 " a),\n"
4342 " a),\n"
4343 " a)",
4344 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00004345
4346 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004347 FormatStyle OnePerLine = getLLVMStyle();
4348 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004349 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00004350 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00004351 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00004352 for (unsigned i = 0, e = 80; i != e; ++i) {
4353 input += " a,\n";
4354 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004355 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004356 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004357}
4358
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004359TEST_F(FormatTest, BreaksAsHighAsPossible) {
4360 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004361 "void f() {\n"
4362 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
4363 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
4364 " f();\n"
4365 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00004366 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004367 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004368}
4369
Daniel Jasper6728fc12013-04-11 14:29:13 +00004370TEST_F(FormatTest, BreaksFunctionDeclarations) {
4371 // Principially, we break function declarations in a certain order:
4372 // 1) break amongst arguments.
4373 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
4374 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004375 verifyFormat("template <class TemplateIt>\n"
4376 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
4377 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00004378
4379 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00004380 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004381 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004382 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004383 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004384
4385 // 3) break after (.
4386 verifyFormat(
4387 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00004388 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
4389 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004390
4391 // 4) break before after nested name specifiers.
4392 verifyFormat(
4393 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004394 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
4395 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004396 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004397
4398 // However, there are exceptions, if a sufficient amount of lines can be
4399 // saved.
4400 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
4401 // more adjusting.
4402 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4403 " Cccccccccccccc cccccccccc,\n"
4404 " Cccccccccccccc cccccccccc,\n"
4405 " Cccccccccccccc cccccccccc,\n"
4406 " Cccccccccccccc cccccccccc);");
4407 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004408 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004409 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4410 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4411 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004412 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004413 verifyFormat(
4414 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4415 " Cccccccccccccc cccccccccc,\n"
4416 " Cccccccccccccc cccccccccc,\n"
4417 " Cccccccccccccc cccccccccc,\n"
4418 " Cccccccccccccc cccccccccc,\n"
4419 " Cccccccccccccc cccccccccc,\n"
4420 " Cccccccccccccc cccccccccc);");
4421 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4422 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4423 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4424 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4425 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00004426
4427 // Break after multi-line parameters.
4428 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4429 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4430 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4431 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00004432 verifyFormat("void SomeLoooooooooooongFunction(\n"
4433 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
4434 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4435 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004436
4437 // Treat overloaded operators like other functions.
4438 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4439 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00004440 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4441 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00004442 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4443 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
4444 verifyGoogleFormat(
4445 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
4446 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004447 verifyGoogleFormat(
4448 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
4449 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00004450 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4451 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4452 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
4453 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00004454 verifyGoogleFormat(
4455 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
4456 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4457 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00004458 verifyGoogleFormat(
4459 "template <typename T>\n"
4460 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4461 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
4462 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00004463
4464 FormatStyle Style = getLLVMStyle();
4465 Style.PointerAlignment = FormatStyle::PAS_Left;
4466 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4467 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
4468 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004469 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
4470 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4471 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00004472}
4473
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004474TEST_F(FormatTest, TrailingReturnType) {
4475 verifyFormat("auto foo() -> int;\n");
4476 verifyFormat("struct S {\n"
4477 " auto bar() const -> int;\n"
4478 "};");
4479 verifyFormat("template <size_t Order, typename T>\n"
4480 "auto load_img(const std::string &filename)\n"
4481 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00004482 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
4483 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00004484 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00004485 verifyFormat("template <typename T>\n"
4486 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
4487 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00004488
4489 // Not trailing return types.
4490 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004491}
4492
Daniel Jasper5be31f72013-05-21 09:16:31 +00004493TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004494 // Avoid breaking before trailing 'const' or other trailing annotations, if
4495 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00004496 FormatStyle Style = getGoogleStyle();
4497 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00004498 verifyFormat("void someLongFunction(\n"
4499 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00004500 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00004501 verifyFormat("LoooooongReturnType\n"
4502 "someLoooooooongFunction() const {}",
4503 getLLVMStyleWithColumns(47));
4504 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
4505 " const {}",
4506 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004507 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4508 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
4509 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4510 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
4511 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4512 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00004513 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
4514 " aaaaaaaaaaa aaaaa) const override;");
4515 verifyGoogleFormat(
4516 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4517 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004518
Daniel Jasper5550de62014-02-17 07:57:46 +00004519 // Even if the first parameter has to be wrapped.
4520 verifyFormat("void someLongFunction(\n"
4521 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004522 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00004523 verifyFormat("void someLongFunction(\n"
4524 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004525 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00004526 verifyFormat("void someLongFunction(\n"
4527 " int someLongParameter) override {}",
4528 Style);
4529 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004530 " int someLongParameter) OVERRIDE {}",
4531 Style);
4532 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004533 " int someLongParameter) final {}",
4534 Style);
4535 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004536 " int someLongParameter) FINAL {}",
4537 Style);
4538 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004539 " int parameter) const override {}",
4540 Style);
4541
Daniel Jaspere3f907f2014-06-02 09:52:08 +00004542 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
4543 verifyFormat("void someLongFunction(\n"
4544 " int someLongParameter) const\n"
4545 "{\n"
4546 "}",
4547 Style);
4548
Daniel Jasper5550de62014-02-17 07:57:46 +00004549 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004550 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
4551 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4552 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00004553
4554 // Breaking before function-like trailing annotations is fine to keep them
4555 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00004556 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4557 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4558 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4559 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4560 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4561 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00004562 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4563 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00004564 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004565
4566 verifyFormat(
4567 "void aaaaaaaaaaaaaaaaaa()\n"
4568 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4569 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
4570 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4571 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004572 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004573 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004574 " GUARDED_BY(aaaaaaaaaaaa);");
4575 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004576 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004577 " GUARDED_BY(aaaaaaaaaaaa);");
4578 verifyGoogleFormat(
4579 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4580 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004581 verifyGoogleFormat(
4582 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4583 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004584}
4585
Daniel Jasperf090f032015-05-18 09:47:22 +00004586TEST_F(FormatTest, FunctionAnnotations) {
4587 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004588 "int OldFunction(const string &parameter) {}");
4589 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004590 "string OldFunction(const string &parameter) {}");
4591 verifyFormat("template <typename T>\n"
4592 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4593 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004594
4595 // Not function annotations.
4596 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4597 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004598 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4599 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004600 verifyFormat("MACRO(abc).function() // wrap\n"
4601 " << abc;");
4602 verifyFormat("MACRO(abc)->function() // wrap\n"
4603 " << abc;");
4604 verifyFormat("MACRO(abc)::function() // wrap\n"
4605 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004606}
4607
Daniel Jasperf7935112012-12-03 18:12:45 +00004608TEST_F(FormatTest, BreaksDesireably) {
4609 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4610 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004611 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004612 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4613 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4614 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004615
4616 verifyFormat(
4617 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004618 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004619
4620 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4621 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4622 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004623
4624 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004625 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4626 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4627 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004628 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4629 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004630
4631 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4632 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4633
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004634 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004635 "void f() {\n"
4636 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4637 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4638 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004639 verifyFormat(
4640 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4641 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4642 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004643 "aaaaaa(aaa,\n"
4644 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4645 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jaspera44991332015-04-29 13:06:49 +00004646 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4647 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4648 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004649
Daniel Jasper739b85f2015-06-29 10:42:59 +00004650 // Indent consistently independent of call expression and unary operator.
4651 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4652 " dddddddddddddddddddddddddddddd));");
4653 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4654 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004655 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004656 " dddddddddddddddddddddddddddddd));");
4657
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004658 // This test case breaks on an incorrect memoization, i.e. an optimization not
4659 // taking into account the StopAt value.
4660 verifyFormat(
4661 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004662 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4663 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4664 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004665
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004666 verifyFormat("{\n {\n {\n"
4667 " Annotation.SpaceRequiredBefore =\n"
4668 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4669 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4670 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004671
4672 // Break on an outer level if there was a break on an inner level.
4673 EXPECT_EQ("f(g(h(a, // comment\n"
4674 " b, c),\n"
4675 " d, e),\n"
4676 " x, y);",
4677 format("f(g(h(a, // comment\n"
4678 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004679
4680 // Prefer breaking similar line breaks.
4681 verifyFormat(
4682 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4683 " NSTrackingMouseEnteredAndExited |\n"
4684 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004685}
4686
Daniel Jasper18210d72014-10-09 09:52:05 +00004687TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4688 FormatStyle NoBinPacking = getGoogleStyle();
4689 NoBinPacking.BinPackParameters = false;
4690 NoBinPacking.BinPackArguments = true;
4691 verifyFormat("void f() {\n"
4692 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4693 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4694 "}",
4695 NoBinPacking);
4696 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4697 " int aaaaaaaaaaaaaaaaaaaa,\n"
4698 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4699 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004700
Daniel Jasper00693b082016-01-09 15:56:47 +00004701 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4702 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4703 " vector<int> bbbbbbbbbbbbbbb);",
4704 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004705 // FIXME: This behavior difference is probably not wanted. However, currently
4706 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4707 // template arguments from BreakBeforeParameter being set because of the
4708 // one-per-line formatting.
4709 verifyFormat(
4710 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4711 " aaaaaaaaaa> aaaaaaaaaa);",
4712 NoBinPacking);
4713 verifyFormat(
4714 "void fffffffffff(\n"
4715 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4716 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004717}
4718
Daniel Jasper9278eb92013-01-16 14:59:02 +00004719TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004720 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004721 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004722 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004723 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4724 " aaaaaaaaaaaaaaaaaaaa,\n"
4725 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4726 NoBinPacking);
4727 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4728 " aaaaaaaaaaaaa,\n"
4729 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4730 NoBinPacking);
4731 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004732 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4733 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4734 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4735 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004736 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4737 NoBinPacking);
4738 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4739 " .aaaaaaaaaaaaaaaaaa();",
4740 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004741 verifyFormat("void f() {\n"
4742 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4743 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4744 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004745 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004746
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004747 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004748 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4749 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004750 " aaaaaaaaaaaa);",
4751 NoBinPacking);
4752 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004753 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4754 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004755 " test);",
4756 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004757
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004758 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4759 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004760 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4761 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004762 NoBinPacking);
4763 verifyFormat("a(\"a\"\n"
4764 " \"a\",\n"
4765 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004766
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004767 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004768 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004769 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004770 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004771 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004772 verifyFormat(
4773 "void f() {\n"
4774 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4775 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004776 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004777 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004778 verifyFormat(
4779 "template <class SomeType, class SomeOtherType>\n"
4780 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4781 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004782}
4783
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004784TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4785 FormatStyle Style = getLLVMStyleWithColumns(15);
4786 Style.ExperimentalAutoDetectBinPacking = true;
4787 EXPECT_EQ("aaa(aaaa,\n"
4788 " aaaa,\n"
4789 " aaaa);\n"
4790 "aaa(aaaa,\n"
4791 " aaaa,\n"
4792 " aaaa);",
4793 format("aaa(aaaa,\n" // one-per-line
4794 " aaaa,\n"
4795 " aaaa );\n"
4796 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4797 Style));
4798 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4799 " aaaa);\n"
4800 "aaa(aaaa, aaaa,\n"
4801 " aaaa);",
4802 format("aaa(aaaa, aaaa,\n" // bin-packed
4803 " aaaa );\n"
4804 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4805 Style));
4806}
4807
Daniel Jasper04468962013-01-18 10:56:38 +00004808TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004809 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4810 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4811 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4812 " .StartsWith(\".init\", ORDER_INIT)\n"
4813 " .StartsWith(\".fini\", ORDER_FINI)\n"
4814 " .StartsWith(\".hash\", ORDER_HASH)\n"
4815 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004816
Daniel Jaspereb50c672013-02-15 20:33:06 +00004817 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004818 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004819 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004820 "aaaaaaa->aaaaaaa\n"
4821 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4822 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004823 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004824 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004825 "aaaaaaa->aaaaaaa\n"
4826 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4827 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4828 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004829 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004830 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004831 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004832 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4833 " aaaaaa->aaaaaaaaaaaa()\n"
4834 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004835 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004836 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004837 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004838 "void f() {\n"
4839 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004840 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004841 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004842 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004843 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004844 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004845 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004846 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004847 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004848 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004849 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004850 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004851
4852 verifyFormat(
4853 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4854 verifyFormat("aaaaaaaaaaaaaaa()\n"
4855 " .aaaaaaaaaaaaaaa()\n"
4856 " .aaaaaaaaaaaaaaa()\n"
4857 " .aaaaaaaaaaaaaaa()\n"
4858 " .aaaaaaaaaaaaaaa();");
4859 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4860 " .aaaaaaaaaaaaaaa()\n"
4861 " .aaaaaaaaaaaaaaa()\n"
4862 " .aaaaaaaaaaaaaaa();");
4863 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4864 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4865 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004866 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4867 " ->aaaaaaaaaaaaaae(0)\n"
4868 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004869
Daniel Jasper775954b2015-04-24 10:08:09 +00004870 // Don't linewrap after very short segments.
4871 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4872 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4873 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4874 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4875 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4876 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4877 verifyFormat("aaa()\n"
4878 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4879 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4880 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4881
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004882 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4883 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4884 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4885 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4886 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004887 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004888
Daniel Jaspera41aa532014-09-19 08:01:25 +00004889 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004890 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4891 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004892
4893 // Prefer not to create "hanging" indents.
4894 verifyFormat(
4895 "return !soooooooooooooome_map\n"
4896 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4897 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004898 verifyFormat(
4899 "return aaaaaaaaaaaaaaaa\n"
4900 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4901 " .aaaa(aaaaaaaaaaaaaa);");
4902 // No hanging indent here.
4903 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4904 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4905 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4906 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004907 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4908 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4909 getLLVMStyleWithColumns(60));
4910 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4911 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4912 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4913 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004914 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4915 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4916 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004917}
4918
Daniel Jasperde5c2072012-12-24 00:13:23 +00004919TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4920 verifyFormat(
4921 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004922 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004923 verifyFormat(
4924 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4925 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4926
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004927 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004928 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004929 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4930 " ccccccccccccccccccccccccc) {\n}");
4931
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004932 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004933 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004934 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4935 " ccccccccccccccccccccccccc) {\n}");
4936
Daniel Jasperde5c2072012-12-24 00:13:23 +00004937 verifyFormat(
4938 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004939 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004940 verifyFormat(
4941 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4942 " ccccccccccccccccccccccccc) {\n}");
4943
Daniel Jasper400adc62013-02-08 15:28:42 +00004944 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4945 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4946 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4947 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004948 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4949 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4950 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4951 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4952
Daniel Jasper400adc62013-02-08 15:28:42 +00004953 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4954 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4955 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004956 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4957 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4958 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004959}
4960
Daniel Jasper43b65482013-01-23 12:27:43 +00004961TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004962 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004963 "unsigned Cost =\n"
4964 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4965 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004966 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004967 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4968 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004969
4970 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004971 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4972 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004973 verifyFormat("unsigned OriginalStartColumn =\n"
4974 " SourceMgr.getSpellingColumnNumber(\n"
4975 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4976 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004977}
4978
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004979TEST_F(FormatTest, AlignsAfterAssignments) {
4980 verifyFormat(
4981 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004982 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004983 verifyFormat(
4984 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004985 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004986 verifyFormat(
4987 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004988 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004989 verifyFormat(
4990 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004991 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004992 verifyFormat(
4993 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4994 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4995 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004996}
4997
4998TEST_F(FormatTest, AlignsAfterReturn) {
4999 verifyFormat(
5000 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5001 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
5002 verifyFormat(
5003 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5004 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00005005 verifyFormat(
5006 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005007 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00005008 verifyFormat(
5009 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005010 " aaaaaaaaaaaaaaaaaaaaaa());");
5011 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5012 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5013 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5014 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
5015 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00005016 verifyFormat("return\n"
5017 " // true if code is one of a or b.\n"
5018 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00005019}
5020
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005021TEST_F(FormatTest, AlignsAfterOpenBracket) {
5022 verifyFormat(
5023 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5024 " aaaaaaaaa aaaaaaa) {}");
5025 verifyFormat(
5026 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5027 " aaaaaaaaaaa aaaaaaaaa);");
5028 verifyFormat(
5029 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5030 " aaaaaaaaaaaaaaaaaaaaa));");
5031 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005032 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00005033 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5034 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
5035 Style);
5036 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5037 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
5038 Style);
5039 verifyFormat("SomeLongVariableName->someFunction(\n"
5040 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
5041 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005042 verifyFormat(
5043 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5044 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5045 Style);
5046 verifyFormat(
5047 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5048 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5049 Style);
5050 verifyFormat(
5051 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5052 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5053 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005054
Daniel Jasper2a9f7202016-02-08 09:52:54 +00005055 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
5056 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
5057 " b));",
5058 Style);
5059
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005060 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5061 Style.BinPackArguments = false;
5062 Style.BinPackParameters = false;
5063 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5064 " aaaaaaaaaaa aaaaaaaa,\n"
5065 " aaaaaaaaa aaaaaaa,\n"
5066 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5067 Style);
5068 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5069 " aaaaaaaaaaa aaaaaaaaa,\n"
5070 " aaaaaaaaaaa aaaaaaaaa,\n"
5071 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5072 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00005073 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
5074 " aaaaaaaaaaaaaaa,\n"
5075 " aaaaaaaaaaaaaaaaaaaaa,\n"
5076 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005077 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00005078 verifyFormat(
5079 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
5080 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5081 Style);
5082 verifyFormat(
5083 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
5084 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5085 Style);
5086 verifyFormat(
5087 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5088 " aaaaaaaaaaaaaaaaaaaaa(\n"
5089 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
5090 " aaaaaaaaaaaaaaaa);",
5091 Style);
5092 verifyFormat(
5093 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5094 " aaaaaaaaaaaaaaaaaaaaa(\n"
5095 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
5096 " aaaaaaaaaaaaaaaa);",
5097 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005098}
5099
Daniel Jasper3219e432014-12-02 13:24:51 +00005100TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
5101 FormatStyle Style = getLLVMStyleWithColumns(40);
5102 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5103 " bbbbbbbbbbbbbbbbbbbbbb);",
5104 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005105 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00005106 Style.AlignOperands = false;
5107 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5108 " bbbbbbbbbbbbbbbbbbbbbb);",
5109 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005110 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00005111 Style.AlignOperands = true;
5112 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5113 " bbbbbbbbbbbbbbbbbbbbbb);",
5114 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005115 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00005116 Style.AlignOperands = false;
5117 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5118 " bbbbbbbbbbbbbbbbbbbbbb);",
5119 Style);
5120}
5121
Daniel Jasper399d24b2013-01-09 07:06:56 +00005122TEST_F(FormatTest, BreaksConditionalExpressions) {
5123 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005124 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
5125 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5126 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00005127 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005128 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
5129 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5130 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005131 verifyFormat(
5132 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
5133 " : aaaaaaaaaaaaa);");
5134 verifyFormat(
5135 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00005136 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005137 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5138 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005139 verifyFormat(
5140 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5141 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5142 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005143 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5144 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5145 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5146 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5147 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5148 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5149 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5150 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5151 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5152 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5153 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5154 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005155 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5156 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5157 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5158 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5159 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00005160 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5161 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5162 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005163 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5164 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5165 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5166 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00005167 verifyFormat(
5168 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5169 " ? aaaaaaaaaaaaaaa\n"
5170 " : aaaaaaaaaaaaaaa;");
5171 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005172 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00005173 " ? b\n"
5174 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00005175 verifyFormat("return aaaa == bbbb\n"
5176 " // comment\n"
5177 " ? aaaa\n"
5178 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005179 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005180 " format(TheLine.First,\n"
5181 " IndentForLevel[TheLine.Level] >= 0\n"
5182 " ? IndentForLevel[TheLine.Level]\n"
5183 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005184 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005185 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00005186 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5187 " ? aaaaaaaaaaaaaaa\n"
5188 " : bbbbbbbbbbbbbbb //\n"
5189 " ? ccccccccccccccc\n"
5190 " : ddddddddddddddd;");
5191 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5192 " ? aaaaaaaaaaaaaaa\n"
5193 " : (bbbbbbbbbbbbbbb //\n"
5194 " ? ccccccccccccccc\n"
5195 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005196 verifyFormat(
5197 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5198 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5199 " aaaaaaaaaaaaaaaaaaaaa +\n"
5200 " aaaaaaaaaaaaaaaaaaaaa\n"
5201 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00005202 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005203 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5204 " : aaaaaaaaaaaaaaaaaaaaaa\n"
5205 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00005206
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005207 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00005208 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005209 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00005210 "void f() {\n"
5211 " g(aaa,\n"
5212 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5213 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5214 " ? aaaaaaaaaaaaaaa\n"
5215 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005216 "}",
5217 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005218 verifyFormat(
5219 "void f() {\n"
5220 " g(aaa,\n"
5221 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5222 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5223 " ?: aaaaaaaaaaaaaaa);\n"
5224 "}",
5225 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00005226
5227 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
5228 " // comment.\n"
5229 " ccccccccccccccccccccccccccccccccccccccc\n"
5230 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5231 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00005232
5233 // Assignments in conditional expressions. Apparently not uncommon :-(.
5234 verifyFormat("return a != b\n"
5235 " // comment\n"
5236 " ? a = b\n"
5237 " : a = b;");
5238 verifyFormat("return a != b\n"
5239 " // comment\n"
5240 " ? a = a != b\n"
5241 " // comment\n"
5242 " ? a = b\n"
5243 " : a\n"
5244 " : a;\n");
5245 verifyFormat("return a != b\n"
5246 " // comment\n"
5247 " ? a\n"
5248 " : a = a != b\n"
5249 " // comment\n"
5250 " ? a = b\n"
5251 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00005252}
5253
Daniel Jasper165b29e2013-11-08 00:57:11 +00005254TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
5255 FormatStyle Style = getLLVMStyle();
5256 Style.BreakBeforeTernaryOperators = false;
5257 Style.ColumnLimit = 70;
5258 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005259 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
5260 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5261 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005262 Style);
5263 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005264 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
5265 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5266 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005267 Style);
5268 verifyFormat(
5269 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
5270 " aaaaaaaaaaaaa);",
5271 Style);
5272 verifyFormat(
5273 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5274 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5275 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5276 " aaaaaaaaaaaaa);",
5277 Style);
5278 verifyFormat(
5279 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5280 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5281 " aaaaaaaaaaaaa);",
5282 Style);
5283 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5284 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5285 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5286 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5287 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5288 Style);
5289 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5290 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5291 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5292 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5293 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5294 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5295 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5296 Style);
5297 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5298 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
5299 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5300 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5301 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5302 Style);
5303 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5304 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5305 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5306 Style);
5307 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00005308 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00005309 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5310 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5311 Style);
5312 verifyFormat(
5313 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5314 " aaaaaaaaaaaaaaa :\n"
5315 " aaaaaaaaaaaaaaa;",
5316 Style);
5317 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5318 " aaaaaaaaa ?\n"
5319 " b :\n"
5320 " c);",
5321 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00005322 verifyFormat("unsigned Indent =\n"
5323 " format(TheLine.First,\n"
5324 " IndentForLevel[TheLine.Level] >= 0 ?\n"
5325 " IndentForLevel[TheLine.Level] :\n"
5326 " TheLine * 2,\n"
5327 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
5328 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005329 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5330 " aaaaaaaaaaaaaaa :\n"
5331 " bbbbbbbbbbbbbbb ? //\n"
5332 " ccccccccccccccc :\n"
5333 " ddddddddddddddd;",
5334 Style);
5335 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5336 " aaaaaaaaaaaaaaa :\n"
5337 " (bbbbbbbbbbbbbbb ? //\n"
5338 " ccccccccccccccc :\n"
5339 " ddddddddddddddd);",
5340 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00005341 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5342 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
5343 " ccccccccccccccccccccccccccc;",
5344 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00005345 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5346 " aaaaa :\n"
5347 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
5348 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005349}
5350
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005351TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
5352 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
5353 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
5354 verifyFormat("bool a = true, b = false;");
5355
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005356 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005357 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005358 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00005359 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005360 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00005361 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005362 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00005363 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00005364 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
5365 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
5366 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5367 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
5368 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
5369 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005370
Daniel Jasperbea1ab42015-03-01 18:55:26 +00005371 FormatStyle Style = getGoogleStyle();
5372 Style.PointerAlignment = FormatStyle::PAS_Left;
5373 Style.DerivePointerAlignment = false;
5374 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5375 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
5376 " *b = bbbbbbbbbbbbbbbbbbb;",
5377 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00005378 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5379 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
5380 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00005381 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00005382 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005383}
5384
Nico Weber4a5030c2013-01-12 01:28:06 +00005385TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
5386 verifyFormat("arr[foo ? bar : baz];");
5387 verifyFormat("f()[foo ? bar : baz];");
5388 verifyFormat("(a + b)[foo ? bar : baz];");
5389 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
5390}
5391
Daniel Jasperf7935112012-12-03 18:12:45 +00005392TEST_F(FormatTest, AlignsStringLiterals) {
5393 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
5394 " \"short literal\");");
5395 verifyFormat(
5396 "looooooooooooooooooooooooongFunction(\n"
5397 " \"short literal\"\n"
5398 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005399 verifyFormat("someFunction(\"Always break between multi-line\"\n"
5400 " \" string literals\",\n"
5401 " and, other, parameters);");
Daniel Jasper240527c2017-01-16 13:13:15 +00005402 EXPECT_EQ("fun +\n"
5403 " \"1243\" /* comment */\n"
5404 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005405 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00005406 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005407 getLLVMStyleWithColumns(28)));
5408 EXPECT_EQ(
5409 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5410 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
5411 " \"aaaaaaaaaaaaaaaa\";",
5412 format("aaaaaa ="
5413 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
5414 "aaaaaaaaaaaaaaaaaaaaa\" "
5415 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper240527c2017-01-16 13:13:15 +00005416 verifyFormat("a = a +\n"
5417 " \"a\"\n"
5418 " \"a\"\n"
5419 " \"a\";");
5420 verifyFormat("f(\"a\",\n"
5421 " \"b\"\n"
5422 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005423
5424 verifyFormat(
5425 "#define LL_FORMAT \"ll\"\n"
5426 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
5427 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00005428
5429 verifyFormat("#define A(X) \\\n"
5430 " \"aaaaa\" #X \"bbbbbb\" \\\n"
5431 " \"ccccc\"",
5432 getLLVMStyleWithColumns(23));
5433 verifyFormat("#define A \"def\"\n"
5434 "f(\"abc\" A \"ghi\"\n"
5435 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005436
5437 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005438 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005439 verifyFormat("#define A(X) \\\n"
5440 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
5441 " L\"ccccc\"",
5442 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00005443
5444 verifyFormat("f(@\"a\"\n"
5445 " @\"b\");");
5446 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00005447 " @\"b\"\n"
5448 " @\"c\";");
5449 verifyFormat("NSString s = @\"a\"\n"
5450 " \"b\"\n"
5451 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00005452}
5453
Zachary Turner448592e2015-12-18 22:20:15 +00005454TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005455 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005456 // No declarations or definitions should be moved to own line.
5457 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
5458 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005459 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005460 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005461 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005462 "int f() { return 1; }\n"
5463 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005464 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00005465
5466 // All declarations and definitions should have the return type moved to its
5467 // own
5468 // line.
5469 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
5470 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005471 " int\n"
5472 " f() {\n"
5473 " return 1;\n"
5474 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005475 " int\n"
5476 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005477 "};\n"
5478 "int\n"
5479 "f() {\n"
5480 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005481 "}\n"
5482 "int\n"
5483 "g();\n",
5484 Style);
5485
5486 // Top-level definitions, and no kinds of declarations should have the
5487 // return type moved to its own line.
5488 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
5489 verifyFormat("class B {\n"
5490 " int f() { return 1; }\n"
5491 " int g();\n"
5492 "};\n"
5493 "int\n"
5494 "f() {\n"
5495 " return 1;\n"
5496 "}\n"
5497 "int g();\n",
5498 Style);
5499
5500 // Top-level definitions and declarations should have the return type moved
5501 // to its own line.
5502 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
5503 verifyFormat("class C {\n"
5504 " int f() { return 1; }\n"
5505 " int g();\n"
5506 "};\n"
5507 "int\n"
5508 "f() {\n"
5509 " return 1;\n"
5510 "}\n"
5511 "int\n"
5512 "g();\n",
5513 Style);
5514
5515 // All definitions should have the return type moved to its own line, but no
5516 // kinds of declarations.
5517 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5518 verifyFormat("class D {\n"
5519 " int\n"
5520 " f() {\n"
5521 " return 1;\n"
5522 " }\n"
5523 " int g();\n"
5524 "};\n"
5525 "int\n"
5526 "f() {\n"
5527 " return 1;\n"
5528 "}\n"
5529 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005530 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005531 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005532 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005533 " return \"\";\n"
5534 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005535 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005536 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005537 verifyFormat("template <class T>\n"
5538 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005539 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005540 " return NULL;\n"
5541 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005542 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005543 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00005544 verifyFormat("class C {\n"
5545 " int\n"
5546 " operator+() {\n"
5547 " return 1;\n"
5548 " }\n"
5549 " int\n"
5550 " operator()() {\n"
5551 " return 1;\n"
5552 " }\n"
5553 "};\n",
5554 Style);
5555 verifyFormat("void\n"
5556 "A::operator()() {}\n"
5557 "void\n"
5558 "A::operator>>() {}\n"
5559 "void\n"
5560 "A::operator+() {}\n",
5561 Style);
5562 verifyFormat("void *operator new(std::size_t s);", // No break here.
5563 Style);
5564 verifyFormat("void *\n"
5565 "operator new(std::size_t s) {}",
5566 Style);
5567 verifyFormat("void *\n"
5568 "operator delete[](void *ptr) {}",
5569 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005570 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005571 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005572 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005573 "{\n"
5574 " return \"\";\n"
5575 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005576 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005577 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005578 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005579 "T *\n" // Problem here: no line break
5580 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005581 "{\n"
5582 " return NULL;\n"
5583 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005584 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005585 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005586}
5587
Alexander Kornienko58611712013-07-04 12:02:44 +00005588TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5589 FormatStyle NoBreak = getLLVMStyle();
5590 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5591 FormatStyle Break = getLLVMStyle();
5592 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005593 verifyFormat("aaaa = \"bbbb\"\n"
5594 " \"cccc\";",
5595 NoBreak);
5596 verifyFormat("aaaa =\n"
5597 " \"bbbb\"\n"
5598 " \"cccc\";",
5599 Break);
5600 verifyFormat("aaaa(\"bbbb\"\n"
5601 " \"cccc\");",
5602 NoBreak);
5603 verifyFormat("aaaa(\n"
5604 " \"bbbb\"\n"
5605 " \"cccc\");",
5606 Break);
Daniel Jasper240527c2017-01-16 13:13:15 +00005607 verifyFormat("aaaa(qqq,\n"
5608 " \"bbbb\"\n"
5609 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005610 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005611 verifyFormat("aaaa(qqq,\n"
5612 " \"bbbb\"\n"
5613 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005614 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005615 verifyFormat("aaaa(qqq,\n"
5616 " L\"bbbb\"\n"
5617 " L\"cccc\");",
5618 Break);
Daniel Jasper240527c2017-01-16 13:13:15 +00005619 verifyFormat("aaaaa(aaaaaa,\n"
5620 " aaaaaaa(\"aaaa\"\n"
5621 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005622 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005623 verifyFormat("string s = someFunction(\n"
5624 " \"abc\"\n"
5625 " \"abc\");",
5626 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005627
Daniel Jasper3251fff2014-06-10 06:27:23 +00005628 // As we break before unary operators, breaking right after them is bad.
5629 verifyFormat("string foo = abc ? \"x\"\n"
5630 " \"blah blah blah blah blah blah\"\n"
5631 " : \"y\";",
5632 Break);
5633
Daniel Jasperc834c702013-07-17 15:38:19 +00005634 // Don't break if there is no column gain.
5635 verifyFormat("f(\"aaaa\"\n"
5636 " \"bbbb\");",
5637 Break);
5638
5639 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005640 EXPECT_EQ("x = \"a\\\n"
5641 "b\\\n"
5642 "c\";",
5643 format("x = \"a\\\n"
5644 "b\\\n"
5645 "c\";",
5646 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005647 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005648 " \"a\\\n"
5649 "b\\\n"
5650 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005651 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005652 "b\\\n"
5653 "c\";",
5654 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005655
5656 // Exempt ObjC strings for now.
5657 EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005658 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005659 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005660 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005661 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005662
5663 Break.ColumnLimit = 0;
5664 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005665}
5666
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005667TEST_F(FormatTest, AlignsPipes) {
5668 verifyFormat(
5669 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5670 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5671 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5672 verifyFormat(
5673 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5674 " << aaaaaaaaaaaaaaaaaaaa;");
5675 verifyFormat(
5676 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5677 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5678 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005679 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5680 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5681 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005682 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5683 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5684 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5685 verifyFormat(
5686 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5687 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5688 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005689 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5690 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5691 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5692 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005693 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5694 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005695 verifyFormat(
5696 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5697 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005698
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005699 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5700 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005701 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5702 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5703 " aaaaaaaaaaaaaaaaaaaaa)\n"
5704 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005705 verifyFormat("LOG_IF(aaa == //\n"
5706 " bbb)\n"
5707 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005708
Daniel Jasper467ddb12013-08-12 12:58:05 +00005709 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005710 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5711 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005712 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5713 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5714 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005715 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5716 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005717 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5718 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5719 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5720 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5721 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5722 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5723 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005724
Daniel Jasperc238c872013-04-02 14:33:13 +00005725 verifyFormat(
5726 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5727 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005728
5729 // Incomplete string literal.
5730 EXPECT_EQ("llvm::errs() << \"\n"
5731 " << a;",
5732 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005733
5734 verifyFormat("void f() {\n"
5735 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5736 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5737 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005738
5739 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005740 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5741 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5742 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005743
5744 // Handle '\n'.
5745 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5746 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5747 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5748 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5749 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5750 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5751 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005752}
5753
Daniel Jasper7209bb92016-12-13 11:16:42 +00005754TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5755 verifyFormat("return out << \"somepacket = {\\n\"\n"
5756 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5757 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5758 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5759 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5760 " << \"}\";");
5761
5762 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5763 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5764 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5765 verifyFormat(
5766 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5767 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5768 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5769 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5770 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5771 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5772 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5773 verifyFormat(
5774 "void f() {\n"
5775 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5776 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5777 "}");
5778
5779 // Breaking before the first "<<" is generally not desirable.
5780 verifyFormat(
5781 "llvm::errs()\n"
5782 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5783 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5784 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5785 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5786 getLLVMStyleWithColumns(70));
5787 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5788 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5789 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5790 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5791 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5792 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5793 getLLVMStyleWithColumns(70));
5794
5795 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5796 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5797 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5798 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5799 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5800 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005801 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5802 " (aaaa + aaaa);",
5803 getLLVMStyleWithColumns(40));
5804 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5805 " (aaaaaaa + aaaaa));",
5806 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005807 verifyFormat(
5808 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5809 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5810 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005811}
5812
Daniel Jasperf7935112012-12-03 18:12:45 +00005813TEST_F(FormatTest, UnderstandsEquals) {
5814 verifyFormat(
5815 "aaaaaaaaaaaaaaaaa =\n"
5816 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5817 verifyFormat(
5818 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005819 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005820 verifyFormat(
5821 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005822 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005823 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005824 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5825 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005826
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005827 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5828 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005829}
5830
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005831TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005832 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5833 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005834
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005835 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5836 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005837
5838 verifyFormat(
5839 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5840 " Parameter2);");
5841
5842 verifyFormat(
5843 "ShortObject->shortFunction(\n"
5844 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5845 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5846
5847 verifyFormat("loooooooooooooongFunction(\n"
5848 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5849
5850 verifyFormat(
5851 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5852 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5853
Daniel Jasper687af3b2013-02-14 14:26:07 +00005854 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5855 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005856 verifyFormat("void f() {\n"
5857 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5858 " .Times(2)\n"
5859 " .WillRepeatedly(Return(SomeValue));\n"
5860 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005861 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5862 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005863 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005864 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5865 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005866 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005867 verifyFormat("void f() {\n"
5868 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5869 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5870 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005871 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5872 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5873 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5874 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5875 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005876 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5877 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5878 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5879 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5880 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005881
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005882 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005883 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005884 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005885 verifyFormat(
5886 "aaaaaaaaaaa->aaaaaaaaa(\n"
5887 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5888 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005889
5890 verifyFormat(
5891 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5892 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005893 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5894 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5895 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5896 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005897
Daniel Jasper9b334242013-03-15 14:57:30 +00005898 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005899 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5900 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005901
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005902 FormatStyle NoBinPacking = getLLVMStyle();
5903 NoBinPacking.BinPackParameters = false;
5904 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5905 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5906 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5907 " aaaaaaaaaaaaaaaaaaa,\n"
5908 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5909 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005910
5911 // If there is a subsequent call, change to hanging indentation.
5912 verifyFormat(
5913 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5914 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5915 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5916 verifyFormat(
5917 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5918 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005919 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5920 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5921 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5922 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5923 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5924 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005925}
5926
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005927TEST_F(FormatTest, WrapsTemplateDeclarations) {
5928 verifyFormat("template <typename T>\n"
5929 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005930 verifyFormat("template <typename T>\n"
5931 "// T should be one of {A, B}.\n"
5932 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005933 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005934 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005935 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005936 verifyFormat("template <typename T>\n"
5937 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5938 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005939 verifyFormat(
5940 "template <typename T>\n"
5941 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5942 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005943 verifyFormat(
5944 "template <typename T>\n"
5945 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5946 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5947 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005948 verifyFormat("template <typename T>\n"
5949 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005950 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005951 verifyFormat(
5952 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5953 " typename T4 = char>\n"
5954 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005955 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5956 " template <typename> class cccccccccccccccccccccc,\n"
5957 " typename ddddddddddddd>\n"
5958 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005959 verifyFormat(
5960 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5961 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005962
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005963 verifyFormat("void f() {\n"
5964 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5965 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5966 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005967
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005968 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005969 verifyFormat("template <typename T> void f();");
5970 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005971 verifyFormat(
5972 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5973 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5974 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5975 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5976 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5977 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5978 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5979 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005980 EXPECT_EQ("static_cast<A< //\n"
5981 " B> *>(\n"
5982 "\n"
5983 " );",
5984 format("static_cast<A<//\n"
5985 " B>*>(\n"
5986 "\n"
5987 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005988 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5989 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005990
5991 FormatStyle AlwaysBreak = getLLVMStyle();
5992 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5993 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5994 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5995 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5996 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5997 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5998 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5999 verifyFormat("template <template <typename> class Fooooooo,\n"
6000 " template <typename> class Baaaaaaar>\n"
6001 "struct C {};",
6002 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00006003 verifyFormat("template <typename T> // T can be A, B or C.\n"
6004 "struct C {};",
6005 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00006006 verifyFormat("template <enum E> class A {\n"
6007 "public:\n"
6008 " E *f();\n"
6009 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00006010}
6011
Daniel Jasper45797022013-01-25 10:57:27 +00006012TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
6013 verifyFormat(
6014 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6015 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6016 verifyFormat(
6017 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6018 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6019 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
6020
Daniel Jasper0f0234e2013-05-08 10:00:18 +00006021 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00006022 verifyFormat(
6023 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6024 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00006025 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00006026
Daniel Jasper45797022013-01-25 10:57:27 +00006027 verifyFormat(
6028 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00006029 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00006030
6031 // Breaking at nested name specifiers is generally not desirable.
6032 verifyFormat(
6033 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6034 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00006035
6036 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00006037 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
6038 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6039 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00006040 " aaaaaaaaaaaaaaaaaaaaa);",
6041 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00006042
6043 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6044 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6045 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00006046}
6047
Daniel Jasperf7935112012-12-03 18:12:45 +00006048TEST_F(FormatTest, UnderstandsTemplateParameters) {
6049 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006050 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006051 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
6052 verifyFormat("bool x = a < 1 || 2 > a;");
6053 verifyFormat("bool x = 5 < f<int>();");
6054 verifyFormat("bool x = f<int>() > 5;");
6055 verifyFormat("bool x = 5 < a<int>::x;");
6056 verifyFormat("bool x = a < 4 ? a > 2 : false;");
6057 verifyFormat("bool x = f() ? a < 2 : a > 2;");
6058
6059 verifyGoogleFormat("A<A<int>> a;");
6060 verifyGoogleFormat("A<A<A<int>>> a;");
6061 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006062 verifyGoogleFormat("A<A<int> > a;");
6063 verifyGoogleFormat("A<A<A<int> > > a;");
6064 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00006065 verifyGoogleFormat("A<::A<int>> a;");
6066 verifyGoogleFormat("A<::A> a;");
6067 verifyGoogleFormat("A< ::A> a;");
6068 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006069 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
6070 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00006071 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
6072 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006073 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
6074 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006075
Nico Weber7533b4d2014-09-24 17:17:32 +00006076 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
6077
Daniel Jasperf7935112012-12-03 18:12:45 +00006078 verifyFormat("test >> a >> b;");
6079 verifyFormat("test << a >> b;");
6080
6081 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006082 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00006083 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00006084 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
6085 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00006086 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00006087 verifyFormat("f(a.operator()<A>());");
6088 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6089 " .template operator()<A>());",
6090 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00006091
6092 // Not template parameters.
6093 verifyFormat("return a < b && c > d;");
6094 verifyFormat("void f() {\n"
6095 " while (a < b && c > d) {\n"
6096 " }\n"
6097 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006098 verifyFormat("template <typename... Types>\n"
6099 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00006100
6101 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6102 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
6103 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00006104 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00006105 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00006106 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00006107}
6108
Malcolm Parsons6af3f142016-11-03 16:57:30 +00006109TEST_F(FormatTest, BitshiftOperatorWidth) {
6110 EXPECT_EQ("int a = 1 << 2; /* foo\n"
6111 " bar */",
6112 format("int a=1<<2; /* foo\n"
6113 " bar */"));
6114
6115 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
6116 " bar */",
6117 format("int b =256>>1 ; /* foo\n"
6118 " bar */"));
6119}
6120
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006121TEST_F(FormatTest, UnderstandsBinaryOperators) {
6122 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00006123 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00006124}
6125
6126TEST_F(FormatTest, UnderstandsPointersToMembers) {
6127 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006128 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006129 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006130 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006131 verifyFormat("void f() {\n"
6132 " (a->*f)();\n"
6133 " a->*x;\n"
6134 " (a.*f)();\n"
6135 " ((*a).*f)();\n"
6136 " a.*x;\n"
6137 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00006138 verifyFormat("void f() {\n"
6139 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
6140 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
6141 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00006142 verifyFormat(
6143 "(aaaaaaaaaa->*bbbbbbb)(\n"
6144 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006145 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006146 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006147 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006148}
6149
Daniel Jasper8dd40472012-12-21 09:41:31 +00006150TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00006151 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00006152 verifyFormat("f(-1, -2, -3);");
6153 verifyFormat("a[-1] = 5;");
6154 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006155 verifyFormat("if (i == -1) {\n}");
6156 verifyFormat("if (i != -1) {\n}");
6157 verifyFormat("if (i > -1) {\n}");
6158 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00006159 verifyFormat("++(a->f());");
6160 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00006161 verifyFormat("(a->f())++;");
6162 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006163 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00006164
6165 verifyFormat("a-- > b;");
6166 verifyFormat("b ? -a : c;");
6167 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006168 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00006169 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006170 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00006171
6172 verifyFormat("return -1;");
6173 verifyFormat("switch (a) {\n"
6174 "case -1:\n"
6175 " break;\n"
6176 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00006177 verifyFormat("#define X -1");
6178 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00006179
Chandler Carruthf8b72662014-03-02 12:37:31 +00006180 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
6181 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00006182
6183 verifyFormat("int a = /* confusing comment */ -1;");
6184 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
6185 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006186}
6187
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006188TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00006189 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006190 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00006191 "}");
6192 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00006193 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00006194 verifyFormat("*aaa = aaaaaaa( // break\n"
6195 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00006196}
6197
Daniel Jasper8863ada2013-08-26 08:10:17 +00006198TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00006199 verifyFormat("bool operator<();");
6200 verifyFormat("bool operator>();");
6201 verifyFormat("bool operator=();");
6202 verifyFormat("bool operator==();");
6203 verifyFormat("bool operator!=();");
6204 verifyFormat("int operator+();");
6205 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00006206 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006207 verifyFormat("bool operator();");
6208 verifyFormat("bool operator()();");
6209 verifyFormat("bool operator[]();");
6210 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006211 verifyFormat("operator int();");
6212 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006213 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006214 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006215 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006216 verifyFormat("void *operator new(std::size_t size);");
6217 verifyFormat("void *operator new[](std::size_t size);");
6218 verifyFormat("void operator delete(void *ptr);");
6219 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00006220 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
6221 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00006222 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00006223 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006224
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006225 verifyFormat(
6226 "ostream &operator<<(ostream &OutputStream,\n"
6227 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00006228 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
6229 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
6230 " return left.group < right.group;\n"
6231 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00006232 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00006233 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006234
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006235 verifyGoogleFormat("operator void*();");
6236 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00006237 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00006238
6239 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00006240 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
6241 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006242}
6243
Daniel Jasper1c220482015-02-25 10:30:06 +00006244TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00006245 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
6246 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
6247 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
6248 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
6249 verifyFormat("Deleted &operator=(const Deleted &) &;");
6250 verifyFormat("Deleted &operator=(const Deleted &) &&;");
6251 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
6252 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
6253 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
6254 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
6255 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00006256 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00006257 verifyFormat("template <typename T>\n"
6258 "void F(T) && = delete;",
6259 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00006260
Daniel Jasperaf642c62015-08-25 13:40:51 +00006261 FormatStyle AlignLeft = getLLVMStyle();
6262 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00006263 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00006264 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
6265 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
6266 AlignLeft);
6267 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
6268 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006269 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
6270 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
6271 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
6272 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00006273 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00006274
6275 FormatStyle Spaces = getLLVMStyle();
6276 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006277 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
6278 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
6279 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
6280 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006281
6282 Spaces.SpacesInCStyleCastParentheses = false;
6283 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006284 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
6285 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
6286 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
6287 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006288}
6289
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006290TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00006291 verifyFormat("void f() {\n"
6292 " A *a = new A;\n"
6293 " A *a = new (placement) A;\n"
6294 " delete a;\n"
6295 " delete (A *)a;\n"
6296 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00006297 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6298 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00006299 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6300 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6301 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00006302 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006303}
6304
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006305TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006306 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006307 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006308 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006309 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006310 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006311 verifyIndependentOfContext("int a = b * 10;");
6312 verifyIndependentOfContext("int a = 10 * b;");
6313 verifyIndependentOfContext("int a = b * c;");
6314 verifyIndependentOfContext("int a += b * c;");
6315 verifyIndependentOfContext("int a -= b * c;");
6316 verifyIndependentOfContext("int a *= b * c;");
6317 verifyIndependentOfContext("int a /= b * c;");
6318 verifyIndependentOfContext("int a = *b;");
6319 verifyIndependentOfContext("int a = *b * c;");
6320 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00006321 verifyIndependentOfContext("int a = b * (10);");
6322 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006323 verifyIndependentOfContext("return 10 * b;");
6324 verifyIndependentOfContext("return *b * *c;");
6325 verifyIndependentOfContext("return a & ~b;");
6326 verifyIndependentOfContext("f(b ? *c : *d);");
6327 verifyIndependentOfContext("int a = b ? *c : *d;");
6328 verifyIndependentOfContext("*b = a;");
6329 verifyIndependentOfContext("a * ~b;");
6330 verifyIndependentOfContext("a * !b;");
6331 verifyIndependentOfContext("a * +b;");
6332 verifyIndependentOfContext("a * -b;");
6333 verifyIndependentOfContext("a * ++b;");
6334 verifyIndependentOfContext("a * --b;");
6335 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00006336 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006337 verifyIndependentOfContext("f() * b;");
6338 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006339 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006340 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00006341 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006342 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00006343 verifyIndependentOfContext("return sizeof(int **);");
6344 verifyIndependentOfContext("return sizeof(int ******);");
6345 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00006346 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006347 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00006348 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00006349 verifyGoogleFormat("return sizeof(int**);");
6350 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
6351 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006352 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00006353 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00006354 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00006355 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00006356 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00006357 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00006358 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00006359 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00006360 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00006361 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00006362 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00006363 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00006364 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00006365 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00006366 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00006367 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00006368 verifyFormat("void f(const MyOverride &override);");
6369 verifyFormat("void f(const MyFinal &final);");
6370 verifyIndependentOfContext("bool a = f() && override.f();");
6371 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00006372
Daniel Jasper5b49f472013-01-23 12:10:53 +00006373 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00006374
Daniel Jasper5b49f472013-01-23 12:10:53 +00006375 verifyIndependentOfContext("A<int *> a;");
6376 verifyIndependentOfContext("A<int **> a;");
6377 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00006378 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006379 verifyIndependentOfContext(
6380 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006381 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00006382 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00006383 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00006384 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00006385 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00006386
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00006387 verifyFormat(
6388 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6389 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6390
Daniel Jasper1f5d6372016-06-13 14:45:12 +00006391 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00006392 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00006393 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006394 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00006395 verifyGoogleFormat("A<int*> a;");
6396 verifyGoogleFormat("A<int**> a;");
6397 verifyGoogleFormat("A<int*, int*> a;");
6398 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006399 verifyGoogleFormat("f(b ? *c : *d);");
6400 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00006401 verifyGoogleFormat("Type* t = **x;");
6402 verifyGoogleFormat("Type* t = *++*x;");
6403 verifyGoogleFormat("*++*x;");
6404 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
6405 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006406 verifyGoogleFormat(
6407 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00006408 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00006409 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
6410 verifyGoogleFormat("template <typename T>\n"
6411 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00006412
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006413 FormatStyle Left = getLLVMStyle();
6414 Left.PointerAlignment = FormatStyle::PAS_Left;
6415 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00006416 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00006417 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006418
Daniel Jasper5b49f472013-01-23 12:10:53 +00006419 verifyIndependentOfContext("a = *(x + y);");
6420 verifyIndependentOfContext("a = &(x + y);");
6421 verifyIndependentOfContext("*(x + y).call();");
6422 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006423 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00006424
Daniel Jasper5b49f472013-01-23 12:10:53 +00006425 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00006426 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00006427 "int *MyValues = {\n"
6428 " *A, // Operator detection might be confused by the '{'\n"
6429 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00006430 "};");
Nico Weber80a82762013-01-17 17:17:19 +00006431
Daniel Jasper5b49f472013-01-23 12:10:53 +00006432 verifyIndependentOfContext("if (int *a = &b)");
6433 verifyIndependentOfContext("if (int &a = *b)");
6434 verifyIndependentOfContext("if (a & b[i])");
6435 verifyIndependentOfContext("if (a::b::c::d & b[i])");
6436 verifyIndependentOfContext("if (*b[i])");
6437 verifyIndependentOfContext("if (int *a = (&b))");
6438 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00006439 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00006440 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00006441 verifyFormat("void f() {\n"
6442 " for (const int &v : Values) {\n"
6443 " }\n"
6444 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006445 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
6446 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00006447 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00006448
Daniel Jaspera98da3d2013-11-07 19:56:07 +00006449 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006450 verifyFormat("#define MACRO \\\n"
6451 " int *i = a * b; \\\n"
6452 " void f(a *b);",
6453 getLLVMStyleWithColumns(19));
6454
Daniel Jasper97b89482013-03-13 07:49:51 +00006455 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006456 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006457 verifyIndependentOfContext("T **t = new T *;");
6458 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00006459 verifyGoogleFormat("A = new SomeType*[Length]();");
6460 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006461 verifyGoogleFormat("T** t = new T*;");
6462 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006463
Daniel Jasper990ff972013-05-07 14:17:18 +00006464 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006465 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00006466 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00006467 verifyFormat("STATIC_ASSERT((a & b) == 0);");
6468 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006469 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006470 "typename t::if<x && y>::type f() {}");
6471 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006472 verifyFormat("vector<int *> v;");
6473 verifyFormat("vector<int *const> v;");
6474 verifyFormat("vector<int *const **const *> v;");
6475 verifyFormat("vector<int *volatile> v;");
6476 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006477 verifyFormat("foo<b && false>();");
6478 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00006479 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00006480 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00006481 "template <class T,\n"
6482 " class = typename std::enable_if<\n"
6483 " std::is_integral<T>::value &&\n"
6484 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006485 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00006486 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006487 verifyFormat(
6488 "template <class T,\n"
6489 " class = typename ::std::enable_if<\n"
6490 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6491 "void F();",
6492 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006493
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006494 verifyIndependentOfContext("MACRO(int *i);");
6495 verifyIndependentOfContext("MACRO(auto *a);");
6496 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006497 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006498 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006499 // FIXME: Is there a way to make this work?
6500 // verifyIndependentOfContext("MACRO(A *a);");
6501
Daniel Jasper32ccb032014-06-23 07:36:18 +00006502 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006503 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006504
Daniel Jasper866468a2014-04-14 13:15:29 +00006505 EXPECT_EQ("#define OP(x) \\\n"
6506 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6507 " return s << a.DebugString(); \\\n"
6508 " }",
6509 format("#define OP(x) \\\n"
6510 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6511 " return s << a.DebugString(); \\\n"
6512 " }",
6513 getLLVMStyleWithColumns(50)));
6514
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006515 // FIXME: We cannot handle this case yet; we might be able to figure out that
6516 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006517 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006518
6519 FormatStyle PointerMiddle = getLLVMStyle();
6520 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6521 verifyFormat("delete *x;", PointerMiddle);
6522 verifyFormat("int * x;", PointerMiddle);
6523 verifyFormat("template <int * y> f() {}", PointerMiddle);
6524 verifyFormat("int * f(int * a) {}", PointerMiddle);
6525 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6526 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6527 verifyFormat("A<int *> a;", PointerMiddle);
6528 verifyFormat("A<int **> a;", PointerMiddle);
6529 verifyFormat("A<int *, int *> a;", PointerMiddle);
6530 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006531 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6532 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006533 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006534
6535 // Member function reference qualifiers aren't binary operators.
6536 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006537 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006538 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006539 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006540 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006541 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006542}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006543
Daniel Jasperee6d6502013-07-17 20:25:02 +00006544TEST_F(FormatTest, UnderstandsAttributes) {
6545 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006546 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6547 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006548 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006549 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006550 verifyFormat("__attribute__((nodebug)) void\n"
6551 "foo() {}\n",
6552 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006553}
6554
Daniel Jasper10cd5812013-05-06 06:35:44 +00006555TEST_F(FormatTest, UnderstandsEllipsis) {
6556 verifyFormat("int printf(const char *fmt, ...);");
6557 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006558 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6559
6560 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006561 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006562 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006563}
6564
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006565TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006566 EXPECT_EQ("int *a;\n"
6567 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006568 "int *a;",
6569 format("int *a;\n"
6570 "int* a;\n"
6571 "int *a;",
6572 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006573 EXPECT_EQ("int* a;\n"
6574 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006575 "int* a;",
6576 format("int* a;\n"
6577 "int* a;\n"
6578 "int *a;",
6579 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006580 EXPECT_EQ("int *a;\n"
6581 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006582 "int *a;",
6583 format("int *a;\n"
6584 "int * a;\n"
6585 "int * a;",
6586 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006587 EXPECT_EQ("auto x = [] {\n"
6588 " int *a;\n"
6589 " int *a;\n"
6590 " int *a;\n"
6591 "};",
6592 format("auto x=[]{int *a;\n"
6593 "int * a;\n"
6594 "int * a;};",
6595 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006596}
6597
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006598TEST_F(FormatTest, UnderstandsRvalueReferences) {
6599 verifyFormat("int f(int &&a) {}");
6600 verifyFormat("int f(int a, char &&b) {}");
6601 verifyFormat("void f() { int &&a = b; }");
6602 verifyGoogleFormat("int f(int a, char&& b) {}");
6603 verifyGoogleFormat("void f() { int&& a = b; }");
6604
Daniel Jasper1eff9082013-05-27 16:36:33 +00006605 verifyIndependentOfContext("A<int &&> a;");
6606 verifyIndependentOfContext("A<int &&, int &&> a;");
6607 verifyGoogleFormat("A<int&&> a;");
6608 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006609
6610 // Not rvalue references:
6611 verifyFormat("template <bool B, bool C> class A {\n"
6612 " static_assert(B && C, \"Something is wrong\");\n"
6613 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006614 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6615 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006616 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006617}
6618
Manuel Klimekc1237a82013-01-23 14:08:21 +00006619TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6620 verifyFormat("void f() {\n"
6621 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006622 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006623 "}",
6624 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006625}
6626
Daniel Jasperef906a92013-01-13 08:01:36 +00006627TEST_F(FormatTest, FormatsCasts) {
6628 verifyFormat("Type *A = static_cast<Type *>(P);");
6629 verifyFormat("Type *A = (Type *)P;");
6630 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6631 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006632 verifyFormat("int a = (int)2.0f;");
6633 verifyFormat("x[(int32)y];");
6634 verifyFormat("x = (int32)y;");
6635 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6636 verifyFormat("int a = (int)*b;");
6637 verifyFormat("int a = (int)2.0f;");
6638 verifyFormat("int a = (int)~0;");
6639 verifyFormat("int a = (int)++a;");
6640 verifyFormat("int a = (int)sizeof(int);");
6641 verifyFormat("int a = (int)+2;");
6642 verifyFormat("my_int a = (my_int)2.0f;");
6643 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006644 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006645 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006646 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006647 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006648 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006649
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006650 verifyFormat("void f() { my_int a = (my_int)*b; }");
6651 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6652 verifyFormat("my_int a = (my_int)~0;");
6653 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006654 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006655 verifyFormat("my_int a = (my_int)1;");
6656 verifyFormat("my_int a = (my_int *)1;");
6657 verifyFormat("my_int a = (const my_int)-1;");
6658 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006659 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006660 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006661 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006662 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006663
6664 // FIXME: single value wrapped with paren will be treated as cast.
6665 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006666
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006667 verifyFormat("{ (void)F; }");
6668
Daniel Jasper998cabc2013-07-18 14:46:07 +00006669 // Don't break after a cast's
6670 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6671 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6672 " bbbbbbbbbbbbbbbbbbbbbb);");
6673
Daniel Jasperef906a92013-01-13 08:01:36 +00006674 // These are not casts.
6675 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006676 verifyFormat("f(foo)->b;");
6677 verifyFormat("f(foo).b;");
6678 verifyFormat("f(foo)(b);");
6679 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006680 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006681 verifyFormat("(*funptr)(foo)[4];");
6682 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006683 verifyFormat("void f(int *);");
6684 verifyFormat("void f(int *) = 0;");
6685 verifyFormat("void f(SmallVector<int>) {}");
6686 verifyFormat("void f(SmallVector<int>);");
6687 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006688 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006689 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006690 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006691 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6692 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006693 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006694
Daniel Jasperba0bda92013-02-23 08:07:18 +00006695 // These are not casts, but at some point were confused with casts.
6696 verifyFormat("virtual void foo(int *) override;");
6697 verifyFormat("virtual void foo(char &) const;");
6698 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006699 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006700 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006701 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006702 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006703
6704 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6705 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006706 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006707 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006708 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6709 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6710 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006711}
6712
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006713TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006714 verifyFormat("A<bool()> a;");
6715 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006716 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006717 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006718 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006719 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006720 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006721 verifyFormat("template <class CallbackClass>\n"
6722 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006723
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006724 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6725 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006726 verifyGoogleFormat(
6727 "template <class CallbackClass>\n"
6728 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006729
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006730 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006731 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006732 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006733 verifyFormat("some_var = function(*some_pointer_var)[0];");
6734 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006735 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006736 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006737}
6738
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006739TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6740 verifyFormat("A (*foo_)[6];");
6741 verifyFormat("vector<int> (*foo_)[6];");
6742}
6743
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006744TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6745 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6746 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6747 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6748 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006749 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6750 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006751
6752 // Different ways of ()-initializiation.
6753 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6754 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6755 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6756 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6757 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6758 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006759 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6760 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006761}
6762
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006763TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006764 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006765 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006766 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006767 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006768 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006769 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006770 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6771 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006772 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6773 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006774 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6775 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006776 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6777 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006778 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6779 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006780 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6781 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6782 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6783 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006784 FormatStyle Indented = getLLVMStyle();
6785 Indented.IndentWrappedFunctionNames = true;
6786 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6787 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6788 Indented);
6789 verifyFormat(
6790 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6791 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6792 Indented);
6793 verifyFormat(
6794 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6795 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6796 Indented);
6797 verifyFormat(
6798 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6799 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6800 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006801
6802 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006803 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6804 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6805 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006806
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006807 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006808 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006809 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006810 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6811 " SourceLocation L, IdentifierIn *II,\n"
6812 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006813 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006814 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006815 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006816 " const SomeType<string, SomeOtherTemplateParameter>\n"
6817 " &ReallyReallyLongParameterName,\n"
6818 " const SomeType<string, SomeOtherTemplateParameter>\n"
6819 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006820 verifyFormat("template <typename A>\n"
6821 "SomeLoooooooooooooooooooooongType<\n"
6822 " typename some_namespace::SomeOtherType<A>::Type>\n"
6823 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006824
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006825 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006826 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6827 " aaaaaaaaaaaaaaaaaaaaaaa;");
6828 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006829 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6830 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006831 verifyGoogleFormat(
6832 "some_namespace::LongReturnType\n"
6833 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006834 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006835
6836 verifyGoogleFormat("template <typename T>\n"
6837 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006838 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006839 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6840 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006841
6842 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006843 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6844 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006845 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6846 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6847 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6848 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6849 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6850 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6851 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006852}
6853
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006854TEST_F(FormatTest, FormatsArrays) {
6855 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6856 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006857 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6858 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006859 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6860 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006861 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6862 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6863 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6864 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6865 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6866 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6867 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6868 verifyFormat(
6869 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6870 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6871 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006872 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6873 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006874
6875 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6876 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006877 verifyFormat(
6878 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6879 " .aaaaaaa[0]\n"
6880 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006881 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006882
6883 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006884
6885 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6886 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006887}
6888
Daniel Jaspere9de2602012-12-06 09:56:08 +00006889TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6890 verifyFormat("(a)->b();");
6891 verifyFormat("--a;");
6892}
6893
Daniel Jasper8b529712012-12-04 13:02:32 +00006894TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006895 verifyFormat("#include <string>\n"
6896 "#include <a/b/c.h>\n"
6897 "#include \"a/b/string\"\n"
6898 "#include \"string.h\"\n"
6899 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006900 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006901 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006902 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006903 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006904 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006905 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
6906 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006907 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6908 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006909
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006910 verifyFormat("#import <string>");
6911 verifyFormat("#import <a/b/c.h>");
6912 verifyFormat("#import \"a/b/string\"");
6913 verifyFormat("#import \"string.h\"");
6914 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006915 verifyFormat("#if __has_include(<strstream>)\n"
6916 "#include <strstream>\n"
6917 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006918
Daniel Jasper343643b2014-08-13 08:29:18 +00006919 verifyFormat("#define MY_IMPORT <a/b>");
6920
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006921 // Protocol buffer definition or missing "#".
6922 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6923 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006924
6925 FormatStyle Style = getLLVMStyle();
6926 Style.AlwaysBreakBeforeMultilineStrings = true;
6927 Style.ColumnLimit = 0;
6928 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006929
6930 // But 'import' might also be a regular C++ namespace.
6931 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6932 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006933}
6934
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006935//===----------------------------------------------------------------------===//
6936// Error recovery tests.
6937//===----------------------------------------------------------------------===//
6938
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006939TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006940 FormatStyle NoBinPacking = getLLVMStyle();
6941 NoBinPacking.BinPackParameters = false;
6942 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6943 " double *min_x,\n"
6944 " double *max_x,\n"
6945 " double *min_y,\n"
6946 " double *max_y,\n"
6947 " double *min_z,\n"
6948 " double *max_z, ) {}",
6949 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006950}
6951
Daniel Jasper83a54d22013-01-10 09:26:47 +00006952TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006953 verifyFormat("void f() { return; }\n42");
6954 verifyFormat("void f() {\n"
6955 " if (0)\n"
6956 " return;\n"
6957 "}\n"
6958 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006959 verifyFormat("void f() { return }\n42");
6960 verifyFormat("void f() {\n"
6961 " if (0)\n"
6962 " return\n"
6963 "}\n"
6964 "42");
6965}
6966
6967TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6968 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6969 EXPECT_EQ("void f() {\n"
6970 " if (a)\n"
6971 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006972 "}",
6973 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006974 EXPECT_EQ("namespace N {\n"
6975 "void f()\n"
6976 "}",
6977 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006978 EXPECT_EQ("namespace N {\n"
6979 "void f() {}\n"
6980 "void g()\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006981 "}",
6982 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006983}
6984
Daniel Jasper2df93312013-01-09 10:16:05 +00006985TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6986 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006987 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006988 " b;",
6989 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006990 verifyFormat("function(\n"
6991 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006992 " LoooooooooooongArgument);\n",
6993 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006994}
6995
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006996TEST_F(FormatTest, IncorrectAccessSpecifier) {
6997 verifyFormat("public:");
6998 verifyFormat("class A {\n"
6999 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007000 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007001 "};");
7002 verifyFormat("public\n"
7003 "int qwerty;");
7004 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007005 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007006 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007007 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007008 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007009 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00007010}
Daniel Jasperf7935112012-12-03 18:12:45 +00007011
Daniel Jasper291f9362013-03-20 15:58:10 +00007012TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
7013 verifyFormat("{");
7014 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00007015 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00007016}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007017
7018TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007019 verifyFormat("do {\n}");
7020 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007021 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007022 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007023 "wheeee(fun);");
7024 verifyFormat("do {\n"
7025 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00007026 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00007027}
7028
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007029TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00007030 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007031 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007032 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00007033 verifyFormat("while {\n foo;\n foo();\n}");
7034 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00007035}
7036
Daniel Jasperc0880a92013-01-04 18:52:56 +00007037TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007038 verifyIncompleteFormat("namespace {\n"
7039 "class Foo { Foo (\n"
7040 "};\n"
7041 "} // comment");
Daniel Jasperc0880a92013-01-04 18:52:56 +00007042}
7043
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007044TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007045 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007046 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
7047 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007048 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007049
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007050 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007051 " {\n"
7052 " breakme(\n"
7053 " qwe);\n"
7054 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007055 format("{\n"
7056 " {\n"
7057 " breakme(qwe);\n"
7058 "}\n",
7059 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007060}
7061
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00007062TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007063 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007064 " avariable,\n"
7065 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007066 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00007067}
7068
Manuel Klimek762dd182013-01-21 10:07:49 +00007069TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007070 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00007071}
7072
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007073TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007074 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00007075 verifyFormat("vector<int> x{\n"
7076 " 1, 2, 3, 4,\n"
7077 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007078 verifyFormat("vector<T> x{{}, {}, {}, {}};");
7079 verifyFormat("f({1, 2});");
7080 verifyFormat("auto v = Foo{-1};");
7081 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
7082 verifyFormat("Class::Class : member{1, 2, 3} {}");
7083 verifyFormat("new vector<int>{1, 2, 3};");
7084 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00007085 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007086 verifyFormat("return {arg1, arg2};");
7087 verifyFormat("return {arg1, SomeType{parameter}};");
7088 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
7089 verifyFormat("new T{arg1, arg2};");
7090 verifyFormat("f(MyMap[{composite, key}]);");
7091 verifyFormat("class Class {\n"
7092 " T member = {arg1, arg2};\n"
7093 "};");
7094 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00007095 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
7096 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00007097
Daniel Jasper438059e2014-05-22 12:11:13 +00007098 verifyFormat("int foo(int i) { return fo1{}(i); }");
7099 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007100 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00007101 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00007102 verifyFormat("Node n{1, Node{1000}, //\n"
7103 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00007104 verifyFormat("Aaaa aaaaaaa{\n"
7105 " {\n"
7106 " aaaa,\n"
7107 " },\n"
7108 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00007109 verifyFormat("class C : public D {\n"
7110 " SomeClass SC{2};\n"
7111 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00007112 verifyFormat("class C : public A {\n"
7113 " class D : public B {\n"
7114 " void f() { int i{2}; }\n"
7115 " };\n"
7116 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00007117 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00007118
Daniel Jaspere4ada022016-12-13 10:05:03 +00007119 // Cases where distinguising braced lists and blocks is hard.
7120 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
7121 verifyFormat("void f() {\n"
7122 " return; // comment\n"
7123 "}\n"
7124 "SomeType t;");
7125 verifyFormat("void f() {\n"
7126 " if (a) {\n"
7127 " f();\n"
7128 " }\n"
7129 "}\n"
7130 "SomeType t;");
7131
Daniel Jasper08434342015-05-26 07:26:26 +00007132 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007133 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00007134 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007135 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
7136 " bbbbb,\n"
7137 " ccccc,\n"
7138 " ddddd,\n"
7139 " eeeee,\n"
7140 " ffffff,\n"
7141 " ggggg,\n"
7142 " hhhhhh,\n"
7143 " iiiiii,\n"
7144 " jjjjjj,\n"
7145 " kkkkkk};",
7146 NoBinPacking);
7147 verifyFormat("const Aaaaaa aaaaa = {\n"
7148 " aaaaa,\n"
7149 " bbbbb,\n"
7150 " ccccc,\n"
7151 " ddddd,\n"
7152 " eeeee,\n"
7153 " ffffff,\n"
7154 " ggggg,\n"
7155 " hhhhhh,\n"
7156 " iiiiii,\n"
7157 " jjjjjj,\n"
7158 " kkkkkk,\n"
7159 "};",
7160 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00007161 verifyFormat(
7162 "const Aaaaaa aaaaa = {\n"
7163 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
7164 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
7165 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
7166 "};",
7167 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007168
Chandler Carruthf8b72662014-03-02 12:37:31 +00007169 // FIXME: The alignment of these trailing comments might be bad. Then again,
7170 // this might be utterly useless in real code.
7171 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00007172 " : some_value{ //\n"
7173 " aaaaaaa, //\n"
7174 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00007175
Chandler Carruthf8b72662014-03-02 12:37:31 +00007176 // In braced lists, the first comment is always assumed to belong to the
7177 // first element. Thus, it can be moved to the next or previous line as
7178 // appropriate.
7179 EXPECT_EQ("function({// First element:\n"
7180 " 1,\n"
7181 " // Second element:\n"
7182 " 2});",
7183 format("function({\n"
7184 " // First element:\n"
7185 " 1,\n"
7186 " // Second element:\n"
7187 " 2});"));
7188 EXPECT_EQ("std::vector<int> MyNumbers{\n"
7189 " // First element:\n"
7190 " 1,\n"
7191 " // Second element:\n"
7192 " 2};",
7193 format("std::vector<int> MyNumbers{// First element:\n"
7194 " 1,\n"
7195 " // Second element:\n"
7196 " 2};",
7197 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00007198 // A trailing comma should still lead to an enforced line break.
7199 EXPECT_EQ("vector<int> SomeVector = {\n"
7200 " // aaa\n"
7201 " 1, 2,\n"
7202 "};",
7203 format("vector<int> SomeVector = { // aaa\n"
7204 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00007205
Chandler Carruthf8b72662014-03-02 12:37:31 +00007206 FormatStyle ExtraSpaces = getLLVMStyle();
7207 ExtraSpaces.Cpp11BracedListStyle = false;
7208 ExtraSpaces.ColumnLimit = 75;
7209 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
7210 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
7211 verifyFormat("f({ 1, 2 });", ExtraSpaces);
7212 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
7213 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
7214 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
7215 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
7216 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
7217 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
7218 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
7219 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
7220 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
7221 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
7222 verifyFormat("class Class {\n"
7223 " T member = { arg1, arg2 };\n"
7224 "};",
7225 ExtraSpaces);
7226 verifyFormat(
7227 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7228 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
7229 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
7230 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
7231 ExtraSpaces);
7232 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00007233 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007234 ExtraSpaces);
7235 verifyFormat(
7236 "someFunction(OtherParam,\n"
7237 " BracedList{ // comment 1 (Forcing interesting break)\n"
7238 " param1, param2,\n"
7239 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00007240 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007241 ExtraSpaces);
7242 verifyFormat(
7243 "std::this_thread::sleep_for(\n"
7244 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
7245 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00007246 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00007247 " aaaaaaa,\n"
7248 " aaaaaaaaaa,\n"
7249 " aaaaa,\n"
7250 " aaaaaaaaaaaaaaa,\n"
7251 " aaa,\n"
7252 " aaaaaaaaaa,\n"
7253 " a,\n"
7254 " aaaaaaaaaaaaaaaaaaaaa,\n"
7255 " aaaaaaaaaaaa,\n"
7256 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
7257 " aaaaaaa,\n"
7258 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007259 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00007260}
7261
Daniel Jasper33b909c2013-10-25 14:29:37 +00007262TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007263 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7264 " 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};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007269 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007270 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00007271 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007272 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7273 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007274 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007275 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7276 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7277 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
7278 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7279 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7280 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7281 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007282 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007283 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7284 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007285 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7286 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7287 " // Separating comment.\n"
7288 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
7289 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7290 " // Leading comment\n"
7291 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7292 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007293 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7294 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007295 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00007296 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7297 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007298 getLLVMStyleWithColumns(38));
7299 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007300 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
7301 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007302 verifyFormat(
7303 "static unsigned SomeValues[10][3] = {\n"
7304 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
7305 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
7306 verifyFormat("static auto fields = new vector<string>{\n"
7307 " \"aaaaaaaaaaaaa\",\n"
7308 " \"aaaaaaaaaaaaa\",\n"
7309 " \"aaaaaaaaaaaa\",\n"
7310 " \"aaaaaaaaaaaaaa\",\n"
7311 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7312 " \"aaaaaaaaaaaa\",\n"
7313 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7314 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00007315 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
7316 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
7317 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
7318 " 3, cccccccccccccccccccccc};",
7319 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00007320
7321 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00007322 verifyFormat("vector<int> x = {\n"
7323 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
7324 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00007325 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00007326 verifyFormat("vector<int> x = {\n"
7327 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00007328 "};",
7329 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00007330 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7331 " 1, 1, 1, 1,\n"
7332 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00007333 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007334
Daniel Jasper60c27072015-05-13 08:16:00 +00007335 // Trailing comment in the first line.
7336 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
7337 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
7338 " 111111111, 222222222, 3333333333, 444444444, //\n"
7339 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00007340 // Trailing comment in the last line.
7341 verifyFormat("int aaaaa[] = {\n"
7342 " 1, 2, 3, // comment\n"
7343 " 4, 5, 6 // comment\n"
7344 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00007345
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007346 // With nested lists, we should either format one item per line or all nested
7347 // lists one on line.
7348 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007349 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
7350 " {aaaaaaaaaaaaaaaaaaa},\n"
7351 " {aaaaaaaaaaaaaaaaaaaaa},\n"
7352 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00007353 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00007354 verifyFormat(
7355 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007356 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
7357 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
7358 " {aaa, aaa},\n"
7359 " {aaa, aaa},\n"
7360 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
7361 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7362 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00007363
7364 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007365 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
7366 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00007367
7368 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00007369
Daniel Jaspereb65e912015-12-21 18:31:15 +00007370 // No braced initializer here.
7371 verifyFormat("void f() {\n"
7372 " struct Dummy {};\n"
7373 " f(v);\n"
7374 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00007375
7376 // Long lists should be formatted in columns even if they are nested.
7377 verifyFormat(
7378 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7379 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7380 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7381 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7382 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7383 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00007384
7385 // Allow "single-column" layout even if that violates the column limit. There
7386 // isn't going to be a better way.
7387 verifyFormat("std::vector<int> a = {\n"
7388 " aaaaaaaa,\n"
7389 " aaaaaaaa,\n"
7390 " aaaaaaaa,\n"
7391 " aaaaaaaa,\n"
7392 " aaaaaaaaaa,\n"
7393 " aaaaaaaa,\n"
7394 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
7395 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00007396 verifyFormat("vector<int> aaaa = {\n"
7397 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7398 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7399 " aaaaaa.aaaaaaa,\n"
7400 " aaaaaa.aaaaaaa,\n"
7401 " aaaaaa.aaaaaaa,\n"
7402 " aaaaaa.aaaaaaa,\n"
7403 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007404
7405 // Don't create hanging lists.
7406 verifyFormat("someFunction(Param,\n"
7407 " {List1, List2,\n"
7408 " List3});",
7409 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00007410 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
7411 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007412}
7413
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007414TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007415 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00007416 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007417
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007418 verifyFormat("void f() { return 42; }");
7419 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007420 " return 42;\n"
7421 "}",
7422 DoNotMerge);
7423 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007424 " // Comment\n"
7425 "}");
7426 verifyFormat("{\n"
7427 "#error {\n"
7428 " int a;\n"
7429 "}");
7430 verifyFormat("{\n"
7431 " int a;\n"
7432 "#error {\n"
7433 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00007434 verifyFormat("void f() {} // comment");
7435 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00007436 verifyFormat("void f() {\n"
7437 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007438 DoNotMerge);
7439 verifyFormat("void f() {\n"
7440 " int a;\n"
7441 "} // comment",
7442 DoNotMerge);
7443 verifyFormat("void f() {\n"
7444 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00007445 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007446
7447 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7448 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7449
7450 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7451 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007452 verifyFormat("class C {\n"
7453 " C()\n"
7454 " : iiiiiiii(nullptr),\n"
7455 " kkkkkkk(nullptr),\n"
7456 " mmmmmmm(nullptr),\n"
7457 " nnnnnnn(nullptr) {}\n"
7458 "};",
7459 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007460
7461 FormatStyle NoColumnLimit = getLLVMStyle();
7462 NoColumnLimit.ColumnLimit = 0;
7463 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7464 EXPECT_EQ("class C {\n"
7465 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007466 "};",
7467 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007468 EXPECT_EQ("A()\n"
7469 " : b(0) {\n"
7470 "}",
7471 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7472
7473 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007474 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7475 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007476 EXPECT_EQ("A()\n"
7477 " : b(0) {\n"
7478 "}",
7479 format("A():b(0){}", DoNotMergeNoColumnLimit));
7480 EXPECT_EQ("A()\n"
7481 " : b(0) {\n"
7482 "}",
7483 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007484
7485 verifyFormat("#define A \\\n"
7486 " void f() { \\\n"
7487 " int i; \\\n"
7488 " }",
7489 getLLVMStyleWithColumns(20));
7490 verifyFormat("#define A \\\n"
7491 " void f() { int i; }",
7492 getLLVMStyleWithColumns(21));
7493 verifyFormat("#define A \\\n"
7494 " void f() { \\\n"
7495 " int i; \\\n"
7496 " } \\\n"
7497 " int j;",
7498 getLLVMStyleWithColumns(22));
7499 verifyFormat("#define A \\\n"
7500 " void f() { int i; } \\\n"
7501 " int j;",
7502 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007503}
7504
Daniel Jasperd74cf402014-04-08 12:46:38 +00007505TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7506 FormatStyle MergeInlineOnly = getLLVMStyle();
7507 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7508 verifyFormat("class C {\n"
7509 " int f() { return 42; }\n"
7510 "};",
7511 MergeInlineOnly);
7512 verifyFormat("int f() {\n"
7513 " return 42;\n"
7514 "}",
7515 MergeInlineOnly);
7516}
7517
Manuel Klimeke01bab52013-01-15 13:38:33 +00007518TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7519 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007520 verifyFormat("struct foo a = {bar};\nint n;");
7521 verifyFormat("class foo a = {bar};\nint n;");
7522 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007523
7524 // Elaborate types inside function definitions.
7525 verifyFormat("struct foo f() {}\nint n;");
7526 verifyFormat("class foo f() {}\nint n;");
7527 verifyFormat("union foo f() {}\nint n;");
7528
7529 // Templates.
7530 verifyFormat("template <class X> void f() {}\nint n;");
7531 verifyFormat("template <struct X> void f() {}\nint n;");
7532 verifyFormat("template <union X> void f() {}\nint n;");
7533
7534 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007535 verifyFormat("struct {\n} n;");
7536 verifyFormat(
7537 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007538 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007539 verifyFormat("class MACRO Z {\n} n;");
7540 verifyFormat("class MACRO(X) Z {\n} n;");
7541 verifyFormat("class __attribute__(X) Z {\n} n;");
7542 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007543 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007544 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007545 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7546 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007547
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007548 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007549 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007550
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007551 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007552 verifyFormat(
7553 "template <typename F>\n"
7554 "Matcher(const Matcher<F> &Other,\n"
7555 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7556 " !is_same<F, T>::value>::type * = 0)\n"
7557 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7558
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007559 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007560 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007561 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007562
7563 // FIXME:
7564 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007565 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007566
Manuel Klimeke01bab52013-01-15 13:38:33 +00007567 // Elaborate types where incorrectly parsing the structural element would
7568 // break the indent.
7569 verifyFormat("if (true)\n"
7570 " class X x;\n"
7571 "else\n"
7572 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007573
7574 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007575 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007576}
7577
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007578TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007579 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7580 format("#error Leave all white!!!!! space* alone!\n"));
7581 EXPECT_EQ(
7582 "#warning Leave all white!!!!! space* alone!\n",
7583 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007584 EXPECT_EQ("#error 1", format(" # error 1"));
7585 EXPECT_EQ("#warning 1", format(" # warning 1"));
7586}
7587
Daniel Jasper4431aa92013-04-23 13:54:04 +00007588TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007589 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007590 verifyFormat("#if (AAAA && BBBB)");
7591 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007592 // FIXME: Come up with a better indentation for #elif.
7593 verifyFormat(
7594 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7595 " defined(BBBBBBBB)\n"
7596 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7597 " defined(BBBBBBBB)\n"
7598 "#endif",
7599 getLLVMStyleWithColumns(65));
7600}
7601
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007602TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7603 FormatStyle AllowsMergedIf = getGoogleStyle();
7604 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7605 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7606 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007607 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7608 EXPECT_EQ("if (true) return 42;",
7609 format("if (true)\nreturn 42;", AllowsMergedIf));
7610 FormatStyle ShortMergedIf = AllowsMergedIf;
7611 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007612 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007613 " if (true) return 42;",
7614 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007615 verifyFormat("#define A \\\n"
7616 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007617 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007618 "#define B",
7619 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007620 verifyFormat("#define A \\\n"
7621 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007622 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007623 "g();",
7624 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007625 verifyFormat("{\n"
7626 "#ifdef A\n"
7627 " // Comment\n"
7628 " if (true) continue;\n"
7629 "#endif\n"
7630 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007631 " if (true) continue;\n"
7632 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007633 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007634 ShortMergedIf.ColumnLimit = 29;
7635 verifyFormat("#define A \\\n"
7636 " if (aaaaaaaaaa) return 1; \\\n"
7637 " return 2;",
7638 ShortMergedIf);
7639 ShortMergedIf.ColumnLimit = 28;
7640 verifyFormat("#define A \\\n"
7641 " if (aaaaaaaaaa) \\\n"
7642 " return 1; \\\n"
7643 " return 2;",
7644 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007645}
7646
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007647TEST_F(FormatTest, BlockCommentsInControlLoops) {
7648 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7649 " f();\n"
7650 "}");
7651 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7652 " f();\n"
7653 "} /* another comment */ else /* comment #3 */ {\n"
7654 " g();\n"
7655 "}");
7656 verifyFormat("while (0) /* a comment in a strange place */ {\n"
7657 " f();\n"
7658 "}");
7659 verifyFormat("for (;;) /* a comment in a strange place */ {\n"
7660 " f();\n"
7661 "}");
7662 verifyFormat("do /* a comment in a strange place */ {\n"
7663 " f();\n"
7664 "} /* another comment */ while (0);");
7665}
7666
7667TEST_F(FormatTest, BlockComments) {
7668 EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
7669 format("/* *//* */ /* */\n/* *//* */ /* */"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007670 EXPECT_EQ("/* */ a /* */ b;", format(" /* */ a/* */ b;"));
Daniel Jaspera49393f2013-08-28 09:07:32 +00007671 EXPECT_EQ("#define A /*123*/ \\\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007672 " b\n"
7673 "/* */\n"
7674 "someCall(\n"
7675 " parameter);",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00007676 format("#define A /*123*/ b\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007677 "/* */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007678 "someCall(parameter);",
7679 getLLVMStyleWithColumns(15)));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007680
7681 EXPECT_EQ("#define A\n"
7682 "/* */ someCall(\n"
7683 " parameter);",
7684 format("#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007685 "/* */someCall(parameter);",
7686 getLLVMStyleWithColumns(15)));
Daniel Jasper51fb2b22013-05-30 06:40:07 +00007687 EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007688 EXPECT_EQ("/*\n"
7689 "*\n"
7690 " * aaaaaa\n"
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00007691 " * aaaaaa\n"
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007692 "*/",
7693 format("/*\n"
7694 "*\n"
7695 " * aaaaaa aaaaaa\n"
7696 "*/",
7697 getLLVMStyleWithColumns(10)));
Daniel Jasperce257f22013-05-30 17:27:48 +00007698 EXPECT_EQ("/*\n"
7699 "**\n"
7700 "* aaaaaa\n"
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007701 "*aaaaaa\n"
Daniel Jasperce257f22013-05-30 17:27:48 +00007702 "*/",
7703 format("/*\n"
7704 "**\n"
7705 "* aaaaaa aaaaaa\n"
7706 "*/",
7707 getLLVMStyleWithColumns(10)));
Daniel Jasperacadc8e2016-06-08 09:45:08 +00007708 EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7709 " /* line 1\n"
7710 " bbbbbbbbbbbb */\n"
7711 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7712 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7713 " /* line 1\n"
7714 " bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7715 getLLVMStyleWithColumns(50)));
Daniel Jasper1f140982013-02-04 07:32:14 +00007716
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007717 FormatStyle NoBinPacking = getLLVMStyle();
7718 NoBinPacking.BinPackParameters = false;
Daniel Jasper1f140982013-02-04 07:32:14 +00007719 EXPECT_EQ("someFunction(1, /* comment 1 */\n"
7720 " 2, /* comment 2 */\n"
7721 " 3, /* comment 3 */\n"
Daniel Jasper14e40ec2013-02-04 08:34:57 +00007722 " aaaa,\n"
7723 " bbbb);",
Daniel Jasper1f140982013-02-04 07:32:14 +00007724 format("someFunction (1, /* comment 1 */\n"
7725 " 2, /* comment 2 */ \n"
7726 " 3, /* comment 3 */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007727 "aaaa, bbbb );",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007728 NoBinPacking));
Daniel Jasper38396592013-02-06 15:23:09 +00007729 verifyFormat(
7730 "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7731 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7732 EXPECT_EQ(
7733 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7734 " aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7735 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
7736 format(
7737 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7738 " aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7739 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
Daniel Jasper94f0e132013-02-06 20:07:35 +00007740 EXPECT_EQ(
7741 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7742 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7743 "int cccccccccccccccccccccccccccccc; /* comment */\n",
7744 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7745 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7746 "int cccccccccccccccccccccccccccccc; /* comment */\n"));
Daniel Jasper022612d2013-07-01 09:34:09 +00007747
7748 verifyFormat("void f(int * /* unused */) {}");
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007749
7750 EXPECT_EQ("/*\n"
7751 " **\n"
7752 " */",
7753 format("/*\n"
7754 " **\n"
7755 " */"));
7756 EXPECT_EQ("/*\n"
7757 " *q\n"
7758 " */",
7759 format("/*\n"
7760 " *q\n"
7761 " */"));
7762 EXPECT_EQ("/*\n"
7763 " * q\n"
7764 " */",
7765 format("/*\n"
7766 " * q\n"
7767 " */"));
7768 EXPECT_EQ("/*\n"
7769 " **/",
7770 format("/*\n"
7771 " **/"));
7772 EXPECT_EQ("/*\n"
7773 " ***/",
7774 format("/*\n"
7775 " ***/"));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007776}
7777
Manuel Klimek82b836a2013-02-06 16:40:56 +00007778TEST_F(FormatTest, BlockCommentsInMacros) {
7779 EXPECT_EQ("#define A \\\n"
7780 " { \\\n"
7781 " /* one line */ \\\n"
7782 " someCall();",
7783 format("#define A { \\\n"
7784 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007785 " someCall();",
7786 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007787 EXPECT_EQ("#define A \\\n"
7788 " { \\\n"
7789 " /* previous */ \\\n"
7790 " /* one line */ \\\n"
7791 " someCall();",
7792 format("#define A { \\\n"
7793 " /* previous */ \\\n"
7794 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007795 " someCall();",
7796 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007797}
7798
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007799TEST_F(FormatTest, BlockCommentsAtEndOfLine) {
7800 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007801 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007802 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007803 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007804 "};",
7805 getLLVMStyleWithColumns(15)));
7806 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007807 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007808 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007809 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007810 "};",
7811 getLLVMStyleWithColumns(15)));
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007812 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007813 " 1111 /* a\n"
Krasimir Georgiev91834222017-01-25 13:58:58 +00007814 " */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007815 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007816 format("a = {1111 /* a */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007817 "};",
7818 getLLVMStyleWithColumns(15)));
7819}
7820
Manuel Klimek82b836a2013-02-06 16:40:56 +00007821TEST_F(FormatTest, IndentLineCommentsInStartOfBlockAtEndOfFile) {
Manuel Klimek82b836a2013-02-06 16:40:56 +00007822 verifyFormat("{\n"
Marianne Mailhot-Sarrasin03137c62016-04-14 14:56:49 +00007823 " // a\n"
7824 " // b");
Manuel Klimek82b836a2013-02-06 16:40:56 +00007825}
7826
Manuel Klimekd33516e2013-01-23 10:09:28 +00007827TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007828 verifyFormat("void f(int *a);");
7829 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007830 verifyFormat("class A {\n void f(int *a);\n};");
7831 verifyFormat("class A {\n int *a;\n};");
7832 verifyFormat("namespace a {\n"
7833 "namespace b {\n"
7834 "class A {\n"
7835 " void f() {}\n"
7836 " int *a;\n"
7837 "};\n"
7838 "}\n"
7839 "}");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007840}
7841
Manuel Klimekd33516e2013-01-23 10:09:28 +00007842TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7843 verifyFormat("while");
7844 verifyFormat("operator");
7845}
7846
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007847TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7848 // This code would be painfully slow to format if we didn't skip it.
7849 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
7850 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7851 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7852 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7853 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7854 "A(1, 1)\n"
7855 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7856 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7857 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7858 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7859 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7860 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7861 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7862 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7863 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7864 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7865 // Deeply nested part is untouched, rest is formatted.
7866 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7867 format(std::string("int i;\n") + Code + "int j;\n",
7868 getLLVMStyle(), IC_ExpectIncomplete));
7869}
7870
Nico Weber7e6a7a12013-01-08 17:56:31 +00007871//===----------------------------------------------------------------------===//
7872// Objective-C tests.
7873//===----------------------------------------------------------------------===//
7874
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007875TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7876 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7877 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7878 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007879 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007880 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7881 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7882 format("-(NSInteger)Method3:(id)anObject;"));
7883 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7884 format("-(NSInteger)Method4:(id)anObject;"));
7885 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7886 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7887 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7888 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007889 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7890 "forAllCells:(BOOL)flag;",
7891 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7892 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007893
7894 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007895 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7896 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007897 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7898 " inRange:(NSRange)range\n"
7899 " outRange:(NSRange)out_range\n"
7900 " outRange1:(NSRange)out_range1\n"
7901 " outRange2:(NSRange)out_range2\n"
7902 " outRange3:(NSRange)out_range3\n"
7903 " outRange4:(NSRange)out_range4\n"
7904 " outRange5:(NSRange)out_range5\n"
7905 " outRange6:(NSRange)out_range6\n"
7906 " outRange7:(NSRange)out_range7\n"
7907 " outRange8:(NSRange)out_range8\n"
7908 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007909
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007910 // When the function name has to be wrapped.
7911 FormatStyle Style = getLLVMStyle();
7912 Style.IndentWrappedFunctionNames = false;
7913 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7914 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7915 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7916 "}",
7917 Style);
7918 Style.IndentWrappedFunctionNames = true;
7919 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7920 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7921 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7922 "}",
7923 Style);
7924
Nico Weberd6f962f2013-01-10 20:18:33 +00007925 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007926 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007927 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7928 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007929 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007930
Daniel Jasper37194282013-05-28 08:33:00 +00007931 verifyFormat("- (int (*)())foo:(int (*)())f;");
7932 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007933
7934 // If there's no return type (very rare in practice!), LLVM and Google style
7935 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007936 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007937 verifyFormat("- foo:(int)f;");
7938 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007939}
7940
Nico Weber0588b502013-02-07 00:19:29 +00007941
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007942TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007943 EXPECT_EQ("\"some text \"\n"
7944 "\"other\";",
7945 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007946 EXPECT_EQ("\"some text \"\n"
7947 "\"other\";",
7948 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007949 EXPECT_EQ(
7950 "#define A \\\n"
7951 " \"some \" \\\n"
7952 " \"text \" \\\n"
7953 " \"other\";",
7954 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7955 EXPECT_EQ(
7956 "#define A \\\n"
7957 " \"so \" \\\n"
7958 " \"text \" \\\n"
7959 " \"other\";",
7960 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7961
7962 EXPECT_EQ("\"some text\"",
7963 format("\"some text\"", getLLVMStyleWithColumns(1)));
7964 EXPECT_EQ("\"some text\"",
7965 format("\"some text\"", getLLVMStyleWithColumns(11)));
7966 EXPECT_EQ("\"some \"\n"
7967 "\"text\"",
7968 format("\"some text\"", getLLVMStyleWithColumns(10)));
7969 EXPECT_EQ("\"some \"\n"
7970 "\"text\"",
7971 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007972 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007973 "\" tex\"\n"
7974 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007975 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007976 EXPECT_EQ("\"some\"\n"
7977 "\" tex\"\n"
7978 "\" and\"",
7979 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7980 EXPECT_EQ("\"some\"\n"
7981 "\"/tex\"\n"
7982 "\"/and\"",
7983 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007984
7985 EXPECT_EQ("variable =\n"
7986 " \"long string \"\n"
7987 " \"literal\";",
7988 format("variable = \"long string literal\";",
7989 getLLVMStyleWithColumns(20)));
7990
7991 EXPECT_EQ("variable = f(\n"
7992 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007993 " \"literal\",\n"
7994 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007995 " loooooooooooooooooooong);",
7996 format("variable = f(\"long string literal\", short, "
7997 "loooooooooooooooooooong);",
7998 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007999
Daniel Jaspera44991332015-04-29 13:06:49 +00008000 EXPECT_EQ(
8001 "f(g(\"long string \"\n"
8002 " \"literal\"),\n"
8003 " b);",
8004 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00008005 EXPECT_EQ("f(g(\"long string \"\n"
8006 " \"literal\",\n"
8007 " a),\n"
8008 " b);",
8009 format("f(g(\"long string literal\", a), b);",
8010 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008011 EXPECT_EQ(
8012 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00008013 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00008014 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
8015 EXPECT_EQ("f(\"one two three four five six \"\n"
8016 " \"seven\".split(\n"
8017 " really_looooong_variable));",
8018 format("f(\"one two three four five six seven\"."
8019 "split(really_looooong_variable));",
8020 getLLVMStyleWithColumns(33)));
8021
8022 EXPECT_EQ("f(\"some \"\n"
8023 " \"text\",\n"
8024 " other);",
8025 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00008026
8027 // Only break as a last resort.
8028 verifyFormat(
8029 "aaaaaaaaaaaaaaaaaaaa(\n"
8030 " aaaaaaaaaaaaaaaaaaaa,\n"
8031 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00008032
Daniel Jaspera44991332015-04-29 13:06:49 +00008033 EXPECT_EQ("\"splitmea\"\n"
8034 "\"trandomp\"\n"
8035 "\"oint\"",
8036 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00008037
Daniel Jaspera44991332015-04-29 13:06:49 +00008038 EXPECT_EQ("\"split/\"\n"
8039 "\"pathat/\"\n"
8040 "\"slashes\"",
8041 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008042
Daniel Jaspera44991332015-04-29 13:06:49 +00008043 EXPECT_EQ("\"split/\"\n"
8044 "\"pathat/\"\n"
8045 "\"slashes\"",
8046 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00008047 EXPECT_EQ("\"split at \"\n"
8048 "\"spaces/at/\"\n"
8049 "\"slashes.at.any$\"\n"
8050 "\"non-alphanumeric%\"\n"
8051 "\"1111111111characte\"\n"
8052 "\"rs\"",
8053 format("\"split at "
8054 "spaces/at/"
8055 "slashes.at."
8056 "any$non-"
8057 "alphanumeric%"
8058 "1111111111characte"
8059 "rs\"",
8060 getLLVMStyleWithColumns(20)));
8061
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008062 // Verify that splitting the strings understands
8063 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00008064 EXPECT_EQ(
8065 "aaaaaaaaaaaa(\n"
8066 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8067 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8068 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8069 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8070 "aaaaaaaaaaaaaaaaaaaaaa\");",
8071 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00008072 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8073 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8074 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8075 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8076 "aaaaaaaaaaaaaaaaaaaaaa\";",
8077 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00008078 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8079 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8080 format("llvm::outs() << "
8081 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8082 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00008083 EXPECT_EQ("ffff(\n"
8084 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8085 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8086 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8087 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8088 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008089
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008090 FormatStyle Style = getLLVMStyleWithColumns(12);
8091 Style.BreakStringLiterals = false;
8092 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8093
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008094 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
8095 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00008096 EXPECT_EQ("#define A \\\n"
8097 " \"some \" \\\n"
8098 " \"text \" \\\n"
8099 " \"other\";",
8100 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008101}
8102
Manuel Klimek9e321992015-07-28 15:50:24 +00008103TEST_F(FormatTest, FullyRemoveEmptyLines) {
8104 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8105 NoEmptyLines.MaxEmptyLinesToKeep = 0;
8106 EXPECT_EQ("int i = a(b());",
8107 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8108}
8109
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008110TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8111 EXPECT_EQ(
8112 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8113 "(\n"
8114 " \"x\t\");",
8115 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8116 "aaaaaaa("
8117 "\"x\t\");"));
8118}
8119
Daniel Jasper174b0122014-01-09 14:18:12 +00008120TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00008121 EXPECT_EQ(
8122 "u8\"utf8 string \"\n"
8123 "u8\"literal\";",
8124 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8125 EXPECT_EQ(
8126 "u\"utf16 string \"\n"
8127 "u\"literal\";",
8128 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8129 EXPECT_EQ(
8130 "U\"utf32 string \"\n"
8131 "U\"literal\";",
8132 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8133 EXPECT_EQ("L\"wide string \"\n"
8134 "L\"literal\";",
8135 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00008136 EXPECT_EQ("@\"NSString \"\n"
8137 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00008138 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00008139
8140 // This input makes clang-format try to split the incomplete unicode escape
8141 // sequence, which used to lead to a crasher.
8142 verifyNoCrash(
8143 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8144 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008145}
8146
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00008147TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8148 FormatStyle Style = getGoogleStyleWithColumns(15);
8149 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8150 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8151 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8152 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8153 EXPECT_EQ("u8R\"x(raw literal)x\";",
8154 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008155}
8156
8157TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8158 FormatStyle Style = getLLVMStyleWithColumns(20);
8159 EXPECT_EQ(
8160 "_T(\"aaaaaaaaaaaaaa\")\n"
8161 "_T(\"aaaaaaaaaaaaaa\")\n"
8162 "_T(\"aaaaaaaaaaaa\")",
8163 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
8164 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
8165 " _T(\"aaaaaa\"),\n"
8166 " z);",
8167 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8168
8169 // FIXME: Handle embedded spaces in one iteration.
8170 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8171 // "_T(\"aaaaaaaaaaaaa\")\n"
8172 // "_T(\"aaaaaaaaaaaaa\")\n"
8173 // "_T(\"a\")",
8174 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8175 // getLLVMStyleWithColumns(20)));
8176 EXPECT_EQ(
8177 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8178 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008179 EXPECT_EQ("f(\n"
8180 "#if !TEST\n"
8181 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8182 "#endif\n"
8183 " );",
8184 format("f(\n"
8185 "#if !TEST\n"
8186 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8187 "#endif\n"
8188 ");"));
8189 EXPECT_EQ("f(\n"
8190 "\n"
8191 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8192 format("f(\n"
8193 "\n"
8194 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008195}
8196
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008197TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008198 EXPECT_EQ(
8199 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8200 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8201 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8202 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8203 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8204 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8205}
8206
8207TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8208 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008209 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008210 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8211 "multiline raw string literal xxxxxxxxxxxxxx\n"
8212 ")x\",\n"
8213 " a),\n"
8214 " b);",
8215 format("fffffffffff(g(R\"x(\n"
8216 "multiline raw string literal xxxxxxxxxxxxxx\n"
8217 ")x\", a), b);",
8218 getGoogleStyleWithColumns(20)));
8219 EXPECT_EQ("fffffffffff(\n"
8220 " g(R\"x(qqq\n"
8221 "multiline raw string literal xxxxxxxxxxxxxx\n"
8222 ")x\",\n"
8223 " a),\n"
8224 " b);",
8225 format("fffffffffff(g(R\"x(qqq\n"
8226 "multiline raw string literal xxxxxxxxxxxxxx\n"
8227 ")x\", a), b);",
8228 getGoogleStyleWithColumns(20)));
8229
8230 EXPECT_EQ("fffffffffff(R\"x(\n"
8231 "multiline raw string literal xxxxxxxxxxxxxx\n"
8232 ")x\");",
8233 format("fffffffffff(R\"x(\n"
8234 "multiline raw string literal xxxxxxxxxxxxxx\n"
8235 ")x\");",
8236 getGoogleStyleWithColumns(20)));
8237 EXPECT_EQ("fffffffffff(R\"x(\n"
8238 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008239 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008240 format("fffffffffff(R\"x(\n"
8241 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008242 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008243 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008244 EXPECT_EQ("fffffffffff(\n"
8245 " R\"x(\n"
8246 "multiline raw string literal xxxxxxxxxxxxxx\n"
8247 ")x\" +\n"
8248 " bbbbbb);",
8249 format("fffffffffff(\n"
8250 " R\"x(\n"
8251 "multiline raw string literal xxxxxxxxxxxxxx\n"
8252 ")x\" + bbbbbb);",
8253 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008254}
8255
Alexander Kornienkobe633902013-06-14 11:46:10 +00008256TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008257 verifyFormat("string a = \"unterminated;");
8258 EXPECT_EQ("function(\"unterminated,\n"
8259 " OtherParameter);",
8260 format("function( \"unterminated,\n"
8261 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008262}
8263
8264TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008265 FormatStyle Style = getLLVMStyle();
8266 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008267 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008268 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008269}
8270
Daniel Jaspera44991332015-04-29 13:06:49 +00008271TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008272
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008273TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8274 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8275 " \"ddeeefff\");",
8276 format("someFunction(\"aaabbbcccdddeeefff\");",
8277 getLLVMStyleWithColumns(25)));
8278 EXPECT_EQ("someFunction1234567890(\n"
8279 " \"aaabbbcccdddeeefff\");",
8280 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8281 getLLVMStyleWithColumns(26)));
8282 EXPECT_EQ("someFunction1234567890(\n"
8283 " \"aaabbbcccdddeeeff\"\n"
8284 " \"f\");",
8285 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8286 getLLVMStyleWithColumns(25)));
8287 EXPECT_EQ("someFunction1234567890(\n"
8288 " \"aaabbbcccdddeeeff\"\n"
8289 " \"f\");",
8290 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8291 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008292 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8293 " \"ddde \"\n"
8294 " \"efff\");",
8295 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008296 getLLVMStyleWithColumns(25)));
8297 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8298 " \"ddeeefff\");",
8299 format("someFunction(\"aaabbbccc ddeeefff\");",
8300 getLLVMStyleWithColumns(25)));
8301 EXPECT_EQ("someFunction1234567890(\n"
8302 " \"aaabb \"\n"
8303 " \"cccdddeeefff\");",
8304 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8305 getLLVMStyleWithColumns(25)));
8306 EXPECT_EQ("#define A \\\n"
8307 " string s = \\\n"
8308 " \"123456789\" \\\n"
8309 " \"0\"; \\\n"
8310 " int i;",
8311 format("#define A string s = \"1234567890\"; int i;",
8312 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008313 // FIXME: Put additional penalties on breaking at non-whitespace locations.
8314 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8315 " \"dddeeeff\"\n"
8316 " \"f\");",
8317 format("someFunction(\"aaabbbcc dddeeefff\");",
8318 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008319}
8320
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008321TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008322 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8323 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008324 EXPECT_EQ("\"test\"\n"
8325 "\"\\n\"",
8326 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8327 EXPECT_EQ("\"tes\\\\\"\n"
8328 "\"n\"",
8329 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8330 EXPECT_EQ("\"\\\\\\\\\"\n"
8331 "\"\\n\"",
8332 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008333 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008334 EXPECT_EQ("\"\\uff01\"\n"
8335 "\"test\"",
8336 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8337 EXPECT_EQ("\"\\Uff01ff02\"",
8338 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8339 EXPECT_EQ("\"\\x000000000001\"\n"
8340 "\"next\"",
8341 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8342 EXPECT_EQ("\"\\x000000000001next\"",
8343 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8344 EXPECT_EQ("\"\\x000000000001\"",
8345 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8346 EXPECT_EQ("\"test\"\n"
8347 "\"\\000000\"\n"
8348 "\"000001\"",
8349 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8350 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008351 "\"00000000\"\n"
8352 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008353 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008354}
8355
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008356TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8357 verifyFormat("void f() {\n"
8358 " return g() {}\n"
8359 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008360 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008361 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008362 "}");
8363}
8364
Manuel Klimek421147e2014-01-24 09:25:23 +00008365TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8366 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008367 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008368}
8369
Manuel Klimek13b97d82013-05-13 08:42:42 +00008370TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8371 verifyFormat("class X {\n"
8372 " void f() {\n"
8373 " }\n"
8374 "};",
8375 getLLVMStyleWithColumns(12));
8376}
8377
8378TEST_F(FormatTest, ConfigurableIndentWidth) {
8379 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8380 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008381 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008382 verifyFormat("void f() {\n"
8383 " someFunction();\n"
8384 " if (true) {\n"
8385 " f();\n"
8386 " }\n"
8387 "}",
8388 EightIndent);
8389 verifyFormat("class X {\n"
8390 " void f() {\n"
8391 " }\n"
8392 "};",
8393 EightIndent);
8394 verifyFormat("int x[] = {\n"
8395 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008396 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008397 EightIndent);
8398}
8399
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008400TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008401 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008402 "f();",
8403 getLLVMStyleWithColumns(8));
8404}
8405
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008406TEST_F(FormatTest, ConfigurableUseOfTab) {
8407 FormatStyle Tab = getLLVMStyleWithColumns(42);
8408 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008409 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008410 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008411
8412 EXPECT_EQ("if (aaaaaaaa && // q\n"
8413 " bb)\t\t// w\n"
8414 "\t;",
8415 format("if (aaaaaaaa &&// q\n"
8416 "bb)// w\n"
8417 ";",
8418 Tab));
8419 EXPECT_EQ("if (aaa && bbb) // w\n"
8420 "\t;",
8421 format("if(aaa&&bbb)// w\n"
8422 ";",
8423 Tab));
8424
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008425 verifyFormat("class X {\n"
8426 "\tvoid f() {\n"
8427 "\t\tsomeFunction(parameter1,\n"
8428 "\t\t\t parameter2);\n"
8429 "\t}\n"
8430 "};",
8431 Tab);
8432 verifyFormat("#define A \\\n"
8433 "\tvoid f() { \\\n"
8434 "\t\tsomeFunction( \\\n"
8435 "\t\t parameter1, \\\n"
8436 "\t\t parameter2); \\\n"
8437 "\t}",
8438 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008439
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008440 Tab.TabWidth = 4;
8441 Tab.IndentWidth = 8;
8442 verifyFormat("class TabWidth4Indent8 {\n"
8443 "\t\tvoid f() {\n"
8444 "\t\t\t\tsomeFunction(parameter1,\n"
8445 "\t\t\t\t\t\t\t parameter2);\n"
8446 "\t\t}\n"
8447 "};",
8448 Tab);
8449
8450 Tab.TabWidth = 4;
8451 Tab.IndentWidth = 4;
8452 verifyFormat("class TabWidth4Indent4 {\n"
8453 "\tvoid f() {\n"
8454 "\t\tsomeFunction(parameter1,\n"
8455 "\t\t\t\t\t parameter2);\n"
8456 "\t}\n"
8457 "};",
8458 Tab);
8459
8460 Tab.TabWidth = 8;
8461 Tab.IndentWidth = 4;
8462 verifyFormat("class TabWidth8Indent4 {\n"
8463 " void f() {\n"
8464 "\tsomeFunction(parameter1,\n"
8465 "\t\t parameter2);\n"
8466 " }\n"
8467 "};",
8468 Tab);
8469
Alexander Kornienko39856b72013-09-10 09:38:25 +00008470 Tab.TabWidth = 8;
8471 Tab.IndentWidth = 8;
8472 EXPECT_EQ("/*\n"
8473 "\t a\t\tcomment\n"
8474 "\t in multiple lines\n"
8475 " */",
8476 format(" /*\t \t \n"
8477 " \t \t a\t\tcomment\t \t\n"
8478 " \t \t in multiple lines\t\n"
8479 " \t */",
8480 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008481
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008482 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008483 verifyFormat("{\n"
8484 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8485 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8486 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8487 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8488 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8489 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008490 "};",
8491 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008492 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008493 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008494 "\ta2,\n"
8495 "\ta3\n"
8496 "};",
8497 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008498 EXPECT_EQ("if (aaaaaaaa && // q\n"
8499 " bb) // w\n"
8500 "\t;",
8501 format("if (aaaaaaaa &&// q\n"
8502 "bb)// w\n"
8503 ";",
8504 Tab));
8505 verifyFormat("class X {\n"
8506 "\tvoid f() {\n"
8507 "\t\tsomeFunction(parameter1,\n"
8508 "\t\t parameter2);\n"
8509 "\t}\n"
8510 "};",
8511 Tab);
8512 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008513 "\tQ(\n"
8514 "\t {\n"
8515 "\t\t int a;\n"
8516 "\t\t someFunction(aaaaaaaa,\n"
8517 "\t\t bbbbbbb);\n"
8518 "\t },\n"
8519 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008520 "}",
8521 Tab);
8522 EXPECT_EQ("{\n"
8523 "\t/* aaaa\n"
8524 "\t bbbb */\n"
8525 "}",
8526 format("{\n"
8527 "/* aaaa\n"
8528 " bbbb */\n"
8529 "}",
8530 Tab));
8531 EXPECT_EQ("{\n"
8532 "\t/*\n"
8533 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8534 "\t bbbbbbbbbbbbb\n"
8535 "\t*/\n"
8536 "}",
8537 format("{\n"
8538 "/*\n"
8539 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8540 "*/\n"
8541 "}",
8542 Tab));
8543 EXPECT_EQ("{\n"
8544 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8545 "\t// bbbbbbbbbbbbb\n"
8546 "}",
8547 format("{\n"
8548 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8549 "}",
8550 Tab));
8551 EXPECT_EQ("{\n"
8552 "\t/*\n"
8553 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8554 "\t bbbbbbbbbbbbb\n"
8555 "\t*/\n"
8556 "}",
8557 format("{\n"
8558 "\t/*\n"
8559 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8560 "\t*/\n"
8561 "}",
8562 Tab));
8563 EXPECT_EQ("{\n"
8564 "\t/*\n"
8565 "\n"
8566 "\t*/\n"
8567 "}",
8568 format("{\n"
8569 "\t/*\n"
8570 "\n"
8571 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008572 "}",
8573 Tab));
8574 EXPECT_EQ("{\n"
8575 "\t/*\n"
8576 " asdf\n"
8577 "\t*/\n"
8578 "}",
8579 format("{\n"
8580 "\t/*\n"
8581 " asdf\n"
8582 "\t*/\n"
8583 "}",
8584 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008585
8586 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008587 EXPECT_EQ("/*\n"
8588 " a\t\tcomment\n"
8589 " in multiple lines\n"
8590 " */",
8591 format(" /*\t \t \n"
8592 " \t \t a\t\tcomment\t \t\n"
8593 " \t \t in multiple lines\t\n"
8594 " \t */",
8595 Tab));
8596 EXPECT_EQ("/* some\n"
8597 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008598 format(" \t \t /* some\n"
8599 " \t \t comment */",
8600 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008601 EXPECT_EQ("int a; /* some\n"
8602 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008603 format(" \t \t int a; /* some\n"
8604 " \t \t comment */",
8605 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008606
Alexander Kornienko39856b72013-09-10 09:38:25 +00008607 EXPECT_EQ("int a; /* some\n"
8608 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008609 format(" \t \t int\ta; /* some\n"
8610 " \t \t comment */",
8611 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008612 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8613 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008614 format(" \t \t f(\"\t\t\"); /* some\n"
8615 " \t \t comment */",
8616 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008617 EXPECT_EQ("{\n"
8618 " /*\n"
8619 " * Comment\n"
8620 " */\n"
8621 " int i;\n"
8622 "}",
8623 format("{\n"
8624 "\t/*\n"
8625 "\t * Comment\n"
8626 "\t */\n"
8627 "\t int i;\n"
8628 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008629
8630 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8631 Tab.TabWidth = 8;
8632 Tab.IndentWidth = 8;
8633 EXPECT_EQ("if (aaaaaaaa && // q\n"
8634 " bb) // w\n"
8635 "\t;",
8636 format("if (aaaaaaaa &&// q\n"
8637 "bb)// w\n"
8638 ";",
8639 Tab));
8640 EXPECT_EQ("if (aaa && bbb) // w\n"
8641 "\t;",
8642 format("if(aaa&&bbb)// w\n"
8643 ";",
8644 Tab));
8645 verifyFormat("class X {\n"
8646 "\tvoid f() {\n"
8647 "\t\tsomeFunction(parameter1,\n"
8648 "\t\t\t parameter2);\n"
8649 "\t}\n"
8650 "};",
8651 Tab);
8652 verifyFormat("#define A \\\n"
8653 "\tvoid f() { \\\n"
8654 "\t\tsomeFunction( \\\n"
8655 "\t\t parameter1, \\\n"
8656 "\t\t parameter2); \\\n"
8657 "\t}",
8658 Tab);
8659 Tab.TabWidth = 4;
8660 Tab.IndentWidth = 8;
8661 verifyFormat("class TabWidth4Indent8 {\n"
8662 "\t\tvoid f() {\n"
8663 "\t\t\t\tsomeFunction(parameter1,\n"
8664 "\t\t\t\t\t\t\t parameter2);\n"
8665 "\t\t}\n"
8666 "};",
8667 Tab);
8668 Tab.TabWidth = 4;
8669 Tab.IndentWidth = 4;
8670 verifyFormat("class TabWidth4Indent4 {\n"
8671 "\tvoid f() {\n"
8672 "\t\tsomeFunction(parameter1,\n"
8673 "\t\t\t\t\t parameter2);\n"
8674 "\t}\n"
8675 "};",
8676 Tab);
8677 Tab.TabWidth = 8;
8678 Tab.IndentWidth = 4;
8679 verifyFormat("class TabWidth8Indent4 {\n"
8680 " void f() {\n"
8681 "\tsomeFunction(parameter1,\n"
8682 "\t\t parameter2);\n"
8683 " }\n"
8684 "};",
8685 Tab);
8686 Tab.TabWidth = 8;
8687 Tab.IndentWidth = 8;
8688 EXPECT_EQ("/*\n"
8689 "\t a\t\tcomment\n"
8690 "\t in multiple lines\n"
8691 " */",
8692 format(" /*\t \t \n"
8693 " \t \t a\t\tcomment\t \t\n"
8694 " \t \t in multiple lines\t\n"
8695 " \t */",
8696 Tab));
8697 verifyFormat("{\n"
8698 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8699 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8700 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8701 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8702 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8703 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8704 "};",
8705 Tab);
8706 verifyFormat("enum AA {\n"
8707 "\ta1, // Force multiple lines\n"
8708 "\ta2,\n"
8709 "\ta3\n"
8710 "};",
8711 Tab);
8712 EXPECT_EQ("if (aaaaaaaa && // q\n"
8713 " bb) // w\n"
8714 "\t;",
8715 format("if (aaaaaaaa &&// q\n"
8716 "bb)// w\n"
8717 ";",
8718 Tab));
8719 verifyFormat("class X {\n"
8720 "\tvoid f() {\n"
8721 "\t\tsomeFunction(parameter1,\n"
8722 "\t\t\t parameter2);\n"
8723 "\t}\n"
8724 "};",
8725 Tab);
8726 verifyFormat("{\n"
8727 "\tQ(\n"
8728 "\t {\n"
8729 "\t\t int a;\n"
8730 "\t\t someFunction(aaaaaaaa,\n"
8731 "\t\t\t\t bbbbbbb);\n"
8732 "\t },\n"
8733 "\t p);\n"
8734 "}",
8735 Tab);
8736 EXPECT_EQ("{\n"
8737 "\t/* aaaa\n"
8738 "\t bbbb */\n"
8739 "}",
8740 format("{\n"
8741 "/* aaaa\n"
8742 " bbbb */\n"
8743 "}",
8744 Tab));
8745 EXPECT_EQ("{\n"
8746 "\t/*\n"
8747 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8748 "\t bbbbbbbbbbbbb\n"
8749 "\t*/\n"
8750 "}",
8751 format("{\n"
8752 "/*\n"
8753 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8754 "*/\n"
8755 "}",
8756 Tab));
8757 EXPECT_EQ("{\n"
8758 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8759 "\t// bbbbbbbbbbbbb\n"
8760 "}",
8761 format("{\n"
8762 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8763 "}",
8764 Tab));
8765 EXPECT_EQ("{\n"
8766 "\t/*\n"
8767 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8768 "\t bbbbbbbbbbbbb\n"
8769 "\t*/\n"
8770 "}",
8771 format("{\n"
8772 "\t/*\n"
8773 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8774 "\t*/\n"
8775 "}",
8776 Tab));
8777 EXPECT_EQ("{\n"
8778 "\t/*\n"
8779 "\n"
8780 "\t*/\n"
8781 "}",
8782 format("{\n"
8783 "\t/*\n"
8784 "\n"
8785 "\t*/\n"
8786 "}",
8787 Tab));
8788 EXPECT_EQ("{\n"
8789 "\t/*\n"
8790 " asdf\n"
8791 "\t*/\n"
8792 "}",
8793 format("{\n"
8794 "\t/*\n"
8795 " asdf\n"
8796 "\t*/\n"
8797 "}",
8798 Tab));
8799 EXPECT_EQ("/*\n"
8800 "\t a\t\tcomment\n"
8801 "\t in multiple lines\n"
8802 " */",
8803 format(" /*\t \t \n"
8804 " \t \t a\t\tcomment\t \t\n"
8805 " \t \t in multiple lines\t\n"
8806 " \t */",
8807 Tab));
8808 EXPECT_EQ("/* some\n"
8809 " comment */",
8810 format(" \t \t /* some\n"
8811 " \t \t comment */",
8812 Tab));
8813 EXPECT_EQ("int a; /* some\n"
8814 " comment */",
8815 format(" \t \t int a; /* some\n"
8816 " \t \t comment */",
8817 Tab));
8818 EXPECT_EQ("int a; /* some\n"
8819 "comment */",
8820 format(" \t \t int\ta; /* some\n"
8821 " \t \t comment */",
8822 Tab));
8823 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8824 " comment */",
8825 format(" \t \t f(\"\t\t\"); /* some\n"
8826 " \t \t comment */",
8827 Tab));
8828 EXPECT_EQ("{\n"
8829 " /*\n"
8830 " * Comment\n"
8831 " */\n"
8832 " int i;\n"
8833 "}",
8834 format("{\n"
8835 "\t/*\n"
8836 "\t * Comment\n"
8837 "\t */\n"
8838 "\t int i;\n"
8839 "}"));
8840 Tab.AlignConsecutiveAssignments = true;
8841 Tab.AlignConsecutiveDeclarations = true;
8842 Tab.TabWidth = 4;
8843 Tab.IndentWidth = 4;
8844 verifyFormat("class Assign {\n"
8845 "\tvoid f() {\n"
8846 "\t\tint x = 123;\n"
8847 "\t\tint random = 4;\n"
8848 "\t\tstd::string alphabet =\n"
8849 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8850 "\t}\n"
8851 "};",
8852 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008853}
8854
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008855TEST_F(FormatTest, CalculatesOriginalColumn) {
8856 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8857 "q\"; /* some\n"
8858 " comment */",
8859 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8860 "q\"; /* some\n"
8861 " comment */",
8862 getLLVMStyle()));
8863 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8864 "/* some\n"
8865 " comment */",
8866 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8867 " /* some\n"
8868 " comment */",
8869 getLLVMStyle()));
8870 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8871 "qqq\n"
8872 "/* some\n"
8873 " comment */",
8874 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8875 "qqq\n"
8876 " /* some\n"
8877 " comment */",
8878 getLLVMStyle()));
8879 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8880 "wwww; /* some\n"
8881 " comment */",
8882 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8883 "wwww; /* some\n"
8884 " comment */",
8885 getLLVMStyle()));
8886}
8887
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008888TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008889 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008890 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008891
8892 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008893 " continue;",
8894 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008895 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008896 " continue;",
8897 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008898 verifyFormat("if(true)\n"
8899 " f();\n"
8900 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008901 " f();",
8902 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008903 verifyFormat("do {\n"
8904 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008905 "} while(something());",
8906 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008907 verifyFormat("switch(x) {\n"
8908 "default:\n"
8909 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008910 "}",
8911 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008912 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008913 verifyFormat("size_t x = sizeof(x);", NoSpace);
8914 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8915 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8916 verifyFormat("alignas(128) char a[128];", NoSpace);
8917 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8918 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8919 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008920 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008921 verifyFormat("T A::operator()();", NoSpace);
8922 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008923
8924 FormatStyle Space = getLLVMStyle();
8925 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8926
8927 verifyFormat("int f ();", Space);
8928 verifyFormat("void f (int a, T b) {\n"
8929 " while (true)\n"
8930 " continue;\n"
8931 "}",
8932 Space);
8933 verifyFormat("if (true)\n"
8934 " f ();\n"
8935 "else if (true)\n"
8936 " f ();",
8937 Space);
8938 verifyFormat("do {\n"
8939 " do_something ();\n"
8940 "} while (something ());",
8941 Space);
8942 verifyFormat("switch (x) {\n"
8943 "default:\n"
8944 " break;\n"
8945 "}",
8946 Space);
8947 verifyFormat("A::A () : a (1) {}", Space);
8948 verifyFormat("void f () __attribute__ ((asdf));", Space);
8949 verifyFormat("*(&a + 1);\n"
8950 "&((&a)[1]);\n"
8951 "a[(b + c) * d];\n"
8952 "(((a + 1) * 2) + 3) * 4;",
8953 Space);
8954 verifyFormat("#define A(x) x", Space);
8955 verifyFormat("#define A (x) x", Space);
8956 verifyFormat("#if defined(x)\n"
8957 "#endif",
8958 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008959 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008960 verifyFormat("size_t x = sizeof (x);", Space);
8961 verifyFormat("auto f (int x) -> decltype (x);", Space);
8962 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8963 verifyFormat("alignas (128) char a[128];", Space);
8964 verifyFormat("size_t x = alignof (MyType);", Space);
8965 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8966 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008967 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008968 verifyFormat("T A::operator() ();", Space);
8969 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008970}
8971
8972TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8973 FormatStyle Spaces = getLLVMStyle();
8974
8975 Spaces.SpacesInParentheses = true;
8976 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008977 verifyFormat("call();", Spaces);
8978 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008979 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8980 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008981 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008982 " continue;",
8983 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008984 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008985 " continue;",
8986 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008987 verifyFormat("if ( true )\n"
8988 " f();\n"
8989 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008990 " f();",
8991 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008992 verifyFormat("do {\n"
8993 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008994 "} while ( something() );",
8995 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008996 verifyFormat("switch ( x ) {\n"
8997 "default:\n"
8998 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008999 "}",
9000 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009001
9002 Spaces.SpacesInParentheses = false;
9003 Spaces.SpacesInCStyleCastParentheses = true;
9004 verifyFormat("Type *A = ( Type * )P;", Spaces);
9005 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
9006 verifyFormat("x = ( int32 )y;", Spaces);
9007 verifyFormat("int a = ( int )(2.0f);", Spaces);
9008 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
9009 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
9010 verifyFormat("#define x (( int )-1)", Spaces);
9011
Daniel Jasper92e09822015-03-18 12:59:19 +00009012 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00009013 Spaces.SpacesInParentheses = false;
9014 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00009015 Spaces.SpacesInCStyleCastParentheses = true;
9016 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009017 verifyFormat("call( );", Spaces);
9018 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009019 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009020 " continue;",
9021 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009022 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009023 " continue;",
9024 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009025 verifyFormat("if (true)\n"
9026 " f( );\n"
9027 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009028 " f( );",
9029 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009030 verifyFormat("do {\n"
9031 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009032 "} while (something( ));",
9033 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009034 verifyFormat("switch (x) {\n"
9035 "default:\n"
9036 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009037 "}",
9038 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009039
Daniel Jasper92e09822015-03-18 12:59:19 +00009040 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009041 Spaces.SpaceAfterCStyleCast = true;
9042 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009043 verifyFormat("call( );", Spaces);
9044 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009045 verifyFormat("while (( bool ) 1)\n"
9046 " continue;",
9047 Spaces);
9048 verifyFormat("for (;;)\n"
9049 " continue;",
9050 Spaces);
9051 verifyFormat("if (true)\n"
9052 " f( );\n"
9053 "else if (true)\n"
9054 " f( );",
9055 Spaces);
9056 verifyFormat("do {\n"
9057 " do_something(( int ) i);\n"
9058 "} while (something( ));",
9059 Spaces);
9060 verifyFormat("switch (x) {\n"
9061 "default:\n"
9062 " break;\n"
9063 "}",
9064 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009065
9066 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009067 Spaces.SpacesInCStyleCastParentheses = false;
9068 Spaces.SpaceAfterCStyleCast = true;
9069 verifyFormat("while ((bool) 1)\n"
9070 " continue;",
9071 Spaces);
9072 verifyFormat("do {\n"
9073 " do_something((int) i);\n"
9074 "} while (something( ));",
9075 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009076}
9077
Daniel Jasperad981f82014-08-26 11:41:14 +00009078TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9079 verifyFormat("int a[5];");
9080 verifyFormat("a[3] += 42;");
9081
9082 FormatStyle Spaces = getLLVMStyle();
9083 Spaces.SpacesInSquareBrackets = true;
9084 // Lambdas unchanged.
9085 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9086 verifyFormat("return [i, args...] {};", Spaces);
9087
9088 // Not lambdas.
9089 verifyFormat("int a[ 5 ];", Spaces);
9090 verifyFormat("a[ 3 ] += 42;", Spaces);
9091 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9092 verifyFormat("double &operator[](int i) { return 0; }\n"
9093 "int i;",
9094 Spaces);
9095 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9096 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9097 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9098}
9099
Daniel Jasperd94bff32013-09-25 15:15:02 +00009100TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9101 verifyFormat("int a = 5;");
9102 verifyFormat("a += 42;");
9103 verifyFormat("a or_eq 8;");
9104
9105 FormatStyle Spaces = getLLVMStyle();
9106 Spaces.SpaceBeforeAssignmentOperators = false;
9107 verifyFormat("int a= 5;", Spaces);
9108 verifyFormat("a+= 42;", Spaces);
9109 verifyFormat("a or_eq 8;", Spaces);
9110}
9111
Daniel Jaspera44991332015-04-29 13:06:49 +00009112TEST_F(FormatTest, AlignConsecutiveAssignments) {
9113 FormatStyle Alignment = getLLVMStyle();
9114 Alignment.AlignConsecutiveAssignments = false;
9115 verifyFormat("int a = 5;\n"
9116 "int oneTwoThree = 123;",
9117 Alignment);
9118 verifyFormat("int a = 5;\n"
9119 "int oneTwoThree = 123;",
9120 Alignment);
9121
9122 Alignment.AlignConsecutiveAssignments = true;
9123 verifyFormat("int a = 5;\n"
9124 "int oneTwoThree = 123;",
9125 Alignment);
9126 verifyFormat("int a = method();\n"
9127 "int oneTwoThree = 133;",
9128 Alignment);
9129 verifyFormat("a &= 5;\n"
9130 "bcd *= 5;\n"
9131 "ghtyf += 5;\n"
9132 "dvfvdb -= 5;\n"
9133 "a /= 5;\n"
9134 "vdsvsv %= 5;\n"
9135 "sfdbddfbdfbb ^= 5;\n"
9136 "dvsdsv |= 5;\n"
9137 "int dsvvdvsdvvv = 123;",
9138 Alignment);
9139 verifyFormat("int i = 1, j = 10;\n"
9140 "something = 2000;",
9141 Alignment);
9142 verifyFormat("something = 2000;\n"
9143 "int i = 1, j = 10;\n",
9144 Alignment);
9145 verifyFormat("something = 2000;\n"
9146 "another = 911;\n"
9147 "int i = 1, j = 10;\n"
9148 "oneMore = 1;\n"
9149 "i = 2;",
9150 Alignment);
9151 verifyFormat("int a = 5;\n"
9152 "int one = 1;\n"
9153 "method();\n"
9154 "int oneTwoThree = 123;\n"
9155 "int oneTwo = 12;",
9156 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009157 verifyFormat("int oneTwoThree = 123;\n"
9158 "int oneTwo = 12;\n"
9159 "method();\n",
9160 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009161 verifyFormat("int oneTwoThree = 123; // comment\n"
9162 "int oneTwo = 12; // comment",
9163 Alignment);
9164 EXPECT_EQ("int a = 5;\n"
9165 "\n"
9166 "int oneTwoThree = 123;",
9167 format("int a = 5;\n"
9168 "\n"
9169 "int oneTwoThree= 123;",
9170 Alignment));
9171 EXPECT_EQ("int a = 5;\n"
9172 "int one = 1;\n"
9173 "\n"
9174 "int oneTwoThree = 123;",
9175 format("int a = 5;\n"
9176 "int one = 1;\n"
9177 "\n"
9178 "int oneTwoThree = 123;",
9179 Alignment));
9180 EXPECT_EQ("int a = 5;\n"
9181 "int one = 1;\n"
9182 "\n"
9183 "int oneTwoThree = 123;\n"
9184 "int oneTwo = 12;",
9185 format("int a = 5;\n"
9186 "int one = 1;\n"
9187 "\n"
9188 "int oneTwoThree = 123;\n"
9189 "int oneTwo = 12;",
9190 Alignment));
9191 Alignment.AlignEscapedNewlinesLeft = true;
9192 verifyFormat("#define A \\\n"
9193 " int aaaa = 12; \\\n"
9194 " int b = 23; \\\n"
9195 " int ccc = 234; \\\n"
9196 " int dddddddddd = 2345;",
9197 Alignment);
9198 Alignment.AlignEscapedNewlinesLeft = false;
9199 verifyFormat("#define A "
9200 " \\\n"
9201 " int aaaa = 12; "
9202 " \\\n"
9203 " int b = 23; "
9204 " \\\n"
9205 " int ccc = 234; "
9206 " \\\n"
9207 " int dddddddddd = 2345;",
9208 Alignment);
9209 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9210 "k = 4, int l = 5,\n"
9211 " int m = 6) {\n"
9212 " int j = 10;\n"
9213 " otherThing = 1;\n"
9214 "}",
9215 Alignment);
9216 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9217 " int i = 1;\n"
9218 " int j = 2;\n"
9219 " int big = 10000;\n"
9220 "}",
9221 Alignment);
9222 verifyFormat("class C {\n"
9223 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009224 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009225 " virtual void f() = 0;\n"
9226 "};",
9227 Alignment);
9228 verifyFormat("int i = 1;\n"
9229 "if (SomeType t = getSomething()) {\n"
9230 "}\n"
9231 "int j = 2;\n"
9232 "int big = 10000;",
9233 Alignment);
9234 verifyFormat("int j = 7;\n"
9235 "for (int k = 0; k < N; ++k) {\n"
9236 "}\n"
9237 "int j = 2;\n"
9238 "int big = 10000;\n"
9239 "}",
9240 Alignment);
9241 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9242 verifyFormat("int i = 1;\n"
9243 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9244 " = someLooooooooooooooooongFunction();\n"
9245 "int j = 2;",
9246 Alignment);
9247 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9248 verifyFormat("int i = 1;\n"
9249 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9250 " someLooooooooooooooooongFunction();\n"
9251 "int j = 2;",
9252 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009253
9254 verifyFormat("auto lambda = []() {\n"
9255 " auto i = 0;\n"
9256 " return 0;\n"
9257 "};\n"
9258 "int i = 0;\n"
9259 "auto v = type{\n"
9260 " i = 1, //\n"
9261 " (i = 2), //\n"
9262 " i = 3 //\n"
9263 "};",
9264 Alignment);
9265
Daniel Jaspera44991332015-04-29 13:06:49 +00009266 // FIXME: Should align all three assignments
9267 verifyFormat(
9268 "int i = 1;\n"
9269 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9270 " loooooooooooooooooooooongParameterB);\n"
9271 "int j = 2;",
9272 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009273
9274 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9275 " typename B = very_long_type_name_1,\n"
9276 " typename T_2 = very_long_type_name_2>\n"
9277 "auto foo() {}\n",
9278 Alignment);
9279 verifyFormat("int a, b = 1;\n"
9280 "int c = 2;\n"
9281 "int dd = 3;\n",
9282 Alignment);
9283 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9284 "float b[1][] = {{3.f}};\n",
9285 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009286}
9287
Daniel Jaspere12597c2015-10-01 10:06:54 +00009288TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9289 FormatStyle Alignment = getLLVMStyle();
9290 Alignment.AlignConsecutiveDeclarations = false;
9291 verifyFormat("float const a = 5;\n"
9292 "int oneTwoThree = 123;",
9293 Alignment);
9294 verifyFormat("int a = 5;\n"
9295 "float const oneTwoThree = 123;",
9296 Alignment);
9297
9298 Alignment.AlignConsecutiveDeclarations = true;
9299 verifyFormat("float const a = 5;\n"
9300 "int oneTwoThree = 123;",
9301 Alignment);
9302 verifyFormat("int a = method();\n"
9303 "float const oneTwoThree = 133;",
9304 Alignment);
9305 verifyFormat("int i = 1, j = 10;\n"
9306 "something = 2000;",
9307 Alignment);
9308 verifyFormat("something = 2000;\n"
9309 "int i = 1, j = 10;\n",
9310 Alignment);
9311 verifyFormat("float something = 2000;\n"
9312 "double another = 911;\n"
9313 "int i = 1, j = 10;\n"
9314 "const int *oneMore = 1;\n"
9315 "unsigned i = 2;",
9316 Alignment);
9317 verifyFormat("float a = 5;\n"
9318 "int one = 1;\n"
9319 "method();\n"
9320 "const double oneTwoThree = 123;\n"
9321 "const unsigned int oneTwo = 12;",
9322 Alignment);
9323 verifyFormat("int oneTwoThree{0}; // comment\n"
9324 "unsigned oneTwo; // comment",
9325 Alignment);
9326 EXPECT_EQ("float const a = 5;\n"
9327 "\n"
9328 "int oneTwoThree = 123;",
9329 format("float const a = 5;\n"
9330 "\n"
9331 "int oneTwoThree= 123;",
9332 Alignment));
9333 EXPECT_EQ("float a = 5;\n"
9334 "int one = 1;\n"
9335 "\n"
9336 "unsigned oneTwoThree = 123;",
9337 format("float a = 5;\n"
9338 "int one = 1;\n"
9339 "\n"
9340 "unsigned oneTwoThree = 123;",
9341 Alignment));
9342 EXPECT_EQ("float a = 5;\n"
9343 "int one = 1;\n"
9344 "\n"
9345 "unsigned oneTwoThree = 123;\n"
9346 "int oneTwo = 12;",
9347 format("float a = 5;\n"
9348 "int one = 1;\n"
9349 "\n"
9350 "unsigned oneTwoThree = 123;\n"
9351 "int oneTwo = 12;",
9352 Alignment));
9353 Alignment.AlignConsecutiveAssignments = true;
9354 verifyFormat("float something = 2000;\n"
9355 "double another = 911;\n"
9356 "int i = 1, j = 10;\n"
9357 "const int *oneMore = 1;\n"
9358 "unsigned i = 2;",
9359 Alignment);
9360 verifyFormat("int oneTwoThree = {0}; // comment\n"
9361 "unsigned oneTwo = 0; // comment",
9362 Alignment);
9363 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9364 " int const i = 1;\n"
9365 " int * j = 2;\n"
9366 " int big = 10000;\n"
9367 "\n"
9368 " unsigned oneTwoThree = 123;\n"
9369 " int oneTwo = 12;\n"
9370 " method();\n"
9371 " float k = 2;\n"
9372 " int ll = 10000;\n"
9373 "}",
9374 format("void SomeFunction(int parameter= 0) {\n"
9375 " int const i= 1;\n"
9376 " int *j=2;\n"
9377 " int big = 10000;\n"
9378 "\n"
9379 "unsigned oneTwoThree =123;\n"
9380 "int oneTwo = 12;\n"
9381 " method();\n"
9382 "float k= 2;\n"
9383 "int ll=10000;\n"
9384 "}",
9385 Alignment));
9386 Alignment.AlignConsecutiveAssignments = false;
9387 Alignment.AlignEscapedNewlinesLeft = true;
9388 verifyFormat("#define A \\\n"
9389 " int aaaa = 12; \\\n"
9390 " float b = 23; \\\n"
9391 " const int ccc = 234; \\\n"
9392 " unsigned dddddddddd = 2345;",
9393 Alignment);
9394 Alignment.AlignEscapedNewlinesLeft = false;
9395 Alignment.ColumnLimit = 30;
9396 verifyFormat("#define A \\\n"
9397 " int aaaa = 12; \\\n"
9398 " float b = 23; \\\n"
9399 " const int ccc = 234; \\\n"
9400 " int dddddddddd = 2345;",
9401 Alignment);
9402 Alignment.ColumnLimit = 80;
9403 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9404 "k = 4, int l = 5,\n"
9405 " int m = 6) {\n"
9406 " const int j = 10;\n"
9407 " otherThing = 1;\n"
9408 "}",
9409 Alignment);
9410 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9411 " int const i = 1;\n"
9412 " int * j = 2;\n"
9413 " int big = 10000;\n"
9414 "}",
9415 Alignment);
9416 verifyFormat("class C {\n"
9417 "public:\n"
9418 " int i = 1;\n"
9419 " virtual void f() = 0;\n"
9420 "};",
9421 Alignment);
9422 verifyFormat("float i = 1;\n"
9423 "if (SomeType t = getSomething()) {\n"
9424 "}\n"
9425 "const unsigned j = 2;\n"
9426 "int big = 10000;",
9427 Alignment);
9428 verifyFormat("float j = 7;\n"
9429 "for (int k = 0; k < N; ++k) {\n"
9430 "}\n"
9431 "unsigned j = 2;\n"
9432 "int big = 10000;\n"
9433 "}",
9434 Alignment);
9435 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9436 verifyFormat("float i = 1;\n"
9437 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9438 " = someLooooooooooooooooongFunction();\n"
9439 "int j = 2;",
9440 Alignment);
9441 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9442 verifyFormat("int i = 1;\n"
9443 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9444 " someLooooooooooooooooongFunction();\n"
9445 "int j = 2;",
9446 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009447
9448 Alignment.AlignConsecutiveAssignments = true;
9449 verifyFormat("auto lambda = []() {\n"
9450 " auto ii = 0;\n"
9451 " float j = 0;\n"
9452 " return 0;\n"
9453 "};\n"
9454 "int i = 0;\n"
9455 "float i2 = 0;\n"
9456 "auto v = type{\n"
9457 " i = 1, //\n"
9458 " (i = 2), //\n"
9459 " i = 3 //\n"
9460 "};",
9461 Alignment);
9462 Alignment.AlignConsecutiveAssignments = false;
9463
Daniel Jaspere12597c2015-10-01 10:06:54 +00009464 // FIXME: Should align all three declarations
9465 verifyFormat(
9466 "int i = 1;\n"
9467 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9468 " loooooooooooooooooooooongParameterB);\n"
9469 "int j = 2;",
9470 Alignment);
9471
9472 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9473 // We expect declarations and assignments to align, as long as it doesn't
9474 // exceed the column limit, starting a new alignemnt sequence whenever it
9475 // happens.
9476 Alignment.AlignConsecutiveAssignments = true;
9477 Alignment.ColumnLimit = 30;
9478 verifyFormat("float ii = 1;\n"
9479 "unsigned j = 2;\n"
9480 "int someVerylongVariable = 1;\n"
9481 "AnotherLongType ll = 123456;\n"
9482 "VeryVeryLongType k = 2;\n"
9483 "int myvar = 1;",
9484 Alignment);
9485 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009486 Alignment.AlignConsecutiveAssignments = false;
9487
9488 verifyFormat(
9489 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9490 " typename LongType, typename B>\n"
9491 "auto foo() {}\n",
9492 Alignment);
9493 verifyFormat("float a, b = 1;\n"
9494 "int c = 2;\n"
9495 "int dd = 3;\n",
9496 Alignment);
9497 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9498 "float b[1][] = {{3.f}};\n",
9499 Alignment);
9500 Alignment.AlignConsecutiveAssignments = true;
9501 verifyFormat("float a, b = 1;\n"
9502 "int c = 2;\n"
9503 "int dd = 3;\n",
9504 Alignment);
9505 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9506 "float b[1][] = {{3.f}};\n",
9507 Alignment);
9508 Alignment.AlignConsecutiveAssignments = false;
9509
9510 Alignment.ColumnLimit = 30;
9511 Alignment.BinPackParameters = false;
9512 verifyFormat("void foo(float a,\n"
9513 " float b,\n"
9514 " int c,\n"
9515 " uint32_t *d) {\n"
9516 " int * e = 0;\n"
9517 " float f = 0;\n"
9518 " double g = 0;\n"
9519 "}\n"
9520 "void bar(ino_t a,\n"
9521 " int b,\n"
9522 " uint32_t *c,\n"
9523 " bool d) {}\n",
9524 Alignment);
9525 Alignment.BinPackParameters = true;
9526 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009527}
9528
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009529TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009530 FormatStyle LinuxBraceStyle = getLLVMStyle();
9531 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009532 verifyFormat("namespace a\n"
9533 "{\n"
9534 "class A\n"
9535 "{\n"
9536 " void f()\n"
9537 " {\n"
9538 " if (true) {\n"
9539 " a();\n"
9540 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009541 " } else {\n"
9542 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009543 " }\n"
9544 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009545 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009546 "};\n"
9547 "struct B {\n"
9548 " int x;\n"
9549 "};\n"
9550 "}\n",
9551 LinuxBraceStyle);
9552 verifyFormat("enum X {\n"
9553 " Y = 0,\n"
9554 "}\n",
9555 LinuxBraceStyle);
9556 verifyFormat("struct S {\n"
9557 " int Type;\n"
9558 " union {\n"
9559 " int x;\n"
9560 " double y;\n"
9561 " } Value;\n"
9562 " class C\n"
9563 " {\n"
9564 " MyFavoriteType Value;\n"
9565 " } Class;\n"
9566 "}\n",
9567 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009568}
9569
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009570TEST_F(FormatTest, MozillaBraceBreaking) {
9571 FormatStyle MozillaBraceStyle = getLLVMStyle();
9572 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
9573 verifyFormat("namespace a {\n"
9574 "class A\n"
9575 "{\n"
9576 " void f()\n"
9577 " {\n"
9578 " if (true) {\n"
9579 " a();\n"
9580 " b();\n"
9581 " }\n"
9582 " }\n"
9583 " void g() { return; }\n"
9584 "};\n"
9585 "enum E\n"
9586 "{\n"
9587 " A,\n"
9588 " // foo\n"
9589 " B,\n"
9590 " C\n"
9591 "};\n"
9592 "struct B\n"
9593 "{\n"
9594 " int x;\n"
9595 "};\n"
9596 "}\n",
9597 MozillaBraceStyle);
9598 verifyFormat("struct S\n"
9599 "{\n"
9600 " int Type;\n"
9601 " union\n"
9602 " {\n"
9603 " int x;\n"
9604 " double y;\n"
9605 " } Value;\n"
9606 " class C\n"
9607 " {\n"
9608 " MyFavoriteType Value;\n"
9609 " } Class;\n"
9610 "}\n",
9611 MozillaBraceStyle);
9612}
9613
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009614TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009615 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9616 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009617 verifyFormat("namespace a {\n"
9618 "class A {\n"
9619 " void f()\n"
9620 " {\n"
9621 " if (true) {\n"
9622 " a();\n"
9623 " b();\n"
9624 " }\n"
9625 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009626 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009627 "};\n"
9628 "struct B {\n"
9629 " int x;\n"
9630 "};\n"
9631 "}\n",
9632 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009633
Daniel Jasperd9670872014-08-05 12:06:20 +00009634 verifyFormat("void foo()\n"
9635 "{\n"
9636 " if (a) {\n"
9637 " a();\n"
9638 " }\n"
9639 " else {\n"
9640 " b();\n"
9641 " }\n"
9642 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009643 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009644
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009645 verifyFormat("#ifdef _DEBUG\n"
9646 "int foo(int i = 0)\n"
9647 "#else\n"
9648 "int foo(int i = 5)\n"
9649 "#endif\n"
9650 "{\n"
9651 " return i;\n"
9652 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009653 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009654
9655 verifyFormat("void foo() {}\n"
9656 "void bar()\n"
9657 "#ifdef _DEBUG\n"
9658 "{\n"
9659 " foo();\n"
9660 "}\n"
9661 "#else\n"
9662 "{\n"
9663 "}\n"
9664 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009665 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009666
9667 verifyFormat("void foobar() { int i = 5; }\n"
9668 "#ifdef _DEBUG\n"
9669 "void bar() {}\n"
9670 "#else\n"
9671 "void bar() { foobar(); }\n"
9672 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009673 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009674}
9675
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009676TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009677 FormatStyle AllmanBraceStyle = getLLVMStyle();
9678 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009679 verifyFormat("namespace a\n"
9680 "{\n"
9681 "class A\n"
9682 "{\n"
9683 " void f()\n"
9684 " {\n"
9685 " if (true)\n"
9686 " {\n"
9687 " a();\n"
9688 " b();\n"
9689 " }\n"
9690 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009691 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009692 "};\n"
9693 "struct B\n"
9694 "{\n"
9695 " int x;\n"
9696 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009697 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009698 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009699
9700 verifyFormat("void f()\n"
9701 "{\n"
9702 " if (true)\n"
9703 " {\n"
9704 " a();\n"
9705 " }\n"
9706 " else if (false)\n"
9707 " {\n"
9708 " b();\n"
9709 " }\n"
9710 " else\n"
9711 " {\n"
9712 " c();\n"
9713 " }\n"
9714 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009715 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009716
9717 verifyFormat("void f()\n"
9718 "{\n"
9719 " for (int i = 0; i < 10; ++i)\n"
9720 " {\n"
9721 " a();\n"
9722 " }\n"
9723 " while (false)\n"
9724 " {\n"
9725 " b();\n"
9726 " }\n"
9727 " do\n"
9728 " {\n"
9729 " c();\n"
9730 " } while (false)\n"
9731 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009732 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009733
9734 verifyFormat("void f(int a)\n"
9735 "{\n"
9736 " switch (a)\n"
9737 " {\n"
9738 " case 0:\n"
9739 " break;\n"
9740 " case 1:\n"
9741 " {\n"
9742 " break;\n"
9743 " }\n"
9744 " case 2:\n"
9745 " {\n"
9746 " }\n"
9747 " break;\n"
9748 " default:\n"
9749 " break;\n"
9750 " }\n"
9751 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009752 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009753
9754 verifyFormat("enum X\n"
9755 "{\n"
9756 " Y = 0,\n"
9757 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009758 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009759 verifyFormat("enum X\n"
9760 "{\n"
9761 " Y = 0\n"
9762 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009763 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009764
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009765 verifyFormat("@interface BSApplicationController ()\n"
9766 "{\n"
9767 "@private\n"
9768 " id _extraIvar;\n"
9769 "}\n"
9770 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009771 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009772
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009773 verifyFormat("#ifdef _DEBUG\n"
9774 "int foo(int i = 0)\n"
9775 "#else\n"
9776 "int foo(int i = 5)\n"
9777 "#endif\n"
9778 "{\n"
9779 " return i;\n"
9780 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009781 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009782
9783 verifyFormat("void foo() {}\n"
9784 "void bar()\n"
9785 "#ifdef _DEBUG\n"
9786 "{\n"
9787 " foo();\n"
9788 "}\n"
9789 "#else\n"
9790 "{\n"
9791 "}\n"
9792 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009793 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009794
9795 verifyFormat("void foobar() { int i = 5; }\n"
9796 "#ifdef _DEBUG\n"
9797 "void bar() {}\n"
9798 "#else\n"
9799 "void bar() { foobar(); }\n"
9800 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009801 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009802
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009803 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009804 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009805 " // ...\n"
9806 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009807 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009808 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009809 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009810 " // ...\n"
9811 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009812 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009813 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009814 // .. or dict literals.
9815 verifyFormat("void f()\n"
9816 "{\n"
9817 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
9818 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009819 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009820 verifyFormat("int f()\n"
9821 "{ // comment\n"
9822 " return 42;\n"
9823 "}",
9824 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009825
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009826 AllmanBraceStyle.ColumnLimit = 19;
9827 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9828 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009829 verifyFormat("void f()\n"
9830 "{\n"
9831 " int i;\n"
9832 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009833 AllmanBraceStyle);
9834 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009835
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009836 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009837 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9838 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9839 verifyFormat("void f(bool b)\n"
9840 "{\n"
9841 " if (b)\n"
9842 " {\n"
9843 " return;\n"
9844 " }\n"
9845 "}\n",
9846 BreakBeforeBraceShortIfs);
9847 verifyFormat("void f(bool b)\n"
9848 "{\n"
9849 " if (b) return;\n"
9850 "}\n",
9851 BreakBeforeBraceShortIfs);
9852 verifyFormat("void f(bool b)\n"
9853 "{\n"
9854 " while (b)\n"
9855 " {\n"
9856 " return;\n"
9857 " }\n"
9858 "}\n",
9859 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009860}
9861
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009862TEST_F(FormatTest, GNUBraceBreaking) {
9863 FormatStyle GNUBraceStyle = getLLVMStyle();
9864 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9865 verifyFormat("namespace a\n"
9866 "{\n"
9867 "class A\n"
9868 "{\n"
9869 " void f()\n"
9870 " {\n"
9871 " int a;\n"
9872 " {\n"
9873 " int b;\n"
9874 " }\n"
9875 " if (true)\n"
9876 " {\n"
9877 " a();\n"
9878 " b();\n"
9879 " }\n"
9880 " }\n"
9881 " void g() { return; }\n"
9882 "}\n"
9883 "}",
9884 GNUBraceStyle);
9885
9886 verifyFormat("void f()\n"
9887 "{\n"
9888 " if (true)\n"
9889 " {\n"
9890 " a();\n"
9891 " }\n"
9892 " else if (false)\n"
9893 " {\n"
9894 " b();\n"
9895 " }\n"
9896 " else\n"
9897 " {\n"
9898 " c();\n"
9899 " }\n"
9900 "}\n",
9901 GNUBraceStyle);
9902
9903 verifyFormat("void f()\n"
9904 "{\n"
9905 " for (int i = 0; i < 10; ++i)\n"
9906 " {\n"
9907 " a();\n"
9908 " }\n"
9909 " while (false)\n"
9910 " {\n"
9911 " b();\n"
9912 " }\n"
9913 " do\n"
9914 " {\n"
9915 " c();\n"
9916 " }\n"
9917 " while (false);\n"
9918 "}\n",
9919 GNUBraceStyle);
9920
9921 verifyFormat("void f(int a)\n"
9922 "{\n"
9923 " switch (a)\n"
9924 " {\n"
9925 " case 0:\n"
9926 " break;\n"
9927 " case 1:\n"
9928 " {\n"
9929 " break;\n"
9930 " }\n"
9931 " case 2:\n"
9932 " {\n"
9933 " }\n"
9934 " break;\n"
9935 " default:\n"
9936 " break;\n"
9937 " }\n"
9938 "}\n",
9939 GNUBraceStyle);
9940
9941 verifyFormat("enum X\n"
9942 "{\n"
9943 " Y = 0,\n"
9944 "}\n",
9945 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009946
9947 verifyFormat("@interface BSApplicationController ()\n"
9948 "{\n"
9949 "@private\n"
9950 " id _extraIvar;\n"
9951 "}\n"
9952 "@end\n",
9953 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009954
9955 verifyFormat("#ifdef _DEBUG\n"
9956 "int foo(int i = 0)\n"
9957 "#else\n"
9958 "int foo(int i = 5)\n"
9959 "#endif\n"
9960 "{\n"
9961 " return i;\n"
9962 "}",
9963 GNUBraceStyle);
9964
9965 verifyFormat("void foo() {}\n"
9966 "void bar()\n"
9967 "#ifdef _DEBUG\n"
9968 "{\n"
9969 " foo();\n"
9970 "}\n"
9971 "#else\n"
9972 "{\n"
9973 "}\n"
9974 "#endif",
9975 GNUBraceStyle);
9976
9977 verifyFormat("void foobar() { int i = 5; }\n"
9978 "#ifdef _DEBUG\n"
9979 "void bar() {}\n"
9980 "#else\n"
9981 "void bar() { foobar(); }\n"
9982 "#endif",
9983 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009984}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009985
9986TEST_F(FormatTest, WebKitBraceBreaking) {
9987 FormatStyle WebKitBraceStyle = getLLVMStyle();
9988 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
9989 verifyFormat("namespace a {\n"
9990 "class A {\n"
9991 " void f()\n"
9992 " {\n"
9993 " if (true) {\n"
9994 " a();\n"
9995 " b();\n"
9996 " }\n"
9997 " }\n"
9998 " void g() { return; }\n"
9999 "};\n"
10000 "enum E {\n"
10001 " A,\n"
10002 " // foo\n"
10003 " B,\n"
10004 " C\n"
10005 "};\n"
10006 "struct B {\n"
10007 " int x;\n"
10008 "};\n"
10009 "}\n",
10010 WebKitBraceStyle);
10011 verifyFormat("struct S {\n"
10012 " int Type;\n"
10013 " union {\n"
10014 " int x;\n"
10015 " double y;\n"
10016 " } Value;\n"
10017 " class C {\n"
10018 " MyFavoriteType Value;\n"
10019 " } Class;\n"
10020 "};\n",
10021 WebKitBraceStyle);
10022}
10023
Manuel Klimekd5735502013-08-12 03:51:17 +000010024TEST_F(FormatTest, CatchExceptionReferenceBinding) {
10025 verifyFormat("void f() {\n"
10026 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +000010027 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +000010028 " }\n"
10029 "}\n",
10030 getLLVMStyle());
10031}
10032
Daniel Jasper9613c812013-08-07 16:29:23 +000010033TEST_F(FormatTest, UnderstandsPragmas) {
10034 verifyFormat("#pragma omp reduction(| : var)");
10035 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010036
10037 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10038 "(including parentheses).",
10039 format("#pragma mark Any non-hyphenated or hyphenated string "
10040 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010041}
10042
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010043TEST_F(FormatTest, UnderstandPragmaOption) {
10044 verifyFormat("#pragma option -C -A");
10045
10046 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10047}
10048
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010049#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10050 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010051 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10052 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010053
10054TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010055 SmallVector<FormatStyle, 3> Styles;
10056 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010057
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010058 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010059 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10060 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10061 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010062
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010063 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010064 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10065 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10066 EXPECT_ALL_STYLES_EQUAL(Styles);
10067
Nico Weber514ecc82014-02-02 20:50:45 +000010068 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010069 EXPECT_TRUE(
10070 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10071 EXPECT_TRUE(
10072 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10073 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010074
Nico Weber514ecc82014-02-02 20:50:45 +000010075 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010076 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10077 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10078 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010079
10080 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010081 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10082 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10083 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010084
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010085 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010086 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10087 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10088 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010089
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010090 Styles[0] = getGNUStyle();
10091 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10092 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10093 EXPECT_ALL_STYLES_EQUAL(Styles);
10094
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010095 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10096}
10097
10098TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10099 SmallVector<FormatStyle, 8> Styles;
10100 Styles.resize(2);
10101
10102 Styles[0] = getGoogleStyle();
10103 Styles[1] = getLLVMStyle();
10104 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10105 EXPECT_ALL_STYLES_EQUAL(Styles);
10106
10107 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010108 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010109 Styles[1] = getLLVMStyle();
10110 Styles[1].Language = FormatStyle::LK_JavaScript;
10111 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10112
10113 Styles[2] = getLLVMStyle();
10114 Styles[2].Language = FormatStyle::LK_JavaScript;
10115 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10116 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010117 &Styles[2])
10118 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010119
10120 Styles[3] = getLLVMStyle();
10121 Styles[3].Language = FormatStyle::LK_JavaScript;
10122 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10123 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010124 &Styles[3])
10125 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010126
10127 Styles[4] = getLLVMStyle();
10128 Styles[4].Language = FormatStyle::LK_JavaScript;
10129 EXPECT_EQ(0, parseConfiguration("---\n"
10130 "BasedOnStyle: LLVM\n"
10131 "IndentWidth: 123\n"
10132 "---\n"
10133 "BasedOnStyle: Google\n"
10134 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010135 &Styles[4])
10136 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010137 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010138}
10139
Daniel Jasper91881d92014-09-29 08:07:46 +000010140#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010141 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010142 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010143 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010144 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010145 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010146
Daniel Jasper91881d92014-09-29 08:07:46 +000010147#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10148
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010149#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10150 Style.STRUCT.FIELD = false; \
10151 EXPECT_EQ(0, \
10152 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10153 .value()); \
10154 EXPECT_TRUE(Style.STRUCT.FIELD); \
10155 EXPECT_EQ(0, \
10156 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10157 .value()); \
10158 EXPECT_FALSE(Style.STRUCT.FIELD);
10159
10160#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10161 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10162
Daniel Jasper00853002014-09-16 16:22:30 +000010163#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10164 EXPECT_NE(VALUE, Style.FIELD); \
10165 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10166 EXPECT_EQ(VALUE, Style.FIELD)
10167
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010168TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010169 FormatStyle Style = {};
10170 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010171 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +000010172 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010173 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010174 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010175 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010176 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010177 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010178 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010179 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010180 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010181 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010182 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010183 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010184 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010185 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +000010186 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010187 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010188 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010189 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010190 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010191 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010192 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010193 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010194 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010195 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010196 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010197 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010198 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010199 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010200 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010201 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010202 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010203 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010204 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010205 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010206 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010207 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010208 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010209
10210 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10211 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10212 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10213 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10214 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10215 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10216 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10217 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
10218 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10219 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10220 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010221}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010222
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010223#undef CHECK_PARSE_BOOL
10224
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010225TEST_F(FormatTest, ParsesConfiguration) {
10226 FormatStyle Style = {};
10227 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010228 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010229 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10230 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010231 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010232 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10233 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010234 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10235 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010236 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10237 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10238 PenaltyReturnTypeOnItsOwnLine, 1234u);
10239 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10240 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010241 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010242 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010243 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010244
Daniel Jasper553d4872014-06-17 12:40:34 +000010245 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010246 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10247 FormatStyle::PAS_Left);
10248 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10249 FormatStyle::PAS_Right);
10250 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10251 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010252 // For backward compatibility:
10253 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10254 FormatStyle::PAS_Left);
10255 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10256 FormatStyle::PAS_Right);
10257 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10258 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010259
Alexander Kornienkod6538332013-05-07 15:32:14 +000010260 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010261 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10262 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010263 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10264 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10265 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10266
Daniel Jasperac043c92014-09-15 11:11:00 +000010267 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010268 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10269 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010270 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10271 FormatStyle::BOS_None);
10272 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10273 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010274 // For backward compatibility:
10275 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10276 FormatStyle::BOS_None);
10277 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10278 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010279
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010280 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10281 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10282 FormatStyle::BAS_Align);
10283 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10284 FormatStyle::BAS_DontAlign);
10285 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10286 FormatStyle::BAS_AlwaysBreak);
10287 // For backward compatibility:
10288 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10289 FormatStyle::BAS_DontAlign);
10290 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10291 FormatStyle::BAS_Align);
10292
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010293 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010294 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10295 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10296 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010297 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10298 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010299 // For backward compatibility:
10300 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10301 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010302
Daniel Jasperd74cf402014-04-08 12:46:38 +000010303 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010304 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10305 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10306 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10307 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010308 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10309 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010310 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10311 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010312 // For backward compatibility:
10313 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10314 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10315 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10316 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010317
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010318 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10319 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10320 FormatStyle::SBPO_Never);
10321 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10322 FormatStyle::SBPO_Always);
10323 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10324 FormatStyle::SBPO_ControlStatements);
10325 // For backward compatibility:
10326 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10327 FormatStyle::SBPO_Never);
10328 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10329 FormatStyle::SBPO_ControlStatements);
10330
Alexander Kornienkod6538332013-05-07 15:32:14 +000010331 Style.ColumnLimit = 123;
10332 FormatStyle BaseStyle = getLLVMStyle();
10333 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10334 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10335
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010336 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10337 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10338 FormatStyle::BS_Attach);
10339 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10340 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010341 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10342 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010343 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10344 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010345 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10346 FormatStyle::BS_Allman);
10347 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010348 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10349 FormatStyle::BS_WebKit);
10350 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10351 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010352
Zachary Turner448592e2015-12-18 22:20:15 +000010353 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10354 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10355 FormatStyle::RTBS_None);
10356 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10357 FormatStyle::RTBS_All);
10358 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010359 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010360 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10361 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10362 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10363 AlwaysBreakAfterReturnType,
10364 FormatStyle::RTBS_TopLevelDefinitions);
10365
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010366 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10367 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10368 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10369 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10370 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10371 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10372 AlwaysBreakAfterDefinitionReturnType,
10373 FormatStyle::DRTBS_TopLevel);
10374
Daniel Jasper65ee3472013-07-31 23:16:02 +000010375 Style.NamespaceIndentation = FormatStyle::NI_All;
10376 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10377 FormatStyle::NI_None);
10378 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10379 FormatStyle::NI_Inner);
10380 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10381 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010382
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010383 // FIXME: This is required because parsing a configuration simply overwrites
10384 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010385 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010386 std::vector<std::string> BoostForeach;
10387 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010388 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010389 std::vector<std::string> BoostAndQForeach;
10390 BoostAndQForeach.push_back("BOOST_FOREACH");
10391 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010392 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10393 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010394
10395 Style.IncludeCategories.clear();
10396 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10397 {".*", 1}};
10398 CHECK_PARSE("IncludeCategories:\n"
10399 " - Regex: abc/.*\n"
10400 " Priority: 2\n"
10401 " - Regex: .*\n"
10402 " Priority: 1",
10403 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010404 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010405}
10406
10407TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10408 FormatStyle Style = {};
10409 Style.Language = FormatStyle::LK_Cpp;
10410 CHECK_PARSE("Language: Cpp\n"
10411 "IndentWidth: 12",
10412 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010413 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10414 "IndentWidth: 34",
10415 &Style),
10416 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010417 EXPECT_EQ(12u, Style.IndentWidth);
10418 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10419 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10420
10421 Style.Language = FormatStyle::LK_JavaScript;
10422 CHECK_PARSE("Language: JavaScript\n"
10423 "IndentWidth: 12",
10424 IndentWidth, 12u);
10425 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010426 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10427 "IndentWidth: 34",
10428 &Style),
10429 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010430 EXPECT_EQ(23u, Style.IndentWidth);
10431 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10432 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10433
10434 CHECK_PARSE("BasedOnStyle: LLVM\n"
10435 "IndentWidth: 67",
10436 IndentWidth, 67u);
10437
10438 CHECK_PARSE("---\n"
10439 "Language: JavaScript\n"
10440 "IndentWidth: 12\n"
10441 "---\n"
10442 "Language: Cpp\n"
10443 "IndentWidth: 34\n"
10444 "...\n",
10445 IndentWidth, 12u);
10446
10447 Style.Language = FormatStyle::LK_Cpp;
10448 CHECK_PARSE("---\n"
10449 "Language: JavaScript\n"
10450 "IndentWidth: 12\n"
10451 "---\n"
10452 "Language: Cpp\n"
10453 "IndentWidth: 34\n"
10454 "...\n",
10455 IndentWidth, 34u);
10456 CHECK_PARSE("---\n"
10457 "IndentWidth: 78\n"
10458 "---\n"
10459 "Language: JavaScript\n"
10460 "IndentWidth: 56\n"
10461 "...\n",
10462 IndentWidth, 78u);
10463
10464 Style.ColumnLimit = 123;
10465 Style.IndentWidth = 234;
10466 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10467 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010468 EXPECT_FALSE(parseConfiguration("---\n"
10469 "IndentWidth: 456\n"
10470 "BreakBeforeBraces: Allman\n"
10471 "---\n"
10472 "Language: JavaScript\n"
10473 "IndentWidth: 111\n"
10474 "TabWidth: 111\n"
10475 "---\n"
10476 "Language: Cpp\n"
10477 "BreakBeforeBraces: Stroustrup\n"
10478 "TabWidth: 789\n"
10479 "...\n",
10480 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010481 EXPECT_EQ(123u, Style.ColumnLimit);
10482 EXPECT_EQ(456u, Style.IndentWidth);
10483 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10484 EXPECT_EQ(789u, Style.TabWidth);
10485
Rafael Espindola1f243172014-06-12 11:35:17 +000010486 EXPECT_EQ(parseConfiguration("---\n"
10487 "Language: JavaScript\n"
10488 "IndentWidth: 56\n"
10489 "---\n"
10490 "IndentWidth: 78\n"
10491 "...\n",
10492 &Style),
10493 ParseError::Error);
10494 EXPECT_EQ(parseConfiguration("---\n"
10495 "Language: JavaScript\n"
10496 "IndentWidth: 56\n"
10497 "---\n"
10498 "Language: JavaScript\n"
10499 "IndentWidth: 78\n"
10500 "...\n",
10501 &Style),
10502 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010503
10504 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10505}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010506
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010507#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010508
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010509TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10510 FormatStyle Style = {};
10511 Style.Language = FormatStyle::LK_JavaScript;
10512 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010513 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010514 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010515
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010516 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010517 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010518 "BasedOnStyle: Google\n"
10519 "---\n"
10520 "Language: JavaScript\n"
10521 "IndentWidth: 76\n"
10522 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010523 &Style)
10524 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010525 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010526 EXPECT_EQ(76u, Style.IndentWidth);
10527 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10528}
10529
Alexander Kornienkod6538332013-05-07 15:32:14 +000010530TEST_F(FormatTest, ConfigurationRoundTripTest) {
10531 FormatStyle Style = getLLVMStyle();
10532 std::string YAML = configurationAsText(Style);
10533 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010534 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010535 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10536 EXPECT_EQ(Style, ParsedStyle);
10537}
10538
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010539TEST_F(FormatTest, WorksFor8bitEncodings) {
10540 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10541 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10542 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10543 "\"\xef\xee\xf0\xf3...\"",
10544 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10545 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10546 "\xef\xee\xf0\xf3...\"",
10547 getLLVMStyleWithColumns(12)));
10548}
10549
Alexander Kornienko393e3082013-11-13 14:04:17 +000010550TEST_F(FormatTest, HandlesUTF8BOM) {
10551 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10552 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10553 format("\xef\xbb\xbf#include <iostream>"));
10554 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10555 format("\xef\xbb\xbf\n#include <iostream>"));
10556}
10557
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010558// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10559#if !defined(_MSC_VER)
10560
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010561TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10562 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10563 getLLVMStyleWithColumns(35));
10564 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010565 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010566 verifyFormat("// Однажды в студёную зимнюю пору...",
10567 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010568 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010569 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10570 getLLVMStyleWithColumns(39));
10571 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010572 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010573}
10574
10575TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010576 // Non-printable characters' width is currently considered to be the length in
10577 // bytes in UTF8. The characters can be displayed in very different manner
10578 // (zero-width, single width with a substitution glyph, expanded to their code
10579 // (e.g. "<8d>"), so there's no single correct way to handle them.
10580 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010581 "\"\xc2\x8d\";",
10582 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010583 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010584 "\"\xc2\x8d\";",
10585 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010586 EXPECT_EQ("\"Однажды, в \"\n"
10587 "\"студёную \"\n"
10588 "\"зимнюю \"\n"
10589 "\"пору,\"",
10590 format("\"Однажды, в студёную зимнюю пору,\"",
10591 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010592 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010593 "\"一 二 三 \"\n"
10594 "\"四 五六 \"\n"
10595 "\"七 八 九 \"\n"
10596 "\"十\"",
10597 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010598 EXPECT_EQ("\"一\t二 \"\n"
10599 "\"\t三 \"\n"
10600 "\"四 五\t六 \"\n"
10601 "\"\t七 \"\n"
10602 "\"八九十\tqq\"",
10603 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10604 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010605
10606 // UTF8 character in an escape sequence.
10607 EXPECT_EQ("\"aaaaaa\"\n"
10608 "\"\\\xC2\x8D\"",
10609 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010610}
10611
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010612TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10613 EXPECT_EQ("const char *sssss =\n"
10614 " \"一二三四五六七八\\\n"
10615 " 九 十\";",
10616 format("const char *sssss = \"一二三四五六七八\\\n"
10617 " 九 十\";",
10618 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010619}
10620
10621TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010622 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10623 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010624 EXPECT_EQ("// Я из лесу\n"
10625 "// вышел; был\n"
10626 "// сильный\n"
10627 "// мороз.",
10628 format("// Я из лесу вышел; был сильный мороз.",
10629 getLLVMStyleWithColumns(13)));
10630 EXPECT_EQ("// 一二三\n"
10631 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010632 "// 八 九\n"
10633 "// 十",
10634 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010635}
10636
10637TEST_F(FormatTest, SplitsUTF8BlockComments) {
10638 EXPECT_EQ("/* Гляжу,\n"
10639 " * поднимается\n"
10640 " * медленно в\n"
10641 " * гору\n"
10642 " * Лошадка,\n"
10643 " * везущая\n"
10644 " * хворосту\n"
10645 " * воз. */",
10646 format("/* Гляжу, поднимается медленно в гору\n"
10647 " * Лошадка, везущая хворосту воз. */",
10648 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010649 EXPECT_EQ(
10650 "/* 一二三\n"
10651 " * 四五六七\n"
10652 " * 八 九\n"
10653 " * 十 */",
10654 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010655 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10656 " * 𝕓𝕪𝕥𝕖\n"
10657 " * 𝖀𝕿𝕱-𝟠 */",
10658 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010659}
10660
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010661#endif // _MSC_VER
10662
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010663TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10664 FormatStyle Style = getLLVMStyle();
10665
10666 Style.ConstructorInitializerIndentWidth = 4;
10667 verifyFormat(
10668 "SomeClass::Constructor()\n"
10669 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10670 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10671 Style);
10672
10673 Style.ConstructorInitializerIndentWidth = 2;
10674 verifyFormat(
10675 "SomeClass::Constructor()\n"
10676 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10677 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10678 Style);
10679
10680 Style.ConstructorInitializerIndentWidth = 0;
10681 verifyFormat(
10682 "SomeClass::Constructor()\n"
10683 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10684 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10685 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010686 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10687 verifyFormat(
10688 "SomeLongTemplateVariableName<\n"
10689 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10690 Style);
10691 verifyFormat(
10692 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10693 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10694 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010695}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010696
Daniel Jasper00853002014-09-16 16:22:30 +000010697TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10698 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010699 Style.BreakConstructorInitializersBeforeComma = true;
10700 Style.ConstructorInitializerIndentWidth = 4;
10701 verifyFormat("SomeClass::Constructor()\n"
10702 " : a(a)\n"
10703 " , b(b)\n"
10704 " , c(c) {}",
10705 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010706 verifyFormat("SomeClass::Constructor()\n"
10707 " : a(a) {}",
10708 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010709
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010710 Style.ColumnLimit = 0;
10711 verifyFormat("SomeClass::Constructor()\n"
10712 " : a(a) {}",
10713 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010714 verifyFormat("SomeClass::Constructor() noexcept\n"
10715 " : a(a) {}",
10716 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010717 verifyFormat("SomeClass::Constructor()\n"
10718 " : a(a)\n"
10719 " , b(b)\n"
10720 " , c(c) {}",
10721 Style);
10722 verifyFormat("SomeClass::Constructor()\n"
10723 " : a(a) {\n"
10724 " foo();\n"
10725 " bar();\n"
10726 "}",
10727 Style);
10728
Daniel Jasperd74cf402014-04-08 12:46:38 +000010729 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010730 verifyFormat("SomeClass::Constructor()\n"
10731 " : a(a)\n"
10732 " , b(b)\n"
10733 " , c(c) {\n}",
10734 Style);
10735 verifyFormat("SomeClass::Constructor()\n"
10736 " : a(a) {\n}",
10737 Style);
10738
10739 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010740 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010741 Style.ConstructorInitializerIndentWidth = 2;
10742 verifyFormat("SomeClass::Constructor()\n"
10743 " : a(a)\n"
10744 " , b(b)\n"
10745 " , c(c) {}",
10746 Style);
10747
10748 Style.ConstructorInitializerIndentWidth = 0;
10749 verifyFormat("SomeClass::Constructor()\n"
10750 ": a(a)\n"
10751 ", b(b)\n"
10752 ", c(c) {}",
10753 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010754
10755 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10756 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010757 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10758 verifyFormat(
10759 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10760 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010761 verifyFormat(
10762 "SomeClass::Constructor()\n"
10763 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10764 Style);
10765 Style.ConstructorInitializerIndentWidth = 4;
10766 Style.ColumnLimit = 60;
10767 verifyFormat("SomeClass::Constructor()\n"
10768 " : aaaaaaaa(aaaaaaaa)\n"
10769 " , aaaaaaaa(aaaaaaaa)\n"
10770 " , aaaaaaaa(aaaaaaaa) {}",
10771 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010772}
10773
Daniel Jasper38efc132014-10-21 07:51:54 +000010774TEST_F(FormatTest, Destructors) {
10775 verifyFormat("void F(int &i) { i.~int(); }");
10776 verifyFormat("void F(int &i) { i->~int(); }");
10777}
10778
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010779TEST_F(FormatTest, FormatsWithWebKitStyle) {
10780 FormatStyle Style = getWebKitStyle();
10781
10782 // Don't indent in outer namespaces.
10783 verifyFormat("namespace outer {\n"
10784 "int i;\n"
10785 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010786 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010787 "} // namespace inner\n"
10788 "} // namespace outer\n"
10789 "namespace other_outer {\n"
10790 "int i;\n"
10791 "}",
10792 Style);
10793
10794 // Don't indent case labels.
10795 verifyFormat("switch (variable) {\n"
10796 "case 1:\n"
10797 "case 2:\n"
10798 " doSomething();\n"
10799 " break;\n"
10800 "default:\n"
10801 " ++variable;\n"
10802 "}",
10803 Style);
10804
10805 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010806 EXPECT_EQ("void f()\n"
10807 "{\n"
10808 " if (aaaaaaaaaaaaaaaa\n"
10809 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10810 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10811 " return;\n"
10812 "}",
10813 format("void f() {\n"
10814 "if (aaaaaaaaaaaaaaaa\n"
10815 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10816 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10817 "return;\n"
10818 "}",
10819 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010820
Daniel Jasper35995672014-04-29 14:05:20 +000010821 // Allow functions on a single line.
10822 verifyFormat("void f() { return; }", Style);
10823
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010824 // Constructor initializers are formatted one per line with the "," on the
10825 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010826 verifyFormat("Constructor()\n"
10827 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10828 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010829 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010830 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10831 "{\n"
10832 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010833 Style);
10834 verifyFormat("SomeClass::Constructor()\n"
10835 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010836 "{\n"
10837 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010838 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010839 EXPECT_EQ("SomeClass::Constructor()\n"
10840 " : a(a)\n"
10841 "{\n"
10842 "}",
10843 format("SomeClass::Constructor():a(a){}", Style));
10844 verifyFormat("SomeClass::Constructor()\n"
10845 " : a(a)\n"
10846 " , b(b)\n"
10847 " , c(c)\n"
10848 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010849 "}",
10850 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010851 verifyFormat("SomeClass::Constructor()\n"
10852 " : a(a)\n"
10853 "{\n"
10854 " foo();\n"
10855 " bar();\n"
10856 "}",
10857 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010858
Daniel Jasper65ee3472013-07-31 23:16:02 +000010859 // Access specifiers should be aligned left.
10860 verifyFormat("class C {\n"
10861 "public:\n"
10862 " int i;\n"
10863 "};",
10864 Style);
10865
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010866 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010867 verifyFormat("int a; // Do not\n"
10868 "double b; // align comments.",
10869 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010870
Daniel Jasper3219e432014-12-02 13:24:51 +000010871 // Do not align operands.
10872 EXPECT_EQ("ASSERT(aaaa\n"
10873 " || bbbb);",
10874 format("ASSERT ( aaaa\n||bbbb);", Style));
10875
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010876 // Accept input's line breaks.
10877 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10878 " || bbbbbbbbbbbbbbb) {\n"
10879 " i++;\n"
10880 "}",
10881 format("if (aaaaaaaaaaaaaaa\n"
10882 "|| bbbbbbbbbbbbbbb) { i++; }",
10883 Style));
10884 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10885 " i++;\n"
10886 "}",
10887 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010888
10889 // Don't automatically break all macro definitions (llvm.org/PR17842).
10890 verifyFormat("#define aNumber 10", Style);
10891 // However, generally keep the line breaks that the user authored.
10892 EXPECT_EQ("#define aNumber \\\n"
10893 " 10",
10894 format("#define aNumber \\\n"
10895 " 10",
10896 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010897
10898 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010899 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10900 " copyItems:YES];",
10901 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10902 "copyItems:YES];",
10903 Style));
10904 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10905 " copyItems:YES];",
10906 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10907 " copyItems:YES];",
10908 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010909 // FIXME: This does not seem right, there should be more indentation before
10910 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010911 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010912 " @\"a\",\n"
10913 " @\"a\"\n"
10914 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010915 " copyItems:YES];",
10916 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10917 " @\"a\",\n"
10918 " @\"a\"\n"
10919 " ]\n"
10920 " copyItems:YES];",
10921 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010922 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010923 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10924 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010925 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10926 " copyItems:YES];",
10927 Style));
10928
10929 verifyFormat("[self.a b:c c:d];", Style);
10930 EXPECT_EQ("[self.a b:c\n"
10931 " c:d];",
10932 format("[self.a b:c\n"
10933 "c:d];",
10934 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010935}
10936
Manuel Klimekffdeb592013-09-03 15:10:01 +000010937TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010938 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10939 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10940 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10941 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10942 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010943 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010944 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010945 verifyFormat("void f() {\n"
10946 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10947 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010948 verifyFormat("void f() {\n"
10949 " other(x.begin(), //\n"
10950 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000010951 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010952 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000010953 verifyFormat("SomeFunction([]() { // A cool function...\n"
10954 " return 43;\n"
10955 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000010956 EXPECT_EQ("SomeFunction([]() {\n"
10957 "#define A a\n"
10958 " return 43;\n"
10959 "});",
10960 format("SomeFunction([](){\n"
10961 "#define A a\n"
10962 "return 43;\n"
10963 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000010964 verifyFormat("void f() {\n"
10965 " SomeFunction([](decltype(x), A *a) {});\n"
10966 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010967 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10968 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000010969 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10970 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
10971 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000010972 verifyFormat("Constructor()\n"
10973 " : Field([] { // comment\n"
10974 " int i;\n"
10975 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000010976 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
10977 " return some_parameter.size();\n"
10978 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000010979 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
10980 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000010981 verifyFormat("int i = aaaaaa ? 1 //\n"
10982 " : [] {\n"
10983 " return 2; //\n"
10984 " }();");
10985 verifyFormat("llvm::errs() << \"number of twos is \"\n"
10986 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
10987 " return x == 2; // force break\n"
10988 " });");
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000010989 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n"
10990 " int iiiiiiiiiiii) {\n"
10991 " return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n"
10992 "});",
10993 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000010994 verifyFormat("SomeFunction({[&] {\n"
10995 " // comment\n"
10996 " },\n"
10997 " [&] {\n"
10998 " // comment\n"
10999 " }});");
11000 verifyFormat("SomeFunction({[&] {\n"
11001 " // comment\n"
11002 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000011003 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
11004 " [&]() { return true; },\n"
11005 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011006
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011007 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000011008 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000011009 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000011010 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
11011 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011012 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000011013 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000011014 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
11015 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000011016 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011017 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
11018 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000011019 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000011020 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000011021 verifyFormat(
11022 "aaaaaaaaaaaaaaaaaaaaaa(\n"
11023 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
11024 " return aaaaaaaaaaaaaaaaa;\n"
11025 " });",
11026 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000011027 verifyFormat("[]() //\n"
11028 " -> int {\n"
11029 " return 1; //\n"
11030 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000011031
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011032 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000011033 verifyFormat("SomeFunction(\n"
11034 " []() {\n"
11035 " int i = 42;\n"
11036 " return i;\n"
11037 " },\n"
11038 " []() {\n"
11039 " int j = 43;\n"
11040 " return j;\n"
11041 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011042
Daniel Jasperda18fd82014-06-10 06:39:03 +000011043 // More complex introducers.
11044 verifyFormat("return [i, args...] {};");
11045
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011046 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011047 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011048 verifyFormat("double &operator[](int i) { return 0; }\n"
11049 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011050 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011051 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011052 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011053
11054 // Other corner cases.
11055 verifyFormat("void f() {\n"
11056 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
11057 " );\n"
11058 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011059
11060 // Lambdas created through weird macros.
11061 verifyFormat("void f() {\n"
11062 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011063 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011064 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011065
11066 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11067 " doo_dah();\n"
11068 " doo_dah();\n"
11069 " })) {\n"
11070 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011071 verifyFormat("auto lambda = []() {\n"
11072 " int a = 2\n"
11073 "#if A\n"
11074 " + 2\n"
11075 "#endif\n"
11076 " ;\n"
11077 "};");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011078}
11079
Manuel Klimek516e0542013-09-04 13:25:30 +000011080TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011081 FormatStyle ShortBlocks = getLLVMStyle();
11082 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11083 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11084 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11085 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11086 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11087 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11088 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011089
Daniel Jasper76284682014-10-22 09:12:44 +000011090 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11091 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11092 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011093
Daniel Jasper76284682014-10-22 09:12:44 +000011094 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011095 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011096 "}];");
11097 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011098 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011099 "}]};");
11100 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011101 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011102 "}];");
11103 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011104 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011105 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011106 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011107 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011108 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011109 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011110 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011111
11112 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011113 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011114 "}];",
11115 getLLVMStyleWithColumns(60));
11116 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011117 " NSString *path = [self sessionFilePath];\n"
11118 " if (path) {\n"
11119 " // ...\n"
11120 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011121 "});");
11122 verifyFormat("[[SessionService sharedService]\n"
11123 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011124 " if (window) {\n"
11125 " [self windowDidLoad:window];\n"
11126 " } else {\n"
11127 " [self errorLoadingWindow];\n"
11128 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011129 " }];");
11130 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011131 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011132 "};\n",
11133 getLLVMStyleWithColumns(40));
11134 verifyFormat("[[SessionService sharedService]\n"
11135 " loadWindowWithCompletionBlock: //\n"
11136 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011137 " if (window) {\n"
11138 " [self windowDidLoad:window];\n"
11139 " } else {\n"
11140 " [self errorLoadingWindow];\n"
11141 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011142 " }];",
11143 getLLVMStyleWithColumns(60));
11144 verifyFormat("[myObject doSomethingWith:arg1\n"
11145 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011146 " // ...\n"
11147 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011148 " }\n"
11149 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011150 " // ...\n"
11151 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011152 " }\n"
11153 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011154 " // ...\n"
11155 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011156 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011157 verifyFormat("[myObject doSomethingWith:arg1\n"
11158 " firstBlock:-1\n"
11159 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011160 " // ...\n"
11161 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011162 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011163
11164 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011165 " @autoreleasepool {\n"
11166 " if (a) {\n"
11167 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011168 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011169 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011170 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011171 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011172 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11173 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011174
11175 FormatStyle FourIndent = getLLVMStyle();
11176 FourIndent.ObjCBlockIndentWidth = 4;
11177 verifyFormat("[operation setCompletionBlock:^{\n"
11178 " [self onOperationDone];\n"
11179 "}];",
11180 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011181}
11182
Daniel Jasper289afc02015-04-23 09:23:17 +000011183TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11184 FormatStyle ZeroColumn = getLLVMStyle();
11185 ZeroColumn.ColumnLimit = 0;
11186
11187 verifyFormat("[[SessionService sharedService] "
11188 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11189 " if (window) {\n"
11190 " [self windowDidLoad:window];\n"
11191 " } else {\n"
11192 " [self errorLoadingWindow];\n"
11193 " }\n"
11194 "}];",
11195 ZeroColumn);
11196 EXPECT_EQ("[[SessionService sharedService]\n"
11197 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11198 " if (window) {\n"
11199 " [self windowDidLoad:window];\n"
11200 " } else {\n"
11201 " [self errorLoadingWindow];\n"
11202 " }\n"
11203 " }];",
11204 format("[[SessionService sharedService]\n"
11205 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11206 " if (window) {\n"
11207 " [self windowDidLoad:window];\n"
11208 " } else {\n"
11209 " [self errorLoadingWindow];\n"
11210 " }\n"
11211 "}];",
11212 ZeroColumn));
11213 verifyFormat("[myObject doSomethingWith:arg1\n"
11214 " firstBlock:^(Foo *a) {\n"
11215 " // ...\n"
11216 " int i;\n"
11217 " }\n"
11218 " secondBlock:^(Bar *b) {\n"
11219 " // ...\n"
11220 " int i;\n"
11221 " }\n"
11222 " thirdBlock:^Foo(Bar *b) {\n"
11223 " // ...\n"
11224 " int i;\n"
11225 " }];",
11226 ZeroColumn);
11227 verifyFormat("f(^{\n"
11228 " @autoreleasepool {\n"
11229 " if (a) {\n"
11230 " g();\n"
11231 " }\n"
11232 " }\n"
11233 "});",
11234 ZeroColumn);
11235 verifyFormat("void (^largeBlock)(void) = ^{\n"
11236 " // ...\n"
11237 "};",
11238 ZeroColumn);
11239
11240 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11241 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011242 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011243 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11244 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11245 " int i;\n"
11246 "};",
11247 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11248}
11249
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011250TEST_F(FormatTest, SupportsCRLF) {
11251 EXPECT_EQ("int a;\r\n"
11252 "int b;\r\n"
11253 "int c;\r\n",
11254 format("int a;\r\n"
11255 " int b;\r\n"
11256 " int c;\r\n",
11257 getLLVMStyle()));
11258 EXPECT_EQ("int a;\r\n"
11259 "int b;\r\n"
11260 "int c;\r\n",
11261 format("int a;\r\n"
11262 " int b;\n"
11263 " int c;\r\n",
11264 getLLVMStyle()));
11265 EXPECT_EQ("int a;\n"
11266 "int b;\n"
11267 "int c;\n",
11268 format("int a;\r\n"
11269 " int b;\n"
11270 " int c;\n",
11271 getLLVMStyle()));
11272 EXPECT_EQ("\"aaaaaaa \"\r\n"
11273 "\"bbbbbbb\";\r\n",
11274 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11275 EXPECT_EQ("#define A \\\r\n"
11276 " b; \\\r\n"
11277 " c; \\\r\n"
11278 " d;\r\n",
11279 format("#define A \\\r\n"
11280 " b; \\\r\n"
11281 " c; d; \r\n",
11282 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011283
11284 EXPECT_EQ("/*\r\n"
11285 "multi line block comments\r\n"
11286 "should not introduce\r\n"
11287 "an extra carriage return\r\n"
11288 "*/\r\n",
11289 format("/*\r\n"
11290 "multi line block comments\r\n"
11291 "should not introduce\r\n"
11292 "an extra carriage return\r\n"
11293 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011294}
11295
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011296TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11297 verifyFormat("MY_CLASS(C) {\n"
11298 " int i;\n"
11299 " int j;\n"
11300 "};");
11301}
11302
Daniel Jasper6633ab82013-10-18 10:38:14 +000011303TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11304 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11305 TwoIndent.ContinuationIndentWidth = 2;
11306
11307 EXPECT_EQ("int i =\n"
11308 " longFunction(\n"
11309 " arg);",
11310 format("int i = longFunction(arg);", TwoIndent));
11311
11312 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11313 SixIndent.ContinuationIndentWidth = 6;
11314
11315 EXPECT_EQ("int i =\n"
11316 " longFunction(\n"
11317 " arg);",
11318 format("int i = longFunction(arg);", SixIndent));
11319}
11320
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011321TEST_F(FormatTest, SpacesInAngles) {
11322 FormatStyle Spaces = getLLVMStyle();
11323 Spaces.SpacesInAngles = true;
11324
11325 verifyFormat("static_cast< int >(arg);", Spaces);
11326 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11327 verifyFormat("f< int, float >();", Spaces);
11328 verifyFormat("template <> g() {}", Spaces);
11329 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011330 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11331 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11332 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011333
11334 Spaces.Standard = FormatStyle::LS_Cpp03;
11335 Spaces.SpacesInAngles = true;
11336 verifyFormat("A< A< int > >();", Spaces);
11337
11338 Spaces.SpacesInAngles = false;
11339 verifyFormat("A<A<int> >();", Spaces);
11340
11341 Spaces.Standard = FormatStyle::LS_Cpp11;
11342 Spaces.SpacesInAngles = true;
11343 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011344
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011345 Spaces.SpacesInAngles = false;
11346 verifyFormat("A<A<int>>();", Spaces);
11347}
11348
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011349TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11350 FormatStyle Style = getLLVMStyle();
11351 Style.SpaceAfterTemplateKeyword = false;
11352 verifyFormat("template<int> void foo();", Style);
11353}
11354
Jacques Pienaarfc275112015-02-18 23:48:37 +000011355TEST_F(FormatTest, TripleAngleBrackets) {
11356 verifyFormat("f<<<1, 1>>>();");
11357 verifyFormat("f<<<1, 1, 1, s>>>();");
11358 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011359 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011360 verifyFormat("f<param><<<1, 1>>>();");
11361 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011362 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011363 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11364 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011365 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11366 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011367}
11368
11369TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011370 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011371 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011372 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11373 "aaallvm::outs() <<");
11374 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11375 "aaaallvm::outs()\n <<");
11376}
11377
Manuel Klimek819788d2014-03-18 11:22:45 +000011378TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11379 std::string code = "#if A\n"
11380 "#if B\n"
11381 "a.\n"
11382 "#endif\n"
11383 " a = 1;\n"
11384 "#else\n"
11385 "#endif\n"
11386 "#if C\n"
11387 "#else\n"
11388 "#endif\n";
11389 EXPECT_EQ(code, format(code));
11390}
11391
Manuel Klimek68b03042014-04-14 09:14:11 +000011392TEST_F(FormatTest, HandleConflictMarkers) {
11393 // Git/SVN conflict markers.
11394 EXPECT_EQ("int a;\n"
11395 "void f() {\n"
11396 " callme(some(parameter1,\n"
11397 "<<<<<<< text by the vcs\n"
11398 " parameter2),\n"
11399 "||||||| text by the vcs\n"
11400 " parameter2),\n"
11401 " parameter3,\n"
11402 "======= text by the vcs\n"
11403 " parameter2, parameter3),\n"
11404 ">>>>>>> text by the vcs\n"
11405 " otherparameter);\n",
11406 format("int a;\n"
11407 "void f() {\n"
11408 " callme(some(parameter1,\n"
11409 "<<<<<<< text by the vcs\n"
11410 " parameter2),\n"
11411 "||||||| text by the vcs\n"
11412 " parameter2),\n"
11413 " parameter3,\n"
11414 "======= text by the vcs\n"
11415 " parameter2,\n"
11416 " parameter3),\n"
11417 ">>>>>>> text by the vcs\n"
11418 " otherparameter);\n"));
11419
11420 // Perforce markers.
11421 EXPECT_EQ("void f() {\n"
11422 " function(\n"
11423 ">>>> text by the vcs\n"
11424 " parameter,\n"
11425 "==== text by the vcs\n"
11426 " parameter,\n"
11427 "==== text by the vcs\n"
11428 " parameter,\n"
11429 "<<<< text by the vcs\n"
11430 " parameter);\n",
11431 format("void f() {\n"
11432 " function(\n"
11433 ">>>> text by the vcs\n"
11434 " parameter,\n"
11435 "==== text by the vcs\n"
11436 " parameter,\n"
11437 "==== text by the vcs\n"
11438 " parameter,\n"
11439 "<<<< text by the vcs\n"
11440 " parameter);\n"));
11441
11442 EXPECT_EQ("<<<<<<<\n"
11443 "|||||||\n"
11444 "=======\n"
11445 ">>>>>>>",
11446 format("<<<<<<<\n"
11447 "|||||||\n"
11448 "=======\n"
11449 ">>>>>>>"));
11450
11451 EXPECT_EQ("<<<<<<<\n"
11452 "|||||||\n"
11453 "int i;\n"
11454 "=======\n"
11455 ">>>>>>>",
11456 format("<<<<<<<\n"
11457 "|||||||\n"
11458 "int i;\n"
11459 "=======\n"
11460 ">>>>>>>"));
11461
11462 // FIXME: Handle parsing of macros around conflict markers correctly:
11463 EXPECT_EQ("#define Macro \\\n"
11464 "<<<<<<<\n"
11465 "Something \\\n"
11466 "|||||||\n"
11467 "Else \\\n"
11468 "=======\n"
11469 "Other \\\n"
11470 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011471 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011472 format("#define Macro \\\n"
11473 "<<<<<<<\n"
11474 " Something \\\n"
11475 "|||||||\n"
11476 " Else \\\n"
11477 "=======\n"
11478 " Other \\\n"
11479 ">>>>>>>\n"
11480 " End\n"
11481 "int i;\n"));
11482}
11483
Daniel Jasper471894432014-08-06 13:40:26 +000011484TEST_F(FormatTest, DisableRegions) {
11485 EXPECT_EQ("int i;\n"
11486 "// clang-format off\n"
11487 " int j;\n"
11488 "// clang-format on\n"
11489 "int k;",
11490 format(" int i;\n"
11491 " // clang-format off\n"
11492 " int j;\n"
11493 " // clang-format on\n"
11494 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011495 EXPECT_EQ("int i;\n"
11496 "/* clang-format off */\n"
11497 " int j;\n"
11498 "/* clang-format on */\n"
11499 "int k;",
11500 format(" int i;\n"
11501 " /* clang-format off */\n"
11502 " int j;\n"
11503 " /* clang-format on */\n"
11504 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011505
11506 // Don't reflow comments within disabled regions.
11507 EXPECT_EQ(
11508 "// clang-format off\n"
11509 "// long long long long long long line\n"
11510 "/* clang-format on */\n"
11511 "/* long long long\n"
11512 " * long long long\n"
11513 " * line */\n"
11514 "int i;\n"
11515 "/* clang-format off */\n"
11516 "/* long long long long long long line */\n",
11517 format("// clang-format off\n"
11518 "// long long long long long long line\n"
11519 "/* clang-format on */\n"
11520 "/* long long long long long long line */\n"
11521 "int i;\n"
11522 "/* clang-format off */\n"
11523 "/* long long long long long long line */\n",
11524 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011525}
11526
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011527TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11528 format("? ) =");
11529 verifyNoCrash("#define a\\\n /**/}");
11530}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011531
Daniel Jasper498f5582015-12-25 08:53:31 +000011532TEST_F(FormatTest, FormatsTableGenCode) {
11533 FormatStyle Style = getLLVMStyle();
11534 Style.Language = FormatStyle::LK_TableGen;
11535 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11536}
11537
Nico Weberb2673a12016-11-10 21:49:25 +000011538TEST_F(FormatTest, ArrayOfTemplates) {
11539 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11540 format("auto a = new unique_ptr<int > [ 10];"));
11541
11542 FormatStyle Spaces = getLLVMStyle();
11543 Spaces.SpacesInSquareBrackets = true;
11544 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11545 format("auto a = new unique_ptr<int > [10];", Spaces));
11546}
11547
11548TEST_F(FormatTest, ArrayAsTemplateType) {
11549 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11550 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11551
11552 FormatStyle Spaces = getLLVMStyle();
11553 Spaces.SpacesInSquareBrackets = true;
11554 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11555 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11556}
11557
Eric Liu547d8792016-03-24 13:22:42 +000011558TEST(FormatStyle, GetStyleOfFile) {
11559 vfs::InMemoryFileSystem FS;
11560 // Test 1: format file in the same directory.
11561 ASSERT_TRUE(
11562 FS.addFile("/a/.clang-format", 0,
11563 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11564 ASSERT_TRUE(
11565 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011566 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011567 ASSERT_TRUE((bool)Style1);
11568 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011569
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011570 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011571 ASSERT_TRUE(
11572 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011573 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011574 ASSERT_TRUE((bool)Style2);
11575 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011576
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011577 // Test 2.2: no format on 'none' fallback style.
11578 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11579 ASSERT_TRUE((bool)Style2);
11580 ASSERT_EQ(*Style2, getNoStyle());
11581
11582 // Test 2.3: format if config is found with no based style while fallback is
11583 // 'none'.
11584 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11585 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11586 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11587 ASSERT_TRUE((bool)Style2);
11588 ASSERT_EQ(*Style2, getLLVMStyle());
11589
11590 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11591 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11592 ASSERT_TRUE((bool)Style2);
11593 ASSERT_EQ(*Style2, getLLVMStyle());
11594
Eric Liu547d8792016-03-24 13:22:42 +000011595 // Test 3: format file in parent directory.
11596 ASSERT_TRUE(
11597 FS.addFile("/c/.clang-format", 0,
11598 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11599 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11600 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011601 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011602 ASSERT_TRUE((bool)Style3);
11603 ASSERT_EQ(*Style3, getGoogleStyle());
11604
11605 // Test 4: error on invalid fallback style
11606 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11607 ASSERT_FALSE((bool)Style4);
11608 llvm::consumeError(Style4.takeError());
11609
11610 // Test 5: error on invalid yaml on command line
11611 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11612 ASSERT_FALSE((bool)Style5);
11613 llvm::consumeError(Style5.takeError());
11614
11615 // Test 6: error on invalid style
11616 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11617 ASSERT_FALSE((bool)Style6);
11618 llvm::consumeError(Style6.takeError());
11619
11620 // Test 7: found config file, error on parsing it
11621 ASSERT_TRUE(
11622 FS.addFile("/d/.clang-format", 0,
11623 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11624 "InvalidKey: InvalidValue")));
11625 ASSERT_TRUE(
11626 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11627 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11628 ASSERT_FALSE((bool)Style7);
11629 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011630}
11631
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011632TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11633 // Column limit is 20.
11634 std::string Code = "Type *a =\n"
11635 " new Type();\n"
11636 "g(iiiii, 0, jjjjj,\n"
11637 " 0, kkkkk, 0, mm);\n"
11638 "int bad = format ;";
11639 std::string Expected = "auto a = new Type();\n"
11640 "g(iiiii, nullptr,\n"
11641 " jjjjj, nullptr,\n"
11642 " kkkkk, nullptr,\n"
11643 " mm);\n"
11644 "int bad = format ;";
11645 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011646 tooling::Replacements Replaces = toReplacements(
11647 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11648 "auto "),
11649 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11650 "nullptr"),
11651 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11652 "nullptr"),
11653 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11654 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011655
11656 format::FormatStyle Style = format::getLLVMStyle();
11657 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011658 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11659 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11660 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11661 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11662 EXPECT_TRUE(static_cast<bool>(Result));
11663 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011664}
11665
Eric Liubaf58c22016-05-18 13:43:48 +000011666TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11667 std::string Code = "#include \"a.h\"\n"
11668 "#include \"c.h\"\n"
11669 "\n"
11670 "int main() {\n"
11671 " return 0;\n"
11672 "}";
11673 std::string Expected = "#include \"a.h\"\n"
11674 "#include \"b.h\"\n"
11675 "#include \"c.h\"\n"
11676 "\n"
11677 "int main() {\n"
11678 " return 0;\n"
11679 "}";
11680 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011681 tooling::Replacements Replaces = toReplacements(
11682 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11683 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011684
11685 format::FormatStyle Style = format::getLLVMStyle();
11686 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011687 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11688 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11689 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11690 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11691 EXPECT_TRUE(static_cast<bool>(Result));
11692 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011693}
11694
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011695TEST_F(FormatTest, AllignTrailingComments) {
11696 EXPECT_EQ("#define MACRO(V) \\\n"
11697 " V(Rt2) /* one more char */ \\\n"
11698 " V(Rs) /* than here */ \\\n"
11699 "/* comment 3 */\n",
11700 format("#define MACRO(V)\\\n"
11701 "V(Rt2) /* one more char */ \\\n"
11702 "V(Rs) /* than here */ \\\n"
11703 "/* comment 3 */ \\\n",
11704 getLLVMStyleWithColumns(40)));
11705}
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011706} // end namespace
11707} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011708} // end namespace clang