blob: 7348fa030df1d53552e6e3a2ded93ab389efb50b [file] [log] [blame]
Daniel Jasperf7935112012-12-03 18:12:45 +00001//===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Chandler Carruth320d9662012-12-04 09:45:34 +000010#include "clang/Format/Format.h"
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011
Eric Liu40ef2fb2016-08-01 10:16:37 +000012#include "../Tooling/ReplacementTest.h"
Manuel Klimekb12e5a52016-03-01 12:37:30 +000013#include "FormatTestUtils.h"
14
15#include "clang/Frontend/TextDiagnosticPrinter.h"
Chandler Carruth4b417452013-01-19 08:09:44 +000016#include "llvm/Support/Debug.h"
Eric Liu547d8792016-03-24 13:22:42 +000017#include "llvm/Support/MemoryBuffer.h"
Chandler Carruth4b417452013-01-19 08:09:44 +000018#include "gtest/gtest.h"
Manuel Klimek24998102013-01-16 14:55:28 +000019
Chandler Carruth10346662014-04-22 03:17:02 +000020#define DEBUG_TYPE "format-test"
21
Eric Liu40ef2fb2016-08-01 10:16:37 +000022using clang::tooling::ReplacementTest;
23using clang::tooling::toReplacements;
24
Daniel Jasperf7935112012-12-03 18:12:45 +000025namespace clang {
26namespace format {
Daniel Jasperd246a5a2015-06-15 15:25:11 +000027namespace {
Daniel Jasperf7935112012-12-03 18:12:45 +000028
Daniel Jaspera44991332015-04-29 13:06:49 +000029FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); }
Nico Weber514ecc82014-02-02 20:50:45 +000030
Daniel Jasperf7935112012-12-03 18:12:45 +000031class FormatTest : public ::testing::Test {
32protected:
Manuel Klimekec5c3db2015-05-07 12:26:30 +000033 enum IncompleteCheck {
34 IC_ExpectComplete,
35 IC_ExpectIncomplete,
36 IC_DoNotCheck
37 };
38
Daniel Jasperd246a5a2015-06-15 15:25:11 +000039 std::string format(llvm::StringRef Code,
40 const FormatStyle &Style = getLLVMStyle(),
Manuel Klimekec5c3db2015-05-07 12:26:30 +000041 IncompleteCheck CheckIncomplete = IC_ExpectComplete) {
Manuel Klimek24998102013-01-16 14:55:28 +000042 DEBUG(llvm::errs() << "---\n");
Manuel Klimek71814b42013-10-11 21:25:45 +000043 DEBUG(llvm::errs() << Code << "\n\n");
Daniel Jasperd246a5a2015-06-15 15:25:11 +000044 std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
Manuel Klimekec5c3db2015-05-07 12:26:30 +000045 bool IncompleteFormat = false;
46 tooling::Replacements Replaces =
47 reformat(Style, Code, Ranges, "<stdin>", &IncompleteFormat);
48 if (CheckIncomplete != IC_DoNotCheck) {
49 bool ExpectedIncompleteFormat = CheckIncomplete == IC_ExpectIncomplete;
50 EXPECT_EQ(ExpectedIncompleteFormat, IncompleteFormat) << Code << "\n\n";
51 }
Daniel Jasperec04c0d2013-05-16 10:40:07 +000052 ReplacementCount = Replaces.size();
Eric Liu4f8d9942016-07-11 13:53:12 +000053 auto Result = applyAllReplacements(Code, Replaces);
54 EXPECT_TRUE(static_cast<bool>(Result));
55 DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
56 return *Result;
Daniel Jasperf7935112012-12-03 18:12:45 +000057 }
58
Manuel Klimekb69e3c62013-01-02 18:33:23 +000059 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
60 FormatStyle Style = getLLVMStyle();
61 Style.ColumnLimit = ColumnLimit;
62 return Style;
63 }
64
Daniel Jasper1b750ed2013-01-14 16:24:39 +000065 FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
66 FormatStyle Style = getGoogleStyle();
67 Style.ColumnLimit = ColumnLimit;
68 return Style;
69 }
70
Manuel Klimekb69e3c62013-01-02 18:33:23 +000071 void verifyFormat(llvm::StringRef Code,
72 const FormatStyle &Style = getLLVMStyle()) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000073 EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
Daniel Jasperf7935112012-12-03 18:12:45 +000074 }
75
Manuel Klimekec5c3db2015-05-07 12:26:30 +000076 void verifyIncompleteFormat(llvm::StringRef Code,
77 const FormatStyle &Style = getLLVMStyle()) {
78 EXPECT_EQ(Code.str(),
79 format(test::messUp(Code), Style, IC_ExpectIncomplete));
80 }
81
Daniel Jasperf7935112012-12-03 18:12:45 +000082 void verifyGoogleFormat(llvm::StringRef Code) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000083 verifyFormat(Code, getGoogleStyle());
Daniel Jasperf7935112012-12-03 18:12:45 +000084 }
Daniel Jasper5b49f472013-01-23 12:10:53 +000085
86 void verifyIndependentOfContext(llvm::StringRef text) {
87 verifyFormat(text);
88 verifyFormat(llvm::Twine("void f() { " + text + " }").str());
89 }
Daniel Jasper7b038a22013-01-30 09:46:12 +000090
Daniel Jasper675b4f82015-01-19 10:51:23 +000091 /// \brief Verify that clang-format does not crash on the given input.
92 void verifyNoCrash(llvm::StringRef Code,
93 const FormatStyle &Style = getLLVMStyle()) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +000094 format(Code, Style, IC_DoNotCheck);
Daniel Jasper675b4f82015-01-19 10:51:23 +000095 }
96
Daniel Jasper7b038a22013-01-30 09:46:12 +000097 int ReplacementCount;
Daniel Jasperf7935112012-12-03 18:12:45 +000098};
99
Manuel Klimek52b15152013-01-09 15:25:02 +0000100TEST_F(FormatTest, MessUp) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +0000101 EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
102 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
103 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
104 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
105 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
Manuel Klimek52b15152013-01-09 15:25:02 +0000106}
107
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000108//===----------------------------------------------------------------------===//
109// Basic function tests.
110//===----------------------------------------------------------------------===//
111
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +0000112TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000113 EXPECT_EQ(";", format(";"));
114}
115
116TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
117 EXPECT_EQ("int i;", format(" int i;"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +0000118 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000119 EXPECT_EQ("int i;\nint j;", format(" int i; int j;"));
120 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;"));
121}
122
123TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
124 EXPECT_EQ("int i;", format("int\ni;"));
125}
126
127TEST_F(FormatTest, FormatsNestedBlockStatements) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000128 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000129}
130
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000131TEST_F(FormatTest, FormatsNestedCall) {
132 verifyFormat("Method(f1, f2(f3));");
133 verifyFormat("Method(f1(f2, f3()));");
Daniel Jasper48cb3b92013-01-13 08:19:51 +0000134 verifyFormat("Method(f1(f2, (f3())));");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000135}
136
Daniel Jasper14556742013-02-07 21:08:36 +0000137TEST_F(FormatTest, NestedNameSpecifiers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +0000138 verifyFormat("vector<::Type> v;");
Daniel Jasper14556742013-02-07 21:08:36 +0000139 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
Daniel Jasper11be8ac2013-08-28 07:07:07 +0000140 verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
Daniel Jasperf322eb52014-10-23 20:22:22 +0000141 verifyFormat("bool a = 2 < ::SomeFunction();");
Daniel Jasper736c14f2013-01-16 07:19:28 +0000142}
143
Daniel Jasper7b038a22013-01-30 09:46:12 +0000144TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
145 EXPECT_EQ("if (a) {\n"
146 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000147 "}",
148 format("if(a){f();}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000149 EXPECT_EQ(4, ReplacementCount);
150 EXPECT_EQ("if (a) {\n"
151 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000152 "}",
153 format("if (a) {\n"
154 " f();\n"
155 "}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000156 EXPECT_EQ(0, ReplacementCount);
Daniel Jasperd6e61882015-06-17 12:23:15 +0000157 EXPECT_EQ("/*\r\n"
158 "\r\n"
159 "*/\r\n",
160 format("/*\r\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +0000161 "\r\n"
162 "*/\r\n"));
Daniel Jasperd6e61882015-06-17 12:23:15 +0000163 EXPECT_EQ(0, ReplacementCount);
Daniel Jasper7b038a22013-01-30 09:46:12 +0000164}
165
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000166TEST_F(FormatTest, RemovesEmptyLines) {
167 EXPECT_EQ("class C {\n"
168 " int i;\n"
169 "};",
170 format("class C {\n"
171 " int i;\n"
172 "\n"
173 "};"));
174
Nico Weber34272652014-11-13 16:25:37 +0000175 // Don't remove empty lines at the start of namespaces or extern "C" blocks.
Daniel Jasper01b35482014-03-21 13:03:33 +0000176 EXPECT_EQ("namespace N {\n"
177 "\n"
178 "int i;\n"
179 "}",
180 format("namespace N {\n"
181 "\n"
182 "int i;\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000183 "}",
184 getGoogleStyle()));
Nico Weber34272652014-11-13 16:25:37 +0000185 EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
186 "\n"
187 "int i;\n"
188 "}",
189 format("extern /**/ \"C\" /**/ {\n"
190 "\n"
191 "int i;\n"
192 "}",
193 getGoogleStyle()));
194
195 // ...but do keep inlining and removing empty lines for non-block extern "C"
196 // functions.
197 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
198 EXPECT_EQ("extern \"C\" int f() {\n"
199 " int i = 42;\n"
200 " return i;\n"
201 "}",
202 format("extern \"C\" int f() {\n"
203 "\n"
204 " int i = 42;\n"
205 " return i;\n"
206 "}",
207 getGoogleStyle()));
Daniel Jasper01b35482014-03-21 13:03:33 +0000208
Daniel Jasper11164bd2014-03-21 12:58:53 +0000209 // Remove empty lines at the beginning and end of blocks.
210 EXPECT_EQ("void f() {\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000211 "\n"
212 " if (a) {\n"
213 "\n"
214 " f();\n"
215 " }\n"
216 "}",
217 format("void f() {\n"
218 "\n"
219 " if (a) {\n"
220 "\n"
221 " f();\n"
222 "\n"
223 " }\n"
224 "\n"
225 "}",
226 getLLVMStyle()));
227 EXPECT_EQ("void f() {\n"
Daniel Jasper11164bd2014-03-21 12:58:53 +0000228 " if (a) {\n"
229 " f();\n"
230 " }\n"
231 "}",
232 format("void f() {\n"
233 "\n"
234 " if (a) {\n"
235 "\n"
236 " f();\n"
237 "\n"
238 " }\n"
239 "\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000240 "}",
241 getGoogleStyle()));
Daniel Jasper11164bd2014-03-21 12:58:53 +0000242
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000243 // Don't remove empty lines in more complex control statements.
244 EXPECT_EQ("void f() {\n"
245 " if (a) {\n"
246 " f();\n"
247 "\n"
248 " } else if (b) {\n"
249 " f();\n"
250 " }\n"
251 "}",
252 format("void f() {\n"
253 " if (a) {\n"
254 " f();\n"
255 "\n"
256 " } else if (b) {\n"
257 " f();\n"
258 "\n"
259 " }\n"
260 "\n"
261 "}"));
262
263 // FIXME: This is slightly inconsistent.
264 EXPECT_EQ("namespace {\n"
265 "int i;\n"
266 "}",
267 format("namespace {\n"
268 "int i;\n"
269 "\n"
270 "}"));
271 EXPECT_EQ("namespace {\n"
272 "int i;\n"
273 "\n"
274 "} // namespace",
275 format("namespace {\n"
276 "int i;\n"
277 "\n"
278 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000279
280 FormatStyle Style = getLLVMStyle();
281 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
282 Style.MaxEmptyLinesToKeep = 2;
283 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
284 Style.BraceWrapping.AfterClass = true;
285 Style.BraceWrapping.AfterFunction = true;
286 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
287
288 EXPECT_EQ("class Foo\n"
289 "{\n"
290 " Foo() {}\n"
291 "\n"
292 " void funk() {}\n"
293 "};",
294 format("class Foo\n"
295 "{\n"
296 " Foo()\n"
297 " {\n"
298 " }\n"
299 "\n"
300 " void funk() {}\n"
301 "};",
302 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000303}
304
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000305TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000306 verifyFormat("x = (a) and (b);");
307 verifyFormat("x = (a) or (b);");
308 verifyFormat("x = (a) bitand (b);");
309 verifyFormat("x = (a) bitor (b);");
310 verifyFormat("x = (a) not_eq (b);");
311 verifyFormat("x = (a) and_eq (b);");
312 verifyFormat("x = (a) or_eq (b);");
313 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000314}
315
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000316//===----------------------------------------------------------------------===//
317// Tests for control statements.
318//===----------------------------------------------------------------------===//
319
Daniel Jaspercdd06622013-05-14 10:31:09 +0000320TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000321 verifyFormat("if (true)\n f();\ng();");
322 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000323 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000324
Daniel Jasper3a685df2013-05-16 12:12:21 +0000325 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000326 AllowsMergedIf.AlignEscapedNewlinesLeft = true;
Daniel Jasperced17f82013-01-16 15:44:34 +0000327 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
328 verifyFormat("if (a)\n"
329 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000330 " f();",
331 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000332 verifyFormat("{\n"
333 " if (a)\n"
334 " label:\n"
335 " f();\n"
336 "}",
337 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000338 verifyFormat("#define A \\\n"
339 " if (a) \\\n"
340 " label: \\\n"
341 " f()",
342 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000343 verifyFormat("if (a)\n"
344 " ;",
345 AllowsMergedIf);
346 verifyFormat("if (a)\n"
347 " if (b) return;",
348 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000349
Daniel Jasper3a685df2013-05-16 12:12:21 +0000350 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000351 " f();\n",
352 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000353 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000354 " f();",
355 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000356 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000357 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000358 "}",
359 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000360 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000361 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000362 "}",
363 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000364
365 AllowsMergedIf.ColumnLimit = 14;
366 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000367 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000368 " return;",
369 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000370
371 AllowsMergedIf.ColumnLimit = 13;
372 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000373}
374
Daniel Jasper3a685df2013-05-16 12:12:21 +0000375TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
376 FormatStyle AllowsMergedLoops = getLLVMStyle();
377 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
378 verifyFormat("while (true) continue;", AllowsMergedLoops);
379 verifyFormat("for (;;) continue;", AllowsMergedLoops);
380 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
381 verifyFormat("while (true)\n"
382 " ;",
383 AllowsMergedLoops);
384 verifyFormat("for (;;)\n"
385 " ;",
386 AllowsMergedLoops);
387 verifyFormat("for (;;)\n"
388 " for (;;) continue;",
389 AllowsMergedLoops);
390 verifyFormat("for (;;) // Can't merge this\n"
391 " continue;",
392 AllowsMergedLoops);
393 verifyFormat("for (;;) /* still don't merge */\n"
394 " continue;",
395 AllowsMergedLoops);
396}
397
Daniel Jasper17605d32014-05-14 09:33:35 +0000398TEST_F(FormatTest, FormatShortBracedStatements) {
399 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
400 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
401
402 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
403 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
404
405 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
406 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
407 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
408 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
409 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
410 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
411 verifyFormat("if (true) { //\n"
412 " f();\n"
413 "}",
414 AllowSimpleBracedStatements);
415 verifyFormat("if (true) {\n"
416 " f();\n"
417 " f();\n"
418 "}",
419 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000420 verifyFormat("if (true) {\n"
421 " f();\n"
422 "} else {\n"
423 " f();\n"
424 "}",
425 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000426
Daniel Jasperbd630732014-05-22 13:25:26 +0000427 verifyFormat("template <int> struct A2 {\n"
428 " struct B {};\n"
429 "};",
430 AllowSimpleBracedStatements);
431
Daniel Jasper17605d32014-05-14 09:33:35 +0000432 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
433 verifyFormat("if (true) {\n"
434 " f();\n"
435 "}",
436 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000437 verifyFormat("if (true) {\n"
438 " f();\n"
439 "} else {\n"
440 " f();\n"
441 "}",
442 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000443
444 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
445 verifyFormat("while (true) {\n"
446 " f();\n"
447 "}",
448 AllowSimpleBracedStatements);
449 verifyFormat("for (;;) {\n"
450 " f();\n"
451 "}",
452 AllowSimpleBracedStatements);
453}
454
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000455TEST_F(FormatTest, ParseIfElse) {
456 verifyFormat("if (true)\n"
457 " if (true)\n"
458 " if (true)\n"
459 " f();\n"
460 " else\n"
461 " g();\n"
462 " else\n"
463 " h();\n"
464 "else\n"
465 " i();");
466 verifyFormat("if (true)\n"
467 " if (true)\n"
468 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000469 " if (true)\n"
470 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000471 " } else {\n"
472 " g();\n"
473 " }\n"
474 " else\n"
475 " h();\n"
476 "else {\n"
477 " i();\n"
478 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000479 verifyFormat("void f() {\n"
480 " if (a) {\n"
481 " } else {\n"
482 " }\n"
483 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000484}
485
486TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000487 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000488 verifyFormat("if (a)\n"
489 " f();\n"
490 "else if (b)\n"
491 " g();\n"
492 "else\n"
493 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000494 verifyFormat("if (a) {\n"
495 " f();\n"
496 "}\n"
497 "// or else ..\n"
498 "else {\n"
499 " g()\n"
500 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000501
502 verifyFormat("if (a) {\n"
503 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
504 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
505 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000506 verifyFormat("if (a) {\n"
507 "} else if (\n"
508 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
509 "}",
510 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000511}
512
Daniel Jasperf7935112012-12-03 18:12:45 +0000513TEST_F(FormatTest, FormatsForLoop) {
514 verifyFormat(
515 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000516 " ++VeryVeryLongLoopVariable)\n"
517 " ;");
518 verifyFormat("for (;;)\n"
519 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000520 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000521 verifyFormat("for (;;) {\n"
522 " f();\n"
523 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000524 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000525
526 verifyFormat(
527 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
528 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000529 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000530
531 verifyFormat(
532 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000533 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000534 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
535 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000536 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000537 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
538 " I = FD->getDeclsInPrototypeScope().begin(),\n"
539 " E = FD->getDeclsInPrototypeScope().end();\n"
540 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000541 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
542 " I = Container.begin(),\n"
543 " E = Container.end();\n"
544 " I != E; ++I) {\n}",
545 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000546
Daniel Jasper48c62f92013-01-28 17:30:17 +0000547 verifyFormat(
548 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
549 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000550 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
551 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000552 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000553 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
554 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
555 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000556 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
557 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
558 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000559 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
560 " aaaaaaaaaa);\n"
561 " iter; ++iter) {\n"
562 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000563 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
564 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
565 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
566 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000567
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000568 FormatStyle NoBinPacking = getLLVMStyle();
569 NoBinPacking.BinPackParameters = false;
570 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
571 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
572 " aaaaaaaaaaaaaaaa,\n"
573 " aaaaaaaaaaaaaaaa,\n"
574 " aaaaaaaaaaaaaaaa);\n"
575 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
576 "}",
577 NoBinPacking);
578 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000579 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
580 " E = UnwrappedLines.end();\n"
581 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000582 " ++I) {\n}",
583 NoBinPacking);
Daniel Jasperf7935112012-12-03 18:12:45 +0000584}
585
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000586TEST_F(FormatTest, RangeBasedForLoops) {
587 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
588 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
589 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
590 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000591 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
592 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000593 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
594 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000595}
596
Daniel Jaspere1e43192014-04-01 12:55:11 +0000597TEST_F(FormatTest, ForEachLoops) {
598 verifyFormat("void f() {\n"
599 " foreach (Item *item, itemlist) {}\n"
600 " Q_FOREACH (Item *item, itemlist) {}\n"
601 " BOOST_FOREACH (Item *item, itemlist) {}\n"
602 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
603 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000604
605 // As function-like macros.
606 verifyFormat("#define foreach(x, y)\n"
607 "#define Q_FOREACH(x, y)\n"
608 "#define BOOST_FOREACH(x, y)\n"
609 "#define UNKNOWN_FOREACH(x, y)\n");
610
611 // Not as function-like macros.
612 verifyFormat("#define foreach (x, y)\n"
613 "#define Q_FOREACH (x, y)\n"
614 "#define BOOST_FOREACH (x, y)\n"
615 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000616}
617
Daniel Jasperf7935112012-12-03 18:12:45 +0000618TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000619 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000620 verifyFormat("while (true)\n"
621 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000622 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000623 verifyFormat("while () {\n"
624 " f();\n"
625 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000626}
627
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000628TEST_F(FormatTest, FormatsDoWhile) {
629 verifyFormat("do {\n"
630 " do_something();\n"
631 "} while (something());");
632 verifyFormat("do\n"
633 " do_something();\n"
634 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000635}
636
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000637TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000638 verifyFormat("switch (x) {\n"
639 "case 1:\n"
640 " f();\n"
641 " break;\n"
642 "case kFoo:\n"
643 "case ns::kBar:\n"
644 "case kBaz:\n"
645 " break;\n"
646 "default:\n"
647 " g();\n"
648 " break;\n"
649 "}");
650 verifyFormat("switch (x) {\n"
651 "case 1: {\n"
652 " f();\n"
653 " break;\n"
654 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000655 "case 2: {\n"
656 " break;\n"
657 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000658 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000659 verifyFormat("switch (x) {\n"
660 "case 1: {\n"
661 " f();\n"
662 " {\n"
663 " g();\n"
664 " h();\n"
665 " }\n"
666 " break;\n"
667 "}\n"
668 "}");
669 verifyFormat("switch (x) {\n"
670 "case 1: {\n"
671 " f();\n"
672 " if (foo) {\n"
673 " g();\n"
674 " h();\n"
675 " }\n"
676 " break;\n"
677 "}\n"
678 "}");
679 verifyFormat("switch (x) {\n"
680 "case 1: {\n"
681 " f();\n"
682 " g();\n"
683 "} break;\n"
684 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000685 verifyFormat("switch (test)\n"
686 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000687 verifyFormat("switch (x) {\n"
688 "default: {\n"
689 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000690 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000691 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000692 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000693 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000694 "// if 1, do f()\n"
695 "case 1:\n"
696 " f();\n"
697 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000698 verifyFormat("switch (x) {\n"
699 "case 1:\n"
700 " // Do amazing stuff\n"
701 " {\n"
702 " f();\n"
703 " g();\n"
704 " }\n"
705 " break;\n"
706 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000707 verifyFormat("#define A \\\n"
708 " switch (x) { \\\n"
709 " case a: \\\n"
710 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000711 " }",
712 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000713 verifyFormat("#define OPERATION_CASE(name) \\\n"
714 " case OP_name: \\\n"
715 " return operations::Operation##name\n",
716 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000717 verifyFormat("switch (x) {\n"
718 "case 1:;\n"
719 "default:;\n"
720 " int i;\n"
721 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000722
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000723 verifyGoogleFormat("switch (x) {\n"
724 " case 1:\n"
725 " f();\n"
726 " break;\n"
727 " case kFoo:\n"
728 " case ns::kBar:\n"
729 " case kBaz:\n"
730 " break;\n"
731 " default:\n"
732 " g();\n"
733 " break;\n"
734 "}");
735 verifyGoogleFormat("switch (x) {\n"
736 " case 1: {\n"
737 " f();\n"
738 " break;\n"
739 " }\n"
740 "}");
741 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000742 " ;");
743
744 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
745 " case OP_name: \\\n"
746 " return operations::Operation##name\n");
747 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
748 " // Get the correction operation class.\n"
749 " switch (OpCode) {\n"
750 " CASE(Add);\n"
751 " CASE(Subtract);\n"
752 " default:\n"
753 " return operations::Unknown;\n"
754 " }\n"
755 "#undef OPERATION_CASE\n"
756 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000757 verifyFormat("DEBUG({\n"
758 " switch (x) {\n"
759 " case A:\n"
760 " f();\n"
761 " break;\n"
762 " // On B:\n"
763 " case B:\n"
764 " g();\n"
765 " break;\n"
766 " }\n"
767 "});");
Daniel Jasper031e2402014-04-28 07:48:36 +0000768 verifyFormat("switch (a) {\n"
769 "case (b):\n"
770 " return;\n"
771 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000772
773 verifyFormat("switch (a) {\n"
774 "case some_namespace::\n"
775 " some_constant:\n"
776 " return;\n"
777 "}",
778 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000779}
780
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000781TEST_F(FormatTest, CaseRanges) {
782 verifyFormat("switch (x) {\n"
783 "case 'A' ... 'Z':\n"
784 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000785 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000786 " break;\n"
787 "}");
788}
789
Daniel Jasperb87899b2014-09-10 13:11:45 +0000790TEST_F(FormatTest, ShortCaseLabels) {
791 FormatStyle Style = getLLVMStyle();
792 Style.AllowShortCaseLabelsOnASingleLine = true;
793 verifyFormat("switch (a) {\n"
794 "case 1: x = 1; break;\n"
795 "case 2: return;\n"
796 "case 3:\n"
797 "case 4:\n"
798 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +0000799 "case 6: // comment\n"
800 " return;\n"
801 "case 7:\n"
802 " // comment\n"
803 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +0000804 "case 8:\n"
805 " x = 8; // comment\n"
806 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000807 "default: y = 1; break;\n"
808 "}",
809 Style);
810 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +0000811 "#if FOO\n"
812 "case 0: return 0;\n"
813 "#endif\n"
814 "}",
815 Style);
816 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000817 "case 1: {\n"
818 "}\n"
819 "case 2: {\n"
820 " return;\n"
821 "}\n"
822 "case 3: {\n"
823 " x = 1;\n"
824 " return;\n"
825 "}\n"
826 "case 4:\n"
827 " if (x)\n"
828 " return;\n"
829 "}",
830 Style);
831 Style.ColumnLimit = 21;
832 verifyFormat("switch (a) {\n"
833 "case 1: x = 1; break;\n"
834 "case 2: return;\n"
835 "case 3:\n"
836 "case 4:\n"
837 "case 5: return;\n"
838 "default:\n"
839 " y = 1;\n"
840 " break;\n"
841 "}",
842 Style);
843}
844
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000845TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000846 verifyFormat("void f() {\n"
847 " some_code();\n"
848 "test_label:\n"
849 " some_other_code();\n"
850 " {\n"
851 " some_more_code();\n"
852 " another_label:\n"
853 " some_more_code();\n"
854 " }\n"
855 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +0000856 verifyFormat("{\n"
857 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000858 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +0000859 " some_other_code();\n"
860 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000861 verifyFormat("{\n"
862 " some_code();\n"
863 "test_label:;\n"
864 " int i = 0;\n"
865 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000866}
867
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000868//===----------------------------------------------------------------------===//
869// Tests for comments.
870//===----------------------------------------------------------------------===//
871
872TEST_F(FormatTest, UnderstandsSingleLineComments) {
Daniel Jasper55213652013-03-22 10:01:29 +0000873 verifyFormat("//* */");
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000874 verifyFormat("// line 1\n"
875 "// line 2\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000876 "void f() {}\n");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000877
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000878 verifyFormat("void f() {\n"
879 " // Doesn't do anything\n"
880 "}");
Daniel Jasper185de242013-07-11 13:48:16 +0000881 verifyFormat("SomeObject\n"
882 " // Calling someFunction on SomeObject\n"
883 " .someFunction();");
Daniel Jaspera0407742014-02-11 10:08:11 +0000884 verifyFormat("auto result = SomeObject\n"
885 " // Calling someFunction on SomeObject\n"
886 " .someFunction();");
Daniel Jasperaa701fa2013-01-18 08:44:07 +0000887 verifyFormat("void f(int i, // some comment (probably for i)\n"
888 " int j, // some comment (probably for j)\n"
Daniel Jasper942ee722013-01-13 16:10:20 +0000889 " int k); // some comment (probably for k)");
890 verifyFormat("void f(int i,\n"
891 " // some comment (probably for j)\n"
892 " int j,\n"
893 " // some comment (probably for k)\n"
894 " int k);");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000895
Daniel Jasperaa701fa2013-01-18 08:44:07 +0000896 verifyFormat("int i // This is a fancy variable\n"
897 " = 5; // with nicely aligned comment.");
898
899 verifyFormat("// Leading comment.\n"
900 "int a; // Trailing comment.");
901 verifyFormat("int a; // Trailing comment\n"
902 " // on 2\n"
903 " // or 3 lines.\n"
904 "int b;");
905 verifyFormat("int a; // Trailing comment\n"
906 "\n"
907 "// Leading comment.\n"
908 "int b;");
909 verifyFormat("int a; // Comment.\n"
910 " // More details.\n"
911 "int bbbb; // Another comment.");
912 verifyFormat(
913 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
914 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // comment\n"
915 "int cccccccccccccccccccccccccccccc; // comment\n"
916 "int ddd; // looooooooooooooooooooooooong comment\n"
917 "int aaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
918 "int bbbbbbbbbbbbbbbbbbbbb; // comment\n"
919 "int ccccccccccccccccccc; // comment");
920
Daniel Jasper997b08c2013-01-18 09:19:33 +0000921 verifyFormat("#include \"a\" // comment\n"
922 "#include \"a/b/c\" // comment");
923 verifyFormat("#include <a> // comment\n"
924 "#include <a/b/c> // comment");
Daniel Jasper98857842013-10-30 13:54:53 +0000925 EXPECT_EQ("#include \"a\" // comment\n"
Manuel Klimek5c24cca2013-05-23 10:56:37 +0000926 "#include \"a/b/c\" // comment",
927 format("#include \\\n"
928 " \"a\" // comment\n"
929 "#include \"a/b/c\" // comment"));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000930
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000931 verifyFormat("enum E {\n"
932 " // comment\n"
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000933 " VAL_A, // comment\n"
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000934 " VAL_B\n"
935 "};");
Daniel Jaspere25509f2012-12-17 11:29:41 +0000936
937 verifyFormat(
938 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000939 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // Trailing comment");
Daniel Jasperd8bb2db2013-01-09 09:33:39 +0000940 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
941 " // Comment inside a statement.\n"
942 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper4281c5a2014-10-07 14:45:34 +0000943 verifyFormat("SomeFunction(a,\n"
944 " // comment\n"
945 " b + x);");
946 verifyFormat("SomeFunction(a, a,\n"
947 " // comment\n"
948 " b + x);");
Daniel Jasper38396592013-02-06 15:23:09 +0000949 verifyFormat(
950 "bool aaaaaaaaaaaaa = // comment\n"
951 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
952 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Manuel Klimekc74d2922013-01-07 08:54:53 +0000953
Daniel Jasper525264c2013-02-13 19:25:54 +0000954 verifyFormat("int aaaa; // aaaaa\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000955 "int aa; // aaaaaaa",
956 getLLVMStyleWithColumns(20));
Daniel Jasper525264c2013-02-13 19:25:54 +0000957
Daniel Jasper304a9862013-01-21 22:49:20 +0000958 EXPECT_EQ("void f() { // This does something ..\n"
959 "}\n"
960 "int a; // This is unrelated",
961 format("void f() { // This does something ..\n"
962 " }\n"
963 "int a; // This is unrelated"));
Daniel Jasper251b3c92013-07-01 11:22:57 +0000964 EXPECT_EQ("class C {\n"
965 " void f() { // This does something ..\n"
966 " } // awesome..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +0000967 "\n"
Daniel Jasper251b3c92013-07-01 11:22:57 +0000968 " int a; // This is unrelated\n"
969 "};",
970 format("class C{void f() { // This does something ..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +0000971 " } // awesome..\n"
972 " \n"
Daniel Jasper251b3c92013-07-01 11:22:57 +0000973 "int a; // This is unrelated\n"
974 "};"));
Daniel Jasper304a9862013-01-21 22:49:20 +0000975
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000976 EXPECT_EQ("int i; // single line trailing comment",
Manuel Klimekc74d2922013-01-07 08:54:53 +0000977 format("int i;\\\n// single line trailing comment"));
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000978
979 verifyGoogleFormat("int a; // Trailing comment.");
Daniel Jasperddaa9be2013-01-29 19:41:55 +0000980
981 verifyFormat("someFunction(anotherFunction( // Force break.\n"
982 " parameter));");
Daniel Jaspera885dbe2013-02-05 09:34:14 +0000983
984 verifyGoogleFormat("#endif // HEADER_GUARD");
Daniel Jasperf79f9352013-02-06 22:04:05 +0000985
986 verifyFormat("const char *test[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +0000987 " // A\n"
988 " \"aaaa\",\n"
989 " // B\n"
990 " \"aaaaa\"};");
Daniel Jaspereef30492013-02-11 12:36:37 +0000991 verifyGoogleFormat(
992 "aaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +0000993 " aaaaaaaaaaaaaaaaaaaaaa); // 81_cols_with_this_comment");
Alexander Kornienkob1be9d62013-04-03 12:38:53 +0000994 EXPECT_EQ("D(a, {\n"
995 " // test\n"
996 " int a;\n"
997 "});",
998 format("D(a, {\n"
999 "// test\n"
1000 "int a;\n"
1001 "});"));
Manuel Klimekc5730802013-05-23 11:42:52 +00001002
1003 EXPECT_EQ("lineWith(); // comment\n"
1004 "// at start\n"
1005 "otherLine();",
1006 format("lineWith(); // comment\n"
1007 "// at start\n"
1008 "otherLine();"));
1009 EXPECT_EQ("lineWith(); // comment\n"
Daniel Jasperbb37a2f2016-02-01 11:20:55 +00001010 "/*\n"
1011 " * at start */\n"
1012 "otherLine();",
1013 format("lineWith(); // comment\n"
1014 "/*\n"
1015 " * at start */\n"
1016 "otherLine();"));
1017 EXPECT_EQ("lineWith(); // comment\n"
Manuel Klimekc5730802013-05-23 11:42:52 +00001018 " // at start\n"
1019 "otherLine();",
1020 format("lineWith(); // comment\n"
1021 " // at start\n"
1022 "otherLine();"));
Manuel Klimekb27375f2013-05-23 19:54:43 +00001023
1024 EXPECT_EQ("lineWith(); // comment\n"
1025 "// at start\n"
1026 "otherLine(); // comment",
1027 format("lineWith(); // comment\n"
1028 "// at start\n"
1029 "otherLine(); // comment"));
Manuel Klimek75ef31f2013-05-23 20:46:07 +00001030 EXPECT_EQ("lineWith();\n"
1031 "// at start\n"
1032 "otherLine(); // comment",
1033 format("lineWith();\n"
1034 " // at start\n"
1035 "otherLine(); // comment"));
1036 EXPECT_EQ("// first\n"
1037 "// at start\n"
1038 "otherLine(); // comment",
1039 format("// first\n"
1040 " // at start\n"
1041 "otherLine(); // comment"));
1042 EXPECT_EQ("f();\n"
1043 "// first\n"
1044 "// at start\n"
1045 "otherLine(); // comment",
1046 format("f();\n"
1047 "// first\n"
1048 " // at start\n"
1049 "otherLine(); // comment"));
Daniel Jasper0e93cdb2013-11-08 23:31:14 +00001050 verifyFormat("f(); // comment\n"
1051 "// first\n"
1052 "// at start\n"
1053 "otherLine();");
1054 EXPECT_EQ("f(); // comment\n"
1055 "// first\n"
1056 "// at start\n"
1057 "otherLine();",
1058 format("f(); // comment\n"
1059 "// first\n"
1060 " // at start\n"
1061 "otherLine();"));
1062 EXPECT_EQ("f(); // comment\n"
1063 " // first\n"
1064 "// at start\n"
1065 "otherLine();",
1066 format("f(); // comment\n"
1067 " // first\n"
1068 "// at start\n"
1069 "otherLine();"));
Daniel Jasper49532102015-01-07 14:00:11 +00001070 EXPECT_EQ("void f() {\n"
1071 " lineWith(); // comment\n"
1072 " // at start\n"
1073 "}",
1074 format("void f() {\n"
1075 " lineWith(); // comment\n"
1076 " // at start\n"
1077 "}"));
Benjamin Kramerdab50462016-01-11 16:27:16 +00001078 EXPECT_EQ("int xy; // a\n"
1079 "int z; // b",
1080 format("int xy; // a\n"
1081 "int z; //b"));
1082 EXPECT_EQ("int xy; // a\n"
1083 "int z; // bb",
1084 format("int xy; // a\n"
1085 "int z; //bb",
1086 getLLVMStyleWithColumns(12)));
Daniel Jasper66935022014-04-27 10:03:19 +00001087
Daniel Jaspera44991332015-04-29 13:06:49 +00001088 verifyFormat("#define A \\\n"
1089 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1090 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1091 getLLVMStyleWithColumns(60));
Daniel Jasper66935022014-04-27 10:03:19 +00001092 verifyFormat(
1093 "#define A \\\n"
1094 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1095 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1096 getLLVMStyleWithColumns(61));
Daniel Jasper8acf8222014-05-07 09:23:05 +00001097
1098 verifyFormat("if ( // This is some comment\n"
1099 " x + 3) {\n"
1100 "}");
1101 EXPECT_EQ("if ( // This is some comment\n"
1102 " // spanning two lines\n"
1103 " x + 3) {\n"
1104 "}",
1105 format("if( // This is some comment\n"
1106 " // spanning two lines\n"
1107 " x + 3) {\n"
1108 "}"));
Daniel Jasper9b79efb2015-01-19 11:49:32 +00001109
1110 verifyNoCrash("/\\\n/");
1111 verifyNoCrash("/\\\n* */");
Daniel Jasper62c78f52015-05-06 08:58:57 +00001112 // The 0-character somehow makes the lexer return a proper comment.
1113 verifyNoCrash(StringRef("/*\\\0\n/", 6));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001114}
1115
Daniel Jasper14e58e52014-03-21 11:58:45 +00001116TEST_F(FormatTest, KeepsParameterWithTrailingCommentsOnTheirOwnLine) {
1117 EXPECT_EQ("SomeFunction(a,\n"
1118 " b, // comment\n"
1119 " c);",
1120 format("SomeFunction(a,\n"
1121 " b, // comment\n"
1122 " c);"));
Daniel Jasper28df0a32014-03-21 12:15:40 +00001123 EXPECT_EQ("SomeFunction(a, b,\n"
1124 " // comment\n"
1125 " c);",
1126 format("SomeFunction(a,\n"
1127 " b,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001128 " // comment\n"
Daniel Jasper28df0a32014-03-21 12:15:40 +00001129 " c);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001130 EXPECT_EQ("SomeFunction(a, b, // comment (unclear relation)\n"
1131 " c);",
1132 format("SomeFunction(a, b, // comment (unclear relation)\n"
1133 " c);"));
1134 EXPECT_EQ("SomeFunction(a, // comment\n"
1135 " b,\n"
1136 " c); // comment",
1137 format("SomeFunction(a, // comment\n"
1138 " b,\n"
1139 " c); // comment"));
Daniel Jasper35e41222016-11-29 09:40:01 +00001140 EXPECT_EQ("aaaaaaaaaa(aaaa(aaaa,\n"
1141 " aaaa), //\n"
1142 " aaaa, bbbbb);",
1143 format("aaaaaaaaaa(aaaa(aaaa,\n"
1144 "aaaa), //\n"
1145 "aaaa, bbbbb);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001146}
1147
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001148TEST_F(FormatTest, RemovesTrailingWhitespaceOfComments) {
1149 EXPECT_EQ("// comment", format("// comment "));
1150 EXPECT_EQ("int aaaaaaa, bbbbbbb; // comment",
1151 format("int aaaaaaa, bbbbbbb; // comment ",
1152 getLLVMStyleWithColumns(33)));
Alexander Kornienko9ab4a772013-09-06 17:24:54 +00001153 EXPECT_EQ("// comment\\\n", format("// comment\\\n \t \v \f "));
1154 EXPECT_EQ("// comment \\\n", format("// comment \\\n \t \v \f "));
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001155}
1156
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001157TEST_F(FormatTest, UnderstandsBlockComments) {
Nico Weber8084cff2013-06-26 00:15:19 +00001158 verifyFormat("f(/*noSpaceAfterParameterNamingComment=*/true);");
Daniel Jasper2b2c9672016-05-08 18:14:01 +00001159 verifyFormat("void f() { g(/*aaa=*/x, /*bbb=*/!y, /*c=*/::c); }");
Daniel Jasper38c82402013-11-29 09:27:43 +00001160 EXPECT_EQ("f(aaaaaaaaaaaaaaaaaaaaaaaaa, /* Trailing comment for aa... */\n"
1161 " bbbbbbbbbbbbbbbbbbbbbbbbb);",
1162 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \\\n"
1163 "/* Trailing comment for aa... */\n"
1164 " bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001165 EXPECT_EQ(
1166 "f(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1167 " /* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);",
1168 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \n"
1169 "/* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper61a40782013-06-06 16:08:57 +00001170 EXPECT_EQ(
1171 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1172 " aaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001173 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001174 "}",
1175 format("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1176 " aaaaaaaaaaaaaaaaaa ,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001177 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001178 "}"));
Daniel Jasper99302ed2016-05-27 08:59:34 +00001179 verifyFormat("f(/* aaaaaaaaaaaaaaaaaa = */\n"
1180 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperddaa9be2013-01-29 19:41:55 +00001181
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00001182 FormatStyle NoBinPacking = getLLVMStyle();
1183 NoBinPacking.BinPackParameters = false;
1184 verifyFormat("aaaaaaaa(/* parameter 1 */ aaaaaa,\n"
1185 " /* parameter 2 */ aaaaaa,\n"
1186 " /* parameter 3 */ aaaaaa,\n"
1187 " /* parameter 4 */ aaaaaa);",
1188 NoBinPacking);
Daniel Jasper03b1bc72014-03-28 15:06:01 +00001189
1190 // Aligning block comments in macros.
1191 verifyGoogleFormat("#define A \\\n"
1192 " int i; /*a*/ \\\n"
1193 " int jjj; /*b*/");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001194}
1195
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001196TEST_F(FormatTest, AlignsBlockComments) {
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001197 EXPECT_EQ("/*\n"
1198 " * Really multi-line\n"
1199 " * comment.\n"
1200 " */\n"
1201 "void f() {}",
1202 format(" /*\n"
1203 " * Really multi-line\n"
1204 " * comment.\n"
1205 " */\n"
1206 " void f() {}"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001207 EXPECT_EQ("class C {\n"
1208 " /*\n"
1209 " * Another multi-line\n"
1210 " * comment.\n"
1211 " */\n"
1212 " void f() {}\n"
1213 "};",
1214 format("class C {\n"
1215 "/*\n"
1216 " * Another multi-line\n"
1217 " * comment.\n"
1218 " */\n"
1219 "void f() {}\n"
1220 "};"));
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001221 EXPECT_EQ("/*\n"
1222 " 1. This is a comment with non-trivial formatting.\n"
1223 " 1.1. We have to indent/outdent all lines equally\n"
1224 " 1.1.1. to keep the formatting.\n"
1225 " */",
1226 format(" /*\n"
1227 " 1. This is a comment with non-trivial formatting.\n"
1228 " 1.1. We have to indent/outdent all lines equally\n"
1229 " 1.1.1. to keep the formatting.\n"
1230 " */"));
1231 EXPECT_EQ("/*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001232 "Don't try to outdent if there's not enough indentation.\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001233 "*/",
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001234 format(" /*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001235 " Don't try to outdent if there's not enough indentation.\n"
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001236 " */"));
Manuel Klimek281dcbe2013-05-28 08:55:01 +00001237
1238 EXPECT_EQ("int i; /* Comment with empty...\n"
1239 " *\n"
1240 " * line. */",
1241 format("int i; /* Comment with empty...\n"
1242 " *\n"
1243 " * line. */"));
Alexander Kornienko67d9c8c2014-04-17 16:12:46 +00001244 EXPECT_EQ("int foobar = 0; /* comment */\n"
1245 "int bar = 0; /* multiline\n"
1246 " comment 1 */\n"
1247 "int baz = 0; /* multiline\n"
1248 " comment 2 */\n"
1249 "int bzz = 0; /* multiline\n"
1250 " comment 3 */",
1251 format("int foobar = 0; /* comment */\n"
1252 "int bar = 0; /* multiline\n"
1253 " comment 1 */\n"
1254 "int baz = 0; /* multiline\n"
1255 " comment 2 */\n"
1256 "int bzz = 0; /* multiline\n"
1257 " comment 3 */"));
1258 EXPECT_EQ("int foobar = 0; /* comment */\n"
1259 "int bar = 0; /* multiline\n"
1260 " comment */\n"
1261 "int baz = 0; /* multiline\n"
1262 "comment */",
1263 format("int foobar = 0; /* comment */\n"
1264 "int bar = 0; /* multiline\n"
1265 "comment */\n"
1266 "int baz = 0; /* multiline\n"
1267 "comment */"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001268}
1269
Daniel Jaspera0a50392015-12-01 13:28:53 +00001270TEST_F(FormatTest, CommentReflowingCanBeTurnedOff) {
1271 FormatStyle Style = getLLVMStyleWithColumns(20);
1272 Style.ReflowComments = false;
1273 verifyFormat("// aaaaaaaaa aaaaaaaaaa aaaaaaaaaa", Style);
1274 verifyFormat("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa */", Style);
1275}
1276
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001277TEST_F(FormatTest, CorrectlyHandlesLengthOfBlockComments) {
1278 EXPECT_EQ("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1279 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */",
1280 format("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1281 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */"));
Alexander Kornienkoaa620e12013-07-01 13:42:42 +00001282 EXPECT_EQ(
1283 "void ffffffffffff(\n"
1284 " int aaaaaaaa, int bbbbbbbb,\n"
1285 " int cccccccccccc) { /*\n"
1286 " aaaaaaaaaa\n"
1287 " aaaaaaaaaaaaa\n"
1288 " bbbbbbbbbbbbbb\n"
1289 " bbbbbbbbbb\n"
1290 " */\n"
1291 "}",
1292 format("void ffffffffffff(int aaaaaaaa, int bbbbbbbb, int cccccccccccc)\n"
1293 "{ /*\n"
1294 " aaaaaaaaaa aaaaaaaaaaaaa\n"
1295 " bbbbbbbbbbbbbb bbbbbbbbbb\n"
1296 " */\n"
1297 "}",
1298 getLLVMStyleWithColumns(40)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001299}
1300
Alexander Kornienko94042342013-07-16 23:47:22 +00001301TEST_F(FormatTest, DontBreakNonTrailingBlockComments) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00001302 EXPECT_EQ("void ffffffffff(\n"
1303 " int aaaaa /* test */);",
Alexander Kornienko94042342013-07-16 23:47:22 +00001304 format("void ffffffffff(int aaaaa /* test */);",
1305 getLLVMStyleWithColumns(35)));
1306}
1307
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001308TEST_F(FormatTest, SplitsLongCxxComments) {
1309 EXPECT_EQ("// A comment that\n"
1310 "// doesn't fit on\n"
1311 "// one line",
1312 format("// A comment that doesn't fit on one line",
1313 getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001314 EXPECT_EQ("/// A comment that\n"
1315 "/// doesn't fit on\n"
1316 "/// one line",
1317 format("/// A comment that doesn't fit on one line",
1318 getLLVMStyleWithColumns(20)));
1319 EXPECT_EQ("//! A comment that\n"
1320 "//! doesn't fit on\n"
1321 "//! one line",
1322 format("//! A comment that doesn't fit on one line",
1323 getLLVMStyleWithColumns(20)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00001324 EXPECT_EQ("// a b c d\n"
1325 "// e f g\n"
1326 "// h i j k",
Daniel Jaspera44991332015-04-29 13:06:49 +00001327 format("// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
1328 EXPECT_EQ(
1329 "// a b c d\n"
1330 "// e f g\n"
1331 "// h i j k",
1332 format("\\\n// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001333 EXPECT_EQ("if (true) // A comment that\n"
1334 " // doesn't fit on\n"
1335 " // one line",
1336 format("if (true) // A comment that doesn't fit on one line ",
1337 getLLVMStyleWithColumns(30)));
1338 EXPECT_EQ("// Don't_touch_leading_whitespace",
1339 format("// Don't_touch_leading_whitespace",
1340 getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001341 EXPECT_EQ("// Add leading\n"
1342 "// whitespace",
1343 format("//Add leading whitespace", getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001344 EXPECT_EQ("/// Add leading\n"
1345 "/// whitespace",
1346 format("///Add leading whitespace", getLLVMStyleWithColumns(20)));
1347 EXPECT_EQ("//! Add leading\n"
1348 "//! whitespace",
1349 format("//!Add leading whitespace", getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001350 EXPECT_EQ("// whitespace", format("//whitespace", getLLVMStyle()));
1351 EXPECT_EQ("// Even if it makes the line exceed the column\n"
1352 "// limit",
1353 format("//Even if it makes the line exceed the column limit",
1354 getLLVMStyleWithColumns(51)));
1355 EXPECT_EQ("//--But not here", format("//--But not here", getLLVMStyle()));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001356
1357 EXPECT_EQ("// aa bb cc dd",
1358 format("// aa bb cc dd ",
1359 getLLVMStyleWithColumns(15)));
1360
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001361 EXPECT_EQ("// A comment before\n"
1362 "// a macro\n"
1363 "// definition\n"
1364 "#define a b",
1365 format("// A comment before a macro definition\n"
1366 "#define a b",
1367 getLLVMStyleWithColumns(20)));
Daniel Jaspere068ac72014-10-27 17:13:59 +00001368 EXPECT_EQ("void ffffff(\n"
1369 " int aaaaaaaaa, // wwww\n"
1370 " int bbbbbbbbbb, // xxxxxxx\n"
1371 " // yyyyyyyyyy\n"
1372 " int c, int d, int e) {}",
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001373 format("void ffffff(\n"
1374 " int aaaaaaaaa, // wwww\n"
Daniel Jasper19a541e2013-12-19 16:45:34 +00001375 " int bbbbbbbbbb, // xxxxxxx yyyyyyyyyy\n"
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001376 " int c, int d, int e) {}",
1377 getLLVMStyleWithColumns(40)));
Alexander Kornienkob93062e2013-06-20 13:58:37 +00001378 EXPECT_EQ("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1379 format("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1380 getLLVMStyleWithColumns(20)));
Alexander Kornienko3abbb8a2013-11-12 17:30:49 +00001381 EXPECT_EQ(
1382 "#define XXX // a b c d\n"
1383 " // e f g h",
1384 format("#define XXX // a b c d e f g h", getLLVMStyleWithColumns(22)));
1385 EXPECT_EQ(
1386 "#define XXX // q w e r\n"
1387 " // t y u i",
1388 format("#define XXX //q w e r t y u i", getLLVMStyleWithColumns(22)));
Krasimir Georgieve518e0b2017-01-30 21:00:01 +00001389 EXPECT_EQ("{\n"
1390 " //\n"
1391 " //\\\n"
1392 " // long 1 2 3 4\n"
1393 " // 5\n"
1394 "}",
1395 format("{\n"
1396 " //\n"
1397 " //\\\n"
1398 " // long 1 2 3 4 5\n"
1399 "}",
1400 getLLVMStyleWithColumns(20)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001401}
Manuel Klimek9043c742013-05-27 15:23:34 +00001402
Alexander Kornienko4504f932014-03-10 13:14:56 +00001403TEST_F(FormatTest, PreservesHangingIndentInCxxComments) {
1404 EXPECT_EQ("// A comment\n"
1405 "// that doesn't\n"
1406 "// fit on one\n"
1407 "// line",
1408 format("// A comment that doesn't fit on one line",
1409 getLLVMStyleWithColumns(20)));
1410 EXPECT_EQ("/// A comment\n"
1411 "/// that doesn't\n"
1412 "/// fit on one\n"
1413 "/// line",
1414 format("/// A comment that doesn't fit on one line",
1415 getLLVMStyleWithColumns(20)));
1416}
1417
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001418TEST_F(FormatTest, DontSplitLineCommentsWithEscapedNewlines) {
1419 EXPECT_EQ("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1420 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1421 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1422 format("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1423 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1424 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
1425 EXPECT_EQ("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1426 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1427 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1428 format("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1429 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1430 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1431 getLLVMStyleWithColumns(50)));
1432 // FIXME: One day we might want to implement adjustment of leading whitespace
1433 // of the consecutive lines in this kind of comment:
Daniel Jasper4355e7f2014-07-09 07:50:33 +00001434 EXPECT_EQ("double\n"
1435 " a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1436 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1437 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1438 format("double a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1439 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1440 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001441 getLLVMStyleWithColumns(49)));
1442}
1443
Alexander Kornienkoce9161a2014-01-02 15:13:14 +00001444TEST_F(FormatTest, DontSplitLineCommentsWithPragmas) {
1445 FormatStyle Pragmas = getLLVMStyleWithColumns(30);
1446 Pragmas.CommentPragmas = "^ IWYU pragma:";
1447 EXPECT_EQ(
1448 "// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb",
1449 format("// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb", Pragmas));
1450 EXPECT_EQ(
1451 "/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */",
1452 format("/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */", Pragmas));
1453}
1454
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001455TEST_F(FormatTest, PriorityOfCommentBreaking) {
Daniel Jasper2739af32013-08-28 10:03:58 +00001456 EXPECT_EQ("if (xxx ==\n"
1457 " yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001458 " zzz)\n"
1459 " q();",
1460 format("if (xxx == yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
1461 " zzz) q();",
1462 getLLVMStyleWithColumns(40)));
1463 EXPECT_EQ("if (xxxxxxxxxx ==\n"
1464 " yyy && // aaaaaa bbbbbbbb cccc\n"
1465 " zzz)\n"
1466 " q();",
1467 format("if (xxxxxxxxxx == yyy && // aaaaaa bbbbbbbb cccc\n"
1468 " zzz) q();",
1469 getLLVMStyleWithColumns(40)));
1470 EXPECT_EQ("if (xxxxxxxxxx &&\n"
1471 " yyy || // aaaaaa bbbbbbbb cccc\n"
1472 " zzz)\n"
1473 " q();",
1474 format("if (xxxxxxxxxx && yyy || // aaaaaa bbbbbbbb cccc\n"
1475 " zzz) q();",
1476 getLLVMStyleWithColumns(40)));
Daniel Jasper19a541e2013-12-19 16:45:34 +00001477 EXPECT_EQ("fffffffff(\n"
1478 " &xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1479 " zzz);",
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001480 format("fffffffff(&xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1481 " zzz);",
1482 getLLVMStyleWithColumns(40)));
Manuel Klimek9043c742013-05-27 15:23:34 +00001483}
1484
1485TEST_F(FormatTest, MultiLineCommentsInDefines) {
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001486 EXPECT_EQ("#define A(x) /* \\\n"
1487 " a comment \\\n"
1488 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001489 " f();",
1490 format("#define A(x) /* \\\n"
1491 " a comment \\\n"
1492 " inside */ \\\n"
1493 " f();",
1494 getLLVMStyleWithColumns(17)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001495 EXPECT_EQ("#define A( \\\n"
1496 " x) /* \\\n"
1497 " a comment \\\n"
1498 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001499 " f();",
1500 format("#define A( \\\n"
1501 " x) /* \\\n"
1502 " a comment \\\n"
1503 " inside */ \\\n"
1504 " f();",
1505 getLLVMStyleWithColumns(17)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001506}
1507
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001508TEST_F(FormatTest, ParsesCommentsAdjacentToPPDirectives) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001509 EXPECT_EQ("namespace {}\n// Test\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001510 format("namespace {}\n // Test\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001511 EXPECT_EQ("namespace {}\n/* Test */\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001512 format("namespace {}\n /* Test */\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001513 EXPECT_EQ("namespace {}\n/* Test */ #define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001514 format("namespace {}\n /* Test */ #define A"));
1515}
1516
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001517TEST_F(FormatTest, SplitsLongLinesInComments) {
1518 EXPECT_EQ("/* This is a long\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001519 " * comment that\n"
1520 " * doesn't\n"
1521 " * fit on one line.\n"
1522 " */",
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001523 format("/* "
1524 "This is a long "
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001525 "comment that "
1526 "doesn't "
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001527 "fit on one line. */",
1528 getLLVMStyleWithColumns(20)));
Daniel Jaspera44991332015-04-29 13:06:49 +00001529 EXPECT_EQ(
1530 "/* a b c d\n"
1531 " * e f g\n"
1532 " * h i j k\n"
1533 " */",
1534 format("/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
1535 EXPECT_EQ(
1536 "/* a b c d\n"
1537 " * e f g\n"
1538 " * h i j k\n"
1539 " */",
1540 format("\\\n/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001541 EXPECT_EQ("/*\n"
1542 "This is a long\n"
1543 "comment that doesn't\n"
1544 "fit on one line.\n"
1545 "*/",
1546 format("/*\n"
1547 "This is a long "
1548 "comment that doesn't "
1549 "fit on one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001550 "*/",
1551 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001552 EXPECT_EQ("/*\n"
1553 " * This is a long\n"
1554 " * comment that\n"
1555 " * doesn't fit on\n"
1556 " * one line.\n"
1557 " */",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001558 format("/* \n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001559 " * This is a long "
1560 " comment that "
1561 " doesn't fit on "
1562 " one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001563 " */",
1564 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001565 EXPECT_EQ("/*\n"
1566 " * This_is_a_comment_with_words_that_dont_fit_on_one_line\n"
1567 " * so_it_should_be_broken\n"
1568 " * wherever_a_space_occurs\n"
1569 " */",
1570 format("/*\n"
1571 " * This_is_a_comment_with_words_that_dont_fit_on_one_line "
1572 " so_it_should_be_broken "
1573 " wherever_a_space_occurs \n"
1574 " */",
1575 getLLVMStyleWithColumns(20)));
1576 EXPECT_EQ("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001577 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001578 " */",
1579 format("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001580 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001581 " */",
1582 getLLVMStyleWithColumns(20)));
1583 EXPECT_EQ("{\n"
1584 " /*\n"
1585 " This is another\n"
1586 " long comment that\n"
1587 " doesn't fit on one\n"
1588 " line 1234567890\n"
1589 " */\n"
1590 "}",
1591 format("{\n"
1592 "/*\n"
1593 "This is another "
1594 " long comment that "
1595 " doesn't fit on one"
1596 " line 1234567890\n"
1597 "*/\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001598 "}",
1599 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001600 EXPECT_EQ("{\n"
1601 " /*\n"
1602 " * This i s\n"
1603 " * another comment\n"
1604 " * t hat doesn' t\n"
1605 " * fit on one l i\n"
1606 " * n e\n"
1607 " */\n"
1608 "}",
1609 format("{\n"
1610 "/*\n"
1611 " * This i s"
1612 " another comment"
1613 " t hat doesn' t"
1614 " fit on one l i"
1615 " n e\n"
1616 " */\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001617 "}",
1618 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001619 EXPECT_EQ("/*\n"
1620 " * This is a long\n"
1621 " * comment that\n"
1622 " * doesn't fit on\n"
1623 " * one line\n"
1624 " */",
1625 format(" /*\n"
1626 " * This is a long comment that doesn't fit on one line\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001627 " */",
1628 getLLVMStyleWithColumns(20)));
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001629 EXPECT_EQ("{\n"
1630 " if (something) /* This is a\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001631 " long\n"
1632 " comment */\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001633 " ;\n"
1634 "}",
1635 format("{\n"
1636 " if (something) /* This is a long comment */\n"
1637 " ;\n"
1638 "}",
1639 getLLVMStyleWithColumns(30)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001640
1641 EXPECT_EQ("/* A comment before\n"
1642 " * a macro\n"
1643 " * definition */\n"
1644 "#define a b",
1645 format("/* A comment before a macro definition */\n"
1646 "#define a b",
1647 getLLVMStyleWithColumns(20)));
1648
1649 EXPECT_EQ("/* some comment\n"
1650 " * a comment\n"
1651 "* that we break\n"
1652 " * another comment\n"
1653 "* we have to break\n"
1654 "* a left comment\n"
1655 " */",
1656 format(" /* some comment\n"
1657 " * a comment that we break\n"
1658 " * another comment we have to break\n"
1659 "* a left comment\n"
1660 " */",
1661 getLLVMStyleWithColumns(20)));
1662
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00001663 EXPECT_EQ("/**\n"
1664 " * multiline block\n"
1665 " * comment\n"
1666 " *\n"
1667 " */",
1668 format("/**\n"
1669 " * multiline block comment\n"
1670 " *\n"
1671 " */",
1672 getLLVMStyleWithColumns(20)));
1673
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001674 EXPECT_EQ("/*\n"
1675 "\n"
1676 "\n"
1677 " */\n",
1678 format(" /* \n"
1679 " \n"
1680 " \n"
1681 " */\n"));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001682
1683 EXPECT_EQ("/* a a */",
1684 format("/* a a */", getLLVMStyleWithColumns(15)));
1685 EXPECT_EQ("/* a a bc */",
1686 format("/* a a bc */", getLLVMStyleWithColumns(15)));
1687 EXPECT_EQ("/* aaa aaa\n"
1688 " * aaaaa */",
1689 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
1690 EXPECT_EQ("/* aaa aaa\n"
1691 " * aaaaa */",
1692 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001693}
1694
1695TEST_F(FormatTest, SplitsLongLinesInCommentsInPreprocessor) {
1696 EXPECT_EQ("#define X \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001697 " /* \\\n"
1698 " Test \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001699 " Macro comment \\\n"
1700 " with a long \\\n"
1701 " line \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001702 " */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001703 " A + B",
1704 format("#define X \\\n"
1705 " /*\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001706 " Test\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001707 " Macro comment with a long line\n"
1708 " */ \\\n"
1709 " A + B",
1710 getLLVMStyleWithColumns(20)));
1711 EXPECT_EQ("#define X \\\n"
1712 " /* Macro comment \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001713 " with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001714 " line */ \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001715 " A + B",
1716 format("#define X \\\n"
1717 " /* Macro comment with a long\n"
1718 " line */ \\\n"
1719 " A + B",
1720 getLLVMStyleWithColumns(20)));
1721 EXPECT_EQ("#define X \\\n"
1722 " /* Macro comment \\\n"
1723 " * with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001724 " * line */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001725 " A + B",
1726 format("#define X \\\n"
1727 " /* Macro comment with a long line */ \\\n"
1728 " A + B",
1729 getLLVMStyleWithColumns(20)));
1730}
1731
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001732TEST_F(FormatTest, CommentsInStaticInitializers) {
1733 EXPECT_EQ(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001734 "static SomeType type = {aaaaaaaaaaaaaaaaaaaa, /* comment */\n"
1735 " aaaaaaaaaaaaaaaaaaaa /* comment */,\n"
1736 " /* comment */ aaaaaaaaaaaaaaaaaaaa,\n"
1737 " aaaaaaaaaaaaaaaaaaaa, // comment\n"
1738 " aaaaaaaaaaaaaaaaaaaa};",
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001739 format("static SomeType type = { aaaaaaaaaaaaaaaaaaaa , /* comment */\n"
1740 " aaaaaaaaaaaaaaaaaaaa /* comment */ ,\n"
1741 " /* comment */ aaaaaaaaaaaaaaaaaaaa ,\n"
1742 " aaaaaaaaaaaaaaaaaaaa , // comment\n"
1743 " aaaaaaaaaaaaaaaaaaaa };"));
Chandler Carruthf8b72662014-03-02 12:37:31 +00001744 verifyFormat("static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1745 " bbbbbbbbbbb, ccccccccccc};");
1746 verifyFormat("static SomeType type = {aaaaaaaaaaa,\n"
1747 " // comment for bb....\n"
1748 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001749 verifyGoogleFormat(
Daniel Jaspere5777d22013-05-23 10:15:45 +00001750 "static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1751 " bbbbbbbbbbb, ccccccccccc};");
1752 verifyGoogleFormat("static SomeType type = {aaaaaaaaaaa,\n"
1753 " // comment for bb....\n"
1754 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001755
Chandler Carruthf8b72662014-03-02 12:37:31 +00001756 verifyFormat("S s = {{a, b, c}, // Group #1\n"
1757 " {d, e, f}, // Group #2\n"
1758 " {g, h, i}}; // Group #3");
1759 verifyFormat("S s = {{// Group #1\n"
1760 " a, b, c},\n"
1761 " {// Group #2\n"
1762 " d, e, f},\n"
1763 " {// Group #3\n"
1764 " g, h, i}};");
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001765
1766 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001767 " // Some comment\n"
1768 " a,\n"
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001769 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001770 " // Comment after empty line\n"
1771 " b}",
Daniel Jasperfb5e2412013-02-26 13:10:34 +00001772 format("S s = {\n"
1773 " // Some comment\n"
1774 " a,\n"
1775 " \n"
1776 " // Comment after empty line\n"
1777 " b\n"
1778 "}"));
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001779 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001780 " /* Some comment */\n"
1781 " a,\n"
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001782 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001783 " /* Comment after empty line */\n"
1784 " b}",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001785 format("S s = {\n"
1786 " /* Some comment */\n"
1787 " a,\n"
1788 " \n"
1789 " /* Comment after empty line */\n"
1790 " b\n"
1791 "}"));
Daniel Jaspera400cab2013-02-28 15:04:12 +00001792 verifyFormat("const uint8_t aaaaaaaaaaaaaaaaaaaaaa[0] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001793 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1794 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1795 " 0x00, 0x00, 0x00, 0x00}; // comment\n");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001796}
1797
Krasimir Georgiev84321612017-01-30 19:18:55 +00001798TEST_F(FormatTest, LineCommentsAfterRightBrace) {
1799 EXPECT_EQ("if (true) { // comment about branch\n"
1800 " // comment about f\n"
1801 " f();\n"
1802 "}",
1803 format("if (true) { // comment about branch\n"
1804 " // comment about f\n"
1805 " f();\n"
1806 "}",
1807 getLLVMStyleWithColumns(80)));
1808 EXPECT_EQ("if (1) { // if line 1\n"
1809 " // if line 2\n"
1810 " // if line 3\n"
1811 " // f line 1\n"
1812 " // f line 2\n"
1813 " f();\n"
1814 "} else { // else line 1\n"
1815 " // else line 2\n"
1816 " // else line 3\n"
1817 " // g line 1\n"
1818 " g();\n"
1819 "}",
1820 format("if (1) { // if line 1\n"
1821 " // if line 2\n"
1822 " // if line 3\n"
1823 " // f line 1\n"
1824 " // f line 2\n"
1825 " f();\n"
1826 "} else { // else line 1\n"
1827 " // else line 2\n"
1828 " // else line 3\n"
1829 " // g line 1\n"
1830 " g();\n"
1831 "}"));
1832 EXPECT_EQ("do { // line 1\n"
1833 " // line 2\n"
1834 " // line 3\n"
1835 " f();\n"
1836 "} while (true);",
1837 format("do { // line 1\n"
1838 " // line 2\n"
1839 " // line 3\n"
1840 " f();\n"
1841 "} while (true);",
1842 getLLVMStyleWithColumns(80)));
1843 EXPECT_EQ("while (a < b) { // line 1\n"
1844 " // line 2\n"
1845 " // line 3\n"
1846 " f();\n"
1847 "}",
1848 format("while (a < b) {// line 1\n"
1849 " // line 2\n"
1850 " // line 3\n"
1851 " f();\n"
1852 "}",
1853 getLLVMStyleWithColumns(80)));
1854}
1855
Krasimir Georgiev91834222017-01-25 13:58:58 +00001856TEST_F(FormatTest, ReflowsComments) {
1857 // Break a long line and reflow with the full next line.
1858 EXPECT_EQ("// long long long\n"
1859 "// long long",
1860 format("// long long long long\n"
1861 "// long",
1862 getLLVMStyleWithColumns(20)));
1863
1864 // Keep the trailing newline while reflowing.
1865 EXPECT_EQ("// long long long\n"
1866 "// long long\n",
1867 format("// long long long long\n"
1868 "// long\n",
1869 getLLVMStyleWithColumns(20)));
1870
1871 // Break a long line and reflow with a part of the next line.
1872 EXPECT_EQ("// long long long\n"
1873 "// long long\n"
1874 "// long_long",
1875 format("// long long long long\n"
1876 "// long long_long",
1877 getLLVMStyleWithColumns(20)));
1878
1879 // Break but do not reflow if the first word from the next line is too long.
1880 EXPECT_EQ("// long long long\n"
1881 "// long\n"
1882 "// long_long_long\n",
1883 format("// long long long long\n"
1884 "// long_long_long\n",
1885 getLLVMStyleWithColumns(20)));
1886
1887 // Don't break or reflow short lines.
1888 verifyFormat("// long\n"
1889 "// long long long lo\n"
1890 "// long long long lo\n"
1891 "// long",
1892 getLLVMStyleWithColumns(20));
1893
1894 // Keep prefixes and decorations while reflowing.
1895 EXPECT_EQ("/// long long long\n"
1896 "/// long long\n",
1897 format("/// long long long long\n"
1898 "/// long\n",
1899 getLLVMStyleWithColumns(20)));
1900 EXPECT_EQ("//! long long long\n"
1901 "//! long long\n",
1902 format("//! long long long long\n"
1903 "//! long\n",
1904 getLLVMStyleWithColumns(20)));
1905 EXPECT_EQ("/* long long long\n"
1906 " * long long */",
1907 format("/* long long long long\n"
1908 " * long */",
1909 getLLVMStyleWithColumns(20)));
1910
1911 // Don't bring leading whitespace up while reflowing.
1912 EXPECT_EQ("/* long long long\n"
1913 " * long long long\n"
1914 " */",
1915 format("/* long long long long\n"
1916 " * long long\n"
1917 " */",
1918 getLLVMStyleWithColumns(20)));
1919
1920 // Reflow the last line of a block comment with its trailing '*/'.
1921 EXPECT_EQ("/* long long long\n"
1922 " long long */",
1923 format("/* long long long long\n"
1924 " long */",
1925 getLLVMStyleWithColumns(20)));
1926
1927 // Reflow two short lines; keep the postfix of the last one.
1928 EXPECT_EQ("/* long long long\n"
1929 " * long long long */",
1930 format("/* long long long long\n"
1931 " * long\n"
1932 " * long */",
1933 getLLVMStyleWithColumns(20)));
1934
1935 // Put the postfix of the last short reflow line on a newline if it doesn't
1936 // fit.
1937 EXPECT_EQ("/* long long long\n"
1938 " * long long longg\n"
1939 " */",
1940 format("/* long long long long\n"
1941 " * long\n"
1942 " * longg */",
1943 getLLVMStyleWithColumns(20)));
1944
1945 // Break single line block comments that are first in the line with ' *'
1946 // decoration.
1947 EXPECT_EQ("/* long long long\n"
1948 " * long */",
1949 format("/* long long long long */", getLLVMStyleWithColumns(20)));
1950
1951 // Break single line block comment that are not first in the line with ' '
1952 // decoration.
1953 EXPECT_EQ("int i; /* long long\n"
1954 " long */",
1955 format("int i; /* long long long */", getLLVMStyleWithColumns(20)));
1956
1957 // Reflow a line that goes just over the column limit.
1958 EXPECT_EQ("// long long long\n"
1959 "// lon long",
1960 format("// long long long lon\n"
1961 "// long",
1962 getLLVMStyleWithColumns(20)));
1963
1964 // Stop reflowing if the next line has a different indentation than the
1965 // previous line.
1966 EXPECT_EQ("// long long long\n"
1967 "// long\n"
1968 "// long long\n"
1969 "// long",
1970 format("// long long long long\n"
1971 "// long long\n"
1972 "// long",
1973 getLLVMStyleWithColumns(20)));
1974
1975 // Reflow into the last part of a really long line that has been broken into
1976 // multiple lines.
1977 EXPECT_EQ("// long long long\n"
1978 "// long long long\n"
1979 "// long long long\n",
1980 format("// long long long long long long long long\n"
1981 "// long\n",
1982 getLLVMStyleWithColumns(20)));
1983
1984 // Break the first line, then reflow the beginning of the second and third
1985 // line up.
1986 EXPECT_EQ("// long long long\n"
1987 "// lon1 lon2 lon2\n"
1988 "// lon2 lon3 lon3",
1989 format("// long long long lon1\n"
1990 "// lon2 lon2 lon2\n"
1991 "// lon3 lon3",
1992 getLLVMStyleWithColumns(20)));
1993
1994 // Reflow the beginning of the second line, then break the rest.
1995 EXPECT_EQ("// long long long\n"
1996 "// lon1 lon2 lon2\n"
1997 "// lon2 lon2 lon2\n"
1998 "// lon3",
1999 format("// long long long lon1\n"
2000 "// lon2 lon2 lon2 lon2 lon2 lon3",
2001 getLLVMStyleWithColumns(20)));
2002
2003 // Shrink the first line, then reflow the second line up.
2004 EXPECT_EQ("// long long long", format("// long long\n"
2005 "// long",
2006 getLLVMStyleWithColumns(20)));
2007
2008 // Don't shrink leading whitespace.
2009 EXPECT_EQ("int i; /// a",
2010 format("int i; /// a", getLLVMStyleWithColumns(20)));
2011
2012 // Shrink trailing whitespace if there is no postfix and reflow.
2013 EXPECT_EQ("// long long long\n"
2014 "// long long",
2015 format("// long long long long \n"
2016 "// long",
2017 getLLVMStyleWithColumns(20)));
2018
2019 // Shrink trailing whitespace to a single one if there is postfix.
2020 EXPECT_EQ("/* long long long */",
2021 format("/* long long long */", getLLVMStyleWithColumns(20)));
2022
2023 // Break a block comment postfix if exceeding the line limit.
2024 EXPECT_EQ("/* long\n"
2025 " */",
2026 format("/* long */", getLLVMStyleWithColumns(20)));
2027
2028 // Reflow indented comments.
2029 EXPECT_EQ("{\n"
2030 " // long long long\n"
2031 " // long long\n"
2032 " int i; /* long lon\n"
2033 " g long\n"
2034 " */\n"
2035 "}",
2036 format("{\n"
2037 " // long long long long\n"
2038 " // long\n"
2039 " int i; /* long lon g\n"
2040 " long */\n"
2041 "}",
2042 getLLVMStyleWithColumns(20)));
2043
2044 // Don't realign trailing comments after reflow has happened.
2045 EXPECT_EQ("// long long long\n"
2046 "// long long\n"
2047 "long i; // long",
2048 format("// long long long long\n"
2049 "// long\n"
2050 "long i; // long",
2051 getLLVMStyleWithColumns(20)));
2052 EXPECT_EQ("// long long long\n"
2053 "// longng long long\n"
2054 "// long lo",
2055 format("// long long long longng\n"
2056 "// long long long\n"
2057 "// lo",
2058 getLLVMStyleWithColumns(20)));
2059
2060 // Reflow lines after a broken line.
2061 EXPECT_EQ("int a; // Trailing\n"
2062 " // comment on\n"
2063 " // 2 or 3\n"
2064 " // lines.\n",
2065 format("int a; // Trailing comment\n"
2066 " // on 2\n"
2067 " // or 3\n"
2068 " // lines.\n",
2069 getLLVMStyleWithColumns(20)));
2070 EXPECT_EQ("/// This long line\n"
2071 "/// gets reflown.\n",
2072 format("/// This long line gets\n"
2073 "/// reflown.\n",
2074 getLLVMStyleWithColumns(20)));
2075 EXPECT_EQ("//! This long line\n"
2076 "//! gets reflown.\n",
2077 format(" //! This long line gets\n"
2078 " //! reflown.\n",
2079 getLLVMStyleWithColumns(20)));
2080 EXPECT_EQ("/* This long line\n"
2081 " * gets reflown.\n"
2082 " */\n",
2083 format("/* This long line gets\n"
2084 " * reflown.\n"
2085 " */\n",
2086 getLLVMStyleWithColumns(20)));
2087
2088 // Reflow after indentation makes a line too long.
2089 EXPECT_EQ("{\n"
2090 " // long long long\n"
2091 " // lo long\n"
2092 "}\n",
2093 format("{\n"
2094 "// long long long lo\n"
2095 "// long\n"
2096 "}\n",
2097 getLLVMStyleWithColumns(20)));
2098
2099 // Break and reflow multiple lines.
2100 EXPECT_EQ("/*\n"
2101 " * Reflow the end of\n"
2102 " * line by 11 22 33\n"
2103 " * 4.\n"
2104 " */\n",
2105 format("/*\n"
2106 " * Reflow the end of line\n"
2107 " * by\n"
2108 " * 11\n"
2109 " * 22\n"
2110 " * 33\n"
2111 " * 4.\n"
2112 " */\n",
2113 getLLVMStyleWithColumns(20)));
2114 EXPECT_EQ("/// First line gets\n"
2115 "/// broken. Second\n"
2116 "/// line gets\n"
2117 "/// reflown and\n"
2118 "/// broken. Third\n"
2119 "/// gets reflown.\n",
2120 format("/// First line gets broken.\n"
2121 "/// Second line gets reflown and broken.\n"
2122 "/// Third gets reflown.\n",
2123 getLLVMStyleWithColumns(20)));
2124 EXPECT_EQ("int i; // first long\n"
2125 " // long snd\n"
2126 " // long.\n",
2127 format("int i; // first long long\n"
2128 " // snd long.\n",
2129 getLLVMStyleWithColumns(20)));
2130 EXPECT_EQ("{\n"
2131 " // first long line\n"
2132 " // line second\n"
2133 " // long line line\n"
2134 " // third long line\n"
2135 " // line\n"
2136 "}\n",
2137 format("{\n"
2138 " // first long line line\n"
2139 " // second long line line\n"
2140 " // third long line line\n"
2141 "}\n",
2142 getLLVMStyleWithColumns(20)));
2143 EXPECT_EQ("int i; /* first line\n"
2144 " * second\n"
2145 " * line third\n"
2146 " * line\n"
2147 " */",
2148 format("int i; /* first line\n"
2149 " * second line\n"
2150 " * third line\n"
2151 " */",
2152 getLLVMStyleWithColumns(20)));
2153
2154 // Reflow the last two lines of a section that starts with a line having
2155 // different indentation.
2156 EXPECT_EQ(
2157 "// long\n"
2158 "// long long long\n"
2159 "// long long",
2160 format("// long\n"
2161 "// long long long long\n"
2162 "// long",
2163 getLLVMStyleWithColumns(20)));
2164
2165 // Keep the block comment endling '*/' while reflowing.
2166 EXPECT_EQ("/* Long long long\n"
2167 " * line short */\n",
2168 format("/* Long long long line\n"
2169 " * short */\n",
2170 getLLVMStyleWithColumns(20)));
2171
2172 // Don't reflow between separate blocks of comments.
2173 EXPECT_EQ("/* First comment\n"
2174 " * block will */\n"
2175 "/* Snd\n"
2176 " */\n",
2177 format("/* First comment block\n"
2178 " * will */\n"
2179 "/* Snd\n"
2180 " */\n",
2181 getLLVMStyleWithColumns(20)));
2182
2183 // Don't reflow across blank comment lines.
2184 EXPECT_EQ("int i; // This long\n"
2185 " // line gets\n"
2186 " // broken.\n"
2187 " // \n"
2188 " // keep.\n",
2189 format("int i; // This long line gets broken.\n"
2190 " // \n"
2191 " // keep.\n",
2192 getLLVMStyleWithColumns(20)));
2193 EXPECT_EQ("{\n"
2194 " /// long long long\n"
2195 " /// long long\n"
2196 " ///\n"
2197 " /// long\n"
2198 "}",
2199 format("{\n"
2200 " /// long long long long\n"
2201 " /// long\n"
2202 " ///\n"
2203 " /// long\n"
2204 "}",
2205 getLLVMStyleWithColumns(20)));
2206 EXPECT_EQ("//! long long long\n"
2207 "//! long\n"
2208 "\n"
2209 "//! long",
2210 format("//! long long long long\n"
2211 "\n"
2212 "//! long",
2213 getLLVMStyleWithColumns(20)));
2214 EXPECT_EQ("/* long long long\n"
2215 " long\n"
2216 "\n"
2217 " long */",
2218 format("/* long long long long\n"
2219 "\n"
2220 " long */",
2221 getLLVMStyleWithColumns(20)));
2222 EXPECT_EQ("/* long long long\n"
2223 " * long\n"
2224 " *\n"
2225 " * long */",
2226 format("/* long long long long\n"
2227 " *\n"
2228 " * long */",
2229 getLLVMStyleWithColumns(20)));
2230
2231 // Don't reflow lines having content that is a single character.
2232 EXPECT_EQ("// long long long\n"
2233 "// long\n"
2234 "// l",
2235 format("// long long long long\n"
2236 "// l",
2237 getLLVMStyleWithColumns(20)));
2238
2239 // Don't reflow lines starting with two punctuation characters.
2240 EXPECT_EQ("// long long long\n"
2241 "// long\n"
2242 "// ... --- ...",
2243 format(
2244 "// long long long long\n"
2245 "// ... --- ...",
2246 getLLVMStyleWithColumns(20)));
Krasimir Georgiev8f62cf72017-01-31 11:38:02 +00002247
2248 // Don't reflow lines starting with '@'.
2249 EXPECT_EQ("// long long long\n"
2250 "// long\n"
2251 "// @param arg",
2252 format("// long long long long\n"
2253 "// @param arg",
2254 getLLVMStyleWithColumns(20)));
2255
Krasimir Georgiev91834222017-01-25 13:58:58 +00002256 // Reflow lines that have a non-punctuation character among their first 2
2257 // characters.
2258 EXPECT_EQ("// long long long\n"
2259 "// long 'long'",
2260 format(
2261 "// long long long long\n"
2262 "// 'long'",
2263 getLLVMStyleWithColumns(20)));
2264
2265 // Don't reflow between separate blocks of comments.
2266 EXPECT_EQ("/* First comment\n"
2267 " * block will */\n"
2268 "/* Snd\n"
2269 " */\n",
2270 format("/* First comment block\n"
2271 " * will */\n"
2272 "/* Snd\n"
2273 " */\n",
2274 getLLVMStyleWithColumns(20)));
2275
2276 // Don't reflow lines having different indentation.
2277 EXPECT_EQ("// long long long\n"
2278 "// long\n"
2279 "// long",
2280 format("// long long long long\n"
2281 "// long",
2282 getLLVMStyleWithColumns(20)));
2283
2284 // Don't break or reflow after implicit string literals.
2285 verifyFormat("#include <t> // l l l\n"
2286 " // l",
2287 getLLVMStyleWithColumns(20));
2288
2289 // Don't break or reflow comments on import lines.
2290 EXPECT_EQ("#include \"t\" /* l l l\n"
2291 " * l */",
2292 format("#include \"t\" /* l l l\n"
2293 " * l */",
2294 getLLVMStyleWithColumns(20)));
2295
2296 // Don't reflow between different trailing comment sections.
2297 EXPECT_EQ("int i; // long long\n"
2298 " // long\n"
2299 "int j; // long long\n"
2300 " // long\n",
2301 format("int i; // long long long\n"
2302 "int j; // long long long\n",
2303 getLLVMStyleWithColumns(20)));
2304
2305 // Don't reflow if the first word on the next line is longer than the
2306 // available space at current line.
2307 EXPECT_EQ("int i; // trigger\n"
2308 " // reflow\n"
2309 " // longsec\n",
2310 format("int i; // trigger reflow\n"
2311 " // longsec\n",
2312 getLLVMStyleWithColumns(20)));
2313
2314 // Keep empty comment lines.
2315 EXPECT_EQ("/**/", format(" /**/", getLLVMStyleWithColumns(20)));
2316 EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
2317 EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
2318 EXPECT_EQ("//", format(" // ", getLLVMStyleWithColumns(20)));
2319 EXPECT_EQ("///", format(" /// ", getLLVMStyleWithColumns(20)));
2320}
2321
Alexander Kornienkof2e02122013-05-24 18:24:24 +00002322TEST_F(FormatTest, IgnoresIf0Contents) {
2323 EXPECT_EQ("#if 0\n"
2324 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
2325 "#endif\n"
2326 "void f() {}",
2327 format("#if 0\n"
2328 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
2329 "#endif\n"
2330 "void f( ) { }"));
2331 EXPECT_EQ("#if false\n"
2332 "void f( ) { }\n"
2333 "#endif\n"
2334 "void g() {}\n",
2335 format("#if false\n"
2336 "void f( ) { }\n"
2337 "#endif\n"
2338 "void g( ) { }\n"));
2339 EXPECT_EQ("enum E {\n"
2340 " One,\n"
2341 " Two,\n"
2342 "#if 0\n"
2343 "Three,\n"
2344 " Four,\n"
2345 "#endif\n"
2346 " Five\n"
2347 "};",
2348 format("enum E {\n"
2349 " One,Two,\n"
2350 "#if 0\n"
2351 "Three,\n"
2352 " Four,\n"
2353 "#endif\n"
2354 " Five};"));
2355 EXPECT_EQ("enum F {\n"
2356 " One,\n"
2357 "#if 1\n"
2358 " Two,\n"
2359 "#if 0\n"
2360 "Three,\n"
2361 " Four,\n"
2362 "#endif\n"
2363 " Five\n"
2364 "#endif\n"
2365 "};",
2366 format("enum F {\n"
2367 "One,\n"
2368 "#if 1\n"
2369 "Two,\n"
2370 "#if 0\n"
2371 "Three,\n"
2372 " Four,\n"
2373 "#endif\n"
2374 "Five\n"
2375 "#endif\n"
2376 "};"));
2377 EXPECT_EQ("enum G {\n"
2378 " One,\n"
2379 "#if 0\n"
2380 "Two,\n"
2381 "#else\n"
2382 " Three,\n"
2383 "#endif\n"
2384 " Four\n"
2385 "};",
2386 format("enum G {\n"
2387 "One,\n"
2388 "#if 0\n"
2389 "Two,\n"
2390 "#else\n"
2391 "Three,\n"
2392 "#endif\n"
2393 "Four\n"
2394 "};"));
2395 EXPECT_EQ("enum H {\n"
2396 " One,\n"
2397 "#if 0\n"
2398 "#ifdef Q\n"
2399 "Two,\n"
2400 "#else\n"
2401 "Three,\n"
2402 "#endif\n"
2403 "#endif\n"
2404 " Four\n"
2405 "};",
2406 format("enum H {\n"
2407 "One,\n"
2408 "#if 0\n"
2409 "#ifdef Q\n"
2410 "Two,\n"
2411 "#else\n"
2412 "Three,\n"
2413 "#endif\n"
2414 "#endif\n"
2415 "Four\n"
2416 "};"));
2417 EXPECT_EQ("enum I {\n"
2418 " One,\n"
2419 "#if /* test */ 0 || 1\n"
2420 "Two,\n"
2421 "Three,\n"
2422 "#endif\n"
2423 " Four\n"
2424 "};",
2425 format("enum I {\n"
2426 "One,\n"
2427 "#if /* test */ 0 || 1\n"
2428 "Two,\n"
2429 "Three,\n"
2430 "#endif\n"
2431 "Four\n"
2432 "};"));
2433 EXPECT_EQ("enum J {\n"
2434 " One,\n"
2435 "#if 0\n"
2436 "#if 0\n"
2437 "Two,\n"
2438 "#else\n"
2439 "Three,\n"
2440 "#endif\n"
2441 "Four,\n"
2442 "#endif\n"
2443 " Five\n"
2444 "};",
2445 format("enum J {\n"
2446 "One,\n"
2447 "#if 0\n"
2448 "#if 0\n"
2449 "Two,\n"
2450 "#else\n"
2451 "Three,\n"
2452 "#endif\n"
2453 "Four,\n"
2454 "#endif\n"
2455 "Five\n"
2456 "};"));
Alexander Kornienkof2e02122013-05-24 18:24:24 +00002457}
2458
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002459//===----------------------------------------------------------------------===//
2460// Tests for classes, namespaces, etc.
2461//===----------------------------------------------------------------------===//
2462
2463TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002464 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002465}
2466
2467TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
2468 verifyFormat("class A {\n"
2469 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00002470 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002471 "protected:\n"
2472 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002473 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002474 "};");
2475 verifyGoogleFormat("class A {\n"
2476 " public:\n"
2477 " protected:\n"
2478 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002479 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002480 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00002481 verifyFormat("class A {\n"
2482 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002483 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00002484 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002485 " void f2() {}\n"
2486 "protected slots:\n"
2487 " void f3() {}\n"
2488 "protected Q_SLOTS:\n"
2489 " void f4() {}\n"
2490 "private slots:\n"
2491 " void f5() {}\n"
2492 "private Q_SLOTS:\n"
2493 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00002494 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002495 " void g1();\n"
2496 "Q_SIGNALS:\n"
2497 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00002498 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00002499
2500 // Don't interpret 'signals' the wrong way.
2501 verifyFormat("signals.set();");
2502 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00002503 verifyFormat("{\n"
2504 " signals.set(); // This needs indentation.\n"
2505 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00002506 verifyFormat("void f() {\n"
2507 "label:\n"
2508 " signals.baz();\n"
2509 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002510}
2511
Alexander Kornienkofd433362013-03-27 17:08:02 +00002512TEST_F(FormatTest, SeparatesLogicalBlocks) {
2513 EXPECT_EQ("class A {\n"
2514 "public:\n"
2515 " void f();\n"
2516 "\n"
2517 "private:\n"
2518 " void g() {}\n"
2519 " // test\n"
2520 "protected:\n"
2521 " int h;\n"
2522 "};",
2523 format("class A {\n"
2524 "public:\n"
2525 "void f();\n"
2526 "private:\n"
2527 "void g() {}\n"
2528 "// test\n"
2529 "protected:\n"
2530 "int h;\n"
2531 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00002532 EXPECT_EQ("class A {\n"
2533 "protected:\n"
2534 "public:\n"
2535 " void f();\n"
2536 "};",
2537 format("class A {\n"
2538 "protected:\n"
2539 "\n"
2540 "public:\n"
2541 "\n"
2542 " void f();\n"
2543 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00002544
2545 // Even ensure proper spacing inside macros.
2546 EXPECT_EQ("#define B \\\n"
2547 " class A { \\\n"
2548 " protected: \\\n"
2549 " public: \\\n"
2550 " void f(); \\\n"
2551 " };",
2552 format("#define B \\\n"
2553 " class A { \\\n"
2554 " protected: \\\n"
2555 " \\\n"
2556 " public: \\\n"
2557 " \\\n"
2558 " void f(); \\\n"
2559 " };",
2560 getGoogleStyle()));
2561 // But don't remove empty lines after macros ending in access specifiers.
2562 EXPECT_EQ("#define A private:\n"
2563 "\n"
2564 "int i;",
2565 format("#define A private:\n"
2566 "\n"
2567 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00002568}
2569
Daniel Jasper83193602013-04-05 17:22:09 +00002570TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002571 verifyFormat("class A : public B {};");
2572 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002573
2574 verifyFormat(
2575 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002576 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00002577 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
2578 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002579 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002580 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002581 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002582 verifyFormat("class AAAAAAAAAAAA : public B,\n"
2583 " public C,\n"
2584 " public D,\n"
2585 " public E,\n"
2586 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002587 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00002588
2589 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002590 " ReallyReallyLongClassName {\n"
2591 " int i;\n"
2592 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00002593 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00002594 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
2595 " aaaaaaaaaaaaaaaa> {};");
2596 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
2597 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
2598 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00002599 verifyFormat("template <class R, class C>\n"
2600 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
2601 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00002602 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00002603}
2604
Manuel Klimek28cacc72013-01-07 18:10:23 +00002605TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002606 verifyFormat("class A {\n} a, b;");
2607 verifyFormat("struct A {\n} a, b;");
2608 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00002609}
2610
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002611TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002612 verifyFormat("enum {\n"
2613 " Zero,\n"
2614 " One = 1,\n"
2615 " Two = One + 1,\n"
2616 " Three = (One + Two),\n"
2617 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2618 " Five = (One, Two, Three, Four, 5)\n"
2619 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002620 verifyGoogleFormat("enum {\n"
2621 " Zero,\n"
2622 " One = 1,\n"
2623 " Two = One + 1,\n"
2624 " Three = (One + Two),\n"
2625 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2626 " Five = (One, Two, Three, Four, 5)\n"
2627 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002628 verifyFormat("enum Enum {};");
2629 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002630 verifyFormat("enum X E {} d;");
2631 verifyFormat("enum __attribute__((...)) E {} d;");
2632 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00002633 verifyFormat("enum {\n"
2634 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002635 "};",
2636 getLLVMStyleWithColumns(30));
2637
2638 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00002639 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002640
2641 EXPECT_EQ("enum KeepEmptyLines {\n"
2642 " ONE,\n"
2643 "\n"
2644 " TWO,\n"
2645 "\n"
2646 " THREE\n"
2647 "}",
2648 format("enum KeepEmptyLines {\n"
2649 " ONE,\n"
2650 "\n"
2651 " TWO,\n"
2652 "\n"
2653 "\n"
2654 " THREE\n"
2655 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00002656 verifyFormat("enum E { // comment\n"
2657 " ONE,\n"
2658 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00002659 "};\n"
2660 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002661 // Not enums.
2662 verifyFormat("enum X f() {\n"
2663 " a();\n"
2664 " return 42;\n"
2665 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00002666 verifyFormat("enum X Type::f() {\n"
2667 " a();\n"
2668 " return 42;\n"
2669 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002670 verifyFormat("enum ::X f() {\n"
2671 " a();\n"
2672 " return 42;\n"
2673 "}");
2674 verifyFormat("enum ns::X f() {\n"
2675 " a();\n"
2676 " return 42;\n"
2677 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002678}
2679
Daniel Jasperb7150872013-08-30 10:10:19 +00002680TEST_F(FormatTest, FormatsEnumsWithErrors) {
2681 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002682 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002683 " Two = 1;\n"
2684 "};");
2685 verifyFormat("namespace n {\n"
2686 "enum Type {\n"
2687 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002688 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002689 " int i;\n"
2690 "}\n"
2691 "void g() {}");
2692}
2693
Daniel Jasper2b41a822013-08-20 12:42:50 +00002694TEST_F(FormatTest, FormatsEnumStruct) {
2695 verifyFormat("enum struct {\n"
2696 " Zero,\n"
2697 " One = 1,\n"
2698 " Two = One + 1,\n"
2699 " Three = (One + Two),\n"
2700 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2701 " Five = (One, Two, Three, Four, 5)\n"
2702 "};");
2703 verifyFormat("enum struct Enum {};");
2704 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002705 verifyFormat("enum struct X E {} d;");
2706 verifyFormat("enum struct __attribute__((...)) E {} d;");
2707 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002708 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
2709}
2710
2711TEST_F(FormatTest, FormatsEnumClass) {
2712 verifyFormat("enum class {\n"
2713 " Zero,\n"
2714 " One = 1,\n"
2715 " Two = One + 1,\n"
2716 " Three = (One + Two),\n"
2717 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2718 " Five = (One, Two, Three, Four, 5)\n"
2719 "};");
2720 verifyFormat("enum class Enum {};");
2721 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002722 verifyFormat("enum class X E {} d;");
2723 verifyFormat("enum class __attribute__((...)) E {} d;");
2724 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002725 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
2726}
2727
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002728TEST_F(FormatTest, FormatsEnumTypes) {
2729 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002730 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002731 " B\n"
2732 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00002733 verifyFormat("enum X : int { A, B };");
2734 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002735}
2736
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002737TEST_F(FormatTest, FormatsNSEnums) {
2738 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
2739 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
2740 " // Information about someDecentlyLongValue.\n"
2741 " someDecentlyLongValue,\n"
2742 " // Information about anotherDecentlyLongValue.\n"
2743 " anotherDecentlyLongValue,\n"
2744 " // Information about aThirdDecentlyLongValue.\n"
2745 " aThirdDecentlyLongValue\n"
2746 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00002747 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
2748 " a = 1,\n"
2749 " b = 2,\n"
2750 " c = 3,\n"
2751 "};");
2752 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
2753 " a = 1,\n"
2754 " b = 2,\n"
2755 " c = 3,\n"
2756 "};");
2757 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
2758 " a = 1,\n"
2759 " b = 2,\n"
2760 " c = 3,\n"
2761 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002762}
2763
Nico Weber7769a902013-01-14 05:49:49 +00002764TEST_F(FormatTest, FormatsBitfields) {
2765 verifyFormat("struct Bitfields {\n"
2766 " unsigned sClass : 8;\n"
2767 " unsigned ValueKind : 2;\n"
2768 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00002769 verifyFormat("struct A {\n"
2770 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
2771 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
2772 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00002773 verifyFormat("struct MyStruct {\n"
2774 " uchar data;\n"
2775 " uchar : 8;\n"
2776 " uchar : 8;\n"
2777 " uchar other;\n"
2778 "};");
Nico Weber7769a902013-01-14 05:49:49 +00002779}
2780
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002781TEST_F(FormatTest, FormatsNamespaces) {
2782 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002783 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002784 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002785 "}");
2786 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002787 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002788 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002789 "}");
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002790 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002791 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002792 "void f() { f(); }\n"
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002793 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002794 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002795 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002796 "void f() { f(); }");
Manuel Klimek046b9302013-02-06 16:08:09 +00002797
2798 // This code is more common than we thought; if we
2799 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002800 // its own line, which is undesirable.
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002801 verifyFormat("namespace {};");
Manuel Klimek046b9302013-02-06 16:08:09 +00002802 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002803 "class A {};\n"
Manuel Klimek046b9302013-02-06 16:08:09 +00002804 "};");
Daniel Jasper251b3c92013-07-01 11:22:57 +00002805
2806 verifyFormat("namespace {\n"
2807 "int SomeVariable = 0; // comment\n"
2808 "} // namespace");
2809 EXPECT_EQ("#ifndef HEADER_GUARD\n"
2810 "#define HEADER_GUARD\n"
2811 "namespace my_namespace {\n"
2812 "int i;\n"
2813 "} // my_namespace\n"
2814 "#endif // HEADER_GUARD",
2815 format("#ifndef HEADER_GUARD\n"
2816 " #define HEADER_GUARD\n"
2817 " namespace my_namespace {\n"
2818 "int i;\n"
2819 "} // my_namespace\n"
2820 "#endif // HEADER_GUARD"));
Daniel Jasper65ee3472013-07-31 23:16:02 +00002821
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00002822 EXPECT_EQ("namespace A::B {\n"
2823 "class C {};\n"
2824 "}",
2825 format("namespace A::B {\n"
2826 "class C {};\n"
2827 "}"));
2828
Daniel Jasper65ee3472013-07-31 23:16:02 +00002829 FormatStyle Style = getLLVMStyle();
2830 Style.NamespaceIndentation = FormatStyle::NI_All;
2831 EXPECT_EQ("namespace out {\n"
2832 " int i;\n"
2833 " namespace in {\n"
2834 " int i;\n"
2835 " } // namespace\n"
2836 "} // namespace",
2837 format("namespace out {\n"
2838 "int i;\n"
2839 "namespace in {\n"
2840 "int i;\n"
2841 "} // namespace\n"
2842 "} // namespace",
2843 Style));
2844
2845 Style.NamespaceIndentation = FormatStyle::NI_Inner;
2846 EXPECT_EQ("namespace out {\n"
2847 "int i;\n"
2848 "namespace in {\n"
2849 " int i;\n"
2850 "} // namespace\n"
2851 "} // namespace",
2852 format("namespace out {\n"
2853 "int i;\n"
2854 "namespace in {\n"
2855 "int i;\n"
2856 "} // namespace\n"
2857 "} // namespace",
2858 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002859}
2860
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002861TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00002862
Daniel Jasper40aacf42013-03-14 13:45:21 +00002863TEST_F(FormatTest, FormatsInlineASM) {
2864 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00002865 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00002866 verifyFormat(
2867 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2868 " \"cpuid\\n\\t\"\n"
2869 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00002870 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00002871 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00002872 EXPECT_EQ(
2873 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002874 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002875 " mov edx,[that] // vtable in edx\n"
2876 " mov eax,methodIndex\n"
2877 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002878 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002879 "}",
2880 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2881 " __asm {\n"
2882 " mov edx,[that] // vtable in edx\n"
2883 " mov eax,methodIndex\n"
2884 " call [edx][eax*4] // stdcall\n"
2885 " }\n"
2886 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00002887 EXPECT_EQ("_asm {\n"
2888 " xor eax, eax;\n"
2889 " cpuid;\n"
2890 "}",
2891 format("_asm {\n"
2892 " xor eax, eax;\n"
2893 " cpuid;\n"
2894 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00002895 verifyFormat("void function() {\n"
2896 " // comment\n"
2897 " asm(\"\");\n"
2898 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00002899 EXPECT_EQ("__asm {\n"
2900 "}\n"
2901 "int i;",
2902 format("__asm {\n"
2903 "}\n"
2904 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00002905}
2906
Nico Weberd5650bd2013-01-07 16:36:17 +00002907TEST_F(FormatTest, FormatTryCatch) {
2908 verifyFormat("try {\n"
2909 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002910 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002911 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002912 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002913 " exit(42);\n"
2914 "}");
2915
2916 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00002917 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002918 " return 5;\n"
2919 "}");
2920 verifyFormat("class A {\n"
2921 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002922 " A() try : a(0) {\n"
2923 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002924 " throw;\n"
2925 " }\n"
2926 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00002927
2928 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002929 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00002930}
2931
Nico Weberfac23712015-02-04 15:26:27 +00002932TEST_F(FormatTest, FormatSEHTryCatch) {
2933 verifyFormat("__try {\n"
2934 " int a = b * c;\n"
2935 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2936 " // Do nothing.\n"
2937 "}");
2938
2939 verifyFormat("__try {\n"
2940 " int a = b * c;\n"
2941 "} __finally {\n"
2942 " // Do nothing.\n"
2943 "}");
2944
2945 verifyFormat("DEBUG({\n"
2946 " __try {\n"
2947 " } __finally {\n"
2948 " }\n"
2949 "});\n");
2950}
2951
Daniel Jasper04a71a42014-05-08 11:58:24 +00002952TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2953 verifyFormat("try {\n"
2954 " f();\n"
2955 "} catch {\n"
2956 " g();\n"
2957 "}");
2958 verifyFormat("try {\n"
2959 " f();\n"
2960 "} catch (A a) MACRO(x) {\n"
2961 " g();\n"
2962 "} catch (B b) MACRO(x) {\n"
2963 " g();\n"
2964 "}");
2965}
2966
2967TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2968 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00002969 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2970 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00002971 Style.BreakBeforeBraces = BraceStyle;
2972 verifyFormat("try {\n"
2973 " // something\n"
2974 "} catch (...) {\n"
2975 " // something\n"
2976 "}",
2977 Style);
2978 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00002979 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2980 verifyFormat("try {\n"
2981 " // something\n"
2982 "}\n"
2983 "catch (...) {\n"
2984 " // something\n"
2985 "}",
2986 Style);
Nico Weberfac23712015-02-04 15:26:27 +00002987 verifyFormat("__try {\n"
2988 " // something\n"
2989 "}\n"
2990 "__finally {\n"
2991 " // something\n"
2992 "}",
2993 Style);
Nico Weber33381f52015-02-07 01:57:32 +00002994 verifyFormat("@try {\n"
2995 " // something\n"
2996 "}\n"
2997 "@finally {\n"
2998 " // something\n"
2999 "}",
3000 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00003001 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3002 verifyFormat("try\n"
3003 "{\n"
3004 " // something\n"
3005 "}\n"
3006 "catch (...)\n"
3007 "{\n"
3008 " // something\n"
3009 "}",
3010 Style);
3011 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
3012 verifyFormat("try\n"
3013 " {\n"
3014 " // something\n"
3015 " }\n"
3016 "catch (...)\n"
3017 " {\n"
3018 " // something\n"
3019 " }",
3020 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00003021 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
3022 Style.BraceWrapping.BeforeCatch = true;
3023 verifyFormat("try {\n"
3024 " // something\n"
3025 "}\n"
3026 "catch (...) {\n"
3027 " // something\n"
3028 "}",
3029 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00003030}
3031
Daniel Jaspere25509f2012-12-17 11:29:41 +00003032TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003033 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00003034
Daniel Jaspera44991332015-04-29 13:06:49 +00003035 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
3036 " 100000000, "
3037 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00003038
Daniel Jasper473c62c2013-05-17 09:35:01 +00003039 // Here, everything other than the "}" would fit on a line.
3040 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003041 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00003042 EXPECT_EQ("S s = {a,\n"
3043 "\n"
3044 " b};",
3045 format("S s = {\n"
3046 " a,\n"
3047 "\n"
3048 " b\n"
3049 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00003050
3051 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
3052 // line. However, the formatting looks a bit off and this probably doesn't
3053 // happen often in practice.
3054 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003055 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00003056 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00003057}
3058
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003059TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003060 verifyFormat("const struct A a = {.a = 1, .b = 2};");
3061 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
3062 " .bbbbbbbbbb = 2,\n"
3063 " .cccccccccc = 3,\n"
3064 " .dddddddddd = 4,\n"
3065 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003066 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003067 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
3068 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
3069 " .ccccccccccccccccccccccccccc = 3,\n"
3070 " .ddddddddddddddddddddddddddd = 4,\n"
3071 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003072
3073 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
3074}
3075
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003076TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003077 verifyFormat("static A x = {{{}}};\n");
3078 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
3079 " {init1, init2, init3, init4}}};",
3080 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00003081
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003082 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003083 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
3084 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
3085 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
3086 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00003087 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00003088 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
3089 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
3090 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00003091 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
3092 " {rect.fRight - rect.fLeft, rect.fBottom - "
3093 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003094
Daniel Jasper8a8ce242013-01-31 14:59:26 +00003095 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00003096 "SomeArrayOfSomeType a = {\n"
3097 " {{1, 2, 3},\n"
3098 " {1, 2, 3},\n"
3099 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
3100 " 333333333333333333333333333333},\n"
3101 " {1, 2, 3},\n"
3102 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00003103 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00003104 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00003105 " {{1, 2, 3}},\n"
3106 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00003107 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
3108 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00003109 " {{1, 2, 3}},\n"
3110 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00003111
Daniel Jaspera44991332015-04-29 13:06:49 +00003112 verifyFormat("struct {\n"
3113 " unsigned bit;\n"
3114 " const char *const name;\n"
3115 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
3116 " {kOsWin, \"Windows\"},\n"
3117 " {kOsLinux, \"Linux\"},\n"
3118 " {kOsCrOS, \"Chrome OS\"}};");
3119 verifyFormat("struct {\n"
3120 " unsigned bit;\n"
3121 " const char *const name;\n"
3122 "} kBitsToOs[] = {\n"
3123 " {kOsMac, \"Mac\"},\n"
3124 " {kOsWin, \"Windows\"},\n"
3125 " {kOsLinux, \"Linux\"},\n"
3126 " {kOsCrOS, \"Chrome OS\"},\n"
3127 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003128}
3129
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003130TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
3131 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3132 " \\\n"
3133 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
3134}
3135
Daniel Jasperda16db32013-01-07 10:48:50 +00003136TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00003137 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
3138 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00003139
3140 // Do break defaulted and deleted functions.
3141 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
3142 " default;",
3143 getLLVMStyleWithColumns(40));
3144 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
3145 " delete;",
3146 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00003147}
3148
3149TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
3150 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
3151 getLLVMStyleWithColumns(40));
3152 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
3153 getLLVMStyleWithColumns(40));
3154 EXPECT_EQ("#define Q \\\n"
3155 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
3156 " \"aaaaaaaa.cpp\"",
3157 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
3158 getLLVMStyleWithColumns(40)));
3159}
3160
3161TEST_F(FormatTest, UnderstandsLinePPDirective) {
3162 EXPECT_EQ("# 123 \"A string literal\"",
3163 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00003164}
3165
Manuel Klimek591b5802013-01-31 15:58:48 +00003166TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00003167 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00003168 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003169}
3170
3171TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
3172 EXPECT_EQ("#line 42 \"test\"\n",
3173 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003174 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
3175 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003176}
3177
3178TEST_F(FormatTest, EndOfFileEndsPPDirective) {
3179 EXPECT_EQ("#line 42 \"test\"",
3180 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003181 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003182}
3183
Daniel Jasper877615c2013-10-11 19:45:02 +00003184TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
3185 verifyFormat("#define A \\x20");
3186 verifyFormat("#define A \\ x20");
3187 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
3188 verifyFormat("#define A ''");
3189 verifyFormat("#define A ''qqq");
3190 verifyFormat("#define A `qqq");
3191 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00003192 EXPECT_EQ("const char *c = STRINGIFY(\n"
3193 "\\na : b);",
3194 format("const char * c = STRINGIFY(\n"
3195 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00003196
3197 verifyFormat("a\r\\");
3198 verifyFormat("a\v\\");
3199 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00003200}
3201
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003202TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003203 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
3204 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003205 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003206 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00003207 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00003208
3209 verifyFormat("#define A A\n#define A A");
3210 verifyFormat("#define A(X) A\n#define A A");
3211
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003212 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
3213 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003214}
3215
3216TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00003217 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003218 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003219 "#define A( \\\n"
3220 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003221 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00003222 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00003223 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003224 " #include \"a.h\"\n"
3225 "#define A(A,\\\n"
3226 " B)\n"
3227 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00003228 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003229 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003230}
3231
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003232TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00003233
3234TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
3235 EXPECT_EQ("#define A \\\n"
3236 " c; \\\n"
3237 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003238 "f;",
3239 format("#define A c; e;\n"
3240 "f;",
3241 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00003242}
3243
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003244TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00003245
Manuel Klimek1abf7892013-01-04 23:34:14 +00003246TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00003247 EXPECT_EQ("int x,\n"
3248 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003249 " y;",
3250 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00003251}
3252
Manuel Klimek09e07972013-01-05 21:34:55 +00003253TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00003254 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00003255 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00003256 verifyFormat("#define A \\\n"
3257 " { \\\n"
3258 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003259 " }",
3260 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00003261
3262 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003263 " void function##X()",
3264 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00003265
3266 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003267 " void a##b##c()",
3268 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00003269
Daniel Jasper39825ea2013-01-14 15:40:57 +00003270 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00003271}
3272
Manuel Klimekd053c5b2013-01-23 14:37:36 +00003273TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00003274 EXPECT_EQ("#define A (x)", format("#define A (x)"));
3275 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00003276}
3277
Manuel Klimek0c137952013-02-11 12:33:24 +00003278TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
3279 EXPECT_EQ("#define A b;", format("#define A \\\n"
3280 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003281 " b;",
3282 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003283 EXPECT_EQ("#define A \\\n"
3284 " \\\n"
3285 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003286 " b;",
3287 format("#define A \\\n"
3288 " \\\n"
3289 " a; \\\n"
3290 " b;",
3291 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003292 EXPECT_EQ("#define A \\\n"
3293 " a; \\\n"
3294 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003295 " b;",
3296 format("#define A \\\n"
3297 " a; \\\n"
3298 " \\\n"
3299 " b;",
3300 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003301}
3302
Daniel Jasper00475962013-02-19 17:14:38 +00003303TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003304 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00003305 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00003306 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00003307 " case 2\n",
3308 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00003309 verifyFormat("#define MACRO(a) \\\n"
3310 " if (a) \\\n"
3311 " f(); \\\n"
3312 " else \\\n"
3313 " g()",
3314 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00003315 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003316 verifyIncompleteFormat("#define STR(x) #x\n"
3317 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00003318 verifyFormat("#pragma omp threadprivate( \\\n"
3319 " y)), // expected-warning",
3320 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00003321 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00003322 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003323 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00003324 "#define b \\\n"
3325 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003326 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003327 "a",
3328 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00003329 verifyFormat("#define A \\\n"
3330 " { \\\n"
3331 " {\n"
3332 "#define B \\\n"
3333 " } \\\n"
3334 " }",
3335 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00003336 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00003337 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00003338 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00003339 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00003340}
3341
Daniel Jasper40e19212013-05-29 13:16:10 +00003342TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
3343 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
3344 EXPECT_EQ("class A : public QObject {\n"
3345 " Q_OBJECT\n"
3346 "\n"
3347 " A() {}\n"
3348 "};",
3349 format("class A : public QObject {\n"
3350 " Q_OBJECT\n"
3351 "\n"
3352 " A() {\n}\n"
3353 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00003354 EXPECT_EQ("MACRO\n"
3355 "/*static*/ int i;",
3356 format("MACRO\n"
3357 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00003358 EXPECT_EQ("SOME_MACRO\n"
3359 "namespace {\n"
3360 "void f();\n"
3361 "}",
3362 format("SOME_MACRO\n"
3363 " namespace {\n"
3364 "void f( );\n"
3365 "}"));
Daniel Jasper40e19212013-05-29 13:16:10 +00003366 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00003367 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
3368 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00003369 // Only if everything is upper case.
3370 EXPECT_EQ("class A : public QObject {\n"
3371 " Q_Object A() {}\n"
3372 "};",
3373 format("class A : public QObject {\n"
3374 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00003375 " A() {\n}\n"
3376 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00003377
3378 // Only if the next line can actually start an unwrapped line.
3379 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
3380 format("SOME_WEIRD_LOG_MACRO\n"
3381 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00003382
3383 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00003384 "(n, buffers))\n",
3385 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00003386}
3387
Alexander Kornienkode644272013-04-08 22:16:06 +00003388TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
3389 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3390 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3391 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003392 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00003393 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3394 "int *createScopDetectionPass() { return 0; }",
3395 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3396 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3397 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
3398 " class X {};\n"
3399 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3400 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003401 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
3402 // braces, so that inner block is indented one level more.
3403 EXPECT_EQ("int q() {\n"
3404 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3405 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3406 " IPC_END_MESSAGE_MAP()\n"
3407 "}",
3408 format("int q() {\n"
3409 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3410 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3411 " IPC_END_MESSAGE_MAP()\n"
3412 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00003413
Daniel Jasper352dae12014-01-03 11:50:46 +00003414 // Same inside macros.
3415 EXPECT_EQ("#define LIST(L) \\\n"
3416 " L(A) \\\n"
3417 " L(B) \\\n"
3418 " L(C)",
3419 format("#define LIST(L) \\\n"
3420 " L(A) \\\n"
3421 " L(B) \\\n"
3422 " L(C)",
3423 getGoogleStyle()));
3424
Daniel Jasper545c6522013-09-17 09:26:07 +00003425 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003426 EXPECT_EQ("int q() {\n"
3427 " f(x);\n"
3428 " f(x) {}\n"
3429 " f(x)->g();\n"
3430 " f(x)->*g();\n"
3431 " f(x).g();\n"
3432 " f(x) = x;\n"
3433 " f(x) += x;\n"
3434 " f(x) -= x;\n"
3435 " f(x) *= x;\n"
3436 " f(x) /= x;\n"
3437 " f(x) %= x;\n"
3438 " f(x) &= x;\n"
3439 " f(x) |= x;\n"
3440 " f(x) ^= x;\n"
3441 " f(x) >>= x;\n"
3442 " f(x) <<= x;\n"
3443 " f(x)[y].z();\n"
3444 " LOG(INFO) << x;\n"
3445 " ifstream(x) >> x;\n"
3446 "}\n",
3447 format("int q() {\n"
3448 " f(x)\n;\n"
3449 " f(x)\n {}\n"
3450 " f(x)\n->g();\n"
3451 " f(x)\n->*g();\n"
3452 " f(x)\n.g();\n"
3453 " f(x)\n = x;\n"
3454 " f(x)\n += x;\n"
3455 " f(x)\n -= x;\n"
3456 " f(x)\n *= x;\n"
3457 " f(x)\n /= x;\n"
3458 " f(x)\n %= x;\n"
3459 " f(x)\n &= x;\n"
3460 " f(x)\n |= x;\n"
3461 " f(x)\n ^= x;\n"
3462 " f(x)\n >>= x;\n"
3463 " f(x)\n <<= x;\n"
3464 " f(x)\n[y].z();\n"
3465 " LOG(INFO)\n << x;\n"
3466 " ifstream(x)\n >> x;\n"
3467 "}\n"));
3468 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003469 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003470 " if (1) {\n"
3471 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003472 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003473 " while (1) {\n"
3474 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003475 " F(x)\n"
3476 " G(x);\n"
3477 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003478 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003479 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003480 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003481 " }\n"
3482 "}\n",
3483 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003484 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003485 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003486 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003487 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003488 "F(x)\n"
3489 "G(x);\n"
3490 "F(x)\n"
3491 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003492 "}\n"));
3493 EXPECT_EQ("class A {\n"
3494 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00003495 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003496 " A(X x)\n" // FIXME: function-level try blocks are broken.
3497 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003498 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003499 " }\n"
3500 "};",
3501 format("class A {\n"
3502 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00003503 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003504 " A(X x)\n"
3505 " try : t(0) {} catch (...) {}\n"
3506 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00003507 EXPECT_EQ("class SomeClass {\n"
3508 "public:\n"
3509 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3510 "};",
3511 format("class SomeClass {\n"
3512 "public:\n"
3513 " SomeClass()\n"
3514 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3515 "};"));
3516 EXPECT_EQ("class SomeClass {\n"
3517 "public:\n"
3518 " SomeClass()\n"
3519 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3520 "};",
3521 format("class SomeClass {\n"
3522 "public:\n"
3523 " SomeClass()\n"
3524 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3525 "};",
3526 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00003527
3528 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00003529}
3530
Manuel Klimek4fe43002013-05-22 12:51:29 +00003531TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
3532 verifyFormat("#define A \\\n"
3533 " f({ \\\n"
3534 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003535 " });",
3536 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00003537}
3538
Manuel Klimekef2cfb12013-01-05 22:14:16 +00003539TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
3540 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
3541}
3542
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003543TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003544 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003545}
3546
Manuel Klimek1058d982013-01-06 20:07:31 +00003547TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3548 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
3549 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3550 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
3551 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3552}
Manuel Klimek1abf7892013-01-04 23:34:14 +00003553
Daniel Jaspere2408e32015-05-06 11:16:43 +00003554TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003555 EXPECT_EQ(
3556 "#define A \\\n int i; \\\n int j;",
3557 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003558 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00003559 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003560 EXPECT_EQ("/* \\ \\ \\\n*/", format("\\\n/* \\ \\ \\\n*/"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00003561 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003562}
3563
Alexander Kornienko00691cf2015-01-12 13:11:12 +00003564TEST_F(FormatTest, DontCrashOnBlockComments) {
3565 EXPECT_EQ(
3566 "int xxxxxxxxx; /* "
3567 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\n"
3568 "zzzzzz\n"
3569 "0*/",
3570 format("int xxxxxxxxx; /* "
3571 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzz\n"
3572 "0*/"));
3573}
3574
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003575TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3576 verifyFormat("#define A \\\n"
3577 " int v( \\\n"
3578 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003579 " int i;",
3580 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003581}
3582
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003583TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00003584 EXPECT_EQ(
3585 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3586 " \\\n"
3587 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3588 "\n"
3589 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3590 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3591 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
3592 "\\\n"
3593 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3594 " \n"
3595 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3596 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003597}
3598
Manuel Klimek52b15152013-01-09 15:25:02 +00003599TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3600 EXPECT_EQ("int\n"
3601 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003602 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003603 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003604 verifyFormat("functionCallTo(\n"
3605 " someOtherFunction(\n"
3606 " withSomeParameters, whichInSequence,\n"
3607 " areLongerThanALine(andAnotherCall,\n"
3608 "#define A B\n"
3609 " withMoreParamters,\n"
3610 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003611 " andMoreParameters),\n"
3612 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003613 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00003614 verifyFormat("Foo::Foo()\n"
3615 "#ifdef BAR\n"
3616 " : baz(0)\n"
3617 "#endif\n"
3618 "{\n"
3619 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00003620 verifyFormat("void f() {\n"
3621 " if (true)\n"
3622 "#ifdef A\n"
3623 " f(42);\n"
3624 " x();\n"
3625 "#else\n"
3626 " g();\n"
3627 " x();\n"
3628 "#endif\n"
3629 "}");
3630 verifyFormat("void f(param1, param2,\n"
3631 " param3,\n"
3632 "#ifdef A\n"
3633 " param4(param5,\n"
3634 "#ifdef A1\n"
3635 " param6,\n"
3636 "#ifdef A2\n"
3637 " param7),\n"
3638 "#else\n"
3639 " param8),\n"
3640 " param9,\n"
3641 "#endif\n"
3642 " param10,\n"
3643 "#endif\n"
3644 " param11)\n"
3645 "#else\n"
3646 " param12)\n"
3647 "#endif\n"
3648 "{\n"
3649 " x();\n"
3650 "}",
3651 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00003652 verifyFormat("#if 1\n"
3653 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003654 verifyFormat("#if 1\n"
3655 "#endif\n"
3656 "#if 1\n"
3657 "#else\n"
3658 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00003659 verifyFormat("DEBUG({\n"
3660 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3661 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3662 "});\n"
3663 "#if a\n"
3664 "#else\n"
3665 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00003666
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003667 verifyIncompleteFormat("void f(\n"
3668 "#if A\n"
3669 " );\n"
3670 "#else\n"
3671 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00003672}
3673
Manuel Klimek14bd9172014-01-29 08:49:02 +00003674TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3675 verifyFormat("#endif\n"
3676 "#if B");
3677}
3678
Manuel Klimek88033d72013-10-21 08:11:15 +00003679TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3680 FormatStyle SingleLine = getLLVMStyle();
3681 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00003682 verifyFormat("#if 0\n"
3683 "#elif 1\n"
3684 "#endif\n"
3685 "void foo() {\n"
3686 " if (test) foo2();\n"
3687 "}",
3688 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00003689}
3690
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003691TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00003692 verifyFormat("functionCall({ int i; });");
3693 verifyFormat("functionCall({\n"
3694 " int i;\n"
3695 " int j;\n"
3696 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00003697 verifyFormat("functionCall(\n"
3698 " {\n"
3699 " int i;\n"
3700 " int j;\n"
3701 " },\n"
3702 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00003703 verifyFormat("functionA(functionB({\n"
3704 " int i;\n"
3705 " int j;\n"
3706 " }),\n"
3707 " aaaa, bbbb, cccc);");
3708 verifyFormat("functionCall(\n"
3709 " {\n"
3710 " int i;\n"
3711 " int j;\n"
3712 " },\n"
3713 " aaaa, bbbb, // comment\n"
3714 " cccc);");
3715 verifyFormat("functionA(functionB({\n"
3716 " int i;\n"
3717 " int j;\n"
3718 " }),\n"
3719 " aaaa, bbbb, // comment\n"
3720 " cccc);");
3721 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3722 verifyFormat("functionCall(aaaa, bbbb, {\n"
3723 " int i;\n"
3724 " int j;\n"
3725 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00003726 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00003727 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00003728 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003729 " int i; // break\n"
3730 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00003731 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3732 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003733 verifyFormat("DEBUG({\n"
3734 " if (a)\n"
3735 " f();\n"
3736 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003737}
3738
3739TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003740 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003741 "int i;",
3742 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003743}
3744
3745TEST_F(FormatTest, LayoutNestedBlocks) {
3746 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3747 " struct s {\n"
3748 " int i;\n"
3749 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003750 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003751 " for (int i = 0; i < 10; ++i)\n"
3752 " return;\n"
3753 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003754 verifyFormat("call(parameter, {\n"
3755 " something();\n"
3756 " // Comment using all columns.\n"
3757 " somethingelse();\n"
3758 "});",
3759 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00003760 verifyFormat("DEBUG( //\n"
3761 " { f(); }, a);");
3762 verifyFormat("DEBUG( //\n"
3763 " {\n"
3764 " f(); //\n"
3765 " },\n"
3766 " a);");
3767
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003768 EXPECT_EQ("call(parameter, {\n"
3769 " something();\n"
3770 " // Comment too\n"
3771 " // looooooooooong.\n"
3772 " somethingElse();\n"
3773 "});",
3774 format("call(parameter, {\n"
3775 " something();\n"
3776 " // Comment too looooooooooong.\n"
3777 " somethingElse();\n"
3778 "});",
3779 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003780 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003781 EXPECT_EQ("DEBUG({ // comment\n"
3782 " int i;\n"
3783 "});",
3784 format("DEBUG({ // comment\n"
3785 "int i;\n"
3786 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003787 EXPECT_EQ("DEBUG({\n"
3788 " int i;\n"
3789 "\n"
3790 " // comment\n"
3791 " int j;\n"
3792 "});",
3793 format("DEBUG({\n"
3794 " int i;\n"
3795 "\n"
3796 " // comment\n"
3797 " int j;\n"
3798 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003799
3800 verifyFormat("DEBUG({\n"
3801 " if (a)\n"
3802 " return;\n"
3803 "});");
3804 verifyGoogleFormat("DEBUG({\n"
3805 " if (a) return;\n"
3806 "});");
3807 FormatStyle Style = getGoogleStyle();
3808 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003809 verifyFormat("Debug(aaaaa,\n"
3810 " {\n"
3811 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3812 " },\n"
3813 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003814 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003815
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003816 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3817
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003818 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003819}
3820
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003821TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3822 EXPECT_EQ("#define MACRO() \\\n"
3823 " Debug(aaa, /* force line break */ \\\n"
3824 " { \\\n"
3825 " int i; \\\n"
3826 " int j; \\\n"
3827 " })",
3828 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3829 " { int i; int j; })",
3830 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003831
3832 EXPECT_EQ("#define A \\\n"
3833 " [] { \\\n"
3834 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3835 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3836 " }",
3837 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3838 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3839 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003840}
3841
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003842TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3843 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003844 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003845 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003846}
3847
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003848TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3849 FormatStyle Style = getLLVMStyle();
3850 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3851 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3852 verifyFormat("FOO_BEGIN\n"
3853 " FOO_ENTRY\n"
3854 "FOO_END", Style);
3855 verifyFormat("FOO_BEGIN\n"
3856 " NESTED_FOO_BEGIN\n"
3857 " NESTED_FOO_ENTRY\n"
3858 " NESTED_FOO_END\n"
3859 "FOO_END", Style);
3860 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3861 " int x;\n"
3862 " x = 1;\n"
3863 "FOO_END(Baz)", Style);
3864}
3865
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003866//===----------------------------------------------------------------------===//
3867// Line break tests.
3868//===----------------------------------------------------------------------===//
3869
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003870TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003871 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003872 "void f() {\n"
3873 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3874 " parameter, parameter, parameter)),\n"
3875 " SecondLongCall(parameter));\n"
3876 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003877 verifyFormat(
3878 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3879 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3880 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3881 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3882 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003883 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3884 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3885 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3886 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003887 verifyFormat(
3888 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3889 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3890 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3891 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003892 verifyFormat("int a = bbbb && ccc &&\n"
3893 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003894 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003895 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003896}
3897
Daniel Jasperd69fc772013-05-08 14:12:04 +00003898TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3899 verifyFormat(
3900 "bool aaaaaaa =\n"
3901 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3902 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003903 verifyFormat(
3904 "bool aaaaaaa =\n"
3905 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3906 " bbbbbbbb();");
3907
Daniel Jasperd69fc772013-05-08 14:12:04 +00003908 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3909 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3910 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003911 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3912 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3913 " ccccccccc == ddddddddddd;");
3914 verifyFormat(
3915 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3916 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3917 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003918
3919 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3920 " aaaaaa) &&\n"
3921 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003922 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3923 " aaaaaa) >>\n"
3924 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003925 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003926 " SourceMgr.getSpellingColumnNumber(\n"
3927 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3928 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003929
Daniel Jasper68d888c2013-06-03 08:42:05 +00003930 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3931 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3932 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003933 verifyFormat("b = a &&\n"
3934 " // Comment\n"
3935 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003936
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003937 // If the LHS of a comparison is not a binary expression itself, the
3938 // additional linebreak confuses many people.
3939 verifyFormat(
3940 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3941 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3942 "}");
3943 verifyFormat(
3944 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3945 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3946 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003947 verifyFormat(
3948 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3949 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3950 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003951 // Even explicit parentheses stress the precedence enough to make the
3952 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003953 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3954 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3955 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003956 // This cases is borderline, but with the indentation it is still readable.
3957 verifyFormat(
3958 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3959 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3960 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3961 "}",
3962 getLLVMStyleWithColumns(75));
3963
3964 // If the LHS is a binary expression, we should still use the additional break
3965 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003966 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3967 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3968 " 5) {\n"
3969 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003970
Daniel Jasper571f1af2013-05-14 20:39:56 +00003971 FormatStyle OnePerLine = getLLVMStyle();
3972 OnePerLine.BinPackParameters = false;
3973 verifyFormat(
3974 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3975 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3976 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3977 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00003978
3979 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3980 " .aaa(aaaaaaaaaaaaa) *\n"
3981 " aaaaaaa +\n"
3982 " aaaaaaa;",
3983 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00003984}
3985
Daniel Jasper6bee6822013-04-08 20:33:42 +00003986TEST_F(FormatTest, ExpressionIndentation) {
3987 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3988 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3989 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3990 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3991 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3992 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3993 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3994 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3995 " ccccccccccccccccccccccccccccccccccccccccc;");
3996 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3997 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3998 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3999 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4000 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4001 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4002 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4003 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4004 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4005 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4006 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4007 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00004008 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00004009 "} else if (aaaaa &&\n"
4010 " bbbbb > // break\n"
4011 " ccccc) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00004012 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00004013
4014 // Presence of a trailing comment used to change indentation of b.
4015 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
4016 " b;\n"
4017 "return aaaaaaaaaaaaaaaaaaa +\n"
4018 " b; //",
4019 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00004020}
4021
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004022TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
4023 // Not sure what the best system is here. Like this, the LHS can be found
4024 // immediately above an operator (everything with the same or a higher
4025 // indent). The RHS is aligned right of the operator and so compasses
4026 // everything until something with the same indent as the operator is found.
4027 // FIXME: Is this a good system?
4028 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00004029 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004030 verifyFormat(
4031 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004032 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4033 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4034 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4035 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4036 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004037 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004038 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4039 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004040 Style);
4041 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004042 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4043 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004044 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4045 Style);
4046 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004047 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4048 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004049 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4050 Style);
4051 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4052 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004053 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4054 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004055 Style);
4056 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004057 "} else if (aaaaa\n"
4058 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004059 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004060 "}",
4061 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00004062 verifyFormat("return (a)\n"
4063 " // comment\n"
4064 " + b;",
4065 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004066 verifyFormat(
4067 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4068 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4069 " + cc;",
4070 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00004071
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00004072 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4073 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4074 Style);
4075
Daniel Jasper9e5ede02013-11-08 19:56:28 +00004076 // Forced by comments.
4077 verifyFormat(
4078 "unsigned ContentSize =\n"
4079 " sizeof(int16_t) // DWARF ARange version number\n"
4080 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4081 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
4082 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00004083
4084 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
4085 " == boost::fusion::at_c<1>(iiii).second;",
4086 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00004087
4088 Style.ColumnLimit = 60;
4089 verifyFormat("zzzzzzzzzz\n"
4090 " = bbbbbbbbbbbbbbbbb\n"
4091 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
4092 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004093}
4094
Daniel Jasper3219e432014-12-02 13:24:51 +00004095TEST_F(FormatTest, NoOperandAlignment) {
4096 FormatStyle Style = getLLVMStyle();
4097 Style.AlignOperands = false;
4098 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00004099 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4100 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4101 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4102 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4103 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4104 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4105 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4106 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4107 " > ccccccccccccccccccccccccccccccccccccccccc;",
4108 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004109
4110 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4111 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4112 " + cc;",
4113 Style);
4114 verifyFormat("int a = aa\n"
4115 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4116 " * cccccccccccccccccccccccccccccccccccc;",
4117 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00004118
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004119 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00004120 verifyFormat("return (a > b\n"
4121 " // comment1\n"
4122 " // comment2\n"
4123 " || c);",
4124 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004125}
4126
Daniel Jasperac043c92014-09-15 11:11:00 +00004127TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
4128 FormatStyle Style = getLLVMStyle();
4129 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4130 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4131 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00004132 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4133 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00004134}
4135
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004136TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004137 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004138 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
4139 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004140 verifyFormat("Constructor()\n"
4141 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004142 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004143 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004144 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004145 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004146
Daniel Jasper7b259cd2015-08-27 11:59:31 +00004147 verifyFormat("template <typename T>\n"
4148 "Constructor() : Initializer(FitsOnTheLine) {}",
4149 getLLVMStyleWithColumns(45));
4150
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004151 verifyFormat(
4152 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004153 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004154
4155 verifyFormat(
4156 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004157 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004158 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004159 verifyFormat(
4160 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004161 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004162 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00004163 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4164 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4165 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004166
4167 verifyFormat("Constructor()\n"
4168 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4169 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4170 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004171 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004172
Daniel Jasper65585ed2013-01-28 13:31:35 +00004173 verifyFormat("Constructor()\n"
4174 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004175 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00004176
Daniel Jasper62e68172013-02-25 15:59:54 +00004177 verifyFormat("Constructor(int Parameter = 0)\n"
4178 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4179 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00004180 verifyFormat("Constructor()\n"
4181 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4182 "}",
4183 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00004184 verifyFormat("Constructor()\n"
4185 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4186 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00004187
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004188 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00004189 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004190 verifyFormat("Constructor()\n"
4191 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4192 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
4193 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004194
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004195 FormatStyle OnePerLine = getLLVMStyle();
4196 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00004197 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004198 verifyFormat("SomeClass::Constructor()\n"
4199 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4200 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004201 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004202 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004203 verifyFormat("SomeClass::Constructor()\n"
4204 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4205 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004206 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004207 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004208 verifyFormat("MyClass::MyClass(int var)\n"
4209 " : some_var_(var), // 4 space indent\n"
4210 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004211 "}",
4212 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00004213 verifyFormat("Constructor()\n"
4214 " : aaaaa(aaaaaa),\n"
4215 " aaaaa(aaaaaa),\n"
4216 " aaaaa(aaaaaa),\n"
4217 " aaaaa(aaaaaa),\n"
4218 " aaaaa(aaaaaa) {}",
4219 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00004220 verifyFormat("Constructor()\n"
4221 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4222 " aaaaaaaaaaaaaaaaaaaaaa) {}",
4223 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00004224 OnePerLine.BinPackParameters = false;
4225 verifyFormat(
4226 "Constructor()\n"
4227 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4228 " aaaaaaaaaaa().aaa(),\n"
4229 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4230 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00004231 OnePerLine.ColumnLimit = 60;
4232 verifyFormat("Constructor()\n"
4233 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
4234 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4235 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00004236
4237 EXPECT_EQ("Constructor()\n"
4238 " : // Comment forcing unwanted break.\n"
4239 " aaaa(aaaa) {}",
4240 format("Constructor() :\n"
4241 " // Comment forcing unwanted break.\n"
4242 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004243}
4244
4245TEST_F(FormatTest, MemoizationTests) {
4246 // This breaks if the memoization lookup does not take \c Indent and
4247 // \c LastSpace into account.
4248 verifyFormat(
4249 "extern CFRunLoopTimerRef\n"
4250 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
4251 " CFTimeInterval interval, CFOptionFlags flags,\n"
4252 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00004253 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004254
4255 // Deep nesting somewhat works around our memoization.
4256 verifyFormat(
4257 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4258 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4259 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4260 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4261 " aaaaa())))))))))))))))))))))))))))))))))))))));",
4262 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00004263 verifyFormat(
4264 "aaaaa(\n"
4265 " aaaaa,\n"
4266 " aaaaa(\n"
4267 " aaaaa,\n"
4268 " aaaaa(\n"
4269 " aaaaa,\n"
4270 " aaaaa(\n"
4271 " aaaaa,\n"
4272 " aaaaa(\n"
4273 " aaaaa,\n"
4274 " aaaaa(\n"
4275 " aaaaa,\n"
4276 " aaaaa(\n"
4277 " aaaaa,\n"
4278 " aaaaa(\n"
4279 " aaaaa,\n"
4280 " aaaaa(\n"
4281 " aaaaa,\n"
4282 " aaaaa(\n"
4283 " aaaaa,\n"
4284 " aaaaa(\n"
4285 " aaaaa,\n"
4286 " aaaaa(\n"
4287 " aaaaa,\n"
4288 " aaaaa))))))))))));",
4289 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00004290 verifyFormat(
4291 "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"
4292 " a),\n"
4293 " a),\n"
4294 " a),\n"
4295 " a),\n"
4296 " a),\n"
4297 " a),\n"
4298 " a),\n"
4299 " a),\n"
4300 " a),\n"
4301 " a),\n"
4302 " a),\n"
4303 " a),\n"
4304 " a),\n"
4305 " a),\n"
4306 " a),\n"
4307 " a),\n"
4308 " a)",
4309 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00004310
4311 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004312 FormatStyle OnePerLine = getLLVMStyle();
4313 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004314 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00004315 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00004316 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00004317 for (unsigned i = 0, e = 80; i != e; ++i) {
4318 input += " a,\n";
4319 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004320 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004321 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004322}
4323
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004324TEST_F(FormatTest, BreaksAsHighAsPossible) {
4325 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004326 "void f() {\n"
4327 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
4328 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
4329 " f();\n"
4330 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00004331 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004332 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004333}
4334
Daniel Jasper6728fc12013-04-11 14:29:13 +00004335TEST_F(FormatTest, BreaksFunctionDeclarations) {
4336 // Principially, we break function declarations in a certain order:
4337 // 1) break amongst arguments.
4338 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
4339 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004340 verifyFormat("template <class TemplateIt>\n"
4341 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
4342 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00004343
4344 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00004345 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004346 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004347 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004348 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004349
4350 // 3) break after (.
4351 verifyFormat(
4352 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00004353 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
4354 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004355
4356 // 4) break before after nested name specifiers.
4357 verifyFormat(
4358 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004359 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
4360 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004361 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004362
4363 // However, there are exceptions, if a sufficient amount of lines can be
4364 // saved.
4365 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
4366 // more adjusting.
4367 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4368 " Cccccccccccccc cccccccccc,\n"
4369 " Cccccccccccccc cccccccccc,\n"
4370 " Cccccccccccccc cccccccccc,\n"
4371 " Cccccccccccccc cccccccccc);");
4372 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004373 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004374 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4375 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4376 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004377 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004378 verifyFormat(
4379 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4380 " Cccccccccccccc cccccccccc,\n"
4381 " Cccccccccccccc cccccccccc,\n"
4382 " Cccccccccccccc cccccccccc,\n"
4383 " Cccccccccccccc cccccccccc,\n"
4384 " Cccccccccccccc cccccccccc,\n"
4385 " Cccccccccccccc cccccccccc);");
4386 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4387 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4388 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4389 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4390 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00004391
4392 // Break after multi-line parameters.
4393 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4394 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4395 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4396 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00004397 verifyFormat("void SomeLoooooooooooongFunction(\n"
4398 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
4399 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4400 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004401
4402 // Treat overloaded operators like other functions.
4403 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4404 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00004405 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4406 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00004407 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4408 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
4409 verifyGoogleFormat(
4410 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
4411 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004412 verifyGoogleFormat(
4413 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
4414 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00004415 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4416 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4417 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
4418 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00004419 verifyGoogleFormat(
4420 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
4421 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4422 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00004423 verifyGoogleFormat(
4424 "template <typename T>\n"
4425 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4426 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
4427 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00004428
4429 FormatStyle Style = getLLVMStyle();
4430 Style.PointerAlignment = FormatStyle::PAS_Left;
4431 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4432 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
4433 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004434 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
4435 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4436 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00004437}
4438
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004439TEST_F(FormatTest, TrailingReturnType) {
4440 verifyFormat("auto foo() -> int;\n");
4441 verifyFormat("struct S {\n"
4442 " auto bar() const -> int;\n"
4443 "};");
4444 verifyFormat("template <size_t Order, typename T>\n"
4445 "auto load_img(const std::string &filename)\n"
4446 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00004447 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
4448 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00004449 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00004450 verifyFormat("template <typename T>\n"
4451 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
4452 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00004453
4454 // Not trailing return types.
4455 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004456}
4457
Daniel Jasper5be31f72013-05-21 09:16:31 +00004458TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004459 // Avoid breaking before trailing 'const' or other trailing annotations, if
4460 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00004461 FormatStyle Style = getGoogleStyle();
4462 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00004463 verifyFormat("void someLongFunction(\n"
4464 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00004465 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00004466 verifyFormat("LoooooongReturnType\n"
4467 "someLoooooooongFunction() const {}",
4468 getLLVMStyleWithColumns(47));
4469 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
4470 " const {}",
4471 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004472 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4473 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
4474 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4475 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
4476 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4477 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00004478 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
4479 " aaaaaaaaaaa aaaaa) const override;");
4480 verifyGoogleFormat(
4481 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4482 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004483
Daniel Jasper5550de62014-02-17 07:57:46 +00004484 // Even if the first parameter has to be wrapped.
4485 verifyFormat("void someLongFunction(\n"
4486 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004487 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00004488 verifyFormat("void someLongFunction(\n"
4489 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004490 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00004491 verifyFormat("void someLongFunction(\n"
4492 " int someLongParameter) override {}",
4493 Style);
4494 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004495 " int someLongParameter) OVERRIDE {}",
4496 Style);
4497 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004498 " int someLongParameter) final {}",
4499 Style);
4500 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004501 " int someLongParameter) FINAL {}",
4502 Style);
4503 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004504 " int parameter) const override {}",
4505 Style);
4506
Daniel Jaspere3f907f2014-06-02 09:52:08 +00004507 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
4508 verifyFormat("void someLongFunction(\n"
4509 " int someLongParameter) const\n"
4510 "{\n"
4511 "}",
4512 Style);
4513
Daniel Jasper5550de62014-02-17 07:57:46 +00004514 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004515 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
4516 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4517 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00004518
4519 // Breaking before function-like trailing annotations is fine to keep them
4520 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00004521 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4522 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4523 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4524 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4525 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4526 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00004527 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4528 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00004529 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004530
4531 verifyFormat(
4532 "void aaaaaaaaaaaaaaaaaa()\n"
4533 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4534 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
4535 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4536 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004537 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004538 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004539 " GUARDED_BY(aaaaaaaaaaaa);");
4540 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004541 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004542 " GUARDED_BY(aaaaaaaaaaaa);");
4543 verifyGoogleFormat(
4544 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4545 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004546 verifyGoogleFormat(
4547 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4548 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004549}
4550
Daniel Jasperf090f032015-05-18 09:47:22 +00004551TEST_F(FormatTest, FunctionAnnotations) {
4552 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004553 "int OldFunction(const string &parameter) {}");
4554 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004555 "string OldFunction(const string &parameter) {}");
4556 verifyFormat("template <typename T>\n"
4557 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4558 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004559
4560 // Not function annotations.
4561 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4562 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004563 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4564 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004565 verifyFormat("MACRO(abc).function() // wrap\n"
4566 " << abc;");
4567 verifyFormat("MACRO(abc)->function() // wrap\n"
4568 " << abc;");
4569 verifyFormat("MACRO(abc)::function() // wrap\n"
4570 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004571}
4572
Daniel Jasperf7935112012-12-03 18:12:45 +00004573TEST_F(FormatTest, BreaksDesireably) {
4574 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4575 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004576 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004577 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4578 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4579 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004580
4581 verifyFormat(
4582 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004583 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004584
4585 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4586 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4587 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004588
4589 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004590 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4591 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4592 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004593 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4594 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004595
4596 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4597 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4598
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004599 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004600 "void f() {\n"
4601 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4602 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4603 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004604 verifyFormat(
4605 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4606 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4607 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004608 "aaaaaa(aaa,\n"
4609 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4610 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jaspera44991332015-04-29 13:06:49 +00004611 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4612 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4613 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004614
Daniel Jasper739b85f2015-06-29 10:42:59 +00004615 // Indent consistently independent of call expression and unary operator.
4616 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4617 " dddddddddddddddddddddddddddddd));");
4618 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4619 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004620 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004621 " dddddddddddddddddddddddddddddd));");
4622
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004623 // This test case breaks on an incorrect memoization, i.e. an optimization not
4624 // taking into account the StopAt value.
4625 verifyFormat(
4626 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004627 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4628 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4629 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004630
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004631 verifyFormat("{\n {\n {\n"
4632 " Annotation.SpaceRequiredBefore =\n"
4633 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4634 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4635 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004636
4637 // Break on an outer level if there was a break on an inner level.
4638 EXPECT_EQ("f(g(h(a, // comment\n"
4639 " b, c),\n"
4640 " d, e),\n"
4641 " x, y);",
4642 format("f(g(h(a, // comment\n"
4643 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004644
4645 // Prefer breaking similar line breaks.
4646 verifyFormat(
4647 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4648 " NSTrackingMouseEnteredAndExited |\n"
4649 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004650}
4651
Daniel Jasper18210d72014-10-09 09:52:05 +00004652TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4653 FormatStyle NoBinPacking = getGoogleStyle();
4654 NoBinPacking.BinPackParameters = false;
4655 NoBinPacking.BinPackArguments = true;
4656 verifyFormat("void f() {\n"
4657 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4658 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4659 "}",
4660 NoBinPacking);
4661 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4662 " int aaaaaaaaaaaaaaaaaaaa,\n"
4663 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4664 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004665
Daniel Jasper00693b082016-01-09 15:56:47 +00004666 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4667 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4668 " vector<int> bbbbbbbbbbbbbbb);",
4669 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004670 // FIXME: This behavior difference is probably not wanted. However, currently
4671 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4672 // template arguments from BreakBeforeParameter being set because of the
4673 // one-per-line formatting.
4674 verifyFormat(
4675 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4676 " aaaaaaaaaa> aaaaaaaaaa);",
4677 NoBinPacking);
4678 verifyFormat(
4679 "void fffffffffff(\n"
4680 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4681 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004682}
4683
Daniel Jasper9278eb92013-01-16 14:59:02 +00004684TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004685 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004686 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004687 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004688 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4689 " aaaaaaaaaaaaaaaaaaaa,\n"
4690 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4691 NoBinPacking);
4692 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4693 " aaaaaaaaaaaaa,\n"
4694 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4695 NoBinPacking);
4696 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004697 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4698 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4699 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4700 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004701 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4702 NoBinPacking);
4703 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4704 " .aaaaaaaaaaaaaaaaaa();",
4705 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004706 verifyFormat("void f() {\n"
4707 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4708 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4709 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004710 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004711
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004712 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004713 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4714 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004715 " aaaaaaaaaaaa);",
4716 NoBinPacking);
4717 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004718 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4719 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004720 " test);",
4721 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004722
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004723 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4724 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004725 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4726 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004727 NoBinPacking);
4728 verifyFormat("a(\"a\"\n"
4729 " \"a\",\n"
4730 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004731
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004732 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004733 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004734 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004735 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004736 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004737 verifyFormat(
4738 "void f() {\n"
4739 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4740 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004741 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004742 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004743 verifyFormat(
4744 "template <class SomeType, class SomeOtherType>\n"
4745 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4746 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004747}
4748
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004749TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4750 FormatStyle Style = getLLVMStyleWithColumns(15);
4751 Style.ExperimentalAutoDetectBinPacking = true;
4752 EXPECT_EQ("aaa(aaaa,\n"
4753 " aaaa,\n"
4754 " aaaa);\n"
4755 "aaa(aaaa,\n"
4756 " aaaa,\n"
4757 " aaaa);",
4758 format("aaa(aaaa,\n" // one-per-line
4759 " aaaa,\n"
4760 " aaaa );\n"
4761 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4762 Style));
4763 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4764 " aaaa);\n"
4765 "aaa(aaaa, aaaa,\n"
4766 " aaaa);",
4767 format("aaa(aaaa, aaaa,\n" // bin-packed
4768 " aaaa );\n"
4769 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4770 Style));
4771}
4772
Daniel Jasper04468962013-01-18 10:56:38 +00004773TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004774 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4775 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4776 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4777 " .StartsWith(\".init\", ORDER_INIT)\n"
4778 " .StartsWith(\".fini\", ORDER_FINI)\n"
4779 " .StartsWith(\".hash\", ORDER_HASH)\n"
4780 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004781
Daniel Jaspereb50c672013-02-15 20:33:06 +00004782 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004783 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004784 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004785 "aaaaaaa->aaaaaaa\n"
4786 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4787 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004788 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004789 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004790 "aaaaaaa->aaaaaaa\n"
4791 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4792 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4793 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004794 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004795 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004796 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004797 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4798 " aaaaaa->aaaaaaaaaaaa()\n"
4799 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004800 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004801 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004802 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004803 "void f() {\n"
4804 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004805 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004806 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004807 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004808 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004809 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004810 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004811 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004812 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004813 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004814 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004815 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004816
4817 verifyFormat(
4818 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4819 verifyFormat("aaaaaaaaaaaaaaa()\n"
4820 " .aaaaaaaaaaaaaaa()\n"
4821 " .aaaaaaaaaaaaaaa()\n"
4822 " .aaaaaaaaaaaaaaa()\n"
4823 " .aaaaaaaaaaaaaaa();");
4824 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4825 " .aaaaaaaaaaaaaaa()\n"
4826 " .aaaaaaaaaaaaaaa()\n"
4827 " .aaaaaaaaaaaaaaa();");
4828 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4829 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4830 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004831 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4832 " ->aaaaaaaaaaaaaae(0)\n"
4833 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004834
Daniel Jasper775954b2015-04-24 10:08:09 +00004835 // Don't linewrap after very short segments.
4836 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4837 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4838 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4839 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4840 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4841 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4842 verifyFormat("aaa()\n"
4843 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4844 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4845 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4846
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004847 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4848 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4849 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4850 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4851 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004852 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004853
Daniel Jaspera41aa532014-09-19 08:01:25 +00004854 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004855 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4856 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004857
4858 // Prefer not to create "hanging" indents.
4859 verifyFormat(
4860 "return !soooooooooooooome_map\n"
4861 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4862 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004863 verifyFormat(
4864 "return aaaaaaaaaaaaaaaa\n"
4865 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4866 " .aaaa(aaaaaaaaaaaaaa);");
4867 // No hanging indent here.
4868 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4869 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4870 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4871 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004872 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4873 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4874 getLLVMStyleWithColumns(60));
4875 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4876 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4877 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4878 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004879 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4880 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4881 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004882}
4883
Daniel Jasperde5c2072012-12-24 00:13:23 +00004884TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4885 verifyFormat(
4886 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004887 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004888 verifyFormat(
4889 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4890 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4891
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004892 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004893 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004894 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4895 " ccccccccccccccccccccccccc) {\n}");
4896
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004897 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004898 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004899 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4900 " ccccccccccccccccccccccccc) {\n}");
4901
Daniel Jasperde5c2072012-12-24 00:13:23 +00004902 verifyFormat(
4903 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004904 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004905 verifyFormat(
4906 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4907 " ccccccccccccccccccccccccc) {\n}");
4908
Daniel Jasper400adc62013-02-08 15:28:42 +00004909 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4910 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4911 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4912 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004913 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4914 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4915 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4916 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4917
Daniel Jasper400adc62013-02-08 15:28:42 +00004918 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4919 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4920 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004921 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4922 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4923 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004924}
4925
Daniel Jasper43b65482013-01-23 12:27:43 +00004926TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004927 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004928 "unsigned Cost =\n"
4929 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4930 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004931 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004932 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4933 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004934
4935 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004936 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4937 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004938 verifyFormat("unsigned OriginalStartColumn =\n"
4939 " SourceMgr.getSpellingColumnNumber(\n"
4940 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4941 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004942}
4943
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004944TEST_F(FormatTest, AlignsAfterAssignments) {
4945 verifyFormat(
4946 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004947 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004948 verifyFormat(
4949 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004950 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004951 verifyFormat(
4952 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004953 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004954 verifyFormat(
4955 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004956 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004957 verifyFormat(
4958 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4959 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4960 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004961}
4962
4963TEST_F(FormatTest, AlignsAfterReturn) {
4964 verifyFormat(
4965 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4966 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4967 verifyFormat(
4968 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4969 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004970 verifyFormat(
4971 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004972 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004973 verifyFormat(
4974 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004975 " aaaaaaaaaaaaaaaaaaaaaa());");
4976 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4977 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4978 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4979 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4980 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004981 verifyFormat("return\n"
4982 " // true if code is one of a or b.\n"
4983 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004984}
4985
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004986TEST_F(FormatTest, AlignsAfterOpenBracket) {
4987 verifyFormat(
4988 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4989 " aaaaaaaaa aaaaaaa) {}");
4990 verifyFormat(
4991 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4992 " aaaaaaaaaaa aaaaaaaaa);");
4993 verifyFormat(
4994 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4995 " aaaaaaaaaaaaaaaaaaaaa));");
4996 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004997 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004998 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4999 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
5000 Style);
5001 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5002 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
5003 Style);
5004 verifyFormat("SomeLongVariableName->someFunction(\n"
5005 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
5006 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005007 verifyFormat(
5008 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5009 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5010 Style);
5011 verifyFormat(
5012 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5013 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5014 Style);
5015 verifyFormat(
5016 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5017 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5018 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005019
Daniel Jasper2a9f7202016-02-08 09:52:54 +00005020 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
5021 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
5022 " b));",
5023 Style);
5024
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005025 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5026 Style.BinPackArguments = false;
5027 Style.BinPackParameters = false;
5028 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5029 " aaaaaaaaaaa aaaaaaaa,\n"
5030 " aaaaaaaaa aaaaaaa,\n"
5031 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5032 Style);
5033 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5034 " aaaaaaaaaaa aaaaaaaaa,\n"
5035 " aaaaaaaaaaa aaaaaaaaa,\n"
5036 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5037 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00005038 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
5039 " aaaaaaaaaaaaaaa,\n"
5040 " aaaaaaaaaaaaaaaaaaaaa,\n"
5041 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005042 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00005043 verifyFormat(
5044 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
5045 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5046 Style);
5047 verifyFormat(
5048 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
5049 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5050 Style);
5051 verifyFormat(
5052 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5053 " aaaaaaaaaaaaaaaaaaaaa(\n"
5054 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
5055 " aaaaaaaaaaaaaaaa);",
5056 Style);
5057 verifyFormat(
5058 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5059 " aaaaaaaaaaaaaaaaaaaaa(\n"
5060 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
5061 " aaaaaaaaaaaaaaaa);",
5062 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005063}
5064
Daniel Jasper3219e432014-12-02 13:24:51 +00005065TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
5066 FormatStyle Style = getLLVMStyleWithColumns(40);
5067 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5068 " bbbbbbbbbbbbbbbbbbbbbb);",
5069 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005070 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00005071 Style.AlignOperands = false;
5072 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5073 " bbbbbbbbbbbbbbbbbbbbbb);",
5074 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005075 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00005076 Style.AlignOperands = true;
5077 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5078 " bbbbbbbbbbbbbbbbbbbbbb);",
5079 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005080 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00005081 Style.AlignOperands = false;
5082 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5083 " bbbbbbbbbbbbbbbbbbbbbb);",
5084 Style);
5085}
5086
Daniel Jasper399d24b2013-01-09 07:06:56 +00005087TEST_F(FormatTest, BreaksConditionalExpressions) {
5088 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005089 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
5090 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5091 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00005092 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005093 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
5094 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5095 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005096 verifyFormat(
5097 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
5098 " : aaaaaaaaaaaaa);");
5099 verifyFormat(
5100 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00005101 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005102 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5103 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005104 verifyFormat(
5105 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5106 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5107 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005108 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5109 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5110 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5111 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5112 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5113 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5114 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5115 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5116 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5117 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5118 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5119 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005120 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5121 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5122 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5123 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5124 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00005125 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5126 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5127 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005128 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5129 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5130 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5131 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00005132 verifyFormat(
5133 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5134 " ? aaaaaaaaaaaaaaa\n"
5135 " : aaaaaaaaaaaaaaa;");
5136 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005137 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00005138 " ? b\n"
5139 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00005140 verifyFormat("return aaaa == bbbb\n"
5141 " // comment\n"
5142 " ? aaaa\n"
5143 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005144 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005145 " format(TheLine.First,\n"
5146 " IndentForLevel[TheLine.Level] >= 0\n"
5147 " ? IndentForLevel[TheLine.Level]\n"
5148 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005149 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005150 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00005151 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5152 " ? aaaaaaaaaaaaaaa\n"
5153 " : bbbbbbbbbbbbbbb //\n"
5154 " ? ccccccccccccccc\n"
5155 " : ddddddddddddddd;");
5156 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5157 " ? aaaaaaaaaaaaaaa\n"
5158 " : (bbbbbbbbbbbbbbb //\n"
5159 " ? ccccccccccccccc\n"
5160 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005161 verifyFormat(
5162 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5163 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5164 " aaaaaaaaaaaaaaaaaaaaa +\n"
5165 " aaaaaaaaaaaaaaaaaaaaa\n"
5166 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00005167 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005168 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5169 " : aaaaaaaaaaaaaaaaaaaaaa\n"
5170 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00005171
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005172 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00005173 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005174 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00005175 "void f() {\n"
5176 " g(aaa,\n"
5177 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5178 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5179 " ? aaaaaaaaaaaaaaa\n"
5180 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005181 "}",
5182 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005183 verifyFormat(
5184 "void f() {\n"
5185 " g(aaa,\n"
5186 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5187 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5188 " ?: aaaaaaaaaaaaaaa);\n"
5189 "}",
5190 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00005191
5192 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
5193 " // comment.\n"
5194 " ccccccccccccccccccccccccccccccccccccccc\n"
5195 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5196 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00005197
5198 // Assignments in conditional expressions. Apparently not uncommon :-(.
5199 verifyFormat("return a != b\n"
5200 " // comment\n"
5201 " ? a = b\n"
5202 " : a = b;");
5203 verifyFormat("return a != b\n"
5204 " // comment\n"
5205 " ? a = a != b\n"
5206 " // comment\n"
5207 " ? a = b\n"
5208 " : a\n"
5209 " : a;\n");
5210 verifyFormat("return a != b\n"
5211 " // comment\n"
5212 " ? a\n"
5213 " : a = a != b\n"
5214 " // comment\n"
5215 " ? a = b\n"
5216 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00005217}
5218
Daniel Jasper165b29e2013-11-08 00:57:11 +00005219TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
5220 FormatStyle Style = getLLVMStyle();
5221 Style.BreakBeforeTernaryOperators = false;
5222 Style.ColumnLimit = 70;
5223 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005224 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
5225 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5226 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005227 Style);
5228 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005229 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
5230 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5231 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005232 Style);
5233 verifyFormat(
5234 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
5235 " aaaaaaaaaaaaa);",
5236 Style);
5237 verifyFormat(
5238 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5239 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5240 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5241 " aaaaaaaaaaaaa);",
5242 Style);
5243 verifyFormat(
5244 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5245 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5246 " aaaaaaaaaaaaa);",
5247 Style);
5248 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5249 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5250 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5251 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5252 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5253 Style);
5254 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5255 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5256 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5257 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5258 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5259 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5260 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5261 Style);
5262 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5263 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
5264 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5265 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5266 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5267 Style);
5268 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5269 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5270 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5271 Style);
5272 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00005273 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00005274 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5275 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5276 Style);
5277 verifyFormat(
5278 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5279 " aaaaaaaaaaaaaaa :\n"
5280 " aaaaaaaaaaaaaaa;",
5281 Style);
5282 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5283 " aaaaaaaaa ?\n"
5284 " b :\n"
5285 " c);",
5286 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00005287 verifyFormat("unsigned Indent =\n"
5288 " format(TheLine.First,\n"
5289 " IndentForLevel[TheLine.Level] >= 0 ?\n"
5290 " IndentForLevel[TheLine.Level] :\n"
5291 " TheLine * 2,\n"
5292 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
5293 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005294 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5295 " aaaaaaaaaaaaaaa :\n"
5296 " bbbbbbbbbbbbbbb ? //\n"
5297 " ccccccccccccccc :\n"
5298 " ddddddddddddddd;",
5299 Style);
5300 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5301 " aaaaaaaaaaaaaaa :\n"
5302 " (bbbbbbbbbbbbbbb ? //\n"
5303 " ccccccccccccccc :\n"
5304 " ddddddddddddddd);",
5305 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00005306 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5307 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
5308 " ccccccccccccccccccccccccccc;",
5309 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00005310 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5311 " aaaaa :\n"
5312 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
5313 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005314}
5315
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005316TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
5317 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
5318 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
5319 verifyFormat("bool a = true, b = false;");
5320
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005321 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005322 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005323 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00005324 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005325 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00005326 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005327 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00005328 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00005329 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
5330 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
5331 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5332 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
5333 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
5334 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005335
Daniel Jasperbea1ab42015-03-01 18:55:26 +00005336 FormatStyle Style = getGoogleStyle();
5337 Style.PointerAlignment = FormatStyle::PAS_Left;
5338 Style.DerivePointerAlignment = false;
5339 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5340 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
5341 " *b = bbbbbbbbbbbbbbbbbbb;",
5342 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00005343 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5344 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
5345 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00005346 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00005347 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005348}
5349
Nico Weber4a5030c2013-01-12 01:28:06 +00005350TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
5351 verifyFormat("arr[foo ? bar : baz];");
5352 verifyFormat("f()[foo ? bar : baz];");
5353 verifyFormat("(a + b)[foo ? bar : baz];");
5354 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
5355}
5356
Daniel Jasperf7935112012-12-03 18:12:45 +00005357TEST_F(FormatTest, AlignsStringLiterals) {
5358 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
5359 " \"short literal\");");
5360 verifyFormat(
5361 "looooooooooooooooooooooooongFunction(\n"
5362 " \"short literal\"\n"
5363 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005364 verifyFormat("someFunction(\"Always break between multi-line\"\n"
5365 " \" string literals\",\n"
5366 " and, other, parameters);");
Daniel Jasper240527c2017-01-16 13:13:15 +00005367 EXPECT_EQ("fun +\n"
5368 " \"1243\" /* comment */\n"
5369 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005370 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00005371 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005372 getLLVMStyleWithColumns(28)));
5373 EXPECT_EQ(
5374 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5375 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
5376 " \"aaaaaaaaaaaaaaaa\";",
5377 format("aaaaaa ="
5378 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
5379 "aaaaaaaaaaaaaaaaaaaaa\" "
5380 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper240527c2017-01-16 13:13:15 +00005381 verifyFormat("a = a +\n"
5382 " \"a\"\n"
5383 " \"a\"\n"
5384 " \"a\";");
5385 verifyFormat("f(\"a\",\n"
5386 " \"b\"\n"
5387 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005388
5389 verifyFormat(
5390 "#define LL_FORMAT \"ll\"\n"
5391 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
5392 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00005393
5394 verifyFormat("#define A(X) \\\n"
5395 " \"aaaaa\" #X \"bbbbbb\" \\\n"
5396 " \"ccccc\"",
5397 getLLVMStyleWithColumns(23));
5398 verifyFormat("#define A \"def\"\n"
5399 "f(\"abc\" A \"ghi\"\n"
5400 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005401
5402 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005403 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005404 verifyFormat("#define A(X) \\\n"
5405 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
5406 " L\"ccccc\"",
5407 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00005408
5409 verifyFormat("f(@\"a\"\n"
5410 " @\"b\");");
5411 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00005412 " @\"b\"\n"
5413 " @\"c\";");
5414 verifyFormat("NSString s = @\"a\"\n"
5415 " \"b\"\n"
5416 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00005417}
5418
Zachary Turner448592e2015-12-18 22:20:15 +00005419TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005420 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005421 // No declarations or definitions should be moved to own line.
5422 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
5423 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005424 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005425 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005426 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005427 "int f() { return 1; }\n"
5428 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005429 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00005430
5431 // All declarations and definitions should have the return type moved to its
5432 // own
5433 // line.
5434 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
5435 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005436 " int\n"
5437 " f() {\n"
5438 " return 1;\n"
5439 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005440 " int\n"
5441 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005442 "};\n"
5443 "int\n"
5444 "f() {\n"
5445 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005446 "}\n"
5447 "int\n"
5448 "g();\n",
5449 Style);
5450
5451 // Top-level definitions, and no kinds of declarations should have the
5452 // return type moved to its own line.
5453 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
5454 verifyFormat("class B {\n"
5455 " int f() { return 1; }\n"
5456 " int g();\n"
5457 "};\n"
5458 "int\n"
5459 "f() {\n"
5460 " return 1;\n"
5461 "}\n"
5462 "int g();\n",
5463 Style);
5464
5465 // Top-level definitions and declarations should have the return type moved
5466 // to its own line.
5467 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
5468 verifyFormat("class C {\n"
5469 " int f() { return 1; }\n"
5470 " int g();\n"
5471 "};\n"
5472 "int\n"
5473 "f() {\n"
5474 " return 1;\n"
5475 "}\n"
5476 "int\n"
5477 "g();\n",
5478 Style);
5479
5480 // All definitions should have the return type moved to its own line, but no
5481 // kinds of declarations.
5482 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5483 verifyFormat("class D {\n"
5484 " int\n"
5485 " f() {\n"
5486 " return 1;\n"
5487 " }\n"
5488 " int g();\n"
5489 "};\n"
5490 "int\n"
5491 "f() {\n"
5492 " return 1;\n"
5493 "}\n"
5494 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005495 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005496 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005497 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005498 " return \"\";\n"
5499 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005500 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005501 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005502 verifyFormat("template <class T>\n"
5503 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005504 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005505 " return NULL;\n"
5506 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005507 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005508 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00005509 verifyFormat("class C {\n"
5510 " int\n"
5511 " operator+() {\n"
5512 " return 1;\n"
5513 " }\n"
5514 " int\n"
5515 " operator()() {\n"
5516 " return 1;\n"
5517 " }\n"
5518 "};\n",
5519 Style);
5520 verifyFormat("void\n"
5521 "A::operator()() {}\n"
5522 "void\n"
5523 "A::operator>>() {}\n"
5524 "void\n"
5525 "A::operator+() {}\n",
5526 Style);
5527 verifyFormat("void *operator new(std::size_t s);", // No break here.
5528 Style);
5529 verifyFormat("void *\n"
5530 "operator new(std::size_t s) {}",
5531 Style);
5532 verifyFormat("void *\n"
5533 "operator delete[](void *ptr) {}",
5534 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005535 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005536 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005537 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005538 "{\n"
5539 " return \"\";\n"
5540 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005541 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005542 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005543 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005544 "T *\n" // Problem here: no line break
5545 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005546 "{\n"
5547 " return NULL;\n"
5548 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005549 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005550 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005551}
5552
Alexander Kornienko58611712013-07-04 12:02:44 +00005553TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5554 FormatStyle NoBreak = getLLVMStyle();
5555 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5556 FormatStyle Break = getLLVMStyle();
5557 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005558 verifyFormat("aaaa = \"bbbb\"\n"
5559 " \"cccc\";",
5560 NoBreak);
5561 verifyFormat("aaaa =\n"
5562 " \"bbbb\"\n"
5563 " \"cccc\";",
5564 Break);
5565 verifyFormat("aaaa(\"bbbb\"\n"
5566 " \"cccc\");",
5567 NoBreak);
5568 verifyFormat("aaaa(\n"
5569 " \"bbbb\"\n"
5570 " \"cccc\");",
5571 Break);
Daniel Jasper240527c2017-01-16 13:13:15 +00005572 verifyFormat("aaaa(qqq,\n"
5573 " \"bbbb\"\n"
5574 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005575 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005576 verifyFormat("aaaa(qqq,\n"
5577 " \"bbbb\"\n"
5578 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005579 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005580 verifyFormat("aaaa(qqq,\n"
5581 " L\"bbbb\"\n"
5582 " L\"cccc\");",
5583 Break);
Daniel Jasper240527c2017-01-16 13:13:15 +00005584 verifyFormat("aaaaa(aaaaaa,\n"
5585 " aaaaaaa(\"aaaa\"\n"
5586 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005587 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005588 verifyFormat("string s = someFunction(\n"
5589 " \"abc\"\n"
5590 " \"abc\");",
5591 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005592
Daniel Jasper3251fff2014-06-10 06:27:23 +00005593 // As we break before unary operators, breaking right after them is bad.
5594 verifyFormat("string foo = abc ? \"x\"\n"
5595 " \"blah blah blah blah blah blah\"\n"
5596 " : \"y\";",
5597 Break);
5598
Daniel Jasperc834c702013-07-17 15:38:19 +00005599 // Don't break if there is no column gain.
5600 verifyFormat("f(\"aaaa\"\n"
5601 " \"bbbb\");",
5602 Break);
5603
5604 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005605 EXPECT_EQ("x = \"a\\\n"
5606 "b\\\n"
5607 "c\";",
5608 format("x = \"a\\\n"
5609 "b\\\n"
5610 "c\";",
5611 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005612 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005613 " \"a\\\n"
5614 "b\\\n"
5615 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005616 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005617 "b\\\n"
5618 "c\";",
5619 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005620
5621 // Exempt ObjC strings for now.
5622 EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005623 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005624 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005625 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005626 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005627
5628 Break.ColumnLimit = 0;
5629 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005630}
5631
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005632TEST_F(FormatTest, AlignsPipes) {
5633 verifyFormat(
5634 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5635 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5636 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5637 verifyFormat(
5638 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5639 " << aaaaaaaaaaaaaaaaaaaa;");
5640 verifyFormat(
5641 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5642 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5643 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005644 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5645 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5646 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005647 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5648 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5649 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5650 verifyFormat(
5651 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5652 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5653 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005654 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5655 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5656 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5657 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005658 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5659 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005660 verifyFormat(
5661 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5662 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005663
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005664 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5665 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005666 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5667 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5668 " aaaaaaaaaaaaaaaaaaaaa)\n"
5669 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005670 verifyFormat("LOG_IF(aaa == //\n"
5671 " bbb)\n"
5672 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005673
Daniel Jasper467ddb12013-08-12 12:58:05 +00005674 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005675 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5676 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005677 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5678 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5679 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005680 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5681 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005682 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5683 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5684 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5685 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5686 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5687 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5688 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005689
Daniel Jasperc238c872013-04-02 14:33:13 +00005690 verifyFormat(
5691 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5692 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005693
5694 // Incomplete string literal.
5695 EXPECT_EQ("llvm::errs() << \"\n"
5696 " << a;",
5697 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005698
5699 verifyFormat("void f() {\n"
5700 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5701 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5702 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005703
5704 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005705 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5706 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5707 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005708
5709 // Handle '\n'.
5710 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5711 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5712 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5713 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5714 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5715 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5716 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005717}
5718
Daniel Jasper7209bb92016-12-13 11:16:42 +00005719TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5720 verifyFormat("return out << \"somepacket = {\\n\"\n"
5721 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5722 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5723 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5724 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5725 " << \"}\";");
5726
5727 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5728 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5729 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5730 verifyFormat(
5731 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5732 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5733 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5734 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5735 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5736 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5737 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5738 verifyFormat(
5739 "void f() {\n"
5740 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5741 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5742 "}");
5743
5744 // Breaking before the first "<<" is generally not desirable.
5745 verifyFormat(
5746 "llvm::errs()\n"
5747 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5748 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5749 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5750 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5751 getLLVMStyleWithColumns(70));
5752 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5753 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5754 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5755 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5756 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5757 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5758 getLLVMStyleWithColumns(70));
5759
5760 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5761 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5762 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5763 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5764 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5765 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005766 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5767 " (aaaa + aaaa);",
5768 getLLVMStyleWithColumns(40));
5769 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5770 " (aaaaaaa + aaaaa));",
5771 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005772 verifyFormat(
5773 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5774 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5775 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005776}
5777
Daniel Jasperf7935112012-12-03 18:12:45 +00005778TEST_F(FormatTest, UnderstandsEquals) {
5779 verifyFormat(
5780 "aaaaaaaaaaaaaaaaa =\n"
5781 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5782 verifyFormat(
5783 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005784 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005785 verifyFormat(
5786 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005787 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005788 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005789 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5790 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005791
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005792 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5793 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005794}
5795
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005796TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005797 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5798 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005799
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005800 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5801 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005802
5803 verifyFormat(
5804 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5805 " Parameter2);");
5806
5807 verifyFormat(
5808 "ShortObject->shortFunction(\n"
5809 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5810 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5811
5812 verifyFormat("loooooooooooooongFunction(\n"
5813 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5814
5815 verifyFormat(
5816 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5817 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5818
Daniel Jasper687af3b2013-02-14 14:26:07 +00005819 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5820 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005821 verifyFormat("void f() {\n"
5822 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5823 " .Times(2)\n"
5824 " .WillRepeatedly(Return(SomeValue));\n"
5825 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005826 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5827 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005828 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005829 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5830 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005831 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005832 verifyFormat("void f() {\n"
5833 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5834 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5835 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005836 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5837 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5838 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5839 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5840 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005841 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5842 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5843 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5844 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5845 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005846
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005847 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005848 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005849 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005850 verifyFormat(
5851 "aaaaaaaaaaa->aaaaaaaaa(\n"
5852 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5853 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005854
5855 verifyFormat(
5856 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5857 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005858 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5859 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5860 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5861 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005862
Daniel Jasper9b334242013-03-15 14:57:30 +00005863 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005864 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5865 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005866
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005867 FormatStyle NoBinPacking = getLLVMStyle();
5868 NoBinPacking.BinPackParameters = false;
5869 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5870 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5871 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5872 " aaaaaaaaaaaaaaaaaaa,\n"
5873 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5874 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005875
5876 // If there is a subsequent call, change to hanging indentation.
5877 verifyFormat(
5878 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5879 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5880 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5881 verifyFormat(
5882 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5883 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005884 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5885 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5886 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5887 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5888 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5889 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005890}
5891
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005892TEST_F(FormatTest, WrapsTemplateDeclarations) {
5893 verifyFormat("template <typename T>\n"
5894 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005895 verifyFormat("template <typename T>\n"
5896 "// T should be one of {A, B}.\n"
5897 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005898 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005899 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005900 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005901 verifyFormat("template <typename T>\n"
5902 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5903 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005904 verifyFormat(
5905 "template <typename T>\n"
5906 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5907 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005908 verifyFormat(
5909 "template <typename T>\n"
5910 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5911 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5912 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005913 verifyFormat("template <typename T>\n"
5914 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005915 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005916 verifyFormat(
5917 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5918 " typename T4 = char>\n"
5919 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005920 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5921 " template <typename> class cccccccccccccccccccccc,\n"
5922 " typename ddddddddddddd>\n"
5923 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005924 verifyFormat(
5925 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5926 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005927
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005928 verifyFormat("void f() {\n"
5929 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5930 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5931 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005932
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005933 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005934 verifyFormat("template <typename T> void f();");
5935 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005936 verifyFormat(
5937 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5938 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5939 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5940 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5941 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5942 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5943 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5944 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005945 EXPECT_EQ("static_cast<A< //\n"
5946 " B> *>(\n"
5947 "\n"
5948 " );",
5949 format("static_cast<A<//\n"
5950 " B>*>(\n"
5951 "\n"
5952 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005953 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5954 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005955
5956 FormatStyle AlwaysBreak = getLLVMStyle();
5957 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5958 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5959 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5960 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5961 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5962 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5963 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5964 verifyFormat("template <template <typename> class Fooooooo,\n"
5965 " template <typename> class Baaaaaaar>\n"
5966 "struct C {};",
5967 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005968 verifyFormat("template <typename T> // T can be A, B or C.\n"
5969 "struct C {};",
5970 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005971 verifyFormat("template <enum E> class A {\n"
5972 "public:\n"
5973 " E *f();\n"
5974 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005975}
5976
Daniel Jasper45797022013-01-25 10:57:27 +00005977TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5978 verifyFormat(
5979 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5980 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5981 verifyFormat(
5982 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5983 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5984 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5985
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005986 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005987 verifyFormat(
5988 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5989 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005990 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005991
Daniel Jasper45797022013-01-25 10:57:27 +00005992 verifyFormat(
5993 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005994 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005995
5996 // Breaking at nested name specifiers is generally not desirable.
5997 verifyFormat(
5998 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5999 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00006000
6001 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00006002 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
6003 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6004 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00006005 " aaaaaaaaaaaaaaaaaaaaa);",
6006 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00006007
6008 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6009 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6010 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00006011}
6012
Daniel Jasperf7935112012-12-03 18:12:45 +00006013TEST_F(FormatTest, UnderstandsTemplateParameters) {
6014 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006015 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006016 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
6017 verifyFormat("bool x = a < 1 || 2 > a;");
6018 verifyFormat("bool x = 5 < f<int>();");
6019 verifyFormat("bool x = f<int>() > 5;");
6020 verifyFormat("bool x = 5 < a<int>::x;");
6021 verifyFormat("bool x = a < 4 ? a > 2 : false;");
6022 verifyFormat("bool x = f() ? a < 2 : a > 2;");
6023
6024 verifyGoogleFormat("A<A<int>> a;");
6025 verifyGoogleFormat("A<A<A<int>>> a;");
6026 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006027 verifyGoogleFormat("A<A<int> > a;");
6028 verifyGoogleFormat("A<A<A<int> > > a;");
6029 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00006030 verifyGoogleFormat("A<::A<int>> a;");
6031 verifyGoogleFormat("A<::A> a;");
6032 verifyGoogleFormat("A< ::A> a;");
6033 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006034 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
6035 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00006036 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
6037 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006038 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
6039 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006040
Nico Weber7533b4d2014-09-24 17:17:32 +00006041 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
6042
Daniel Jasperf7935112012-12-03 18:12:45 +00006043 verifyFormat("test >> a >> b;");
6044 verifyFormat("test << a >> b;");
6045
6046 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006047 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00006048 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00006049 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
6050 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00006051 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00006052 verifyFormat("f(a.operator()<A>());");
6053 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6054 " .template operator()<A>());",
6055 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00006056
6057 // Not template parameters.
6058 verifyFormat("return a < b && c > d;");
6059 verifyFormat("void f() {\n"
6060 " while (a < b && c > d) {\n"
6061 " }\n"
6062 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006063 verifyFormat("template <typename... Types>\n"
6064 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00006065
6066 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6067 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
6068 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00006069 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00006070 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00006071 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00006072}
6073
Malcolm Parsons6af3f142016-11-03 16:57:30 +00006074TEST_F(FormatTest, BitshiftOperatorWidth) {
6075 EXPECT_EQ("int a = 1 << 2; /* foo\n"
6076 " bar */",
6077 format("int a=1<<2; /* foo\n"
6078 " bar */"));
6079
6080 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
6081 " bar */",
6082 format("int b =256>>1 ; /* foo\n"
6083 " bar */"));
6084}
6085
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006086TEST_F(FormatTest, UnderstandsBinaryOperators) {
6087 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00006088 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00006089}
6090
6091TEST_F(FormatTest, UnderstandsPointersToMembers) {
6092 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006093 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006094 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006095 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006096 verifyFormat("void f() {\n"
6097 " (a->*f)();\n"
6098 " a->*x;\n"
6099 " (a.*f)();\n"
6100 " ((*a).*f)();\n"
6101 " a.*x;\n"
6102 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00006103 verifyFormat("void f() {\n"
6104 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
6105 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
6106 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00006107 verifyFormat(
6108 "(aaaaaaaaaa->*bbbbbbb)(\n"
6109 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006110 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006111 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006112 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006113}
6114
Daniel Jasper8dd40472012-12-21 09:41:31 +00006115TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00006116 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00006117 verifyFormat("f(-1, -2, -3);");
6118 verifyFormat("a[-1] = 5;");
6119 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006120 verifyFormat("if (i == -1) {\n}");
6121 verifyFormat("if (i != -1) {\n}");
6122 verifyFormat("if (i > -1) {\n}");
6123 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00006124 verifyFormat("++(a->f());");
6125 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00006126 verifyFormat("(a->f())++;");
6127 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006128 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00006129
6130 verifyFormat("a-- > b;");
6131 verifyFormat("b ? -a : c;");
6132 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006133 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00006134 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006135 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00006136
6137 verifyFormat("return -1;");
6138 verifyFormat("switch (a) {\n"
6139 "case -1:\n"
6140 " break;\n"
6141 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00006142 verifyFormat("#define X -1");
6143 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00006144
Chandler Carruthf8b72662014-03-02 12:37:31 +00006145 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
6146 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00006147
6148 verifyFormat("int a = /* confusing comment */ -1;");
6149 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
6150 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006151}
6152
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006153TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00006154 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006155 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00006156 "}");
6157 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00006158 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00006159 verifyFormat("*aaa = aaaaaaa( // break\n"
6160 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00006161}
6162
Daniel Jasper8863ada2013-08-26 08:10:17 +00006163TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00006164 verifyFormat("bool operator<();");
6165 verifyFormat("bool operator>();");
6166 verifyFormat("bool operator=();");
6167 verifyFormat("bool operator==();");
6168 verifyFormat("bool operator!=();");
6169 verifyFormat("int operator+();");
6170 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00006171 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006172 verifyFormat("bool operator();");
6173 verifyFormat("bool operator()();");
6174 verifyFormat("bool operator[]();");
6175 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006176 verifyFormat("operator int();");
6177 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006178 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006179 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006180 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006181 verifyFormat("void *operator new(std::size_t size);");
6182 verifyFormat("void *operator new[](std::size_t size);");
6183 verifyFormat("void operator delete(void *ptr);");
6184 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00006185 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
6186 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00006187 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00006188 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006189
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006190 verifyFormat(
6191 "ostream &operator<<(ostream &OutputStream,\n"
6192 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00006193 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
6194 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
6195 " return left.group < right.group;\n"
6196 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00006197 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00006198 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006199
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006200 verifyGoogleFormat("operator void*();");
6201 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00006202 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00006203
6204 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00006205 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
6206 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006207}
6208
Daniel Jasper1c220482015-02-25 10:30:06 +00006209TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00006210 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
6211 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
6212 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
6213 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
6214 verifyFormat("Deleted &operator=(const Deleted &) &;");
6215 verifyFormat("Deleted &operator=(const Deleted &) &&;");
6216 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
6217 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
6218 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
6219 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
6220 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00006221 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00006222 verifyFormat("template <typename T>\n"
6223 "void F(T) && = delete;",
6224 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00006225
Daniel Jasperaf642c62015-08-25 13:40:51 +00006226 FormatStyle AlignLeft = getLLVMStyle();
6227 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00006228 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00006229 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
6230 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
6231 AlignLeft);
6232 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
6233 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006234 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
6235 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
6236 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
6237 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00006238 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00006239
6240 FormatStyle Spaces = getLLVMStyle();
6241 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006242 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
6243 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
6244 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
6245 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006246
6247 Spaces.SpacesInCStyleCastParentheses = false;
6248 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006249 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
6250 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
6251 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
6252 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006253}
6254
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006255TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00006256 verifyFormat("void f() {\n"
6257 " A *a = new A;\n"
6258 " A *a = new (placement) A;\n"
6259 " delete a;\n"
6260 " delete (A *)a;\n"
6261 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00006262 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6263 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00006264 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6265 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6266 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00006267 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006268}
6269
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006270TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006271 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006272 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006273 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006274 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006275 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006276 verifyIndependentOfContext("int a = b * 10;");
6277 verifyIndependentOfContext("int a = 10 * b;");
6278 verifyIndependentOfContext("int a = b * c;");
6279 verifyIndependentOfContext("int a += b * c;");
6280 verifyIndependentOfContext("int a -= b * c;");
6281 verifyIndependentOfContext("int a *= b * c;");
6282 verifyIndependentOfContext("int a /= b * c;");
6283 verifyIndependentOfContext("int a = *b;");
6284 verifyIndependentOfContext("int a = *b * c;");
6285 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00006286 verifyIndependentOfContext("int a = b * (10);");
6287 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006288 verifyIndependentOfContext("return 10 * b;");
6289 verifyIndependentOfContext("return *b * *c;");
6290 verifyIndependentOfContext("return a & ~b;");
6291 verifyIndependentOfContext("f(b ? *c : *d);");
6292 verifyIndependentOfContext("int a = b ? *c : *d;");
6293 verifyIndependentOfContext("*b = a;");
6294 verifyIndependentOfContext("a * ~b;");
6295 verifyIndependentOfContext("a * !b;");
6296 verifyIndependentOfContext("a * +b;");
6297 verifyIndependentOfContext("a * -b;");
6298 verifyIndependentOfContext("a * ++b;");
6299 verifyIndependentOfContext("a * --b;");
6300 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00006301 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006302 verifyIndependentOfContext("f() * b;");
6303 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006304 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006305 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00006306 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006307 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00006308 verifyIndependentOfContext("return sizeof(int **);");
6309 verifyIndependentOfContext("return sizeof(int ******);");
6310 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00006311 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006312 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00006313 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00006314 verifyGoogleFormat("return sizeof(int**);");
6315 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
6316 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006317 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00006318 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00006319 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00006320 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00006321 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00006322 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00006323 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00006324 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00006325 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00006326 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00006327 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00006328 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00006329 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00006330 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00006331 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00006332 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00006333 verifyFormat("void f(const MyOverride &override);");
6334 verifyFormat("void f(const MyFinal &final);");
6335 verifyIndependentOfContext("bool a = f() && override.f();");
6336 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00006337
Daniel Jasper5b49f472013-01-23 12:10:53 +00006338 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00006339
Daniel Jasper5b49f472013-01-23 12:10:53 +00006340 verifyIndependentOfContext("A<int *> a;");
6341 verifyIndependentOfContext("A<int **> a;");
6342 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00006343 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006344 verifyIndependentOfContext(
6345 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006346 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00006347 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00006348 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00006349 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00006350 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00006351
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00006352 verifyFormat(
6353 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6354 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6355
Daniel Jasper1f5d6372016-06-13 14:45:12 +00006356 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00006357 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00006358 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006359 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00006360 verifyGoogleFormat("A<int*> a;");
6361 verifyGoogleFormat("A<int**> a;");
6362 verifyGoogleFormat("A<int*, int*> a;");
6363 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006364 verifyGoogleFormat("f(b ? *c : *d);");
6365 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00006366 verifyGoogleFormat("Type* t = **x;");
6367 verifyGoogleFormat("Type* t = *++*x;");
6368 verifyGoogleFormat("*++*x;");
6369 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
6370 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006371 verifyGoogleFormat(
6372 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00006373 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00006374 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
6375 verifyGoogleFormat("template <typename T>\n"
6376 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00006377
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006378 FormatStyle Left = getLLVMStyle();
6379 Left.PointerAlignment = FormatStyle::PAS_Left;
6380 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00006381 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00006382 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006383
Daniel Jasper5b49f472013-01-23 12:10:53 +00006384 verifyIndependentOfContext("a = *(x + y);");
6385 verifyIndependentOfContext("a = &(x + y);");
6386 verifyIndependentOfContext("*(x + y).call();");
6387 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006388 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00006389
Daniel Jasper5b49f472013-01-23 12:10:53 +00006390 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00006391 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00006392 "int *MyValues = {\n"
6393 " *A, // Operator detection might be confused by the '{'\n"
6394 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00006395 "};");
Nico Weber80a82762013-01-17 17:17:19 +00006396
Daniel Jasper5b49f472013-01-23 12:10:53 +00006397 verifyIndependentOfContext("if (int *a = &b)");
6398 verifyIndependentOfContext("if (int &a = *b)");
6399 verifyIndependentOfContext("if (a & b[i])");
6400 verifyIndependentOfContext("if (a::b::c::d & b[i])");
6401 verifyIndependentOfContext("if (*b[i])");
6402 verifyIndependentOfContext("if (int *a = (&b))");
6403 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00006404 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00006405 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00006406 verifyFormat("void f() {\n"
6407 " for (const int &v : Values) {\n"
6408 " }\n"
6409 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006410 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
6411 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00006412 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00006413
Daniel Jaspera98da3d2013-11-07 19:56:07 +00006414 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006415 verifyFormat("#define MACRO \\\n"
6416 " int *i = a * b; \\\n"
6417 " void f(a *b);",
6418 getLLVMStyleWithColumns(19));
6419
Daniel Jasper97b89482013-03-13 07:49:51 +00006420 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006421 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006422 verifyIndependentOfContext("T **t = new T *;");
6423 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00006424 verifyGoogleFormat("A = new SomeType*[Length]();");
6425 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006426 verifyGoogleFormat("T** t = new T*;");
6427 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006428
Daniel Jasper990ff972013-05-07 14:17:18 +00006429 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006430 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00006431 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00006432 verifyFormat("STATIC_ASSERT((a & b) == 0);");
6433 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006434 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006435 "typename t::if<x && y>::type f() {}");
6436 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006437 verifyFormat("vector<int *> v;");
6438 verifyFormat("vector<int *const> v;");
6439 verifyFormat("vector<int *const **const *> v;");
6440 verifyFormat("vector<int *volatile> v;");
6441 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006442 verifyFormat("foo<b && false>();");
6443 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00006444 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00006445 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00006446 "template <class T,\n"
6447 " class = typename std::enable_if<\n"
6448 " std::is_integral<T>::value &&\n"
6449 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006450 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00006451 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006452 verifyFormat(
6453 "template <class T,\n"
6454 " class = typename ::std::enable_if<\n"
6455 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6456 "void F();",
6457 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006458
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006459 verifyIndependentOfContext("MACRO(int *i);");
6460 verifyIndependentOfContext("MACRO(auto *a);");
6461 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006462 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006463 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006464 // FIXME: Is there a way to make this work?
6465 // verifyIndependentOfContext("MACRO(A *a);");
6466
Daniel Jasper32ccb032014-06-23 07:36:18 +00006467 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006468 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006469
Daniel Jasper866468a2014-04-14 13:15:29 +00006470 EXPECT_EQ("#define OP(x) \\\n"
6471 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6472 " return s << a.DebugString(); \\\n"
6473 " }",
6474 format("#define OP(x) \\\n"
6475 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6476 " return s << a.DebugString(); \\\n"
6477 " }",
6478 getLLVMStyleWithColumns(50)));
6479
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006480 // FIXME: We cannot handle this case yet; we might be able to figure out that
6481 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006482 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006483
6484 FormatStyle PointerMiddle = getLLVMStyle();
6485 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6486 verifyFormat("delete *x;", PointerMiddle);
6487 verifyFormat("int * x;", PointerMiddle);
6488 verifyFormat("template <int * y> f() {}", PointerMiddle);
6489 verifyFormat("int * f(int * a) {}", PointerMiddle);
6490 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6491 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6492 verifyFormat("A<int *> a;", PointerMiddle);
6493 verifyFormat("A<int **> a;", PointerMiddle);
6494 verifyFormat("A<int *, int *> a;", PointerMiddle);
6495 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006496 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6497 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006498 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006499
6500 // Member function reference qualifiers aren't binary operators.
6501 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006502 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006503 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006504 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006505 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006506 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006507}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006508
Daniel Jasperee6d6502013-07-17 20:25:02 +00006509TEST_F(FormatTest, UnderstandsAttributes) {
6510 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006511 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6512 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006513 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006514 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006515 verifyFormat("__attribute__((nodebug)) void\n"
6516 "foo() {}\n",
6517 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006518}
6519
Daniel Jasper10cd5812013-05-06 06:35:44 +00006520TEST_F(FormatTest, UnderstandsEllipsis) {
6521 verifyFormat("int printf(const char *fmt, ...);");
6522 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006523 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6524
6525 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006526 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006527 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006528}
6529
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006530TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006531 EXPECT_EQ("int *a;\n"
6532 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006533 "int *a;",
6534 format("int *a;\n"
6535 "int* a;\n"
6536 "int *a;",
6537 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006538 EXPECT_EQ("int* a;\n"
6539 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006540 "int* a;",
6541 format("int* a;\n"
6542 "int* a;\n"
6543 "int *a;",
6544 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006545 EXPECT_EQ("int *a;\n"
6546 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006547 "int *a;",
6548 format("int *a;\n"
6549 "int * a;\n"
6550 "int * a;",
6551 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006552 EXPECT_EQ("auto x = [] {\n"
6553 " int *a;\n"
6554 " int *a;\n"
6555 " int *a;\n"
6556 "};",
6557 format("auto x=[]{int *a;\n"
6558 "int * a;\n"
6559 "int * a;};",
6560 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006561}
6562
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006563TEST_F(FormatTest, UnderstandsRvalueReferences) {
6564 verifyFormat("int f(int &&a) {}");
6565 verifyFormat("int f(int a, char &&b) {}");
6566 verifyFormat("void f() { int &&a = b; }");
6567 verifyGoogleFormat("int f(int a, char&& b) {}");
6568 verifyGoogleFormat("void f() { int&& a = b; }");
6569
Daniel Jasper1eff9082013-05-27 16:36:33 +00006570 verifyIndependentOfContext("A<int &&> a;");
6571 verifyIndependentOfContext("A<int &&, int &&> a;");
6572 verifyGoogleFormat("A<int&&> a;");
6573 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006574
6575 // Not rvalue references:
6576 verifyFormat("template <bool B, bool C> class A {\n"
6577 " static_assert(B && C, \"Something is wrong\");\n"
6578 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006579 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6580 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006581 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006582}
6583
Manuel Klimekc1237a82013-01-23 14:08:21 +00006584TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6585 verifyFormat("void f() {\n"
6586 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006587 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006588 "}",
6589 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006590}
6591
Daniel Jasperef906a92013-01-13 08:01:36 +00006592TEST_F(FormatTest, FormatsCasts) {
6593 verifyFormat("Type *A = static_cast<Type *>(P);");
6594 verifyFormat("Type *A = (Type *)P;");
6595 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6596 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006597 verifyFormat("int a = (int)2.0f;");
6598 verifyFormat("x[(int32)y];");
6599 verifyFormat("x = (int32)y;");
6600 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6601 verifyFormat("int a = (int)*b;");
6602 verifyFormat("int a = (int)2.0f;");
6603 verifyFormat("int a = (int)~0;");
6604 verifyFormat("int a = (int)++a;");
6605 verifyFormat("int a = (int)sizeof(int);");
6606 verifyFormat("int a = (int)+2;");
6607 verifyFormat("my_int a = (my_int)2.0f;");
6608 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006609 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006610 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006611 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006612 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006613 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006614
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006615 verifyFormat("void f() { my_int a = (my_int)*b; }");
6616 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6617 verifyFormat("my_int a = (my_int)~0;");
6618 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006619 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006620 verifyFormat("my_int a = (my_int)1;");
6621 verifyFormat("my_int a = (my_int *)1;");
6622 verifyFormat("my_int a = (const my_int)-1;");
6623 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006624 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006625 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006626 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006627 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006628
6629 // FIXME: single value wrapped with paren will be treated as cast.
6630 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006631
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006632 verifyFormat("{ (void)F; }");
6633
Daniel Jasper998cabc2013-07-18 14:46:07 +00006634 // Don't break after a cast's
6635 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6636 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6637 " bbbbbbbbbbbbbbbbbbbbbb);");
6638
Daniel Jasperef906a92013-01-13 08:01:36 +00006639 // These are not casts.
6640 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006641 verifyFormat("f(foo)->b;");
6642 verifyFormat("f(foo).b;");
6643 verifyFormat("f(foo)(b);");
6644 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006645 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006646 verifyFormat("(*funptr)(foo)[4];");
6647 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006648 verifyFormat("void f(int *);");
6649 verifyFormat("void f(int *) = 0;");
6650 verifyFormat("void f(SmallVector<int>) {}");
6651 verifyFormat("void f(SmallVector<int>);");
6652 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006653 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006654 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006655 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006656 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6657 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006658 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006659
Daniel Jasperba0bda92013-02-23 08:07:18 +00006660 // These are not casts, but at some point were confused with casts.
6661 verifyFormat("virtual void foo(int *) override;");
6662 verifyFormat("virtual void foo(char &) const;");
6663 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006664 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006665 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006666 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006667 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006668
6669 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6670 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006671 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006672 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006673 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6674 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6675 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006676}
6677
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006678TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006679 verifyFormat("A<bool()> a;");
6680 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006681 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006682 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006683 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006684 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006685 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006686 verifyFormat("template <class CallbackClass>\n"
6687 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006688
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006689 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6690 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006691 verifyGoogleFormat(
6692 "template <class CallbackClass>\n"
6693 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006694
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006695 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006696 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006697 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006698 verifyFormat("some_var = function(*some_pointer_var)[0];");
6699 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006700 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006701 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006702}
6703
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006704TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6705 verifyFormat("A (*foo_)[6];");
6706 verifyFormat("vector<int> (*foo_)[6];");
6707}
6708
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006709TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6710 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6711 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6712 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6713 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006714 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6715 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006716
6717 // Different ways of ()-initializiation.
6718 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6719 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6720 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6721 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6722 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6723 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006724 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6725 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006726}
6727
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006728TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006729 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006730 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006731 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006732 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006733 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006734 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006735 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6736 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006737 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6738 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006739 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6740 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006741 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6742 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006743 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6744 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006745 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6746 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6747 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6748 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006749 FormatStyle Indented = getLLVMStyle();
6750 Indented.IndentWrappedFunctionNames = true;
6751 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6752 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6753 Indented);
6754 verifyFormat(
6755 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6756 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6757 Indented);
6758 verifyFormat(
6759 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6760 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6761 Indented);
6762 verifyFormat(
6763 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6764 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6765 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006766
6767 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006768 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6769 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6770 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006771
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006772 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006773 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006774 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006775 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6776 " SourceLocation L, IdentifierIn *II,\n"
6777 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006778 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006779 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006780 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006781 " const SomeType<string, SomeOtherTemplateParameter>\n"
6782 " &ReallyReallyLongParameterName,\n"
6783 " const SomeType<string, SomeOtherTemplateParameter>\n"
6784 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006785 verifyFormat("template <typename A>\n"
6786 "SomeLoooooooooooooooooooooongType<\n"
6787 " typename some_namespace::SomeOtherType<A>::Type>\n"
6788 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006789
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006790 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006791 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6792 " aaaaaaaaaaaaaaaaaaaaaaa;");
6793 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006794 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6795 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006796 verifyGoogleFormat(
6797 "some_namespace::LongReturnType\n"
6798 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006799 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006800
6801 verifyGoogleFormat("template <typename T>\n"
6802 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006803 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006804 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6805 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006806
6807 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006808 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6809 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006810 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6811 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6812 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6813 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6814 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6815 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6816 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006817}
6818
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006819TEST_F(FormatTest, FormatsArrays) {
6820 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6821 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006822 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6823 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006824 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6825 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006826 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6827 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6828 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6829 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6830 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6831 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6832 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6833 verifyFormat(
6834 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6835 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6836 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006837 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6838 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006839
6840 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6841 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006842 verifyFormat(
6843 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6844 " .aaaaaaa[0]\n"
6845 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006846 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006847
6848 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006849
6850 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6851 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006852}
6853
Daniel Jaspere9de2602012-12-06 09:56:08 +00006854TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6855 verifyFormat("(a)->b();");
6856 verifyFormat("--a;");
6857}
6858
Daniel Jasper8b529712012-12-04 13:02:32 +00006859TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006860 verifyFormat("#include <string>\n"
6861 "#include <a/b/c.h>\n"
6862 "#include \"a/b/string\"\n"
6863 "#include \"string.h\"\n"
6864 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006865 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006866 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006867 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006868 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006869 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006870 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
6871 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006872 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6873 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006874
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006875 verifyFormat("#import <string>");
6876 verifyFormat("#import <a/b/c.h>");
6877 verifyFormat("#import \"a/b/string\"");
6878 verifyFormat("#import \"string.h\"");
6879 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006880 verifyFormat("#if __has_include(<strstream>)\n"
6881 "#include <strstream>\n"
6882 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006883
Daniel Jasper343643b2014-08-13 08:29:18 +00006884 verifyFormat("#define MY_IMPORT <a/b>");
6885
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006886 // Protocol buffer definition or missing "#".
6887 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6888 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006889
6890 FormatStyle Style = getLLVMStyle();
6891 Style.AlwaysBreakBeforeMultilineStrings = true;
6892 Style.ColumnLimit = 0;
6893 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006894
6895 // But 'import' might also be a regular C++ namespace.
6896 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6897 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006898}
6899
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006900//===----------------------------------------------------------------------===//
6901// Error recovery tests.
6902//===----------------------------------------------------------------------===//
6903
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006904TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006905 FormatStyle NoBinPacking = getLLVMStyle();
6906 NoBinPacking.BinPackParameters = false;
6907 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6908 " double *min_x,\n"
6909 " double *max_x,\n"
6910 " double *min_y,\n"
6911 " double *max_y,\n"
6912 " double *min_z,\n"
6913 " double *max_z, ) {}",
6914 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006915}
6916
Daniel Jasper83a54d22013-01-10 09:26:47 +00006917TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006918 verifyFormat("void f() { return; }\n42");
6919 verifyFormat("void f() {\n"
6920 " if (0)\n"
6921 " return;\n"
6922 "}\n"
6923 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006924 verifyFormat("void f() { return }\n42");
6925 verifyFormat("void f() {\n"
6926 " if (0)\n"
6927 " return\n"
6928 "}\n"
6929 "42");
6930}
6931
6932TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6933 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6934 EXPECT_EQ("void f() {\n"
6935 " if (a)\n"
6936 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006937 "}",
6938 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006939 EXPECT_EQ("namespace N {\n"
6940 "void f()\n"
6941 "}",
6942 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006943 EXPECT_EQ("namespace N {\n"
6944 "void f() {}\n"
6945 "void g()\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006946 "}",
6947 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006948}
6949
Daniel Jasper2df93312013-01-09 10:16:05 +00006950TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6951 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006952 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006953 " b;",
6954 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006955 verifyFormat("function(\n"
6956 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006957 " LoooooooooooongArgument);\n",
6958 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006959}
6960
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006961TEST_F(FormatTest, IncorrectAccessSpecifier) {
6962 verifyFormat("public:");
6963 verifyFormat("class A {\n"
6964 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006965 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006966 "};");
6967 verifyFormat("public\n"
6968 "int qwerty;");
6969 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006970 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006971 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006972 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006973 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006974 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006975}
Daniel Jasperf7935112012-12-03 18:12:45 +00006976
Daniel Jasper291f9362013-03-20 15:58:10 +00006977TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6978 verifyFormat("{");
6979 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006980 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006981}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006982
6983TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006984 verifyFormat("do {\n}");
6985 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006986 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006987 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006988 "wheeee(fun);");
6989 verifyFormat("do {\n"
6990 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006991 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006992}
6993
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006994TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006995 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006996 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006997 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006998 verifyFormat("while {\n foo;\n foo();\n}");
6999 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00007000}
7001
Daniel Jasperc0880a92013-01-04 18:52:56 +00007002TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00007003 verifyIncompleteFormat("namespace {\n"
7004 "class Foo { Foo (\n"
7005 "};\n"
7006 "} // comment");
Daniel Jasperc0880a92013-01-04 18:52:56 +00007007}
7008
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007009TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007010 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007011 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
7012 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007013 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007014
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007015 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007016 " {\n"
7017 " breakme(\n"
7018 " qwe);\n"
7019 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007020 format("{\n"
7021 " {\n"
7022 " breakme(qwe);\n"
7023 "}\n",
7024 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007025}
7026
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00007027TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007028 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007029 " avariable,\n"
7030 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007031 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00007032}
7033
Manuel Klimek762dd182013-01-21 10:07:49 +00007034TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007035 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00007036}
7037
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007038TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007039 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00007040 verifyFormat("vector<int> x{\n"
7041 " 1, 2, 3, 4,\n"
7042 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007043 verifyFormat("vector<T> x{{}, {}, {}, {}};");
7044 verifyFormat("f({1, 2});");
7045 verifyFormat("auto v = Foo{-1};");
7046 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
7047 verifyFormat("Class::Class : member{1, 2, 3} {}");
7048 verifyFormat("new vector<int>{1, 2, 3};");
7049 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00007050 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007051 verifyFormat("return {arg1, arg2};");
7052 verifyFormat("return {arg1, SomeType{parameter}};");
7053 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
7054 verifyFormat("new T{arg1, arg2};");
7055 verifyFormat("f(MyMap[{composite, key}]);");
7056 verifyFormat("class Class {\n"
7057 " T member = {arg1, arg2};\n"
7058 "};");
7059 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00007060 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
7061 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00007062
Daniel Jasper438059e2014-05-22 12:11:13 +00007063 verifyFormat("int foo(int i) { return fo1{}(i); }");
7064 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007065 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00007066 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00007067 verifyFormat("Node n{1, Node{1000}, //\n"
7068 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00007069 verifyFormat("Aaaa aaaaaaa{\n"
7070 " {\n"
7071 " aaaa,\n"
7072 " },\n"
7073 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00007074 verifyFormat("class C : public D {\n"
7075 " SomeClass SC{2};\n"
7076 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00007077 verifyFormat("class C : public A {\n"
7078 " class D : public B {\n"
7079 " void f() { int i{2}; }\n"
7080 " };\n"
7081 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00007082 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00007083
Daniel Jaspere4ada022016-12-13 10:05:03 +00007084 // Cases where distinguising braced lists and blocks is hard.
7085 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
7086 verifyFormat("void f() {\n"
7087 " return; // comment\n"
7088 "}\n"
7089 "SomeType t;");
7090 verifyFormat("void f() {\n"
7091 " if (a) {\n"
7092 " f();\n"
7093 " }\n"
7094 "}\n"
7095 "SomeType t;");
7096
Daniel Jasper08434342015-05-26 07:26:26 +00007097 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007098 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00007099 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007100 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
7101 " bbbbb,\n"
7102 " ccccc,\n"
7103 " ddddd,\n"
7104 " eeeee,\n"
7105 " ffffff,\n"
7106 " ggggg,\n"
7107 " hhhhhh,\n"
7108 " iiiiii,\n"
7109 " jjjjjj,\n"
7110 " kkkkkk};",
7111 NoBinPacking);
7112 verifyFormat("const Aaaaaa aaaaa = {\n"
7113 " aaaaa,\n"
7114 " bbbbb,\n"
7115 " ccccc,\n"
7116 " ddddd,\n"
7117 " eeeee,\n"
7118 " ffffff,\n"
7119 " ggggg,\n"
7120 " hhhhhh,\n"
7121 " iiiiii,\n"
7122 " jjjjjj,\n"
7123 " kkkkkk,\n"
7124 "};",
7125 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00007126 verifyFormat(
7127 "const Aaaaaa aaaaa = {\n"
7128 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
7129 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
7130 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
7131 "};",
7132 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007133
Chandler Carruthf8b72662014-03-02 12:37:31 +00007134 // FIXME: The alignment of these trailing comments might be bad. Then again,
7135 // this might be utterly useless in real code.
7136 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00007137 " : some_value{ //\n"
7138 " aaaaaaa, //\n"
7139 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00007140
Chandler Carruthf8b72662014-03-02 12:37:31 +00007141 // In braced lists, the first comment is always assumed to belong to the
7142 // first element. Thus, it can be moved to the next or previous line as
7143 // appropriate.
7144 EXPECT_EQ("function({// First element:\n"
7145 " 1,\n"
7146 " // Second element:\n"
7147 " 2});",
7148 format("function({\n"
7149 " // First element:\n"
7150 " 1,\n"
7151 " // Second element:\n"
7152 " 2});"));
7153 EXPECT_EQ("std::vector<int> MyNumbers{\n"
7154 " // First element:\n"
7155 " 1,\n"
7156 " // Second element:\n"
7157 " 2};",
7158 format("std::vector<int> MyNumbers{// First element:\n"
7159 " 1,\n"
7160 " // Second element:\n"
7161 " 2};",
7162 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00007163 // A trailing comma should still lead to an enforced line break.
7164 EXPECT_EQ("vector<int> SomeVector = {\n"
7165 " // aaa\n"
7166 " 1, 2,\n"
7167 "};",
7168 format("vector<int> SomeVector = { // aaa\n"
7169 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00007170
Chandler Carruthf8b72662014-03-02 12:37:31 +00007171 FormatStyle ExtraSpaces = getLLVMStyle();
7172 ExtraSpaces.Cpp11BracedListStyle = false;
7173 ExtraSpaces.ColumnLimit = 75;
7174 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
7175 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
7176 verifyFormat("f({ 1, 2 });", ExtraSpaces);
7177 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
7178 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
7179 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
7180 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
7181 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
7182 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
7183 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
7184 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
7185 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
7186 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
7187 verifyFormat("class Class {\n"
7188 " T member = { arg1, arg2 };\n"
7189 "};",
7190 ExtraSpaces);
7191 verifyFormat(
7192 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7193 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
7194 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
7195 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
7196 ExtraSpaces);
7197 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00007198 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007199 ExtraSpaces);
7200 verifyFormat(
7201 "someFunction(OtherParam,\n"
7202 " BracedList{ // comment 1 (Forcing interesting break)\n"
7203 " param1, param2,\n"
7204 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00007205 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007206 ExtraSpaces);
7207 verifyFormat(
7208 "std::this_thread::sleep_for(\n"
7209 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
7210 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00007211 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00007212 " aaaaaaa,\n"
7213 " aaaaaaaaaa,\n"
7214 " aaaaa,\n"
7215 " aaaaaaaaaaaaaaa,\n"
7216 " aaa,\n"
7217 " aaaaaaaaaa,\n"
7218 " a,\n"
7219 " aaaaaaaaaaaaaaaaaaaaa,\n"
7220 " aaaaaaaaaaaa,\n"
7221 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
7222 " aaaaaaa,\n"
7223 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007224 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00007225}
7226
Daniel Jasper33b909c2013-10-25 14:29:37 +00007227TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007228 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7229 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7230 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7231 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7232 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7233 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007234 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007235 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00007236 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007237 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7238 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007239 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007240 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7241 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7242 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
7243 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7244 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7245 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7246 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007247 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007248 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7249 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007250 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7251 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7252 " // Separating comment.\n"
7253 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
7254 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7255 " // Leading comment\n"
7256 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7257 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007258 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7259 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007260 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00007261 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7262 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007263 getLLVMStyleWithColumns(38));
7264 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007265 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
7266 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007267 verifyFormat(
7268 "static unsigned SomeValues[10][3] = {\n"
7269 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
7270 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
7271 verifyFormat("static auto fields = new vector<string>{\n"
7272 " \"aaaaaaaaaaaaa\",\n"
7273 " \"aaaaaaaaaaaaa\",\n"
7274 " \"aaaaaaaaaaaa\",\n"
7275 " \"aaaaaaaaaaaaaa\",\n"
7276 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7277 " \"aaaaaaaaaaaa\",\n"
7278 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7279 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00007280 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
7281 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
7282 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
7283 " 3, cccccccccccccccccccccc};",
7284 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00007285
7286 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00007287 verifyFormat("vector<int> x = {\n"
7288 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
7289 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00007290 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00007291 verifyFormat("vector<int> x = {\n"
7292 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00007293 "};",
7294 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00007295 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7296 " 1, 1, 1, 1,\n"
7297 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00007298 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007299
Daniel Jasper60c27072015-05-13 08:16:00 +00007300 // Trailing comment in the first line.
7301 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
7302 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
7303 " 111111111, 222222222, 3333333333, 444444444, //\n"
7304 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00007305 // Trailing comment in the last line.
7306 verifyFormat("int aaaaa[] = {\n"
7307 " 1, 2, 3, // comment\n"
7308 " 4, 5, 6 // comment\n"
7309 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00007310
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007311 // With nested lists, we should either format one item per line or all nested
7312 // lists one on line.
7313 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007314 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
7315 " {aaaaaaaaaaaaaaaaaaa},\n"
7316 " {aaaaaaaaaaaaaaaaaaaaa},\n"
7317 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00007318 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00007319 verifyFormat(
7320 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007321 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
7322 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
7323 " {aaa, aaa},\n"
7324 " {aaa, aaa},\n"
7325 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
7326 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7327 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00007328
7329 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007330 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
7331 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00007332
7333 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00007334
Daniel Jaspereb65e912015-12-21 18:31:15 +00007335 // No braced initializer here.
7336 verifyFormat("void f() {\n"
7337 " struct Dummy {};\n"
7338 " f(v);\n"
7339 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00007340
7341 // Long lists should be formatted in columns even if they are nested.
7342 verifyFormat(
7343 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7344 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7345 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7346 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7347 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7348 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00007349
7350 // Allow "single-column" layout even if that violates the column limit. There
7351 // isn't going to be a better way.
7352 verifyFormat("std::vector<int> a = {\n"
7353 " aaaaaaaa,\n"
7354 " aaaaaaaa,\n"
7355 " aaaaaaaa,\n"
7356 " aaaaaaaa,\n"
7357 " aaaaaaaaaa,\n"
7358 " aaaaaaaa,\n"
7359 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
7360 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00007361 verifyFormat("vector<int> aaaa = {\n"
7362 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7363 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7364 " aaaaaa.aaaaaaa,\n"
7365 " aaaaaa.aaaaaaa,\n"
7366 " aaaaaa.aaaaaaa,\n"
7367 " aaaaaa.aaaaaaa,\n"
7368 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007369
7370 // Don't create hanging lists.
7371 verifyFormat("someFunction(Param,\n"
7372 " {List1, List2,\n"
7373 " List3});",
7374 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00007375 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
7376 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007377}
7378
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007379TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007380 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00007381 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007382
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007383 verifyFormat("void f() { return 42; }");
7384 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007385 " return 42;\n"
7386 "}",
7387 DoNotMerge);
7388 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007389 " // Comment\n"
7390 "}");
7391 verifyFormat("{\n"
7392 "#error {\n"
7393 " int a;\n"
7394 "}");
7395 verifyFormat("{\n"
7396 " int a;\n"
7397 "#error {\n"
7398 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00007399 verifyFormat("void f() {} // comment");
7400 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00007401 verifyFormat("void f() {\n"
7402 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007403 DoNotMerge);
7404 verifyFormat("void f() {\n"
7405 " int a;\n"
7406 "} // comment",
7407 DoNotMerge);
7408 verifyFormat("void f() {\n"
7409 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00007410 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007411
7412 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7413 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7414
7415 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7416 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007417 verifyFormat("class C {\n"
7418 " C()\n"
7419 " : iiiiiiii(nullptr),\n"
7420 " kkkkkkk(nullptr),\n"
7421 " mmmmmmm(nullptr),\n"
7422 " nnnnnnn(nullptr) {}\n"
7423 "};",
7424 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007425
7426 FormatStyle NoColumnLimit = getLLVMStyle();
7427 NoColumnLimit.ColumnLimit = 0;
7428 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7429 EXPECT_EQ("class C {\n"
7430 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007431 "};",
7432 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007433 EXPECT_EQ("A()\n"
7434 " : b(0) {\n"
7435 "}",
7436 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7437
7438 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007439 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7440 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007441 EXPECT_EQ("A()\n"
7442 " : b(0) {\n"
7443 "}",
7444 format("A():b(0){}", DoNotMergeNoColumnLimit));
7445 EXPECT_EQ("A()\n"
7446 " : b(0) {\n"
7447 "}",
7448 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007449
7450 verifyFormat("#define A \\\n"
7451 " void f() { \\\n"
7452 " int i; \\\n"
7453 " }",
7454 getLLVMStyleWithColumns(20));
7455 verifyFormat("#define A \\\n"
7456 " void f() { int i; }",
7457 getLLVMStyleWithColumns(21));
7458 verifyFormat("#define A \\\n"
7459 " void f() { \\\n"
7460 " int i; \\\n"
7461 " } \\\n"
7462 " int j;",
7463 getLLVMStyleWithColumns(22));
7464 verifyFormat("#define A \\\n"
7465 " void f() { int i; } \\\n"
7466 " int j;",
7467 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007468}
7469
Daniel Jasperd74cf402014-04-08 12:46:38 +00007470TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7471 FormatStyle MergeInlineOnly = getLLVMStyle();
7472 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7473 verifyFormat("class C {\n"
7474 " int f() { return 42; }\n"
7475 "};",
7476 MergeInlineOnly);
7477 verifyFormat("int f() {\n"
7478 " return 42;\n"
7479 "}",
7480 MergeInlineOnly);
7481}
7482
Manuel Klimeke01bab52013-01-15 13:38:33 +00007483TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7484 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007485 verifyFormat("struct foo a = {bar};\nint n;");
7486 verifyFormat("class foo a = {bar};\nint n;");
7487 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007488
7489 // Elaborate types inside function definitions.
7490 verifyFormat("struct foo f() {}\nint n;");
7491 verifyFormat("class foo f() {}\nint n;");
7492 verifyFormat("union foo f() {}\nint n;");
7493
7494 // Templates.
7495 verifyFormat("template <class X> void f() {}\nint n;");
7496 verifyFormat("template <struct X> void f() {}\nint n;");
7497 verifyFormat("template <union X> void f() {}\nint n;");
7498
7499 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007500 verifyFormat("struct {\n} n;");
7501 verifyFormat(
7502 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007503 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007504 verifyFormat("class MACRO Z {\n} n;");
7505 verifyFormat("class MACRO(X) Z {\n} n;");
7506 verifyFormat("class __attribute__(X) Z {\n} n;");
7507 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007508 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007509 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007510 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7511 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007512
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007513 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007514 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007515
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007516 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007517 verifyFormat(
7518 "template <typename F>\n"
7519 "Matcher(const Matcher<F> &Other,\n"
7520 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7521 " !is_same<F, T>::value>::type * = 0)\n"
7522 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7523
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007524 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007525 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007526 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007527
7528 // FIXME:
7529 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007530 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007531
Manuel Klimeke01bab52013-01-15 13:38:33 +00007532 // Elaborate types where incorrectly parsing the structural element would
7533 // break the indent.
7534 verifyFormat("if (true)\n"
7535 " class X x;\n"
7536 "else\n"
7537 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007538
7539 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007540 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007541}
7542
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007543TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007544 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7545 format("#error Leave all white!!!!! space* alone!\n"));
7546 EXPECT_EQ(
7547 "#warning Leave all white!!!!! space* alone!\n",
7548 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007549 EXPECT_EQ("#error 1", format(" # error 1"));
7550 EXPECT_EQ("#warning 1", format(" # warning 1"));
7551}
7552
Daniel Jasper4431aa92013-04-23 13:54:04 +00007553TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007554 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007555 verifyFormat("#if (AAAA && BBBB)");
7556 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007557 // FIXME: Come up with a better indentation for #elif.
7558 verifyFormat(
7559 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7560 " defined(BBBBBBBB)\n"
7561 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7562 " defined(BBBBBBBB)\n"
7563 "#endif",
7564 getLLVMStyleWithColumns(65));
7565}
7566
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007567TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7568 FormatStyle AllowsMergedIf = getGoogleStyle();
7569 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7570 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7571 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007572 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7573 EXPECT_EQ("if (true) return 42;",
7574 format("if (true)\nreturn 42;", AllowsMergedIf));
7575 FormatStyle ShortMergedIf = AllowsMergedIf;
7576 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007577 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007578 " if (true) return 42;",
7579 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007580 verifyFormat("#define A \\\n"
7581 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007582 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007583 "#define B",
7584 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007585 verifyFormat("#define A \\\n"
7586 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007587 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007588 "g();",
7589 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007590 verifyFormat("{\n"
7591 "#ifdef A\n"
7592 " // Comment\n"
7593 " if (true) continue;\n"
7594 "#endif\n"
7595 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007596 " if (true) continue;\n"
7597 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007598 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007599 ShortMergedIf.ColumnLimit = 29;
7600 verifyFormat("#define A \\\n"
7601 " if (aaaaaaaaaa) return 1; \\\n"
7602 " return 2;",
7603 ShortMergedIf);
7604 ShortMergedIf.ColumnLimit = 28;
7605 verifyFormat("#define A \\\n"
7606 " if (aaaaaaaaaa) \\\n"
7607 " return 1; \\\n"
7608 " return 2;",
7609 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007610}
7611
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007612TEST_F(FormatTest, BlockCommentsInControlLoops) {
7613 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7614 " f();\n"
7615 "}");
7616 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7617 " f();\n"
7618 "} /* another comment */ else /* comment #3 */ {\n"
7619 " g();\n"
7620 "}");
7621 verifyFormat("while (0) /* a comment in a strange place */ {\n"
7622 " f();\n"
7623 "}");
7624 verifyFormat("for (;;) /* a comment in a strange place */ {\n"
7625 " f();\n"
7626 "}");
7627 verifyFormat("do /* a comment in a strange place */ {\n"
7628 " f();\n"
7629 "} /* another comment */ while (0);");
7630}
7631
7632TEST_F(FormatTest, BlockComments) {
7633 EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
7634 format("/* *//* */ /* */\n/* *//* */ /* */"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007635 EXPECT_EQ("/* */ a /* */ b;", format(" /* */ a/* */ b;"));
Daniel Jaspera49393f2013-08-28 09:07:32 +00007636 EXPECT_EQ("#define A /*123*/ \\\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007637 " b\n"
7638 "/* */\n"
7639 "someCall(\n"
7640 " parameter);",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00007641 format("#define A /*123*/ b\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007642 "/* */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007643 "someCall(parameter);",
7644 getLLVMStyleWithColumns(15)));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007645
7646 EXPECT_EQ("#define A\n"
7647 "/* */ someCall(\n"
7648 " parameter);",
7649 format("#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007650 "/* */someCall(parameter);",
7651 getLLVMStyleWithColumns(15)));
Daniel Jasper51fb2b22013-05-30 06:40:07 +00007652 EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007653 EXPECT_EQ("/*\n"
7654 "*\n"
7655 " * aaaaaa\n"
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00007656 " * aaaaaa\n"
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007657 "*/",
7658 format("/*\n"
7659 "*\n"
7660 " * aaaaaa aaaaaa\n"
7661 "*/",
7662 getLLVMStyleWithColumns(10)));
Daniel Jasperce257f22013-05-30 17:27:48 +00007663 EXPECT_EQ("/*\n"
7664 "**\n"
7665 "* aaaaaa\n"
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007666 "*aaaaaa\n"
Daniel Jasperce257f22013-05-30 17:27:48 +00007667 "*/",
7668 format("/*\n"
7669 "**\n"
7670 "* aaaaaa aaaaaa\n"
7671 "*/",
7672 getLLVMStyleWithColumns(10)));
Daniel Jasperacadc8e2016-06-08 09:45:08 +00007673 EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7674 " /* line 1\n"
7675 " bbbbbbbbbbbb */\n"
7676 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7677 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7678 " /* line 1\n"
7679 " bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7680 getLLVMStyleWithColumns(50)));
Daniel Jasper1f140982013-02-04 07:32:14 +00007681
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007682 FormatStyle NoBinPacking = getLLVMStyle();
7683 NoBinPacking.BinPackParameters = false;
Daniel Jasper1f140982013-02-04 07:32:14 +00007684 EXPECT_EQ("someFunction(1, /* comment 1 */\n"
7685 " 2, /* comment 2 */\n"
7686 " 3, /* comment 3 */\n"
Daniel Jasper14e40ec2013-02-04 08:34:57 +00007687 " aaaa,\n"
7688 " bbbb);",
Daniel Jasper1f140982013-02-04 07:32:14 +00007689 format("someFunction (1, /* comment 1 */\n"
7690 " 2, /* comment 2 */ \n"
7691 " 3, /* comment 3 */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007692 "aaaa, bbbb );",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007693 NoBinPacking));
Daniel Jasper38396592013-02-06 15:23:09 +00007694 verifyFormat(
7695 "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7696 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7697 EXPECT_EQ(
7698 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7699 " aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7700 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
7701 format(
7702 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7703 " aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7704 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
Daniel Jasper94f0e132013-02-06 20:07:35 +00007705 EXPECT_EQ(
7706 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7707 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7708 "int cccccccccccccccccccccccccccccc; /* comment */\n",
7709 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7710 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7711 "int cccccccccccccccccccccccccccccc; /* comment */\n"));
Daniel Jasper022612d2013-07-01 09:34:09 +00007712
7713 verifyFormat("void f(int * /* unused */) {}");
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007714
7715 EXPECT_EQ("/*\n"
7716 " **\n"
7717 " */",
7718 format("/*\n"
7719 " **\n"
7720 " */"));
7721 EXPECT_EQ("/*\n"
7722 " *q\n"
7723 " */",
7724 format("/*\n"
7725 " *q\n"
7726 " */"));
7727 EXPECT_EQ("/*\n"
7728 " * q\n"
7729 " */",
7730 format("/*\n"
7731 " * q\n"
7732 " */"));
7733 EXPECT_EQ("/*\n"
7734 " **/",
7735 format("/*\n"
7736 " **/"));
7737 EXPECT_EQ("/*\n"
7738 " ***/",
7739 format("/*\n"
7740 " ***/"));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007741}
7742
Manuel Klimek82b836a2013-02-06 16:40:56 +00007743TEST_F(FormatTest, BlockCommentsInMacros) {
7744 EXPECT_EQ("#define A \\\n"
7745 " { \\\n"
7746 " /* one line */ \\\n"
7747 " someCall();",
7748 format("#define A { \\\n"
7749 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007750 " someCall();",
7751 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007752 EXPECT_EQ("#define A \\\n"
7753 " { \\\n"
7754 " /* previous */ \\\n"
7755 " /* one line */ \\\n"
7756 " someCall();",
7757 format("#define A { \\\n"
7758 " /* previous */ \\\n"
7759 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007760 " someCall();",
7761 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007762}
7763
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007764TEST_F(FormatTest, BlockCommentsAtEndOfLine) {
7765 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007766 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007767 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007768 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007769 "};",
7770 getLLVMStyleWithColumns(15)));
7771 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007772 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007773 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007774 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007775 "};",
7776 getLLVMStyleWithColumns(15)));
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007777 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007778 " 1111 /* a\n"
Krasimir Georgiev91834222017-01-25 13:58:58 +00007779 " */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007780 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007781 format("a = {1111 /* a */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007782 "};",
7783 getLLVMStyleWithColumns(15)));
7784}
7785
Manuel Klimek82b836a2013-02-06 16:40:56 +00007786TEST_F(FormatTest, IndentLineCommentsInStartOfBlockAtEndOfFile) {
Manuel Klimek82b836a2013-02-06 16:40:56 +00007787 verifyFormat("{\n"
Marianne Mailhot-Sarrasin03137c62016-04-14 14:56:49 +00007788 " // a\n"
7789 " // b");
Manuel Klimek82b836a2013-02-06 16:40:56 +00007790}
7791
Manuel Klimekd33516e2013-01-23 10:09:28 +00007792TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007793 verifyFormat("void f(int *a);");
7794 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007795 verifyFormat("class A {\n void f(int *a);\n};");
7796 verifyFormat("class A {\n int *a;\n};");
7797 verifyFormat("namespace a {\n"
7798 "namespace b {\n"
7799 "class A {\n"
7800 " void f() {}\n"
7801 " int *a;\n"
7802 "};\n"
7803 "}\n"
7804 "}");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007805}
7806
Manuel Klimekd33516e2013-01-23 10:09:28 +00007807TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7808 verifyFormat("while");
7809 verifyFormat("operator");
7810}
7811
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007812TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7813 // This code would be painfully slow to format if we didn't skip it.
7814 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
7815 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7816 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7817 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7818 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7819 "A(1, 1)\n"
7820 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7821 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7822 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7823 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7824 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7825 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7826 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7827 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7828 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7829 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7830 // Deeply nested part is untouched, rest is formatted.
7831 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7832 format(std::string("int i;\n") + Code + "int j;\n",
7833 getLLVMStyle(), IC_ExpectIncomplete));
7834}
7835
Nico Weber7e6a7a12013-01-08 17:56:31 +00007836//===----------------------------------------------------------------------===//
7837// Objective-C tests.
7838//===----------------------------------------------------------------------===//
7839
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007840TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7841 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7842 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7843 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007844 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007845 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7846 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7847 format("-(NSInteger)Method3:(id)anObject;"));
7848 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7849 format("-(NSInteger)Method4:(id)anObject;"));
7850 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7851 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7852 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7853 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007854 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7855 "forAllCells:(BOOL)flag;",
7856 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7857 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007858
7859 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007860 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7861 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007862 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7863 " inRange:(NSRange)range\n"
7864 " outRange:(NSRange)out_range\n"
7865 " outRange1:(NSRange)out_range1\n"
7866 " outRange2:(NSRange)out_range2\n"
7867 " outRange3:(NSRange)out_range3\n"
7868 " outRange4:(NSRange)out_range4\n"
7869 " outRange5:(NSRange)out_range5\n"
7870 " outRange6:(NSRange)out_range6\n"
7871 " outRange7:(NSRange)out_range7\n"
7872 " outRange8:(NSRange)out_range8\n"
7873 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007874
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007875 // When the function name has to be wrapped.
7876 FormatStyle Style = getLLVMStyle();
7877 Style.IndentWrappedFunctionNames = false;
7878 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7879 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7880 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7881 "}",
7882 Style);
7883 Style.IndentWrappedFunctionNames = true;
7884 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7885 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7886 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7887 "}",
7888 Style);
7889
Nico Weberd6f962f2013-01-10 20:18:33 +00007890 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007891 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007892 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7893 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007894 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007895
Daniel Jasper37194282013-05-28 08:33:00 +00007896 verifyFormat("- (int (*)())foo:(int (*)())f;");
7897 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007898
7899 // If there's no return type (very rare in practice!), LLVM and Google style
7900 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007901 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007902 verifyFormat("- foo:(int)f;");
7903 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007904}
7905
Nico Weber0588b502013-02-07 00:19:29 +00007906
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007907TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007908 EXPECT_EQ("\"some text \"\n"
7909 "\"other\";",
7910 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007911 EXPECT_EQ("\"some text \"\n"
7912 "\"other\";",
7913 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007914 EXPECT_EQ(
7915 "#define A \\\n"
7916 " \"some \" \\\n"
7917 " \"text \" \\\n"
7918 " \"other\";",
7919 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7920 EXPECT_EQ(
7921 "#define A \\\n"
7922 " \"so \" \\\n"
7923 " \"text \" \\\n"
7924 " \"other\";",
7925 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7926
7927 EXPECT_EQ("\"some text\"",
7928 format("\"some text\"", getLLVMStyleWithColumns(1)));
7929 EXPECT_EQ("\"some text\"",
7930 format("\"some text\"", getLLVMStyleWithColumns(11)));
7931 EXPECT_EQ("\"some \"\n"
7932 "\"text\"",
7933 format("\"some text\"", getLLVMStyleWithColumns(10)));
7934 EXPECT_EQ("\"some \"\n"
7935 "\"text\"",
7936 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007937 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007938 "\" tex\"\n"
7939 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007940 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007941 EXPECT_EQ("\"some\"\n"
7942 "\" tex\"\n"
7943 "\" and\"",
7944 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7945 EXPECT_EQ("\"some\"\n"
7946 "\"/tex\"\n"
7947 "\"/and\"",
7948 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007949
7950 EXPECT_EQ("variable =\n"
7951 " \"long string \"\n"
7952 " \"literal\";",
7953 format("variable = \"long string literal\";",
7954 getLLVMStyleWithColumns(20)));
7955
7956 EXPECT_EQ("variable = f(\n"
7957 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007958 " \"literal\",\n"
7959 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007960 " loooooooooooooooooooong);",
7961 format("variable = f(\"long string literal\", short, "
7962 "loooooooooooooooooooong);",
7963 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007964
Daniel Jaspera44991332015-04-29 13:06:49 +00007965 EXPECT_EQ(
7966 "f(g(\"long string \"\n"
7967 " \"literal\"),\n"
7968 " b);",
7969 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007970 EXPECT_EQ("f(g(\"long string \"\n"
7971 " \"literal\",\n"
7972 " a),\n"
7973 " b);",
7974 format("f(g(\"long string literal\", a), b);",
7975 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007976 EXPECT_EQ(
7977 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00007978 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007979 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7980 EXPECT_EQ("f(\"one two three four five six \"\n"
7981 " \"seven\".split(\n"
7982 " really_looooong_variable));",
7983 format("f(\"one two three four five six seven\"."
7984 "split(really_looooong_variable));",
7985 getLLVMStyleWithColumns(33)));
7986
7987 EXPECT_EQ("f(\"some \"\n"
7988 " \"text\",\n"
7989 " other);",
7990 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00007991
7992 // Only break as a last resort.
7993 verifyFormat(
7994 "aaaaaaaaaaaaaaaaaaaa(\n"
7995 " aaaaaaaaaaaaaaaaaaaa,\n"
7996 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00007997
Daniel Jaspera44991332015-04-29 13:06:49 +00007998 EXPECT_EQ("\"splitmea\"\n"
7999 "\"trandomp\"\n"
8000 "\"oint\"",
8001 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00008002
Daniel Jaspera44991332015-04-29 13:06:49 +00008003 EXPECT_EQ("\"split/\"\n"
8004 "\"pathat/\"\n"
8005 "\"slashes\"",
8006 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008007
Daniel Jaspera44991332015-04-29 13:06:49 +00008008 EXPECT_EQ("\"split/\"\n"
8009 "\"pathat/\"\n"
8010 "\"slashes\"",
8011 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00008012 EXPECT_EQ("\"split at \"\n"
8013 "\"spaces/at/\"\n"
8014 "\"slashes.at.any$\"\n"
8015 "\"non-alphanumeric%\"\n"
8016 "\"1111111111characte\"\n"
8017 "\"rs\"",
8018 format("\"split at "
8019 "spaces/at/"
8020 "slashes.at."
8021 "any$non-"
8022 "alphanumeric%"
8023 "1111111111characte"
8024 "rs\"",
8025 getLLVMStyleWithColumns(20)));
8026
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008027 // Verify that splitting the strings understands
8028 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00008029 EXPECT_EQ(
8030 "aaaaaaaaaaaa(\n"
8031 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8032 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8033 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8034 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8035 "aaaaaaaaaaaaaaaaaaaaaa\");",
8036 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00008037 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8038 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8039 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8040 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8041 "aaaaaaaaaaaaaaaaaaaaaa\";",
8042 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00008043 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8044 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8045 format("llvm::outs() << "
8046 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8047 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00008048 EXPECT_EQ("ffff(\n"
8049 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8050 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8051 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8052 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8053 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008054
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008055 FormatStyle Style = getLLVMStyleWithColumns(12);
8056 Style.BreakStringLiterals = false;
8057 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8058
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008059 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
8060 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00008061 EXPECT_EQ("#define A \\\n"
8062 " \"some \" \\\n"
8063 " \"text \" \\\n"
8064 " \"other\";",
8065 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008066}
8067
Manuel Klimek9e321992015-07-28 15:50:24 +00008068TEST_F(FormatTest, FullyRemoveEmptyLines) {
8069 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8070 NoEmptyLines.MaxEmptyLinesToKeep = 0;
8071 EXPECT_EQ("int i = a(b());",
8072 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8073}
8074
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008075TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8076 EXPECT_EQ(
8077 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8078 "(\n"
8079 " \"x\t\");",
8080 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8081 "aaaaaaa("
8082 "\"x\t\");"));
8083}
8084
Daniel Jasper174b0122014-01-09 14:18:12 +00008085TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00008086 EXPECT_EQ(
8087 "u8\"utf8 string \"\n"
8088 "u8\"literal\";",
8089 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8090 EXPECT_EQ(
8091 "u\"utf16 string \"\n"
8092 "u\"literal\";",
8093 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8094 EXPECT_EQ(
8095 "U\"utf32 string \"\n"
8096 "U\"literal\";",
8097 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8098 EXPECT_EQ("L\"wide string \"\n"
8099 "L\"literal\";",
8100 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00008101 EXPECT_EQ("@\"NSString \"\n"
8102 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00008103 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00008104
8105 // This input makes clang-format try to split the incomplete unicode escape
8106 // sequence, which used to lead to a crasher.
8107 verifyNoCrash(
8108 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8109 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008110}
8111
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00008112TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8113 FormatStyle Style = getGoogleStyleWithColumns(15);
8114 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8115 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8116 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8117 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8118 EXPECT_EQ("u8R\"x(raw literal)x\";",
8119 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008120}
8121
8122TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8123 FormatStyle Style = getLLVMStyleWithColumns(20);
8124 EXPECT_EQ(
8125 "_T(\"aaaaaaaaaaaaaa\")\n"
8126 "_T(\"aaaaaaaaaaaaaa\")\n"
8127 "_T(\"aaaaaaaaaaaa\")",
8128 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
8129 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
8130 " _T(\"aaaaaa\"),\n"
8131 " z);",
8132 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8133
8134 // FIXME: Handle embedded spaces in one iteration.
8135 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8136 // "_T(\"aaaaaaaaaaaaa\")\n"
8137 // "_T(\"aaaaaaaaaaaaa\")\n"
8138 // "_T(\"a\")",
8139 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8140 // getLLVMStyleWithColumns(20)));
8141 EXPECT_EQ(
8142 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8143 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008144 EXPECT_EQ("f(\n"
8145 "#if !TEST\n"
8146 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8147 "#endif\n"
8148 " );",
8149 format("f(\n"
8150 "#if !TEST\n"
8151 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8152 "#endif\n"
8153 ");"));
8154 EXPECT_EQ("f(\n"
8155 "\n"
8156 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8157 format("f(\n"
8158 "\n"
8159 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008160}
8161
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008162TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008163 EXPECT_EQ(
8164 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8165 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8166 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8167 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8168 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8169 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8170}
8171
8172TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8173 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008174 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008175 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8176 "multiline raw string literal xxxxxxxxxxxxxx\n"
8177 ")x\",\n"
8178 " a),\n"
8179 " b);",
8180 format("fffffffffff(g(R\"x(\n"
8181 "multiline raw string literal xxxxxxxxxxxxxx\n"
8182 ")x\", a), b);",
8183 getGoogleStyleWithColumns(20)));
8184 EXPECT_EQ("fffffffffff(\n"
8185 " g(R\"x(qqq\n"
8186 "multiline raw string literal xxxxxxxxxxxxxx\n"
8187 ")x\",\n"
8188 " a),\n"
8189 " b);",
8190 format("fffffffffff(g(R\"x(qqq\n"
8191 "multiline raw string literal xxxxxxxxxxxxxx\n"
8192 ")x\", a), b);",
8193 getGoogleStyleWithColumns(20)));
8194
8195 EXPECT_EQ("fffffffffff(R\"x(\n"
8196 "multiline raw string literal xxxxxxxxxxxxxx\n"
8197 ")x\");",
8198 format("fffffffffff(R\"x(\n"
8199 "multiline raw string literal xxxxxxxxxxxxxx\n"
8200 ")x\");",
8201 getGoogleStyleWithColumns(20)));
8202 EXPECT_EQ("fffffffffff(R\"x(\n"
8203 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008204 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008205 format("fffffffffff(R\"x(\n"
8206 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008207 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008208 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008209 EXPECT_EQ("fffffffffff(\n"
8210 " R\"x(\n"
8211 "multiline raw string literal xxxxxxxxxxxxxx\n"
8212 ")x\" +\n"
8213 " bbbbbb);",
8214 format("fffffffffff(\n"
8215 " R\"x(\n"
8216 "multiline raw string literal xxxxxxxxxxxxxx\n"
8217 ")x\" + bbbbbb);",
8218 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008219}
8220
Alexander Kornienkobe633902013-06-14 11:46:10 +00008221TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008222 verifyFormat("string a = \"unterminated;");
8223 EXPECT_EQ("function(\"unterminated,\n"
8224 " OtherParameter);",
8225 format("function( \"unterminated,\n"
8226 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008227}
8228
8229TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008230 FormatStyle Style = getLLVMStyle();
8231 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008232 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008233 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008234}
8235
Daniel Jaspera44991332015-04-29 13:06:49 +00008236TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008237
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008238TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8239 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8240 " \"ddeeefff\");",
8241 format("someFunction(\"aaabbbcccdddeeefff\");",
8242 getLLVMStyleWithColumns(25)));
8243 EXPECT_EQ("someFunction1234567890(\n"
8244 " \"aaabbbcccdddeeefff\");",
8245 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8246 getLLVMStyleWithColumns(26)));
8247 EXPECT_EQ("someFunction1234567890(\n"
8248 " \"aaabbbcccdddeeeff\"\n"
8249 " \"f\");",
8250 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8251 getLLVMStyleWithColumns(25)));
8252 EXPECT_EQ("someFunction1234567890(\n"
8253 " \"aaabbbcccdddeeeff\"\n"
8254 " \"f\");",
8255 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8256 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008257 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8258 " \"ddde \"\n"
8259 " \"efff\");",
8260 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008261 getLLVMStyleWithColumns(25)));
8262 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8263 " \"ddeeefff\");",
8264 format("someFunction(\"aaabbbccc ddeeefff\");",
8265 getLLVMStyleWithColumns(25)));
8266 EXPECT_EQ("someFunction1234567890(\n"
8267 " \"aaabb \"\n"
8268 " \"cccdddeeefff\");",
8269 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8270 getLLVMStyleWithColumns(25)));
8271 EXPECT_EQ("#define A \\\n"
8272 " string s = \\\n"
8273 " \"123456789\" \\\n"
8274 " \"0\"; \\\n"
8275 " int i;",
8276 format("#define A string s = \"1234567890\"; int i;",
8277 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008278 // FIXME: Put additional penalties on breaking at non-whitespace locations.
8279 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8280 " \"dddeeeff\"\n"
8281 " \"f\");",
8282 format("someFunction(\"aaabbbcc dddeeefff\");",
8283 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008284}
8285
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008286TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008287 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8288 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008289 EXPECT_EQ("\"test\"\n"
8290 "\"\\n\"",
8291 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8292 EXPECT_EQ("\"tes\\\\\"\n"
8293 "\"n\"",
8294 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8295 EXPECT_EQ("\"\\\\\\\\\"\n"
8296 "\"\\n\"",
8297 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008298 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008299 EXPECT_EQ("\"\\uff01\"\n"
8300 "\"test\"",
8301 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8302 EXPECT_EQ("\"\\Uff01ff02\"",
8303 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8304 EXPECT_EQ("\"\\x000000000001\"\n"
8305 "\"next\"",
8306 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8307 EXPECT_EQ("\"\\x000000000001next\"",
8308 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8309 EXPECT_EQ("\"\\x000000000001\"",
8310 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8311 EXPECT_EQ("\"test\"\n"
8312 "\"\\000000\"\n"
8313 "\"000001\"",
8314 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8315 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008316 "\"00000000\"\n"
8317 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008318 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008319}
8320
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008321TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8322 verifyFormat("void f() {\n"
8323 " return g() {}\n"
8324 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008325 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008326 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008327 "}");
8328}
8329
Manuel Klimek421147e2014-01-24 09:25:23 +00008330TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8331 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008332 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008333}
8334
Manuel Klimek13b97d82013-05-13 08:42:42 +00008335TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8336 verifyFormat("class X {\n"
8337 " void f() {\n"
8338 " }\n"
8339 "};",
8340 getLLVMStyleWithColumns(12));
8341}
8342
8343TEST_F(FormatTest, ConfigurableIndentWidth) {
8344 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8345 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008346 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008347 verifyFormat("void f() {\n"
8348 " someFunction();\n"
8349 " if (true) {\n"
8350 " f();\n"
8351 " }\n"
8352 "}",
8353 EightIndent);
8354 verifyFormat("class X {\n"
8355 " void f() {\n"
8356 " }\n"
8357 "};",
8358 EightIndent);
8359 verifyFormat("int x[] = {\n"
8360 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008361 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008362 EightIndent);
8363}
8364
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008365TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008366 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008367 "f();",
8368 getLLVMStyleWithColumns(8));
8369}
8370
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008371TEST_F(FormatTest, ConfigurableUseOfTab) {
8372 FormatStyle Tab = getLLVMStyleWithColumns(42);
8373 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008374 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008375 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008376
8377 EXPECT_EQ("if (aaaaaaaa && // q\n"
8378 " bb)\t\t// w\n"
8379 "\t;",
8380 format("if (aaaaaaaa &&// q\n"
8381 "bb)// w\n"
8382 ";",
8383 Tab));
8384 EXPECT_EQ("if (aaa && bbb) // w\n"
8385 "\t;",
8386 format("if(aaa&&bbb)// w\n"
8387 ";",
8388 Tab));
8389
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008390 verifyFormat("class X {\n"
8391 "\tvoid f() {\n"
8392 "\t\tsomeFunction(parameter1,\n"
8393 "\t\t\t parameter2);\n"
8394 "\t}\n"
8395 "};",
8396 Tab);
8397 verifyFormat("#define A \\\n"
8398 "\tvoid f() { \\\n"
8399 "\t\tsomeFunction( \\\n"
8400 "\t\t parameter1, \\\n"
8401 "\t\t parameter2); \\\n"
8402 "\t}",
8403 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008404
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008405 Tab.TabWidth = 4;
8406 Tab.IndentWidth = 8;
8407 verifyFormat("class TabWidth4Indent8 {\n"
8408 "\t\tvoid f() {\n"
8409 "\t\t\t\tsomeFunction(parameter1,\n"
8410 "\t\t\t\t\t\t\t parameter2);\n"
8411 "\t\t}\n"
8412 "};",
8413 Tab);
8414
8415 Tab.TabWidth = 4;
8416 Tab.IndentWidth = 4;
8417 verifyFormat("class TabWidth4Indent4 {\n"
8418 "\tvoid f() {\n"
8419 "\t\tsomeFunction(parameter1,\n"
8420 "\t\t\t\t\t parameter2);\n"
8421 "\t}\n"
8422 "};",
8423 Tab);
8424
8425 Tab.TabWidth = 8;
8426 Tab.IndentWidth = 4;
8427 verifyFormat("class TabWidth8Indent4 {\n"
8428 " void f() {\n"
8429 "\tsomeFunction(parameter1,\n"
8430 "\t\t parameter2);\n"
8431 " }\n"
8432 "};",
8433 Tab);
8434
Alexander Kornienko39856b72013-09-10 09:38:25 +00008435 Tab.TabWidth = 8;
8436 Tab.IndentWidth = 8;
8437 EXPECT_EQ("/*\n"
8438 "\t a\t\tcomment\n"
8439 "\t in multiple lines\n"
8440 " */",
8441 format(" /*\t \t \n"
8442 " \t \t a\t\tcomment\t \t\n"
8443 " \t \t in multiple lines\t\n"
8444 " \t */",
8445 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008446
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008447 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008448 verifyFormat("{\n"
8449 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8450 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8451 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8452 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8453 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8454 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008455 "};",
8456 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008457 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008458 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008459 "\ta2,\n"
8460 "\ta3\n"
8461 "};",
8462 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008463 EXPECT_EQ("if (aaaaaaaa && // q\n"
8464 " bb) // w\n"
8465 "\t;",
8466 format("if (aaaaaaaa &&// q\n"
8467 "bb)// w\n"
8468 ";",
8469 Tab));
8470 verifyFormat("class X {\n"
8471 "\tvoid f() {\n"
8472 "\t\tsomeFunction(parameter1,\n"
8473 "\t\t parameter2);\n"
8474 "\t}\n"
8475 "};",
8476 Tab);
8477 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008478 "\tQ(\n"
8479 "\t {\n"
8480 "\t\t int a;\n"
8481 "\t\t someFunction(aaaaaaaa,\n"
8482 "\t\t bbbbbbb);\n"
8483 "\t },\n"
8484 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008485 "}",
8486 Tab);
8487 EXPECT_EQ("{\n"
8488 "\t/* aaaa\n"
8489 "\t bbbb */\n"
8490 "}",
8491 format("{\n"
8492 "/* aaaa\n"
8493 " bbbb */\n"
8494 "}",
8495 Tab));
8496 EXPECT_EQ("{\n"
8497 "\t/*\n"
8498 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8499 "\t bbbbbbbbbbbbb\n"
8500 "\t*/\n"
8501 "}",
8502 format("{\n"
8503 "/*\n"
8504 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8505 "*/\n"
8506 "}",
8507 Tab));
8508 EXPECT_EQ("{\n"
8509 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8510 "\t// bbbbbbbbbbbbb\n"
8511 "}",
8512 format("{\n"
8513 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8514 "}",
8515 Tab));
8516 EXPECT_EQ("{\n"
8517 "\t/*\n"
8518 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8519 "\t bbbbbbbbbbbbb\n"
8520 "\t*/\n"
8521 "}",
8522 format("{\n"
8523 "\t/*\n"
8524 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8525 "\t*/\n"
8526 "}",
8527 Tab));
8528 EXPECT_EQ("{\n"
8529 "\t/*\n"
8530 "\n"
8531 "\t*/\n"
8532 "}",
8533 format("{\n"
8534 "\t/*\n"
8535 "\n"
8536 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008537 "}",
8538 Tab));
8539 EXPECT_EQ("{\n"
8540 "\t/*\n"
8541 " asdf\n"
8542 "\t*/\n"
8543 "}",
8544 format("{\n"
8545 "\t/*\n"
8546 " asdf\n"
8547 "\t*/\n"
8548 "}",
8549 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008550
8551 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008552 EXPECT_EQ("/*\n"
8553 " a\t\tcomment\n"
8554 " in multiple lines\n"
8555 " */",
8556 format(" /*\t \t \n"
8557 " \t \t a\t\tcomment\t \t\n"
8558 " \t \t in multiple lines\t\n"
8559 " \t */",
8560 Tab));
8561 EXPECT_EQ("/* some\n"
8562 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008563 format(" \t \t /* some\n"
8564 " \t \t comment */",
8565 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008566 EXPECT_EQ("int a; /* some\n"
8567 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008568 format(" \t \t int a; /* some\n"
8569 " \t \t comment */",
8570 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008571
Alexander Kornienko39856b72013-09-10 09:38:25 +00008572 EXPECT_EQ("int a; /* some\n"
8573 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008574 format(" \t \t int\ta; /* some\n"
8575 " \t \t comment */",
8576 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008577 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8578 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008579 format(" \t \t f(\"\t\t\"); /* some\n"
8580 " \t \t comment */",
8581 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008582 EXPECT_EQ("{\n"
8583 " /*\n"
8584 " * Comment\n"
8585 " */\n"
8586 " int i;\n"
8587 "}",
8588 format("{\n"
8589 "\t/*\n"
8590 "\t * Comment\n"
8591 "\t */\n"
8592 "\t int i;\n"
8593 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008594
8595 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8596 Tab.TabWidth = 8;
8597 Tab.IndentWidth = 8;
8598 EXPECT_EQ("if (aaaaaaaa && // q\n"
8599 " bb) // w\n"
8600 "\t;",
8601 format("if (aaaaaaaa &&// q\n"
8602 "bb)// w\n"
8603 ";",
8604 Tab));
8605 EXPECT_EQ("if (aaa && bbb) // w\n"
8606 "\t;",
8607 format("if(aaa&&bbb)// w\n"
8608 ";",
8609 Tab));
8610 verifyFormat("class X {\n"
8611 "\tvoid f() {\n"
8612 "\t\tsomeFunction(parameter1,\n"
8613 "\t\t\t parameter2);\n"
8614 "\t}\n"
8615 "};",
8616 Tab);
8617 verifyFormat("#define A \\\n"
8618 "\tvoid f() { \\\n"
8619 "\t\tsomeFunction( \\\n"
8620 "\t\t parameter1, \\\n"
8621 "\t\t parameter2); \\\n"
8622 "\t}",
8623 Tab);
8624 Tab.TabWidth = 4;
8625 Tab.IndentWidth = 8;
8626 verifyFormat("class TabWidth4Indent8 {\n"
8627 "\t\tvoid f() {\n"
8628 "\t\t\t\tsomeFunction(parameter1,\n"
8629 "\t\t\t\t\t\t\t parameter2);\n"
8630 "\t\t}\n"
8631 "};",
8632 Tab);
8633 Tab.TabWidth = 4;
8634 Tab.IndentWidth = 4;
8635 verifyFormat("class TabWidth4Indent4 {\n"
8636 "\tvoid f() {\n"
8637 "\t\tsomeFunction(parameter1,\n"
8638 "\t\t\t\t\t parameter2);\n"
8639 "\t}\n"
8640 "};",
8641 Tab);
8642 Tab.TabWidth = 8;
8643 Tab.IndentWidth = 4;
8644 verifyFormat("class TabWidth8Indent4 {\n"
8645 " void f() {\n"
8646 "\tsomeFunction(parameter1,\n"
8647 "\t\t parameter2);\n"
8648 " }\n"
8649 "};",
8650 Tab);
8651 Tab.TabWidth = 8;
8652 Tab.IndentWidth = 8;
8653 EXPECT_EQ("/*\n"
8654 "\t a\t\tcomment\n"
8655 "\t in multiple lines\n"
8656 " */",
8657 format(" /*\t \t \n"
8658 " \t \t a\t\tcomment\t \t\n"
8659 " \t \t in multiple lines\t\n"
8660 " \t */",
8661 Tab));
8662 verifyFormat("{\n"
8663 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8664 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8665 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8666 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8667 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8668 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8669 "};",
8670 Tab);
8671 verifyFormat("enum AA {\n"
8672 "\ta1, // Force multiple lines\n"
8673 "\ta2,\n"
8674 "\ta3\n"
8675 "};",
8676 Tab);
8677 EXPECT_EQ("if (aaaaaaaa && // q\n"
8678 " bb) // w\n"
8679 "\t;",
8680 format("if (aaaaaaaa &&// q\n"
8681 "bb)// w\n"
8682 ";",
8683 Tab));
8684 verifyFormat("class X {\n"
8685 "\tvoid f() {\n"
8686 "\t\tsomeFunction(parameter1,\n"
8687 "\t\t\t parameter2);\n"
8688 "\t}\n"
8689 "};",
8690 Tab);
8691 verifyFormat("{\n"
8692 "\tQ(\n"
8693 "\t {\n"
8694 "\t\t int a;\n"
8695 "\t\t someFunction(aaaaaaaa,\n"
8696 "\t\t\t\t bbbbbbb);\n"
8697 "\t },\n"
8698 "\t p);\n"
8699 "}",
8700 Tab);
8701 EXPECT_EQ("{\n"
8702 "\t/* aaaa\n"
8703 "\t bbbb */\n"
8704 "}",
8705 format("{\n"
8706 "/* aaaa\n"
8707 " bbbb */\n"
8708 "}",
8709 Tab));
8710 EXPECT_EQ("{\n"
8711 "\t/*\n"
8712 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8713 "\t bbbbbbbbbbbbb\n"
8714 "\t*/\n"
8715 "}",
8716 format("{\n"
8717 "/*\n"
8718 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8719 "*/\n"
8720 "}",
8721 Tab));
8722 EXPECT_EQ("{\n"
8723 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8724 "\t// bbbbbbbbbbbbb\n"
8725 "}",
8726 format("{\n"
8727 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8728 "}",
8729 Tab));
8730 EXPECT_EQ("{\n"
8731 "\t/*\n"
8732 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8733 "\t bbbbbbbbbbbbb\n"
8734 "\t*/\n"
8735 "}",
8736 format("{\n"
8737 "\t/*\n"
8738 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8739 "\t*/\n"
8740 "}",
8741 Tab));
8742 EXPECT_EQ("{\n"
8743 "\t/*\n"
8744 "\n"
8745 "\t*/\n"
8746 "}",
8747 format("{\n"
8748 "\t/*\n"
8749 "\n"
8750 "\t*/\n"
8751 "}",
8752 Tab));
8753 EXPECT_EQ("{\n"
8754 "\t/*\n"
8755 " asdf\n"
8756 "\t*/\n"
8757 "}",
8758 format("{\n"
8759 "\t/*\n"
8760 " asdf\n"
8761 "\t*/\n"
8762 "}",
8763 Tab));
8764 EXPECT_EQ("/*\n"
8765 "\t a\t\tcomment\n"
8766 "\t in multiple lines\n"
8767 " */",
8768 format(" /*\t \t \n"
8769 " \t \t a\t\tcomment\t \t\n"
8770 " \t \t in multiple lines\t\n"
8771 " \t */",
8772 Tab));
8773 EXPECT_EQ("/* some\n"
8774 " comment */",
8775 format(" \t \t /* some\n"
8776 " \t \t comment */",
8777 Tab));
8778 EXPECT_EQ("int a; /* some\n"
8779 " comment */",
8780 format(" \t \t int a; /* some\n"
8781 " \t \t comment */",
8782 Tab));
8783 EXPECT_EQ("int a; /* some\n"
8784 "comment */",
8785 format(" \t \t int\ta; /* some\n"
8786 " \t \t comment */",
8787 Tab));
8788 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8789 " comment */",
8790 format(" \t \t f(\"\t\t\"); /* some\n"
8791 " \t \t comment */",
8792 Tab));
8793 EXPECT_EQ("{\n"
8794 " /*\n"
8795 " * Comment\n"
8796 " */\n"
8797 " int i;\n"
8798 "}",
8799 format("{\n"
8800 "\t/*\n"
8801 "\t * Comment\n"
8802 "\t */\n"
8803 "\t int i;\n"
8804 "}"));
8805 Tab.AlignConsecutiveAssignments = true;
8806 Tab.AlignConsecutiveDeclarations = true;
8807 Tab.TabWidth = 4;
8808 Tab.IndentWidth = 4;
8809 verifyFormat("class Assign {\n"
8810 "\tvoid f() {\n"
8811 "\t\tint x = 123;\n"
8812 "\t\tint random = 4;\n"
8813 "\t\tstd::string alphabet =\n"
8814 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8815 "\t}\n"
8816 "};",
8817 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008818}
8819
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008820TEST_F(FormatTest, CalculatesOriginalColumn) {
8821 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8822 "q\"; /* some\n"
8823 " comment */",
8824 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8825 "q\"; /* some\n"
8826 " comment */",
8827 getLLVMStyle()));
8828 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8829 "/* some\n"
8830 " comment */",
8831 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8832 " /* some\n"
8833 " comment */",
8834 getLLVMStyle()));
8835 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8836 "qqq\n"
8837 "/* some\n"
8838 " comment */",
8839 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8840 "qqq\n"
8841 " /* some\n"
8842 " comment */",
8843 getLLVMStyle()));
8844 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8845 "wwww; /* some\n"
8846 " comment */",
8847 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8848 "wwww; /* some\n"
8849 " comment */",
8850 getLLVMStyle()));
8851}
8852
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008853TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008854 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008855 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008856
8857 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008858 " continue;",
8859 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008860 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008861 " continue;",
8862 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008863 verifyFormat("if(true)\n"
8864 " f();\n"
8865 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008866 " f();",
8867 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008868 verifyFormat("do {\n"
8869 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008870 "} while(something());",
8871 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008872 verifyFormat("switch(x) {\n"
8873 "default:\n"
8874 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008875 "}",
8876 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008877 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008878 verifyFormat("size_t x = sizeof(x);", NoSpace);
8879 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8880 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8881 verifyFormat("alignas(128) char a[128];", NoSpace);
8882 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8883 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8884 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008885 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008886 verifyFormat("T A::operator()();", NoSpace);
8887 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008888
8889 FormatStyle Space = getLLVMStyle();
8890 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8891
8892 verifyFormat("int f ();", Space);
8893 verifyFormat("void f (int a, T b) {\n"
8894 " while (true)\n"
8895 " continue;\n"
8896 "}",
8897 Space);
8898 verifyFormat("if (true)\n"
8899 " f ();\n"
8900 "else if (true)\n"
8901 " f ();",
8902 Space);
8903 verifyFormat("do {\n"
8904 " do_something ();\n"
8905 "} while (something ());",
8906 Space);
8907 verifyFormat("switch (x) {\n"
8908 "default:\n"
8909 " break;\n"
8910 "}",
8911 Space);
8912 verifyFormat("A::A () : a (1) {}", Space);
8913 verifyFormat("void f () __attribute__ ((asdf));", Space);
8914 verifyFormat("*(&a + 1);\n"
8915 "&((&a)[1]);\n"
8916 "a[(b + c) * d];\n"
8917 "(((a + 1) * 2) + 3) * 4;",
8918 Space);
8919 verifyFormat("#define A(x) x", Space);
8920 verifyFormat("#define A (x) x", Space);
8921 verifyFormat("#if defined(x)\n"
8922 "#endif",
8923 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008924 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008925 verifyFormat("size_t x = sizeof (x);", Space);
8926 verifyFormat("auto f (int x) -> decltype (x);", Space);
8927 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8928 verifyFormat("alignas (128) char a[128];", Space);
8929 verifyFormat("size_t x = alignof (MyType);", Space);
8930 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8931 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008932 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008933 verifyFormat("T A::operator() ();", Space);
8934 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008935}
8936
8937TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8938 FormatStyle Spaces = getLLVMStyle();
8939
8940 Spaces.SpacesInParentheses = true;
8941 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008942 verifyFormat("call();", Spaces);
8943 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008944 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8945 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008946 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008947 " continue;",
8948 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008949 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008950 " continue;",
8951 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008952 verifyFormat("if ( true )\n"
8953 " f();\n"
8954 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008955 " f();",
8956 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008957 verifyFormat("do {\n"
8958 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008959 "} while ( something() );",
8960 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008961 verifyFormat("switch ( x ) {\n"
8962 "default:\n"
8963 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008964 "}",
8965 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008966
8967 Spaces.SpacesInParentheses = false;
8968 Spaces.SpacesInCStyleCastParentheses = true;
8969 verifyFormat("Type *A = ( Type * )P;", Spaces);
8970 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8971 verifyFormat("x = ( int32 )y;", Spaces);
8972 verifyFormat("int a = ( int )(2.0f);", Spaces);
8973 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8974 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8975 verifyFormat("#define x (( int )-1)", Spaces);
8976
Daniel Jasper92e09822015-03-18 12:59:19 +00008977 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008978 Spaces.SpacesInParentheses = false;
8979 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008980 Spaces.SpacesInCStyleCastParentheses = true;
8981 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008982 verifyFormat("call( );", Spaces);
8983 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008984 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008985 " continue;",
8986 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008987 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008988 " continue;",
8989 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008990 verifyFormat("if (true)\n"
8991 " f( );\n"
8992 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008993 " f( );",
8994 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008995 verifyFormat("do {\n"
8996 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008997 "} while (something( ));",
8998 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008999 verifyFormat("switch (x) {\n"
9000 "default:\n"
9001 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009002 "}",
9003 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009004
Daniel Jasper92e09822015-03-18 12:59:19 +00009005 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009006 Spaces.SpaceAfterCStyleCast = true;
9007 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009008 verifyFormat("call( );", Spaces);
9009 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009010 verifyFormat("while (( bool ) 1)\n"
9011 " continue;",
9012 Spaces);
9013 verifyFormat("for (;;)\n"
9014 " continue;",
9015 Spaces);
9016 verifyFormat("if (true)\n"
9017 " f( );\n"
9018 "else if (true)\n"
9019 " f( );",
9020 Spaces);
9021 verifyFormat("do {\n"
9022 " do_something(( int ) i);\n"
9023 "} while (something( ));",
9024 Spaces);
9025 verifyFormat("switch (x) {\n"
9026 "default:\n"
9027 " break;\n"
9028 "}",
9029 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009030
9031 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009032 Spaces.SpacesInCStyleCastParentheses = false;
9033 Spaces.SpaceAfterCStyleCast = true;
9034 verifyFormat("while ((bool) 1)\n"
9035 " continue;",
9036 Spaces);
9037 verifyFormat("do {\n"
9038 " do_something((int) i);\n"
9039 "} while (something( ));",
9040 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009041}
9042
Daniel Jasperad981f82014-08-26 11:41:14 +00009043TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9044 verifyFormat("int a[5];");
9045 verifyFormat("a[3] += 42;");
9046
9047 FormatStyle Spaces = getLLVMStyle();
9048 Spaces.SpacesInSquareBrackets = true;
9049 // Lambdas unchanged.
9050 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9051 verifyFormat("return [i, args...] {};", Spaces);
9052
9053 // Not lambdas.
9054 verifyFormat("int a[ 5 ];", Spaces);
9055 verifyFormat("a[ 3 ] += 42;", Spaces);
9056 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9057 verifyFormat("double &operator[](int i) { return 0; }\n"
9058 "int i;",
9059 Spaces);
9060 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9061 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9062 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9063}
9064
Daniel Jasperd94bff32013-09-25 15:15:02 +00009065TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9066 verifyFormat("int a = 5;");
9067 verifyFormat("a += 42;");
9068 verifyFormat("a or_eq 8;");
9069
9070 FormatStyle Spaces = getLLVMStyle();
9071 Spaces.SpaceBeforeAssignmentOperators = false;
9072 verifyFormat("int a= 5;", Spaces);
9073 verifyFormat("a+= 42;", Spaces);
9074 verifyFormat("a or_eq 8;", Spaces);
9075}
9076
Daniel Jaspera44991332015-04-29 13:06:49 +00009077TEST_F(FormatTest, AlignConsecutiveAssignments) {
9078 FormatStyle Alignment = getLLVMStyle();
9079 Alignment.AlignConsecutiveAssignments = false;
9080 verifyFormat("int a = 5;\n"
9081 "int oneTwoThree = 123;",
9082 Alignment);
9083 verifyFormat("int a = 5;\n"
9084 "int oneTwoThree = 123;",
9085 Alignment);
9086
9087 Alignment.AlignConsecutiveAssignments = true;
9088 verifyFormat("int a = 5;\n"
9089 "int oneTwoThree = 123;",
9090 Alignment);
9091 verifyFormat("int a = method();\n"
9092 "int oneTwoThree = 133;",
9093 Alignment);
9094 verifyFormat("a &= 5;\n"
9095 "bcd *= 5;\n"
9096 "ghtyf += 5;\n"
9097 "dvfvdb -= 5;\n"
9098 "a /= 5;\n"
9099 "vdsvsv %= 5;\n"
9100 "sfdbddfbdfbb ^= 5;\n"
9101 "dvsdsv |= 5;\n"
9102 "int dsvvdvsdvvv = 123;",
9103 Alignment);
9104 verifyFormat("int i = 1, j = 10;\n"
9105 "something = 2000;",
9106 Alignment);
9107 verifyFormat("something = 2000;\n"
9108 "int i = 1, j = 10;\n",
9109 Alignment);
9110 verifyFormat("something = 2000;\n"
9111 "another = 911;\n"
9112 "int i = 1, j = 10;\n"
9113 "oneMore = 1;\n"
9114 "i = 2;",
9115 Alignment);
9116 verifyFormat("int a = 5;\n"
9117 "int one = 1;\n"
9118 "method();\n"
9119 "int oneTwoThree = 123;\n"
9120 "int oneTwo = 12;",
9121 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009122 verifyFormat("int oneTwoThree = 123;\n"
9123 "int oneTwo = 12;\n"
9124 "method();\n",
9125 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009126 verifyFormat("int oneTwoThree = 123; // comment\n"
9127 "int oneTwo = 12; // comment",
9128 Alignment);
9129 EXPECT_EQ("int a = 5;\n"
9130 "\n"
9131 "int oneTwoThree = 123;",
9132 format("int a = 5;\n"
9133 "\n"
9134 "int oneTwoThree= 123;",
9135 Alignment));
9136 EXPECT_EQ("int a = 5;\n"
9137 "int one = 1;\n"
9138 "\n"
9139 "int oneTwoThree = 123;",
9140 format("int a = 5;\n"
9141 "int one = 1;\n"
9142 "\n"
9143 "int oneTwoThree = 123;",
9144 Alignment));
9145 EXPECT_EQ("int a = 5;\n"
9146 "int one = 1;\n"
9147 "\n"
9148 "int oneTwoThree = 123;\n"
9149 "int oneTwo = 12;",
9150 format("int a = 5;\n"
9151 "int one = 1;\n"
9152 "\n"
9153 "int oneTwoThree = 123;\n"
9154 "int oneTwo = 12;",
9155 Alignment));
9156 Alignment.AlignEscapedNewlinesLeft = true;
9157 verifyFormat("#define A \\\n"
9158 " int aaaa = 12; \\\n"
9159 " int b = 23; \\\n"
9160 " int ccc = 234; \\\n"
9161 " int dddddddddd = 2345;",
9162 Alignment);
9163 Alignment.AlignEscapedNewlinesLeft = false;
9164 verifyFormat("#define A "
9165 " \\\n"
9166 " int aaaa = 12; "
9167 " \\\n"
9168 " int b = 23; "
9169 " \\\n"
9170 " int ccc = 234; "
9171 " \\\n"
9172 " int dddddddddd = 2345;",
9173 Alignment);
9174 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9175 "k = 4, int l = 5,\n"
9176 " int m = 6) {\n"
9177 " int j = 10;\n"
9178 " otherThing = 1;\n"
9179 "}",
9180 Alignment);
9181 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9182 " int i = 1;\n"
9183 " int j = 2;\n"
9184 " int big = 10000;\n"
9185 "}",
9186 Alignment);
9187 verifyFormat("class C {\n"
9188 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009189 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009190 " virtual void f() = 0;\n"
9191 "};",
9192 Alignment);
9193 verifyFormat("int i = 1;\n"
9194 "if (SomeType t = getSomething()) {\n"
9195 "}\n"
9196 "int j = 2;\n"
9197 "int big = 10000;",
9198 Alignment);
9199 verifyFormat("int j = 7;\n"
9200 "for (int k = 0; k < N; ++k) {\n"
9201 "}\n"
9202 "int j = 2;\n"
9203 "int big = 10000;\n"
9204 "}",
9205 Alignment);
9206 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9207 verifyFormat("int i = 1;\n"
9208 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9209 " = someLooooooooooooooooongFunction();\n"
9210 "int j = 2;",
9211 Alignment);
9212 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9213 verifyFormat("int i = 1;\n"
9214 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9215 " someLooooooooooooooooongFunction();\n"
9216 "int j = 2;",
9217 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009218
9219 verifyFormat("auto lambda = []() {\n"
9220 " auto i = 0;\n"
9221 " return 0;\n"
9222 "};\n"
9223 "int i = 0;\n"
9224 "auto v = type{\n"
9225 " i = 1, //\n"
9226 " (i = 2), //\n"
9227 " i = 3 //\n"
9228 "};",
9229 Alignment);
9230
Daniel Jaspera44991332015-04-29 13:06:49 +00009231 // FIXME: Should align all three assignments
9232 verifyFormat(
9233 "int i = 1;\n"
9234 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9235 " loooooooooooooooooooooongParameterB);\n"
9236 "int j = 2;",
9237 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009238
9239 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9240 " typename B = very_long_type_name_1,\n"
9241 " typename T_2 = very_long_type_name_2>\n"
9242 "auto foo() {}\n",
9243 Alignment);
9244 verifyFormat("int a, b = 1;\n"
9245 "int c = 2;\n"
9246 "int dd = 3;\n",
9247 Alignment);
9248 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9249 "float b[1][] = {{3.f}};\n",
9250 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009251}
9252
Daniel Jaspere12597c2015-10-01 10:06:54 +00009253TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9254 FormatStyle Alignment = getLLVMStyle();
9255 Alignment.AlignConsecutiveDeclarations = false;
9256 verifyFormat("float const a = 5;\n"
9257 "int oneTwoThree = 123;",
9258 Alignment);
9259 verifyFormat("int a = 5;\n"
9260 "float const oneTwoThree = 123;",
9261 Alignment);
9262
9263 Alignment.AlignConsecutiveDeclarations = true;
9264 verifyFormat("float const a = 5;\n"
9265 "int oneTwoThree = 123;",
9266 Alignment);
9267 verifyFormat("int a = method();\n"
9268 "float const oneTwoThree = 133;",
9269 Alignment);
9270 verifyFormat("int i = 1, j = 10;\n"
9271 "something = 2000;",
9272 Alignment);
9273 verifyFormat("something = 2000;\n"
9274 "int i = 1, j = 10;\n",
9275 Alignment);
9276 verifyFormat("float something = 2000;\n"
9277 "double another = 911;\n"
9278 "int i = 1, j = 10;\n"
9279 "const int *oneMore = 1;\n"
9280 "unsigned i = 2;",
9281 Alignment);
9282 verifyFormat("float a = 5;\n"
9283 "int one = 1;\n"
9284 "method();\n"
9285 "const double oneTwoThree = 123;\n"
9286 "const unsigned int oneTwo = 12;",
9287 Alignment);
9288 verifyFormat("int oneTwoThree{0}; // comment\n"
9289 "unsigned oneTwo; // comment",
9290 Alignment);
9291 EXPECT_EQ("float const a = 5;\n"
9292 "\n"
9293 "int oneTwoThree = 123;",
9294 format("float const a = 5;\n"
9295 "\n"
9296 "int oneTwoThree= 123;",
9297 Alignment));
9298 EXPECT_EQ("float a = 5;\n"
9299 "int one = 1;\n"
9300 "\n"
9301 "unsigned oneTwoThree = 123;",
9302 format("float a = 5;\n"
9303 "int one = 1;\n"
9304 "\n"
9305 "unsigned oneTwoThree = 123;",
9306 Alignment));
9307 EXPECT_EQ("float a = 5;\n"
9308 "int one = 1;\n"
9309 "\n"
9310 "unsigned oneTwoThree = 123;\n"
9311 "int oneTwo = 12;",
9312 format("float a = 5;\n"
9313 "int one = 1;\n"
9314 "\n"
9315 "unsigned oneTwoThree = 123;\n"
9316 "int oneTwo = 12;",
9317 Alignment));
9318 Alignment.AlignConsecutiveAssignments = true;
9319 verifyFormat("float something = 2000;\n"
9320 "double another = 911;\n"
9321 "int i = 1, j = 10;\n"
9322 "const int *oneMore = 1;\n"
9323 "unsigned i = 2;",
9324 Alignment);
9325 verifyFormat("int oneTwoThree = {0}; // comment\n"
9326 "unsigned oneTwo = 0; // comment",
9327 Alignment);
9328 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9329 " int const i = 1;\n"
9330 " int * j = 2;\n"
9331 " int big = 10000;\n"
9332 "\n"
9333 " unsigned oneTwoThree = 123;\n"
9334 " int oneTwo = 12;\n"
9335 " method();\n"
9336 " float k = 2;\n"
9337 " int ll = 10000;\n"
9338 "}",
9339 format("void SomeFunction(int parameter= 0) {\n"
9340 " int const i= 1;\n"
9341 " int *j=2;\n"
9342 " int big = 10000;\n"
9343 "\n"
9344 "unsigned oneTwoThree =123;\n"
9345 "int oneTwo = 12;\n"
9346 " method();\n"
9347 "float k= 2;\n"
9348 "int ll=10000;\n"
9349 "}",
9350 Alignment));
9351 Alignment.AlignConsecutiveAssignments = false;
9352 Alignment.AlignEscapedNewlinesLeft = true;
9353 verifyFormat("#define A \\\n"
9354 " int aaaa = 12; \\\n"
9355 " float b = 23; \\\n"
9356 " const int ccc = 234; \\\n"
9357 " unsigned dddddddddd = 2345;",
9358 Alignment);
9359 Alignment.AlignEscapedNewlinesLeft = false;
9360 Alignment.ColumnLimit = 30;
9361 verifyFormat("#define A \\\n"
9362 " int aaaa = 12; \\\n"
9363 " float b = 23; \\\n"
9364 " const int ccc = 234; \\\n"
9365 " int dddddddddd = 2345;",
9366 Alignment);
9367 Alignment.ColumnLimit = 80;
9368 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9369 "k = 4, int l = 5,\n"
9370 " int m = 6) {\n"
9371 " const int j = 10;\n"
9372 " otherThing = 1;\n"
9373 "}",
9374 Alignment);
9375 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9376 " int const i = 1;\n"
9377 " int * j = 2;\n"
9378 " int big = 10000;\n"
9379 "}",
9380 Alignment);
9381 verifyFormat("class C {\n"
9382 "public:\n"
9383 " int i = 1;\n"
9384 " virtual void f() = 0;\n"
9385 "};",
9386 Alignment);
9387 verifyFormat("float i = 1;\n"
9388 "if (SomeType t = getSomething()) {\n"
9389 "}\n"
9390 "const unsigned j = 2;\n"
9391 "int big = 10000;",
9392 Alignment);
9393 verifyFormat("float j = 7;\n"
9394 "for (int k = 0; k < N; ++k) {\n"
9395 "}\n"
9396 "unsigned j = 2;\n"
9397 "int big = 10000;\n"
9398 "}",
9399 Alignment);
9400 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9401 verifyFormat("float i = 1;\n"
9402 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9403 " = someLooooooooooooooooongFunction();\n"
9404 "int j = 2;",
9405 Alignment);
9406 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9407 verifyFormat("int i = 1;\n"
9408 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9409 " someLooooooooooooooooongFunction();\n"
9410 "int j = 2;",
9411 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009412
9413 Alignment.AlignConsecutiveAssignments = true;
9414 verifyFormat("auto lambda = []() {\n"
9415 " auto ii = 0;\n"
9416 " float j = 0;\n"
9417 " return 0;\n"
9418 "};\n"
9419 "int i = 0;\n"
9420 "float i2 = 0;\n"
9421 "auto v = type{\n"
9422 " i = 1, //\n"
9423 " (i = 2), //\n"
9424 " i = 3 //\n"
9425 "};",
9426 Alignment);
9427 Alignment.AlignConsecutiveAssignments = false;
9428
Daniel Jaspere12597c2015-10-01 10:06:54 +00009429 // FIXME: Should align all three declarations
9430 verifyFormat(
9431 "int i = 1;\n"
9432 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9433 " loooooooooooooooooooooongParameterB);\n"
9434 "int j = 2;",
9435 Alignment);
9436
9437 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9438 // We expect declarations and assignments to align, as long as it doesn't
9439 // exceed the column limit, starting a new alignemnt sequence whenever it
9440 // happens.
9441 Alignment.AlignConsecutiveAssignments = true;
9442 Alignment.ColumnLimit = 30;
9443 verifyFormat("float ii = 1;\n"
9444 "unsigned j = 2;\n"
9445 "int someVerylongVariable = 1;\n"
9446 "AnotherLongType ll = 123456;\n"
9447 "VeryVeryLongType k = 2;\n"
9448 "int myvar = 1;",
9449 Alignment);
9450 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009451 Alignment.AlignConsecutiveAssignments = false;
9452
9453 verifyFormat(
9454 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9455 " typename LongType, typename B>\n"
9456 "auto foo() {}\n",
9457 Alignment);
9458 verifyFormat("float a, b = 1;\n"
9459 "int c = 2;\n"
9460 "int dd = 3;\n",
9461 Alignment);
9462 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9463 "float b[1][] = {{3.f}};\n",
9464 Alignment);
9465 Alignment.AlignConsecutiveAssignments = true;
9466 verifyFormat("float a, b = 1;\n"
9467 "int c = 2;\n"
9468 "int dd = 3;\n",
9469 Alignment);
9470 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9471 "float b[1][] = {{3.f}};\n",
9472 Alignment);
9473 Alignment.AlignConsecutiveAssignments = false;
9474
9475 Alignment.ColumnLimit = 30;
9476 Alignment.BinPackParameters = false;
9477 verifyFormat("void foo(float a,\n"
9478 " float b,\n"
9479 " int c,\n"
9480 " uint32_t *d) {\n"
9481 " int * e = 0;\n"
9482 " float f = 0;\n"
9483 " double g = 0;\n"
9484 "}\n"
9485 "void bar(ino_t a,\n"
9486 " int b,\n"
9487 " uint32_t *c,\n"
9488 " bool d) {}\n",
9489 Alignment);
9490 Alignment.BinPackParameters = true;
9491 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009492}
9493
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009494TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009495 FormatStyle LinuxBraceStyle = getLLVMStyle();
9496 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009497 verifyFormat("namespace a\n"
9498 "{\n"
9499 "class A\n"
9500 "{\n"
9501 " void f()\n"
9502 " {\n"
9503 " if (true) {\n"
9504 " a();\n"
9505 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009506 " } else {\n"
9507 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009508 " }\n"
9509 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009510 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009511 "};\n"
9512 "struct B {\n"
9513 " int x;\n"
9514 "};\n"
9515 "}\n",
9516 LinuxBraceStyle);
9517 verifyFormat("enum X {\n"
9518 " Y = 0,\n"
9519 "}\n",
9520 LinuxBraceStyle);
9521 verifyFormat("struct S {\n"
9522 " int Type;\n"
9523 " union {\n"
9524 " int x;\n"
9525 " double y;\n"
9526 " } Value;\n"
9527 " class C\n"
9528 " {\n"
9529 " MyFavoriteType Value;\n"
9530 " } Class;\n"
9531 "}\n",
9532 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009533}
9534
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009535TEST_F(FormatTest, MozillaBraceBreaking) {
9536 FormatStyle MozillaBraceStyle = getLLVMStyle();
9537 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
9538 verifyFormat("namespace a {\n"
9539 "class A\n"
9540 "{\n"
9541 " void f()\n"
9542 " {\n"
9543 " if (true) {\n"
9544 " a();\n"
9545 " b();\n"
9546 " }\n"
9547 " }\n"
9548 " void g() { return; }\n"
9549 "};\n"
9550 "enum E\n"
9551 "{\n"
9552 " A,\n"
9553 " // foo\n"
9554 " B,\n"
9555 " C\n"
9556 "};\n"
9557 "struct B\n"
9558 "{\n"
9559 " int x;\n"
9560 "};\n"
9561 "}\n",
9562 MozillaBraceStyle);
9563 verifyFormat("struct S\n"
9564 "{\n"
9565 " int Type;\n"
9566 " union\n"
9567 " {\n"
9568 " int x;\n"
9569 " double y;\n"
9570 " } Value;\n"
9571 " class C\n"
9572 " {\n"
9573 " MyFavoriteType Value;\n"
9574 " } Class;\n"
9575 "}\n",
9576 MozillaBraceStyle);
9577}
9578
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009579TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009580 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9581 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009582 verifyFormat("namespace a {\n"
9583 "class A {\n"
9584 " void f()\n"
9585 " {\n"
9586 " if (true) {\n"
9587 " a();\n"
9588 " b();\n"
9589 " }\n"
9590 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009591 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009592 "};\n"
9593 "struct B {\n"
9594 " int x;\n"
9595 "};\n"
9596 "}\n",
9597 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009598
Daniel Jasperd9670872014-08-05 12:06:20 +00009599 verifyFormat("void foo()\n"
9600 "{\n"
9601 " if (a) {\n"
9602 " a();\n"
9603 " }\n"
9604 " else {\n"
9605 " b();\n"
9606 " }\n"
9607 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009608 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009609
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009610 verifyFormat("#ifdef _DEBUG\n"
9611 "int foo(int i = 0)\n"
9612 "#else\n"
9613 "int foo(int i = 5)\n"
9614 "#endif\n"
9615 "{\n"
9616 " return i;\n"
9617 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009618 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009619
9620 verifyFormat("void foo() {}\n"
9621 "void bar()\n"
9622 "#ifdef _DEBUG\n"
9623 "{\n"
9624 " foo();\n"
9625 "}\n"
9626 "#else\n"
9627 "{\n"
9628 "}\n"
9629 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009630 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009631
9632 verifyFormat("void foobar() { int i = 5; }\n"
9633 "#ifdef _DEBUG\n"
9634 "void bar() {}\n"
9635 "#else\n"
9636 "void bar() { foobar(); }\n"
9637 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009638 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009639}
9640
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009641TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009642 FormatStyle AllmanBraceStyle = getLLVMStyle();
9643 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009644 verifyFormat("namespace a\n"
9645 "{\n"
9646 "class A\n"
9647 "{\n"
9648 " void f()\n"
9649 " {\n"
9650 " if (true)\n"
9651 " {\n"
9652 " a();\n"
9653 " b();\n"
9654 " }\n"
9655 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009656 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009657 "};\n"
9658 "struct B\n"
9659 "{\n"
9660 " int x;\n"
9661 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009662 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009663 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009664
9665 verifyFormat("void f()\n"
9666 "{\n"
9667 " if (true)\n"
9668 " {\n"
9669 " a();\n"
9670 " }\n"
9671 " else if (false)\n"
9672 " {\n"
9673 " b();\n"
9674 " }\n"
9675 " else\n"
9676 " {\n"
9677 " c();\n"
9678 " }\n"
9679 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009680 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009681
9682 verifyFormat("void f()\n"
9683 "{\n"
9684 " for (int i = 0; i < 10; ++i)\n"
9685 " {\n"
9686 " a();\n"
9687 " }\n"
9688 " while (false)\n"
9689 " {\n"
9690 " b();\n"
9691 " }\n"
9692 " do\n"
9693 " {\n"
9694 " c();\n"
9695 " } while (false)\n"
9696 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009697 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009698
9699 verifyFormat("void f(int a)\n"
9700 "{\n"
9701 " switch (a)\n"
9702 " {\n"
9703 " case 0:\n"
9704 " break;\n"
9705 " case 1:\n"
9706 " {\n"
9707 " break;\n"
9708 " }\n"
9709 " case 2:\n"
9710 " {\n"
9711 " }\n"
9712 " break;\n"
9713 " default:\n"
9714 " break;\n"
9715 " }\n"
9716 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009717 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009718
9719 verifyFormat("enum X\n"
9720 "{\n"
9721 " Y = 0,\n"
9722 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009723 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009724 verifyFormat("enum X\n"
9725 "{\n"
9726 " Y = 0\n"
9727 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009728 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009729
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009730 verifyFormat("@interface BSApplicationController ()\n"
9731 "{\n"
9732 "@private\n"
9733 " id _extraIvar;\n"
9734 "}\n"
9735 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009736 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009737
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009738 verifyFormat("#ifdef _DEBUG\n"
9739 "int foo(int i = 0)\n"
9740 "#else\n"
9741 "int foo(int i = 5)\n"
9742 "#endif\n"
9743 "{\n"
9744 " return i;\n"
9745 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009746 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009747
9748 verifyFormat("void foo() {}\n"
9749 "void bar()\n"
9750 "#ifdef _DEBUG\n"
9751 "{\n"
9752 " foo();\n"
9753 "}\n"
9754 "#else\n"
9755 "{\n"
9756 "}\n"
9757 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009758 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009759
9760 verifyFormat("void foobar() { int i = 5; }\n"
9761 "#ifdef _DEBUG\n"
9762 "void bar() {}\n"
9763 "#else\n"
9764 "void bar() { foobar(); }\n"
9765 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009766 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009767
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009768 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009769 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009770 " // ...\n"
9771 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009772 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009773 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009774 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009775 " // ...\n"
9776 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009777 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009778 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009779 // .. or dict literals.
9780 verifyFormat("void f()\n"
9781 "{\n"
9782 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
9783 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009784 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009785 verifyFormat("int f()\n"
9786 "{ // comment\n"
9787 " return 42;\n"
9788 "}",
9789 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009790
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009791 AllmanBraceStyle.ColumnLimit = 19;
9792 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9793 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009794 verifyFormat("void f()\n"
9795 "{\n"
9796 " int i;\n"
9797 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009798 AllmanBraceStyle);
9799 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009800
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009801 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009802 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9803 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9804 verifyFormat("void f(bool b)\n"
9805 "{\n"
9806 " if (b)\n"
9807 " {\n"
9808 " return;\n"
9809 " }\n"
9810 "}\n",
9811 BreakBeforeBraceShortIfs);
9812 verifyFormat("void f(bool b)\n"
9813 "{\n"
9814 " if (b) return;\n"
9815 "}\n",
9816 BreakBeforeBraceShortIfs);
9817 verifyFormat("void f(bool b)\n"
9818 "{\n"
9819 " while (b)\n"
9820 " {\n"
9821 " return;\n"
9822 " }\n"
9823 "}\n",
9824 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009825}
9826
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009827TEST_F(FormatTest, GNUBraceBreaking) {
9828 FormatStyle GNUBraceStyle = getLLVMStyle();
9829 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9830 verifyFormat("namespace a\n"
9831 "{\n"
9832 "class A\n"
9833 "{\n"
9834 " void f()\n"
9835 " {\n"
9836 " int a;\n"
9837 " {\n"
9838 " int b;\n"
9839 " }\n"
9840 " if (true)\n"
9841 " {\n"
9842 " a();\n"
9843 " b();\n"
9844 " }\n"
9845 " }\n"
9846 " void g() { return; }\n"
9847 "}\n"
9848 "}",
9849 GNUBraceStyle);
9850
9851 verifyFormat("void f()\n"
9852 "{\n"
9853 " if (true)\n"
9854 " {\n"
9855 " a();\n"
9856 " }\n"
9857 " else if (false)\n"
9858 " {\n"
9859 " b();\n"
9860 " }\n"
9861 " else\n"
9862 " {\n"
9863 " c();\n"
9864 " }\n"
9865 "}\n",
9866 GNUBraceStyle);
9867
9868 verifyFormat("void f()\n"
9869 "{\n"
9870 " for (int i = 0; i < 10; ++i)\n"
9871 " {\n"
9872 " a();\n"
9873 " }\n"
9874 " while (false)\n"
9875 " {\n"
9876 " b();\n"
9877 " }\n"
9878 " do\n"
9879 " {\n"
9880 " c();\n"
9881 " }\n"
9882 " while (false);\n"
9883 "}\n",
9884 GNUBraceStyle);
9885
9886 verifyFormat("void f(int a)\n"
9887 "{\n"
9888 " switch (a)\n"
9889 " {\n"
9890 " case 0:\n"
9891 " break;\n"
9892 " case 1:\n"
9893 " {\n"
9894 " break;\n"
9895 " }\n"
9896 " case 2:\n"
9897 " {\n"
9898 " }\n"
9899 " break;\n"
9900 " default:\n"
9901 " break;\n"
9902 " }\n"
9903 "}\n",
9904 GNUBraceStyle);
9905
9906 verifyFormat("enum X\n"
9907 "{\n"
9908 " Y = 0,\n"
9909 "}\n",
9910 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009911
9912 verifyFormat("@interface BSApplicationController ()\n"
9913 "{\n"
9914 "@private\n"
9915 " id _extraIvar;\n"
9916 "}\n"
9917 "@end\n",
9918 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009919
9920 verifyFormat("#ifdef _DEBUG\n"
9921 "int foo(int i = 0)\n"
9922 "#else\n"
9923 "int foo(int i = 5)\n"
9924 "#endif\n"
9925 "{\n"
9926 " return i;\n"
9927 "}",
9928 GNUBraceStyle);
9929
9930 verifyFormat("void foo() {}\n"
9931 "void bar()\n"
9932 "#ifdef _DEBUG\n"
9933 "{\n"
9934 " foo();\n"
9935 "}\n"
9936 "#else\n"
9937 "{\n"
9938 "}\n"
9939 "#endif",
9940 GNUBraceStyle);
9941
9942 verifyFormat("void foobar() { int i = 5; }\n"
9943 "#ifdef _DEBUG\n"
9944 "void bar() {}\n"
9945 "#else\n"
9946 "void bar() { foobar(); }\n"
9947 "#endif",
9948 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009949}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009950
9951TEST_F(FormatTest, WebKitBraceBreaking) {
9952 FormatStyle WebKitBraceStyle = getLLVMStyle();
9953 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
9954 verifyFormat("namespace a {\n"
9955 "class A {\n"
9956 " void f()\n"
9957 " {\n"
9958 " if (true) {\n"
9959 " a();\n"
9960 " b();\n"
9961 " }\n"
9962 " }\n"
9963 " void g() { return; }\n"
9964 "};\n"
9965 "enum E {\n"
9966 " A,\n"
9967 " // foo\n"
9968 " B,\n"
9969 " C\n"
9970 "};\n"
9971 "struct B {\n"
9972 " int x;\n"
9973 "};\n"
9974 "}\n",
9975 WebKitBraceStyle);
9976 verifyFormat("struct S {\n"
9977 " int Type;\n"
9978 " union {\n"
9979 " int x;\n"
9980 " double y;\n"
9981 " } Value;\n"
9982 " class C {\n"
9983 " MyFavoriteType Value;\n"
9984 " } Class;\n"
9985 "};\n",
9986 WebKitBraceStyle);
9987}
9988
Manuel Klimekd5735502013-08-12 03:51:17 +00009989TEST_F(FormatTest, CatchExceptionReferenceBinding) {
9990 verifyFormat("void f() {\n"
9991 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00009992 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00009993 " }\n"
9994 "}\n",
9995 getLLVMStyle());
9996}
9997
Daniel Jasper9613c812013-08-07 16:29:23 +00009998TEST_F(FormatTest, UnderstandsPragmas) {
9999 verifyFormat("#pragma omp reduction(| : var)");
10000 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +000010001
10002 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
10003 "(including parentheses).",
10004 format("#pragma mark Any non-hyphenated or hyphenated string "
10005 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +000010006}
10007
Daniel Jasperee4a8a12015-04-22 09:45:42 +000010008TEST_F(FormatTest, UnderstandPragmaOption) {
10009 verifyFormat("#pragma option -C -A");
10010
10011 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10012}
10013
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010014#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10015 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010016 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10017 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010018
10019TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010020 SmallVector<FormatStyle, 3> Styles;
10021 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010022
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010023 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010024 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10025 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10026 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010027
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010028 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010029 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10030 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10031 EXPECT_ALL_STYLES_EQUAL(Styles);
10032
Nico Weber514ecc82014-02-02 20:50:45 +000010033 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010034 EXPECT_TRUE(
10035 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10036 EXPECT_TRUE(
10037 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10038 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010039
Nico Weber514ecc82014-02-02 20:50:45 +000010040 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010041 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10042 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10043 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010044
10045 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010046 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10047 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10048 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010049
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010050 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010051 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10052 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10053 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010054
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010055 Styles[0] = getGNUStyle();
10056 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10057 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10058 EXPECT_ALL_STYLES_EQUAL(Styles);
10059
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010060 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10061}
10062
10063TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10064 SmallVector<FormatStyle, 8> Styles;
10065 Styles.resize(2);
10066
10067 Styles[0] = getGoogleStyle();
10068 Styles[1] = getLLVMStyle();
10069 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10070 EXPECT_ALL_STYLES_EQUAL(Styles);
10071
10072 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010073 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010074 Styles[1] = getLLVMStyle();
10075 Styles[1].Language = FormatStyle::LK_JavaScript;
10076 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10077
10078 Styles[2] = getLLVMStyle();
10079 Styles[2].Language = FormatStyle::LK_JavaScript;
10080 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10081 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010082 &Styles[2])
10083 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010084
10085 Styles[3] = getLLVMStyle();
10086 Styles[3].Language = FormatStyle::LK_JavaScript;
10087 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10088 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010089 &Styles[3])
10090 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010091
10092 Styles[4] = getLLVMStyle();
10093 Styles[4].Language = FormatStyle::LK_JavaScript;
10094 EXPECT_EQ(0, parseConfiguration("---\n"
10095 "BasedOnStyle: LLVM\n"
10096 "IndentWidth: 123\n"
10097 "---\n"
10098 "BasedOnStyle: Google\n"
10099 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010100 &Styles[4])
10101 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010102 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010103}
10104
Daniel Jasper91881d92014-09-29 08:07:46 +000010105#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010106 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010107 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010108 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010109 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010110 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010111
Daniel Jasper91881d92014-09-29 08:07:46 +000010112#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10113
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010114#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10115 Style.STRUCT.FIELD = false; \
10116 EXPECT_EQ(0, \
10117 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10118 .value()); \
10119 EXPECT_TRUE(Style.STRUCT.FIELD); \
10120 EXPECT_EQ(0, \
10121 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10122 .value()); \
10123 EXPECT_FALSE(Style.STRUCT.FIELD);
10124
10125#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10126 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10127
Daniel Jasper00853002014-09-16 16:22:30 +000010128#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10129 EXPECT_NE(VALUE, Style.FIELD); \
10130 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10131 EXPECT_EQ(VALUE, Style.FIELD)
10132
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010133TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010134 FormatStyle Style = {};
10135 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010136 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +000010137 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010138 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010139 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010140 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010141 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010142 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010143 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010144 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010145 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010146 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010147 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010148 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010149 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010150 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +000010151 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010152 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010153 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010154 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010155 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010156 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010157 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010158 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010159 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010160 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010161 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010162 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010163 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010164 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010165 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010166 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010167 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010168 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010169 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010170 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010171 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010172 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010173 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010174
10175 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10176 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10177 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10178 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10179 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10180 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10181 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10182 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
10183 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10184 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10185 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010186}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010187
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010188#undef CHECK_PARSE_BOOL
10189
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010190TEST_F(FormatTest, ParsesConfiguration) {
10191 FormatStyle Style = {};
10192 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010193 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010194 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10195 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010196 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010197 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10198 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010199 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10200 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010201 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10202 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10203 PenaltyReturnTypeOnItsOwnLine, 1234u);
10204 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10205 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010206 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010207 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010208 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010209
Daniel Jasper553d4872014-06-17 12:40:34 +000010210 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010211 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10212 FormatStyle::PAS_Left);
10213 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10214 FormatStyle::PAS_Right);
10215 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10216 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010217 // For backward compatibility:
10218 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10219 FormatStyle::PAS_Left);
10220 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10221 FormatStyle::PAS_Right);
10222 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10223 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010224
Alexander Kornienkod6538332013-05-07 15:32:14 +000010225 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010226 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10227 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010228 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10229 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10230 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10231
Daniel Jasperac043c92014-09-15 11:11:00 +000010232 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010233 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10234 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010235 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10236 FormatStyle::BOS_None);
10237 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10238 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010239 // For backward compatibility:
10240 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10241 FormatStyle::BOS_None);
10242 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10243 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010244
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010245 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10246 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10247 FormatStyle::BAS_Align);
10248 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10249 FormatStyle::BAS_DontAlign);
10250 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10251 FormatStyle::BAS_AlwaysBreak);
10252 // For backward compatibility:
10253 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10254 FormatStyle::BAS_DontAlign);
10255 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10256 FormatStyle::BAS_Align);
10257
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010258 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010259 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10260 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10261 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010262 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10263 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010264 // For backward compatibility:
10265 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10266 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010267
Daniel Jasperd74cf402014-04-08 12:46:38 +000010268 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010269 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10270 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10271 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10272 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010273 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10274 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010275 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10276 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010277 // For backward compatibility:
10278 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10279 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10280 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10281 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010282
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010283 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10284 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10285 FormatStyle::SBPO_Never);
10286 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10287 FormatStyle::SBPO_Always);
10288 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10289 FormatStyle::SBPO_ControlStatements);
10290 // For backward compatibility:
10291 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10292 FormatStyle::SBPO_Never);
10293 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10294 FormatStyle::SBPO_ControlStatements);
10295
Alexander Kornienkod6538332013-05-07 15:32:14 +000010296 Style.ColumnLimit = 123;
10297 FormatStyle BaseStyle = getLLVMStyle();
10298 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10299 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10300
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010301 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10302 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10303 FormatStyle::BS_Attach);
10304 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10305 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010306 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10307 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010308 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10309 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010310 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10311 FormatStyle::BS_Allman);
10312 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010313 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10314 FormatStyle::BS_WebKit);
10315 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10316 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010317
Zachary Turner448592e2015-12-18 22:20:15 +000010318 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10319 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10320 FormatStyle::RTBS_None);
10321 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10322 FormatStyle::RTBS_All);
10323 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010324 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010325 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10326 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10327 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10328 AlwaysBreakAfterReturnType,
10329 FormatStyle::RTBS_TopLevelDefinitions);
10330
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010331 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10332 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10333 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10334 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10335 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10336 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10337 AlwaysBreakAfterDefinitionReturnType,
10338 FormatStyle::DRTBS_TopLevel);
10339
Daniel Jasper65ee3472013-07-31 23:16:02 +000010340 Style.NamespaceIndentation = FormatStyle::NI_All;
10341 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10342 FormatStyle::NI_None);
10343 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10344 FormatStyle::NI_Inner);
10345 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10346 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010347
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010348 // FIXME: This is required because parsing a configuration simply overwrites
10349 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010350 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010351 std::vector<std::string> BoostForeach;
10352 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010353 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010354 std::vector<std::string> BoostAndQForeach;
10355 BoostAndQForeach.push_back("BOOST_FOREACH");
10356 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010357 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10358 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010359
10360 Style.IncludeCategories.clear();
10361 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10362 {".*", 1}};
10363 CHECK_PARSE("IncludeCategories:\n"
10364 " - Regex: abc/.*\n"
10365 " Priority: 2\n"
10366 " - Regex: .*\n"
10367 " Priority: 1",
10368 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010369 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010370}
10371
10372TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10373 FormatStyle Style = {};
10374 Style.Language = FormatStyle::LK_Cpp;
10375 CHECK_PARSE("Language: Cpp\n"
10376 "IndentWidth: 12",
10377 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010378 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10379 "IndentWidth: 34",
10380 &Style),
10381 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010382 EXPECT_EQ(12u, Style.IndentWidth);
10383 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10384 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10385
10386 Style.Language = FormatStyle::LK_JavaScript;
10387 CHECK_PARSE("Language: JavaScript\n"
10388 "IndentWidth: 12",
10389 IndentWidth, 12u);
10390 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010391 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10392 "IndentWidth: 34",
10393 &Style),
10394 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010395 EXPECT_EQ(23u, Style.IndentWidth);
10396 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10397 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10398
10399 CHECK_PARSE("BasedOnStyle: LLVM\n"
10400 "IndentWidth: 67",
10401 IndentWidth, 67u);
10402
10403 CHECK_PARSE("---\n"
10404 "Language: JavaScript\n"
10405 "IndentWidth: 12\n"
10406 "---\n"
10407 "Language: Cpp\n"
10408 "IndentWidth: 34\n"
10409 "...\n",
10410 IndentWidth, 12u);
10411
10412 Style.Language = FormatStyle::LK_Cpp;
10413 CHECK_PARSE("---\n"
10414 "Language: JavaScript\n"
10415 "IndentWidth: 12\n"
10416 "---\n"
10417 "Language: Cpp\n"
10418 "IndentWidth: 34\n"
10419 "...\n",
10420 IndentWidth, 34u);
10421 CHECK_PARSE("---\n"
10422 "IndentWidth: 78\n"
10423 "---\n"
10424 "Language: JavaScript\n"
10425 "IndentWidth: 56\n"
10426 "...\n",
10427 IndentWidth, 78u);
10428
10429 Style.ColumnLimit = 123;
10430 Style.IndentWidth = 234;
10431 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10432 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010433 EXPECT_FALSE(parseConfiguration("---\n"
10434 "IndentWidth: 456\n"
10435 "BreakBeforeBraces: Allman\n"
10436 "---\n"
10437 "Language: JavaScript\n"
10438 "IndentWidth: 111\n"
10439 "TabWidth: 111\n"
10440 "---\n"
10441 "Language: Cpp\n"
10442 "BreakBeforeBraces: Stroustrup\n"
10443 "TabWidth: 789\n"
10444 "...\n",
10445 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010446 EXPECT_EQ(123u, Style.ColumnLimit);
10447 EXPECT_EQ(456u, Style.IndentWidth);
10448 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10449 EXPECT_EQ(789u, Style.TabWidth);
10450
Rafael Espindola1f243172014-06-12 11:35:17 +000010451 EXPECT_EQ(parseConfiguration("---\n"
10452 "Language: JavaScript\n"
10453 "IndentWidth: 56\n"
10454 "---\n"
10455 "IndentWidth: 78\n"
10456 "...\n",
10457 &Style),
10458 ParseError::Error);
10459 EXPECT_EQ(parseConfiguration("---\n"
10460 "Language: JavaScript\n"
10461 "IndentWidth: 56\n"
10462 "---\n"
10463 "Language: JavaScript\n"
10464 "IndentWidth: 78\n"
10465 "...\n",
10466 &Style),
10467 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010468
10469 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10470}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010471
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010472#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010473
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010474TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10475 FormatStyle Style = {};
10476 Style.Language = FormatStyle::LK_JavaScript;
10477 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010478 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010479 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010480
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010481 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010482 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010483 "BasedOnStyle: Google\n"
10484 "---\n"
10485 "Language: JavaScript\n"
10486 "IndentWidth: 76\n"
10487 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010488 &Style)
10489 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010490 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010491 EXPECT_EQ(76u, Style.IndentWidth);
10492 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10493}
10494
Alexander Kornienkod6538332013-05-07 15:32:14 +000010495TEST_F(FormatTest, ConfigurationRoundTripTest) {
10496 FormatStyle Style = getLLVMStyle();
10497 std::string YAML = configurationAsText(Style);
10498 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010499 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010500 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10501 EXPECT_EQ(Style, ParsedStyle);
10502}
10503
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010504TEST_F(FormatTest, WorksFor8bitEncodings) {
10505 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10506 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10507 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10508 "\"\xef\xee\xf0\xf3...\"",
10509 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10510 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10511 "\xef\xee\xf0\xf3...\"",
10512 getLLVMStyleWithColumns(12)));
10513}
10514
Alexander Kornienko393e3082013-11-13 14:04:17 +000010515TEST_F(FormatTest, HandlesUTF8BOM) {
10516 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10517 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10518 format("\xef\xbb\xbf#include <iostream>"));
10519 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10520 format("\xef\xbb\xbf\n#include <iostream>"));
10521}
10522
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010523// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10524#if !defined(_MSC_VER)
10525
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010526TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10527 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10528 getLLVMStyleWithColumns(35));
10529 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010530 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010531 verifyFormat("// Однажды в студёную зимнюю пору...",
10532 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010533 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010534 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10535 getLLVMStyleWithColumns(39));
10536 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010537 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010538}
10539
10540TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010541 // Non-printable characters' width is currently considered to be the length in
10542 // bytes in UTF8. The characters can be displayed in very different manner
10543 // (zero-width, single width with a substitution glyph, expanded to their code
10544 // (e.g. "<8d>"), so there's no single correct way to handle them.
10545 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010546 "\"\xc2\x8d\";",
10547 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010548 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010549 "\"\xc2\x8d\";",
10550 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010551 EXPECT_EQ("\"Однажды, в \"\n"
10552 "\"студёную \"\n"
10553 "\"зимнюю \"\n"
10554 "\"пору,\"",
10555 format("\"Однажды, в студёную зимнюю пору,\"",
10556 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010557 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010558 "\"一 二 三 \"\n"
10559 "\"四 五六 \"\n"
10560 "\"七 八 九 \"\n"
10561 "\"十\"",
10562 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010563 EXPECT_EQ("\"一\t二 \"\n"
10564 "\"\t三 \"\n"
10565 "\"四 五\t六 \"\n"
10566 "\"\t七 \"\n"
10567 "\"八九十\tqq\"",
10568 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10569 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010570
10571 // UTF8 character in an escape sequence.
10572 EXPECT_EQ("\"aaaaaa\"\n"
10573 "\"\\\xC2\x8D\"",
10574 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010575}
10576
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010577TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10578 EXPECT_EQ("const char *sssss =\n"
10579 " \"一二三四五六七八\\\n"
10580 " 九 十\";",
10581 format("const char *sssss = \"一二三四五六七八\\\n"
10582 " 九 十\";",
10583 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010584}
10585
10586TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010587 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10588 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010589 EXPECT_EQ("// Я из лесу\n"
10590 "// вышел; был\n"
10591 "// сильный\n"
10592 "// мороз.",
10593 format("// Я из лесу вышел; был сильный мороз.",
10594 getLLVMStyleWithColumns(13)));
10595 EXPECT_EQ("// 一二三\n"
10596 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010597 "// 八 九\n"
10598 "// 十",
10599 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010600}
10601
10602TEST_F(FormatTest, SplitsUTF8BlockComments) {
10603 EXPECT_EQ("/* Гляжу,\n"
10604 " * поднимается\n"
10605 " * медленно в\n"
10606 " * гору\n"
10607 " * Лошадка,\n"
10608 " * везущая\n"
10609 " * хворосту\n"
10610 " * воз. */",
10611 format("/* Гляжу, поднимается медленно в гору\n"
10612 " * Лошадка, везущая хворосту воз. */",
10613 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010614 EXPECT_EQ(
10615 "/* 一二三\n"
10616 " * 四五六七\n"
10617 " * 八 九\n"
10618 " * 十 */",
10619 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010620 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10621 " * 𝕓𝕪𝕥𝕖\n"
10622 " * 𝖀𝕿𝕱-𝟠 */",
10623 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010624}
10625
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010626#endif // _MSC_VER
10627
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010628TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10629 FormatStyle Style = getLLVMStyle();
10630
10631 Style.ConstructorInitializerIndentWidth = 4;
10632 verifyFormat(
10633 "SomeClass::Constructor()\n"
10634 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10635 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10636 Style);
10637
10638 Style.ConstructorInitializerIndentWidth = 2;
10639 verifyFormat(
10640 "SomeClass::Constructor()\n"
10641 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10642 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10643 Style);
10644
10645 Style.ConstructorInitializerIndentWidth = 0;
10646 verifyFormat(
10647 "SomeClass::Constructor()\n"
10648 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10649 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10650 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010651 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10652 verifyFormat(
10653 "SomeLongTemplateVariableName<\n"
10654 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10655 Style);
10656 verifyFormat(
10657 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10658 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10659 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010660}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010661
Daniel Jasper00853002014-09-16 16:22:30 +000010662TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10663 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010664 Style.BreakConstructorInitializersBeforeComma = true;
10665 Style.ConstructorInitializerIndentWidth = 4;
10666 verifyFormat("SomeClass::Constructor()\n"
10667 " : a(a)\n"
10668 " , b(b)\n"
10669 " , c(c) {}",
10670 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010671 verifyFormat("SomeClass::Constructor()\n"
10672 " : a(a) {}",
10673 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010674
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010675 Style.ColumnLimit = 0;
10676 verifyFormat("SomeClass::Constructor()\n"
10677 " : a(a) {}",
10678 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010679 verifyFormat("SomeClass::Constructor() noexcept\n"
10680 " : a(a) {}",
10681 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010682 verifyFormat("SomeClass::Constructor()\n"
10683 " : a(a)\n"
10684 " , b(b)\n"
10685 " , c(c) {}",
10686 Style);
10687 verifyFormat("SomeClass::Constructor()\n"
10688 " : a(a) {\n"
10689 " foo();\n"
10690 " bar();\n"
10691 "}",
10692 Style);
10693
Daniel Jasperd74cf402014-04-08 12:46:38 +000010694 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010695 verifyFormat("SomeClass::Constructor()\n"
10696 " : a(a)\n"
10697 " , b(b)\n"
10698 " , c(c) {\n}",
10699 Style);
10700 verifyFormat("SomeClass::Constructor()\n"
10701 " : a(a) {\n}",
10702 Style);
10703
10704 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010705 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010706 Style.ConstructorInitializerIndentWidth = 2;
10707 verifyFormat("SomeClass::Constructor()\n"
10708 " : a(a)\n"
10709 " , b(b)\n"
10710 " , c(c) {}",
10711 Style);
10712
10713 Style.ConstructorInitializerIndentWidth = 0;
10714 verifyFormat("SomeClass::Constructor()\n"
10715 ": a(a)\n"
10716 ", b(b)\n"
10717 ", c(c) {}",
10718 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010719
10720 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10721 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010722 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10723 verifyFormat(
10724 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10725 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010726 verifyFormat(
10727 "SomeClass::Constructor()\n"
10728 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10729 Style);
10730 Style.ConstructorInitializerIndentWidth = 4;
10731 Style.ColumnLimit = 60;
10732 verifyFormat("SomeClass::Constructor()\n"
10733 " : aaaaaaaa(aaaaaaaa)\n"
10734 " , aaaaaaaa(aaaaaaaa)\n"
10735 " , aaaaaaaa(aaaaaaaa) {}",
10736 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010737}
10738
Daniel Jasper38efc132014-10-21 07:51:54 +000010739TEST_F(FormatTest, Destructors) {
10740 verifyFormat("void F(int &i) { i.~int(); }");
10741 verifyFormat("void F(int &i) { i->~int(); }");
10742}
10743
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010744TEST_F(FormatTest, FormatsWithWebKitStyle) {
10745 FormatStyle Style = getWebKitStyle();
10746
10747 // Don't indent in outer namespaces.
10748 verifyFormat("namespace outer {\n"
10749 "int i;\n"
10750 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010751 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010752 "} // namespace inner\n"
10753 "} // namespace outer\n"
10754 "namespace other_outer {\n"
10755 "int i;\n"
10756 "}",
10757 Style);
10758
10759 // Don't indent case labels.
10760 verifyFormat("switch (variable) {\n"
10761 "case 1:\n"
10762 "case 2:\n"
10763 " doSomething();\n"
10764 " break;\n"
10765 "default:\n"
10766 " ++variable;\n"
10767 "}",
10768 Style);
10769
10770 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010771 EXPECT_EQ("void f()\n"
10772 "{\n"
10773 " if (aaaaaaaaaaaaaaaa\n"
10774 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10775 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10776 " return;\n"
10777 "}",
10778 format("void f() {\n"
10779 "if (aaaaaaaaaaaaaaaa\n"
10780 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10781 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10782 "return;\n"
10783 "}",
10784 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010785
Daniel Jasper35995672014-04-29 14:05:20 +000010786 // Allow functions on a single line.
10787 verifyFormat("void f() { return; }", Style);
10788
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010789 // Constructor initializers are formatted one per line with the "," on the
10790 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010791 verifyFormat("Constructor()\n"
10792 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10793 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010794 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010795 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10796 "{\n"
10797 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010798 Style);
10799 verifyFormat("SomeClass::Constructor()\n"
10800 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010801 "{\n"
10802 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010803 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010804 EXPECT_EQ("SomeClass::Constructor()\n"
10805 " : a(a)\n"
10806 "{\n"
10807 "}",
10808 format("SomeClass::Constructor():a(a){}", Style));
10809 verifyFormat("SomeClass::Constructor()\n"
10810 " : a(a)\n"
10811 " , b(b)\n"
10812 " , c(c)\n"
10813 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010814 "}",
10815 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010816 verifyFormat("SomeClass::Constructor()\n"
10817 " : a(a)\n"
10818 "{\n"
10819 " foo();\n"
10820 " bar();\n"
10821 "}",
10822 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010823
Daniel Jasper65ee3472013-07-31 23:16:02 +000010824 // Access specifiers should be aligned left.
10825 verifyFormat("class C {\n"
10826 "public:\n"
10827 " int i;\n"
10828 "};",
10829 Style);
10830
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010831 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010832 verifyFormat("int a; // Do not\n"
10833 "double b; // align comments.",
10834 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010835
Daniel Jasper3219e432014-12-02 13:24:51 +000010836 // Do not align operands.
10837 EXPECT_EQ("ASSERT(aaaa\n"
10838 " || bbbb);",
10839 format("ASSERT ( aaaa\n||bbbb);", Style));
10840
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010841 // Accept input's line breaks.
10842 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10843 " || bbbbbbbbbbbbbbb) {\n"
10844 " i++;\n"
10845 "}",
10846 format("if (aaaaaaaaaaaaaaa\n"
10847 "|| bbbbbbbbbbbbbbb) { i++; }",
10848 Style));
10849 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10850 " i++;\n"
10851 "}",
10852 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010853
10854 // Don't automatically break all macro definitions (llvm.org/PR17842).
10855 verifyFormat("#define aNumber 10", Style);
10856 // However, generally keep the line breaks that the user authored.
10857 EXPECT_EQ("#define aNumber \\\n"
10858 " 10",
10859 format("#define aNumber \\\n"
10860 " 10",
10861 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010862
10863 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010864 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10865 " copyItems:YES];",
10866 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10867 "copyItems:YES];",
10868 Style));
10869 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10870 " copyItems:YES];",
10871 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10872 " copyItems:YES];",
10873 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010874 // FIXME: This does not seem right, there should be more indentation before
10875 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010876 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010877 " @\"a\",\n"
10878 " @\"a\"\n"
10879 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010880 " copyItems:YES];",
10881 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10882 " @\"a\",\n"
10883 " @\"a\"\n"
10884 " ]\n"
10885 " copyItems:YES];",
10886 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010887 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010888 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10889 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010890 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10891 " copyItems:YES];",
10892 Style));
10893
10894 verifyFormat("[self.a b:c c:d];", Style);
10895 EXPECT_EQ("[self.a b:c\n"
10896 " c:d];",
10897 format("[self.a b:c\n"
10898 "c:d];",
10899 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010900}
10901
Manuel Klimekffdeb592013-09-03 15:10:01 +000010902TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010903 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10904 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10905 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10906 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10907 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010908 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010909 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010910 verifyFormat("void f() {\n"
10911 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10912 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010913 verifyFormat("void f() {\n"
10914 " other(x.begin(), //\n"
10915 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000010916 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010917 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000010918 verifyFormat("SomeFunction([]() { // A cool function...\n"
10919 " return 43;\n"
10920 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000010921 EXPECT_EQ("SomeFunction([]() {\n"
10922 "#define A a\n"
10923 " return 43;\n"
10924 "});",
10925 format("SomeFunction([](){\n"
10926 "#define A a\n"
10927 "return 43;\n"
10928 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000010929 verifyFormat("void f() {\n"
10930 " SomeFunction([](decltype(x), A *a) {});\n"
10931 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010932 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10933 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000010934 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10935 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
10936 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000010937 verifyFormat("Constructor()\n"
10938 " : Field([] { // comment\n"
10939 " int i;\n"
10940 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000010941 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
10942 " return some_parameter.size();\n"
10943 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000010944 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
10945 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000010946 verifyFormat("int i = aaaaaa ? 1 //\n"
10947 " : [] {\n"
10948 " return 2; //\n"
10949 " }();");
10950 verifyFormat("llvm::errs() << \"number of twos is \"\n"
10951 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
10952 " return x == 2; // force break\n"
10953 " });");
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000010954 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n"
10955 " int iiiiiiiiiiii) {\n"
10956 " return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n"
10957 "});",
10958 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000010959 verifyFormat("SomeFunction({[&] {\n"
10960 " // comment\n"
10961 " },\n"
10962 " [&] {\n"
10963 " // comment\n"
10964 " }});");
10965 verifyFormat("SomeFunction({[&] {\n"
10966 " // comment\n"
10967 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000010968 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
10969 " [&]() { return true; },\n"
10970 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010971
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010972 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000010973 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000010974 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000010975 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
10976 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010977 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000010978 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010979 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
10980 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000010981 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010982 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
10983 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010984 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010985 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000010986 verifyFormat(
10987 "aaaaaaaaaaaaaaaaaaaaaa(\n"
10988 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
10989 " return aaaaaaaaaaaaaaaaa;\n"
10990 " });",
10991 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000010992 verifyFormat("[]() //\n"
10993 " -> int {\n"
10994 " return 1; //\n"
10995 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010996
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010997 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000010998 verifyFormat("SomeFunction(\n"
10999 " []() {\n"
11000 " int i = 42;\n"
11001 " return i;\n"
11002 " },\n"
11003 " []() {\n"
11004 " int j = 43;\n"
11005 " return j;\n"
11006 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000011007
Daniel Jasperda18fd82014-06-10 06:39:03 +000011008 // More complex introducers.
11009 verifyFormat("return [i, args...] {};");
11010
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011011 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011012 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011013 verifyFormat("double &operator[](int i) { return 0; }\n"
11014 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011015 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011016 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011017 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011018
11019 // Other corner cases.
11020 verifyFormat("void f() {\n"
11021 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
11022 " );\n"
11023 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011024
11025 // Lambdas created through weird macros.
11026 verifyFormat("void f() {\n"
11027 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011028 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011029 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011030
11031 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11032 " doo_dah();\n"
11033 " doo_dah();\n"
11034 " })) {\n"
11035 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011036 verifyFormat("auto lambda = []() {\n"
11037 " int a = 2\n"
11038 "#if A\n"
11039 " + 2\n"
11040 "#endif\n"
11041 " ;\n"
11042 "};");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011043}
11044
Manuel Klimek516e0542013-09-04 13:25:30 +000011045TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011046 FormatStyle ShortBlocks = getLLVMStyle();
11047 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11048 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11049 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11050 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11051 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11052 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11053 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011054
Daniel Jasper76284682014-10-22 09:12:44 +000011055 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11056 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11057 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011058
Daniel Jasper76284682014-10-22 09:12:44 +000011059 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011060 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011061 "}];");
11062 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011063 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011064 "}]};");
11065 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011066 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011067 "}];");
11068 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011069 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011070 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011071 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011072 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011073 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011074 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011075 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011076
11077 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011078 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011079 "}];",
11080 getLLVMStyleWithColumns(60));
11081 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011082 " NSString *path = [self sessionFilePath];\n"
11083 " if (path) {\n"
11084 " // ...\n"
11085 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011086 "});");
11087 verifyFormat("[[SessionService sharedService]\n"
11088 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011089 " if (window) {\n"
11090 " [self windowDidLoad:window];\n"
11091 " } else {\n"
11092 " [self errorLoadingWindow];\n"
11093 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011094 " }];");
11095 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011096 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011097 "};\n",
11098 getLLVMStyleWithColumns(40));
11099 verifyFormat("[[SessionService sharedService]\n"
11100 " loadWindowWithCompletionBlock: //\n"
11101 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011102 " if (window) {\n"
11103 " [self windowDidLoad:window];\n"
11104 " } else {\n"
11105 " [self errorLoadingWindow];\n"
11106 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011107 " }];",
11108 getLLVMStyleWithColumns(60));
11109 verifyFormat("[myObject doSomethingWith:arg1\n"
11110 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011111 " // ...\n"
11112 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011113 " }\n"
11114 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011115 " // ...\n"
11116 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011117 " }\n"
11118 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011119 " // ...\n"
11120 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011121 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011122 verifyFormat("[myObject doSomethingWith:arg1\n"
11123 " firstBlock:-1\n"
11124 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011125 " // ...\n"
11126 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011127 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011128
11129 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011130 " @autoreleasepool {\n"
11131 " if (a) {\n"
11132 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011133 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011134 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011135 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011136 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011137 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11138 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011139
11140 FormatStyle FourIndent = getLLVMStyle();
11141 FourIndent.ObjCBlockIndentWidth = 4;
11142 verifyFormat("[operation setCompletionBlock:^{\n"
11143 " [self onOperationDone];\n"
11144 "}];",
11145 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011146}
11147
Daniel Jasper289afc02015-04-23 09:23:17 +000011148TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11149 FormatStyle ZeroColumn = getLLVMStyle();
11150 ZeroColumn.ColumnLimit = 0;
11151
11152 verifyFormat("[[SessionService sharedService] "
11153 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11154 " if (window) {\n"
11155 " [self windowDidLoad:window];\n"
11156 " } else {\n"
11157 " [self errorLoadingWindow];\n"
11158 " }\n"
11159 "}];",
11160 ZeroColumn);
11161 EXPECT_EQ("[[SessionService sharedService]\n"
11162 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11163 " if (window) {\n"
11164 " [self windowDidLoad:window];\n"
11165 " } else {\n"
11166 " [self errorLoadingWindow];\n"
11167 " }\n"
11168 " }];",
11169 format("[[SessionService sharedService]\n"
11170 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11171 " if (window) {\n"
11172 " [self windowDidLoad:window];\n"
11173 " } else {\n"
11174 " [self errorLoadingWindow];\n"
11175 " }\n"
11176 "}];",
11177 ZeroColumn));
11178 verifyFormat("[myObject doSomethingWith:arg1\n"
11179 " firstBlock:^(Foo *a) {\n"
11180 " // ...\n"
11181 " int i;\n"
11182 " }\n"
11183 " secondBlock:^(Bar *b) {\n"
11184 " // ...\n"
11185 " int i;\n"
11186 " }\n"
11187 " thirdBlock:^Foo(Bar *b) {\n"
11188 " // ...\n"
11189 " int i;\n"
11190 " }];",
11191 ZeroColumn);
11192 verifyFormat("f(^{\n"
11193 " @autoreleasepool {\n"
11194 " if (a) {\n"
11195 " g();\n"
11196 " }\n"
11197 " }\n"
11198 "});",
11199 ZeroColumn);
11200 verifyFormat("void (^largeBlock)(void) = ^{\n"
11201 " // ...\n"
11202 "};",
11203 ZeroColumn);
11204
11205 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11206 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011207 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011208 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11209 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11210 " int i;\n"
11211 "};",
11212 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11213}
11214
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011215TEST_F(FormatTest, SupportsCRLF) {
11216 EXPECT_EQ("int a;\r\n"
11217 "int b;\r\n"
11218 "int c;\r\n",
11219 format("int a;\r\n"
11220 " int b;\r\n"
11221 " int c;\r\n",
11222 getLLVMStyle()));
11223 EXPECT_EQ("int a;\r\n"
11224 "int b;\r\n"
11225 "int c;\r\n",
11226 format("int a;\r\n"
11227 " int b;\n"
11228 " int c;\r\n",
11229 getLLVMStyle()));
11230 EXPECT_EQ("int a;\n"
11231 "int b;\n"
11232 "int c;\n",
11233 format("int a;\r\n"
11234 " int b;\n"
11235 " int c;\n",
11236 getLLVMStyle()));
11237 EXPECT_EQ("\"aaaaaaa \"\r\n"
11238 "\"bbbbbbb\";\r\n",
11239 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11240 EXPECT_EQ("#define A \\\r\n"
11241 " b; \\\r\n"
11242 " c; \\\r\n"
11243 " d;\r\n",
11244 format("#define A \\\r\n"
11245 " b; \\\r\n"
11246 " c; d; \r\n",
11247 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011248
11249 EXPECT_EQ("/*\r\n"
11250 "multi line block comments\r\n"
11251 "should not introduce\r\n"
11252 "an extra carriage return\r\n"
11253 "*/\r\n",
11254 format("/*\r\n"
11255 "multi line block comments\r\n"
11256 "should not introduce\r\n"
11257 "an extra carriage return\r\n"
11258 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011259}
11260
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011261TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11262 verifyFormat("MY_CLASS(C) {\n"
11263 " int i;\n"
11264 " int j;\n"
11265 "};");
11266}
11267
Daniel Jasper6633ab82013-10-18 10:38:14 +000011268TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11269 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11270 TwoIndent.ContinuationIndentWidth = 2;
11271
11272 EXPECT_EQ("int i =\n"
11273 " longFunction(\n"
11274 " arg);",
11275 format("int i = longFunction(arg);", TwoIndent));
11276
11277 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11278 SixIndent.ContinuationIndentWidth = 6;
11279
11280 EXPECT_EQ("int i =\n"
11281 " longFunction(\n"
11282 " arg);",
11283 format("int i = longFunction(arg);", SixIndent));
11284}
11285
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011286TEST_F(FormatTest, SpacesInAngles) {
11287 FormatStyle Spaces = getLLVMStyle();
11288 Spaces.SpacesInAngles = true;
11289
11290 verifyFormat("static_cast< int >(arg);", Spaces);
11291 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11292 verifyFormat("f< int, float >();", Spaces);
11293 verifyFormat("template <> g() {}", Spaces);
11294 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011295 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11296 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11297 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011298
11299 Spaces.Standard = FormatStyle::LS_Cpp03;
11300 Spaces.SpacesInAngles = true;
11301 verifyFormat("A< A< int > >();", Spaces);
11302
11303 Spaces.SpacesInAngles = false;
11304 verifyFormat("A<A<int> >();", Spaces);
11305
11306 Spaces.Standard = FormatStyle::LS_Cpp11;
11307 Spaces.SpacesInAngles = true;
11308 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011309
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011310 Spaces.SpacesInAngles = false;
11311 verifyFormat("A<A<int>>();", Spaces);
11312}
11313
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011314TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11315 FormatStyle Style = getLLVMStyle();
11316 Style.SpaceAfterTemplateKeyword = false;
11317 verifyFormat("template<int> void foo();", Style);
11318}
11319
Jacques Pienaarfc275112015-02-18 23:48:37 +000011320TEST_F(FormatTest, TripleAngleBrackets) {
11321 verifyFormat("f<<<1, 1>>>();");
11322 verifyFormat("f<<<1, 1, 1, s>>>();");
11323 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011324 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011325 verifyFormat("f<param><<<1, 1>>>();");
11326 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011327 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011328 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11329 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011330 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11331 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011332}
11333
11334TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011335 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011336 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011337 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11338 "aaallvm::outs() <<");
11339 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11340 "aaaallvm::outs()\n <<");
11341}
11342
Manuel Klimek819788d2014-03-18 11:22:45 +000011343TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11344 std::string code = "#if A\n"
11345 "#if B\n"
11346 "a.\n"
11347 "#endif\n"
11348 " a = 1;\n"
11349 "#else\n"
11350 "#endif\n"
11351 "#if C\n"
11352 "#else\n"
11353 "#endif\n";
11354 EXPECT_EQ(code, format(code));
11355}
11356
Manuel Klimek68b03042014-04-14 09:14:11 +000011357TEST_F(FormatTest, HandleConflictMarkers) {
11358 // Git/SVN conflict markers.
11359 EXPECT_EQ("int a;\n"
11360 "void f() {\n"
11361 " callme(some(parameter1,\n"
11362 "<<<<<<< text by the vcs\n"
11363 " parameter2),\n"
11364 "||||||| text by the vcs\n"
11365 " parameter2),\n"
11366 " parameter3,\n"
11367 "======= text by the vcs\n"
11368 " parameter2, parameter3),\n"
11369 ">>>>>>> text by the vcs\n"
11370 " otherparameter);\n",
11371 format("int a;\n"
11372 "void f() {\n"
11373 " callme(some(parameter1,\n"
11374 "<<<<<<< text by the vcs\n"
11375 " parameter2),\n"
11376 "||||||| text by the vcs\n"
11377 " parameter2),\n"
11378 " parameter3,\n"
11379 "======= text by the vcs\n"
11380 " parameter2,\n"
11381 " parameter3),\n"
11382 ">>>>>>> text by the vcs\n"
11383 " otherparameter);\n"));
11384
11385 // Perforce markers.
11386 EXPECT_EQ("void f() {\n"
11387 " function(\n"
11388 ">>>> text by the vcs\n"
11389 " parameter,\n"
11390 "==== text by the vcs\n"
11391 " parameter,\n"
11392 "==== text by the vcs\n"
11393 " parameter,\n"
11394 "<<<< text by the vcs\n"
11395 " parameter);\n",
11396 format("void f() {\n"
11397 " function(\n"
11398 ">>>> text by the vcs\n"
11399 " parameter,\n"
11400 "==== text by the vcs\n"
11401 " parameter,\n"
11402 "==== text by the vcs\n"
11403 " parameter,\n"
11404 "<<<< text by the vcs\n"
11405 " parameter);\n"));
11406
11407 EXPECT_EQ("<<<<<<<\n"
11408 "|||||||\n"
11409 "=======\n"
11410 ">>>>>>>",
11411 format("<<<<<<<\n"
11412 "|||||||\n"
11413 "=======\n"
11414 ">>>>>>>"));
11415
11416 EXPECT_EQ("<<<<<<<\n"
11417 "|||||||\n"
11418 "int i;\n"
11419 "=======\n"
11420 ">>>>>>>",
11421 format("<<<<<<<\n"
11422 "|||||||\n"
11423 "int i;\n"
11424 "=======\n"
11425 ">>>>>>>"));
11426
11427 // FIXME: Handle parsing of macros around conflict markers correctly:
11428 EXPECT_EQ("#define Macro \\\n"
11429 "<<<<<<<\n"
11430 "Something \\\n"
11431 "|||||||\n"
11432 "Else \\\n"
11433 "=======\n"
11434 "Other \\\n"
11435 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011436 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011437 format("#define Macro \\\n"
11438 "<<<<<<<\n"
11439 " Something \\\n"
11440 "|||||||\n"
11441 " Else \\\n"
11442 "=======\n"
11443 " Other \\\n"
11444 ">>>>>>>\n"
11445 " End\n"
11446 "int i;\n"));
11447}
11448
Daniel Jasper471894432014-08-06 13:40:26 +000011449TEST_F(FormatTest, DisableRegions) {
11450 EXPECT_EQ("int i;\n"
11451 "// clang-format off\n"
11452 " int j;\n"
11453 "// clang-format on\n"
11454 "int k;",
11455 format(" int i;\n"
11456 " // clang-format off\n"
11457 " int j;\n"
11458 " // clang-format on\n"
11459 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011460 EXPECT_EQ("int i;\n"
11461 "/* clang-format off */\n"
11462 " int j;\n"
11463 "/* clang-format on */\n"
11464 "int k;",
11465 format(" int i;\n"
11466 " /* clang-format off */\n"
11467 " int j;\n"
11468 " /* clang-format on */\n"
11469 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011470
11471 // Don't reflow comments within disabled regions.
11472 EXPECT_EQ(
11473 "// clang-format off\n"
11474 "// long long long long long long line\n"
11475 "/* clang-format on */\n"
11476 "/* long long long\n"
11477 " * long long long\n"
11478 " * line */\n"
11479 "int i;\n"
11480 "/* clang-format off */\n"
11481 "/* long long long long long long line */\n",
11482 format("// clang-format off\n"
11483 "// long long long long long long line\n"
11484 "/* clang-format on */\n"
11485 "/* long long long long long long line */\n"
11486 "int i;\n"
11487 "/* clang-format off */\n"
11488 "/* long long long long long long line */\n",
11489 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011490}
11491
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011492TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11493 format("? ) =");
11494 verifyNoCrash("#define a\\\n /**/}");
11495}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011496
Daniel Jasper498f5582015-12-25 08:53:31 +000011497TEST_F(FormatTest, FormatsTableGenCode) {
11498 FormatStyle Style = getLLVMStyle();
11499 Style.Language = FormatStyle::LK_TableGen;
11500 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11501}
11502
Nico Weberb2673a12016-11-10 21:49:25 +000011503TEST_F(FormatTest, ArrayOfTemplates) {
11504 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11505 format("auto a = new unique_ptr<int > [ 10];"));
11506
11507 FormatStyle Spaces = getLLVMStyle();
11508 Spaces.SpacesInSquareBrackets = true;
11509 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11510 format("auto a = new unique_ptr<int > [10];", Spaces));
11511}
11512
11513TEST_F(FormatTest, ArrayAsTemplateType) {
11514 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11515 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11516
11517 FormatStyle Spaces = getLLVMStyle();
11518 Spaces.SpacesInSquareBrackets = true;
11519 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11520 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11521}
11522
Eric Liu547d8792016-03-24 13:22:42 +000011523TEST(FormatStyle, GetStyleOfFile) {
11524 vfs::InMemoryFileSystem FS;
11525 // Test 1: format file in the same directory.
11526 ASSERT_TRUE(
11527 FS.addFile("/a/.clang-format", 0,
11528 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11529 ASSERT_TRUE(
11530 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011531 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011532 ASSERT_TRUE((bool)Style1);
11533 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011534
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011535 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011536 ASSERT_TRUE(
11537 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011538 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011539 ASSERT_TRUE((bool)Style2);
11540 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011541
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011542 // Test 2.2: no format on 'none' fallback style.
11543 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11544 ASSERT_TRUE((bool)Style2);
11545 ASSERT_EQ(*Style2, getNoStyle());
11546
11547 // Test 2.3: format if config is found with no based style while fallback is
11548 // 'none'.
11549 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11550 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11551 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11552 ASSERT_TRUE((bool)Style2);
11553 ASSERT_EQ(*Style2, getLLVMStyle());
11554
11555 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11556 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11557 ASSERT_TRUE((bool)Style2);
11558 ASSERT_EQ(*Style2, getLLVMStyle());
11559
Eric Liu547d8792016-03-24 13:22:42 +000011560 // Test 3: format file in parent directory.
11561 ASSERT_TRUE(
11562 FS.addFile("/c/.clang-format", 0,
11563 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11564 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11565 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011566 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011567 ASSERT_TRUE((bool)Style3);
11568 ASSERT_EQ(*Style3, getGoogleStyle());
11569
11570 // Test 4: error on invalid fallback style
11571 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11572 ASSERT_FALSE((bool)Style4);
11573 llvm::consumeError(Style4.takeError());
11574
11575 // Test 5: error on invalid yaml on command line
11576 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11577 ASSERT_FALSE((bool)Style5);
11578 llvm::consumeError(Style5.takeError());
11579
11580 // Test 6: error on invalid style
11581 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11582 ASSERT_FALSE((bool)Style6);
11583 llvm::consumeError(Style6.takeError());
11584
11585 // Test 7: found config file, error on parsing it
11586 ASSERT_TRUE(
11587 FS.addFile("/d/.clang-format", 0,
11588 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11589 "InvalidKey: InvalidValue")));
11590 ASSERT_TRUE(
11591 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11592 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11593 ASSERT_FALSE((bool)Style7);
11594 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011595}
11596
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011597TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11598 // Column limit is 20.
11599 std::string Code = "Type *a =\n"
11600 " new Type();\n"
11601 "g(iiiii, 0, jjjjj,\n"
11602 " 0, kkkkk, 0, mm);\n"
11603 "int bad = format ;";
11604 std::string Expected = "auto a = new Type();\n"
11605 "g(iiiii, nullptr,\n"
11606 " jjjjj, nullptr,\n"
11607 " kkkkk, nullptr,\n"
11608 " mm);\n"
11609 "int bad = format ;";
11610 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011611 tooling::Replacements Replaces = toReplacements(
11612 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11613 "auto "),
11614 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11615 "nullptr"),
11616 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11617 "nullptr"),
11618 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11619 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011620
11621 format::FormatStyle Style = format::getLLVMStyle();
11622 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011623 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11624 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11625 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11626 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11627 EXPECT_TRUE(static_cast<bool>(Result));
11628 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011629}
11630
Eric Liubaf58c22016-05-18 13:43:48 +000011631TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11632 std::string Code = "#include \"a.h\"\n"
11633 "#include \"c.h\"\n"
11634 "\n"
11635 "int main() {\n"
11636 " return 0;\n"
11637 "}";
11638 std::string Expected = "#include \"a.h\"\n"
11639 "#include \"b.h\"\n"
11640 "#include \"c.h\"\n"
11641 "\n"
11642 "int main() {\n"
11643 " return 0;\n"
11644 "}";
11645 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011646 tooling::Replacements Replaces = toReplacements(
11647 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11648 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011649
11650 format::FormatStyle Style = format::getLLVMStyle();
11651 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011652 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11653 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11654 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11655 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11656 EXPECT_TRUE(static_cast<bool>(Result));
11657 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011658}
11659
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011660TEST_F(FormatTest, AllignTrailingComments) {
11661 EXPECT_EQ("#define MACRO(V) \\\n"
11662 " V(Rt2) /* one more char */ \\\n"
11663 " V(Rs) /* than here */ \\\n"
11664 "/* comment 3 */\n",
11665 format("#define MACRO(V)\\\n"
11666 "V(Rt2) /* one more char */ \\\n"
11667 "V(Rs) /* than here */ \\\n"
11668 "/* comment 3 */ \\\n",
11669 getLLVMStyleWithColumns(40)));
11670}
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011671} // end namespace
11672} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011673} // end namespace clang