blob: 09b85357d152e9024c68994af3d7acaa2da283bd [file] [log] [blame]
Daniel Jasperf7935112012-12-03 18:12:45 +00001//===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Chandler Carruth320d9662012-12-04 09:45:34 +000010#include "clang/Format/Format.h"
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011
Eric Liu40ef2fb2016-08-01 10:16:37 +000012#include "../Tooling/ReplacementTest.h"
Manuel Klimekb12e5a52016-03-01 12:37:30 +000013#include "FormatTestUtils.h"
14
15#include "clang/Frontend/TextDiagnosticPrinter.h"
Chandler Carruth4b417452013-01-19 08:09:44 +000016#include "llvm/Support/Debug.h"
Eric Liu547d8792016-03-24 13:22:42 +000017#include "llvm/Support/MemoryBuffer.h"
Chandler Carruth4b417452013-01-19 08:09:44 +000018#include "gtest/gtest.h"
Manuel Klimek24998102013-01-16 14:55:28 +000019
Chandler Carruth10346662014-04-22 03:17:02 +000020#define DEBUG_TYPE "format-test"
21
Eric Liu40ef2fb2016-08-01 10:16:37 +000022using clang::tooling::ReplacementTest;
23using clang::tooling::toReplacements;
24
Daniel Jasperf7935112012-12-03 18:12:45 +000025namespace clang {
26namespace format {
Daniel Jasperd246a5a2015-06-15 15:25:11 +000027namespace {
Daniel Jasperf7935112012-12-03 18:12:45 +000028
Daniel Jaspera44991332015-04-29 13:06:49 +000029FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); }
Nico Weber514ecc82014-02-02 20:50:45 +000030
Daniel Jasperf7935112012-12-03 18:12:45 +000031class FormatTest : public ::testing::Test {
32protected:
Manuel Klimekec5c3db2015-05-07 12:26:30 +000033 enum IncompleteCheck {
34 IC_ExpectComplete,
35 IC_ExpectIncomplete,
36 IC_DoNotCheck
37 };
38
Daniel Jasperd246a5a2015-06-15 15:25:11 +000039 std::string format(llvm::StringRef Code,
40 const FormatStyle &Style = getLLVMStyle(),
Manuel Klimekec5c3db2015-05-07 12:26:30 +000041 IncompleteCheck CheckIncomplete = IC_ExpectComplete) {
Manuel Klimek24998102013-01-16 14:55:28 +000042 DEBUG(llvm::errs() << "---\n");
Manuel Klimek71814b42013-10-11 21:25:45 +000043 DEBUG(llvm::errs() << Code << "\n\n");
Daniel Jasperd246a5a2015-06-15 15:25:11 +000044 std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
Manuel Klimekec5c3db2015-05-07 12:26:30 +000045 bool IncompleteFormat = false;
46 tooling::Replacements Replaces =
47 reformat(Style, Code, Ranges, "<stdin>", &IncompleteFormat);
48 if (CheckIncomplete != IC_DoNotCheck) {
49 bool ExpectedIncompleteFormat = CheckIncomplete == IC_ExpectIncomplete;
50 EXPECT_EQ(ExpectedIncompleteFormat, IncompleteFormat) << Code << "\n\n";
51 }
Daniel Jasperec04c0d2013-05-16 10:40:07 +000052 ReplacementCount = Replaces.size();
Eric Liu4f8d9942016-07-11 13:53:12 +000053 auto Result = applyAllReplacements(Code, Replaces);
54 EXPECT_TRUE(static_cast<bool>(Result));
55 DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
56 return *Result;
Daniel Jasperf7935112012-12-03 18:12:45 +000057 }
58
Manuel Klimekb69e3c62013-01-02 18:33:23 +000059 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
60 FormatStyle Style = getLLVMStyle();
61 Style.ColumnLimit = ColumnLimit;
62 return Style;
63 }
64
Daniel Jasper1b750ed2013-01-14 16:24:39 +000065 FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
66 FormatStyle Style = getGoogleStyle();
67 Style.ColumnLimit = ColumnLimit;
68 return Style;
69 }
70
Manuel Klimekb69e3c62013-01-02 18:33:23 +000071 void verifyFormat(llvm::StringRef Code,
72 const FormatStyle &Style = getLLVMStyle()) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000073 EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
Daniel Jasperf7935112012-12-03 18:12:45 +000074 }
75
Manuel Klimekec5c3db2015-05-07 12:26:30 +000076 void verifyIncompleteFormat(llvm::StringRef Code,
77 const FormatStyle &Style = getLLVMStyle()) {
78 EXPECT_EQ(Code.str(),
79 format(test::messUp(Code), Style, IC_ExpectIncomplete));
80 }
81
Daniel Jasperf7935112012-12-03 18:12:45 +000082 void verifyGoogleFormat(llvm::StringRef Code) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000083 verifyFormat(Code, getGoogleStyle());
Daniel Jasperf7935112012-12-03 18:12:45 +000084 }
Daniel Jasper5b49f472013-01-23 12:10:53 +000085
86 void verifyIndependentOfContext(llvm::StringRef text) {
87 verifyFormat(text);
88 verifyFormat(llvm::Twine("void f() { " + text + " }").str());
89 }
Daniel Jasper7b038a22013-01-30 09:46:12 +000090
Daniel Jasper675b4f82015-01-19 10:51:23 +000091 /// \brief Verify that clang-format does not crash on the given input.
92 void verifyNoCrash(llvm::StringRef Code,
93 const FormatStyle &Style = getLLVMStyle()) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +000094 format(Code, Style, IC_DoNotCheck);
Daniel Jasper675b4f82015-01-19 10:51:23 +000095 }
96
Daniel Jasper7b038a22013-01-30 09:46:12 +000097 int ReplacementCount;
Daniel Jasperf7935112012-12-03 18:12:45 +000098};
99
Manuel Klimek52b15152013-01-09 15:25:02 +0000100TEST_F(FormatTest, MessUp) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +0000101 EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
102 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
103 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
104 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
105 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
Manuel Klimek52b15152013-01-09 15:25:02 +0000106}
107
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000108//===----------------------------------------------------------------------===//
109// Basic function tests.
110//===----------------------------------------------------------------------===//
111
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +0000112TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000113 EXPECT_EQ(";", format(";"));
114}
115
116TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
117 EXPECT_EQ("int i;", format(" int i;"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +0000118 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000119 EXPECT_EQ("int i;\nint j;", format(" int i; int j;"));
120 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;"));
121}
122
123TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
124 EXPECT_EQ("int i;", format("int\ni;"));
125}
126
127TEST_F(FormatTest, FormatsNestedBlockStatements) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000128 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000129}
130
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000131TEST_F(FormatTest, FormatsNestedCall) {
132 verifyFormat("Method(f1, f2(f3));");
133 verifyFormat("Method(f1(f2, f3()));");
Daniel Jasper48cb3b92013-01-13 08:19:51 +0000134 verifyFormat("Method(f1(f2, (f3())));");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000135}
136
Daniel Jasper14556742013-02-07 21:08:36 +0000137TEST_F(FormatTest, NestedNameSpecifiers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +0000138 verifyFormat("vector<::Type> v;");
Daniel Jasper14556742013-02-07 21:08:36 +0000139 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
Daniel Jasper11be8ac2013-08-28 07:07:07 +0000140 verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
Daniel Jasperf322eb52014-10-23 20:22:22 +0000141 verifyFormat("bool a = 2 < ::SomeFunction();");
Daniel Jasper736c14f2013-01-16 07:19:28 +0000142}
143
Daniel Jasper7b038a22013-01-30 09:46:12 +0000144TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
145 EXPECT_EQ("if (a) {\n"
146 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000147 "}",
148 format("if(a){f();}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000149 EXPECT_EQ(4, ReplacementCount);
150 EXPECT_EQ("if (a) {\n"
151 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000152 "}",
153 format("if (a) {\n"
154 " f();\n"
155 "}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000156 EXPECT_EQ(0, ReplacementCount);
Daniel Jasperd6e61882015-06-17 12:23:15 +0000157 EXPECT_EQ("/*\r\n"
158 "\r\n"
159 "*/\r\n",
160 format("/*\r\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +0000161 "\r\n"
162 "*/\r\n"));
Daniel Jasperd6e61882015-06-17 12:23:15 +0000163 EXPECT_EQ(0, ReplacementCount);
Daniel Jasper7b038a22013-01-30 09:46:12 +0000164}
165
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000166TEST_F(FormatTest, RemovesEmptyLines) {
167 EXPECT_EQ("class C {\n"
168 " int i;\n"
169 "};",
170 format("class C {\n"
171 " int i;\n"
172 "\n"
173 "};"));
174
Nico Weber34272652014-11-13 16:25:37 +0000175 // Don't remove empty lines at the start of namespaces or extern "C" blocks.
Daniel Jasper01b35482014-03-21 13:03:33 +0000176 EXPECT_EQ("namespace N {\n"
177 "\n"
178 "int i;\n"
179 "}",
180 format("namespace N {\n"
181 "\n"
182 "int i;\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000183 "}",
184 getGoogleStyle()));
Nico Weber34272652014-11-13 16:25:37 +0000185 EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
186 "\n"
187 "int i;\n"
188 "}",
189 format("extern /**/ \"C\" /**/ {\n"
190 "\n"
191 "int i;\n"
192 "}",
193 getGoogleStyle()));
194
195 // ...but do keep inlining and removing empty lines for non-block extern "C"
196 // functions.
197 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
198 EXPECT_EQ("extern \"C\" int f() {\n"
199 " int i = 42;\n"
200 " return i;\n"
201 "}",
202 format("extern \"C\" int f() {\n"
203 "\n"
204 " int i = 42;\n"
205 " return i;\n"
206 "}",
207 getGoogleStyle()));
Daniel Jasper01b35482014-03-21 13:03:33 +0000208
Daniel Jasper11164bd2014-03-21 12:58:53 +0000209 // Remove empty lines at the beginning and end of blocks.
210 EXPECT_EQ("void f() {\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000211 "\n"
212 " if (a) {\n"
213 "\n"
214 " f();\n"
215 " }\n"
216 "}",
217 format("void f() {\n"
218 "\n"
219 " if (a) {\n"
220 "\n"
221 " f();\n"
222 "\n"
223 " }\n"
224 "\n"
225 "}",
226 getLLVMStyle()));
227 EXPECT_EQ("void f() {\n"
Daniel Jasper11164bd2014-03-21 12:58:53 +0000228 " if (a) {\n"
229 " f();\n"
230 " }\n"
231 "}",
232 format("void f() {\n"
233 "\n"
234 " if (a) {\n"
235 "\n"
236 " f();\n"
237 "\n"
238 " }\n"
239 "\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000240 "}",
241 getGoogleStyle()));
Daniel Jasper11164bd2014-03-21 12:58:53 +0000242
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000243 // Don't remove empty lines in more complex control statements.
244 EXPECT_EQ("void f() {\n"
245 " if (a) {\n"
246 " f();\n"
247 "\n"
248 " } else if (b) {\n"
249 " f();\n"
250 " }\n"
251 "}",
252 format("void f() {\n"
253 " if (a) {\n"
254 " f();\n"
255 "\n"
256 " } else if (b) {\n"
257 " f();\n"
258 "\n"
259 " }\n"
260 "\n"
261 "}"));
262
263 // FIXME: This is slightly inconsistent.
264 EXPECT_EQ("namespace {\n"
265 "int i;\n"
266 "}",
267 format("namespace {\n"
268 "int i;\n"
269 "\n"
270 "}"));
271 EXPECT_EQ("namespace {\n"
272 "int i;\n"
273 "\n"
274 "} // namespace",
275 format("namespace {\n"
276 "int i;\n"
277 "\n"
278 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000279
280 FormatStyle Style = getLLVMStyle();
281 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
282 Style.MaxEmptyLinesToKeep = 2;
283 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
284 Style.BraceWrapping.AfterClass = true;
285 Style.BraceWrapping.AfterFunction = true;
286 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
287
288 EXPECT_EQ("class Foo\n"
289 "{\n"
290 " Foo() {}\n"
291 "\n"
292 " void funk() {}\n"
293 "};",
294 format("class Foo\n"
295 "{\n"
296 " Foo()\n"
297 " {\n"
298 " }\n"
299 "\n"
300 " void funk() {}\n"
301 "};",
302 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000303}
304
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000305TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000306 verifyFormat("x = (a) and (b);");
307 verifyFormat("x = (a) or (b);");
308 verifyFormat("x = (a) bitand (b);");
309 verifyFormat("x = (a) bitor (b);");
310 verifyFormat("x = (a) not_eq (b);");
311 verifyFormat("x = (a) and_eq (b);");
312 verifyFormat("x = (a) or_eq (b);");
313 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000314}
315
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000316//===----------------------------------------------------------------------===//
317// Tests for control statements.
318//===----------------------------------------------------------------------===//
319
Daniel Jaspercdd06622013-05-14 10:31:09 +0000320TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000321 verifyFormat("if (true)\n f();\ng();");
322 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000323 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000324
Daniel Jasper3a685df2013-05-16 12:12:21 +0000325 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000326 AllowsMergedIf.AlignEscapedNewlinesLeft = true;
Daniel Jasperced17f82013-01-16 15:44:34 +0000327 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
328 verifyFormat("if (a)\n"
329 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000330 " f();",
331 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000332 verifyFormat("{\n"
333 " if (a)\n"
334 " label:\n"
335 " f();\n"
336 "}",
337 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000338 verifyFormat("#define A \\\n"
339 " if (a) \\\n"
340 " label: \\\n"
341 " f()",
342 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000343 verifyFormat("if (a)\n"
344 " ;",
345 AllowsMergedIf);
346 verifyFormat("if (a)\n"
347 " if (b) return;",
348 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000349
Daniel Jasper3a685df2013-05-16 12:12:21 +0000350 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000351 " f();\n",
352 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000353 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000354 " f();",
355 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000356 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000357 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000358 "}",
359 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000360 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000361 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000362 "}",
363 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000364
365 AllowsMergedIf.ColumnLimit = 14;
366 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000367 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000368 " return;",
369 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000370
371 AllowsMergedIf.ColumnLimit = 13;
372 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000373}
374
Daniel Jasper3a685df2013-05-16 12:12:21 +0000375TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
376 FormatStyle AllowsMergedLoops = getLLVMStyle();
377 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
378 verifyFormat("while (true) continue;", AllowsMergedLoops);
379 verifyFormat("for (;;) continue;", AllowsMergedLoops);
380 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
381 verifyFormat("while (true)\n"
382 " ;",
383 AllowsMergedLoops);
384 verifyFormat("for (;;)\n"
385 " ;",
386 AllowsMergedLoops);
387 verifyFormat("for (;;)\n"
388 " for (;;) continue;",
389 AllowsMergedLoops);
390 verifyFormat("for (;;) // Can't merge this\n"
391 " continue;",
392 AllowsMergedLoops);
393 verifyFormat("for (;;) /* still don't merge */\n"
394 " continue;",
395 AllowsMergedLoops);
396}
397
Daniel Jasper17605d32014-05-14 09:33:35 +0000398TEST_F(FormatTest, FormatShortBracedStatements) {
399 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
400 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
401
402 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
403 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
404
405 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
406 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
407 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
408 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
409 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
410 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
411 verifyFormat("if (true) { //\n"
412 " f();\n"
413 "}",
414 AllowSimpleBracedStatements);
415 verifyFormat("if (true) {\n"
416 " f();\n"
417 " f();\n"
418 "}",
419 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000420 verifyFormat("if (true) {\n"
421 " f();\n"
422 "} else {\n"
423 " f();\n"
424 "}",
425 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000426
Daniel Jasperbd630732014-05-22 13:25:26 +0000427 verifyFormat("template <int> struct A2 {\n"
428 " struct B {};\n"
429 "};",
430 AllowSimpleBracedStatements);
431
Daniel Jasper17605d32014-05-14 09:33:35 +0000432 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
433 verifyFormat("if (true) {\n"
434 " f();\n"
435 "}",
436 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000437 verifyFormat("if (true) {\n"
438 " f();\n"
439 "} else {\n"
440 " f();\n"
441 "}",
442 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000443
444 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
445 verifyFormat("while (true) {\n"
446 " f();\n"
447 "}",
448 AllowSimpleBracedStatements);
449 verifyFormat("for (;;) {\n"
450 " f();\n"
451 "}",
452 AllowSimpleBracedStatements);
453}
454
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000455TEST_F(FormatTest, ParseIfElse) {
456 verifyFormat("if (true)\n"
457 " if (true)\n"
458 " if (true)\n"
459 " f();\n"
460 " else\n"
461 " g();\n"
462 " else\n"
463 " h();\n"
464 "else\n"
465 " i();");
466 verifyFormat("if (true)\n"
467 " if (true)\n"
468 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000469 " if (true)\n"
470 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000471 " } else {\n"
472 " g();\n"
473 " }\n"
474 " else\n"
475 " h();\n"
476 "else {\n"
477 " i();\n"
478 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000479 verifyFormat("void f() {\n"
480 " if (a) {\n"
481 " } else {\n"
482 " }\n"
483 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000484}
485
486TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000487 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000488 verifyFormat("if (a)\n"
489 " f();\n"
490 "else if (b)\n"
491 " g();\n"
492 "else\n"
493 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000494 verifyFormat("if (a) {\n"
495 " f();\n"
496 "}\n"
497 "// or else ..\n"
498 "else {\n"
499 " g()\n"
500 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000501
502 verifyFormat("if (a) {\n"
503 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
504 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
505 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000506 verifyFormat("if (a) {\n"
507 "} else if (\n"
508 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
509 "}",
510 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000511}
512
Daniel Jasperf7935112012-12-03 18:12:45 +0000513TEST_F(FormatTest, FormatsForLoop) {
514 verifyFormat(
515 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000516 " ++VeryVeryLongLoopVariable)\n"
517 " ;");
518 verifyFormat("for (;;)\n"
519 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000520 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000521 verifyFormat("for (;;) {\n"
522 " f();\n"
523 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000524 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000525
526 verifyFormat(
527 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
528 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000529 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000530
531 verifyFormat(
532 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000533 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000534 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
535 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000536 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000537 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
538 " I = FD->getDeclsInPrototypeScope().begin(),\n"
539 " E = FD->getDeclsInPrototypeScope().end();\n"
540 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000541 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
542 " I = Container.begin(),\n"
543 " E = Container.end();\n"
544 " I != E; ++I) {\n}",
545 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000546
Daniel Jasper48c62f92013-01-28 17:30:17 +0000547 verifyFormat(
548 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
549 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000550 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
551 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000552 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000553 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
554 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
555 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000556 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
557 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
558 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000559 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
560 " aaaaaaaaaa);\n"
561 " iter; ++iter) {\n"
562 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000563 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
564 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
565 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
566 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000567
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000568 FormatStyle NoBinPacking = getLLVMStyle();
569 NoBinPacking.BinPackParameters = false;
570 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
571 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
572 " aaaaaaaaaaaaaaaa,\n"
573 " aaaaaaaaaaaaaaaa,\n"
574 " aaaaaaaaaaaaaaaa);\n"
575 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
576 "}",
577 NoBinPacking);
578 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000579 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
580 " E = UnwrappedLines.end();\n"
581 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000582 " ++I) {\n}",
583 NoBinPacking);
Daniel Jasperf7935112012-12-03 18:12:45 +0000584}
585
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000586TEST_F(FormatTest, RangeBasedForLoops) {
587 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
588 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
589 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
590 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000591 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
592 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000593 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
594 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000595}
596
Daniel Jaspere1e43192014-04-01 12:55:11 +0000597TEST_F(FormatTest, ForEachLoops) {
598 verifyFormat("void f() {\n"
599 " foreach (Item *item, itemlist) {}\n"
600 " Q_FOREACH (Item *item, itemlist) {}\n"
601 " BOOST_FOREACH (Item *item, itemlist) {}\n"
602 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
603 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000604
605 // As function-like macros.
606 verifyFormat("#define foreach(x, y)\n"
607 "#define Q_FOREACH(x, y)\n"
608 "#define BOOST_FOREACH(x, y)\n"
609 "#define UNKNOWN_FOREACH(x, y)\n");
610
611 // Not as function-like macros.
612 verifyFormat("#define foreach (x, y)\n"
613 "#define Q_FOREACH (x, y)\n"
614 "#define BOOST_FOREACH (x, y)\n"
615 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000616}
617
Daniel Jasperf7935112012-12-03 18:12:45 +0000618TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000619 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000620 verifyFormat("while (true)\n"
621 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000622 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000623 verifyFormat("while () {\n"
624 " f();\n"
625 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000626}
627
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000628TEST_F(FormatTest, FormatsDoWhile) {
629 verifyFormat("do {\n"
630 " do_something();\n"
631 "} while (something());");
632 verifyFormat("do\n"
633 " do_something();\n"
634 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000635}
636
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000637TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000638 verifyFormat("switch (x) {\n"
639 "case 1:\n"
640 " f();\n"
641 " break;\n"
642 "case kFoo:\n"
643 "case ns::kBar:\n"
644 "case kBaz:\n"
645 " break;\n"
646 "default:\n"
647 " g();\n"
648 " break;\n"
649 "}");
650 verifyFormat("switch (x) {\n"
651 "case 1: {\n"
652 " f();\n"
653 " break;\n"
654 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000655 "case 2: {\n"
656 " break;\n"
657 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000658 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000659 verifyFormat("switch (x) {\n"
660 "case 1: {\n"
661 " f();\n"
662 " {\n"
663 " g();\n"
664 " h();\n"
665 " }\n"
666 " break;\n"
667 "}\n"
668 "}");
669 verifyFormat("switch (x) {\n"
670 "case 1: {\n"
671 " f();\n"
672 " if (foo) {\n"
673 " g();\n"
674 " h();\n"
675 " }\n"
676 " break;\n"
677 "}\n"
678 "}");
679 verifyFormat("switch (x) {\n"
680 "case 1: {\n"
681 " f();\n"
682 " g();\n"
683 "} break;\n"
684 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000685 verifyFormat("switch (test)\n"
686 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000687 verifyFormat("switch (x) {\n"
688 "default: {\n"
689 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000690 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000691 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000692 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000693 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000694 "// if 1, do f()\n"
695 "case 1:\n"
696 " f();\n"
697 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000698 verifyFormat("switch (x) {\n"
699 "case 1:\n"
700 " // Do amazing stuff\n"
701 " {\n"
702 " f();\n"
703 " g();\n"
704 " }\n"
705 " break;\n"
706 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000707 verifyFormat("#define A \\\n"
708 " switch (x) { \\\n"
709 " case a: \\\n"
710 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000711 " }",
712 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000713 verifyFormat("#define OPERATION_CASE(name) \\\n"
714 " case OP_name: \\\n"
715 " return operations::Operation##name\n",
716 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000717 verifyFormat("switch (x) {\n"
718 "case 1:;\n"
719 "default:;\n"
720 " int i;\n"
721 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000722
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000723 verifyGoogleFormat("switch (x) {\n"
724 " case 1:\n"
725 " f();\n"
726 " break;\n"
727 " case kFoo:\n"
728 " case ns::kBar:\n"
729 " case kBaz:\n"
730 " break;\n"
731 " default:\n"
732 " g();\n"
733 " break;\n"
734 "}");
735 verifyGoogleFormat("switch (x) {\n"
736 " case 1: {\n"
737 " f();\n"
738 " break;\n"
739 " }\n"
740 "}");
741 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000742 " ;");
743
744 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
745 " case OP_name: \\\n"
746 " return operations::Operation##name\n");
747 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
748 " // Get the correction operation class.\n"
749 " switch (OpCode) {\n"
750 " CASE(Add);\n"
751 " CASE(Subtract);\n"
752 " default:\n"
753 " return operations::Unknown;\n"
754 " }\n"
755 "#undef OPERATION_CASE\n"
756 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000757 verifyFormat("DEBUG({\n"
758 " switch (x) {\n"
759 " case A:\n"
760 " f();\n"
761 " break;\n"
762 " // On B:\n"
763 " case B:\n"
764 " g();\n"
765 " break;\n"
766 " }\n"
767 "});");
Daniel Jasper031e2402014-04-28 07:48:36 +0000768 verifyFormat("switch (a) {\n"
769 "case (b):\n"
770 " return;\n"
771 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000772
773 verifyFormat("switch (a) {\n"
774 "case some_namespace::\n"
775 " some_constant:\n"
776 " return;\n"
777 "}",
778 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000779}
780
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000781TEST_F(FormatTest, CaseRanges) {
782 verifyFormat("switch (x) {\n"
783 "case 'A' ... 'Z':\n"
784 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000785 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000786 " break;\n"
787 "}");
788}
789
Daniel Jasperb87899b2014-09-10 13:11:45 +0000790TEST_F(FormatTest, ShortCaseLabels) {
791 FormatStyle Style = getLLVMStyle();
792 Style.AllowShortCaseLabelsOnASingleLine = true;
793 verifyFormat("switch (a) {\n"
794 "case 1: x = 1; break;\n"
795 "case 2: return;\n"
796 "case 3:\n"
797 "case 4:\n"
798 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +0000799 "case 6: // comment\n"
800 " return;\n"
801 "case 7:\n"
802 " // comment\n"
803 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +0000804 "case 8:\n"
805 " x = 8; // comment\n"
806 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000807 "default: y = 1; break;\n"
808 "}",
809 Style);
810 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +0000811 "#if FOO\n"
812 "case 0: return 0;\n"
813 "#endif\n"
814 "}",
815 Style);
816 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000817 "case 1: {\n"
818 "}\n"
819 "case 2: {\n"
820 " return;\n"
821 "}\n"
822 "case 3: {\n"
823 " x = 1;\n"
824 " return;\n"
825 "}\n"
826 "case 4:\n"
827 " if (x)\n"
828 " return;\n"
829 "}",
830 Style);
831 Style.ColumnLimit = 21;
832 verifyFormat("switch (a) {\n"
833 "case 1: x = 1; break;\n"
834 "case 2: return;\n"
835 "case 3:\n"
836 "case 4:\n"
837 "case 5: return;\n"
838 "default:\n"
839 " y = 1;\n"
840 " break;\n"
841 "}",
842 Style);
843}
844
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000845TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000846 verifyFormat("void f() {\n"
847 " some_code();\n"
848 "test_label:\n"
849 " some_other_code();\n"
850 " {\n"
851 " some_more_code();\n"
852 " another_label:\n"
853 " some_more_code();\n"
854 " }\n"
855 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +0000856 verifyFormat("{\n"
857 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000858 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +0000859 " some_other_code();\n"
860 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000861 verifyFormat("{\n"
862 " some_code();\n"
863 "test_label:;\n"
864 " int i = 0;\n"
865 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000866}
867
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000868//===----------------------------------------------------------------------===//
869// Tests for comments.
870//===----------------------------------------------------------------------===//
871
872TEST_F(FormatTest, UnderstandsSingleLineComments) {
Daniel Jasper55213652013-03-22 10:01:29 +0000873 verifyFormat("//* */");
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000874 verifyFormat("// line 1\n"
875 "// line 2\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000876 "void f() {}\n");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000877
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000878 verifyFormat("void f() {\n"
879 " // Doesn't do anything\n"
880 "}");
Daniel Jasper185de242013-07-11 13:48:16 +0000881 verifyFormat("SomeObject\n"
882 " // Calling someFunction on SomeObject\n"
883 " .someFunction();");
Daniel Jaspera0407742014-02-11 10:08:11 +0000884 verifyFormat("auto result = SomeObject\n"
885 " // Calling someFunction on SomeObject\n"
886 " .someFunction();");
Daniel Jasperaa701fa2013-01-18 08:44:07 +0000887 verifyFormat("void f(int i, // some comment (probably for i)\n"
888 " int j, // some comment (probably for j)\n"
Daniel Jasper942ee722013-01-13 16:10:20 +0000889 " int k); // some comment (probably for k)");
890 verifyFormat("void f(int i,\n"
891 " // some comment (probably for j)\n"
892 " int j,\n"
893 " // some comment (probably for k)\n"
894 " int k);");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000895
Daniel Jasperaa701fa2013-01-18 08:44:07 +0000896 verifyFormat("int i // This is a fancy variable\n"
897 " = 5; // with nicely aligned comment.");
898
899 verifyFormat("// Leading comment.\n"
900 "int a; // Trailing comment.");
901 verifyFormat("int a; // Trailing comment\n"
902 " // on 2\n"
903 " // or 3 lines.\n"
904 "int b;");
905 verifyFormat("int a; // Trailing comment\n"
906 "\n"
907 "// Leading comment.\n"
908 "int b;");
909 verifyFormat("int a; // Comment.\n"
910 " // More details.\n"
911 "int bbbb; // Another comment.");
912 verifyFormat(
913 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
914 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // comment\n"
915 "int cccccccccccccccccccccccccccccc; // comment\n"
916 "int ddd; // looooooooooooooooooooooooong comment\n"
917 "int aaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
918 "int bbbbbbbbbbbbbbbbbbbbb; // comment\n"
919 "int ccccccccccccccccccc; // comment");
920
Daniel Jasper997b08c2013-01-18 09:19:33 +0000921 verifyFormat("#include \"a\" // comment\n"
922 "#include \"a/b/c\" // comment");
923 verifyFormat("#include <a> // comment\n"
924 "#include <a/b/c> // comment");
Daniel Jasper98857842013-10-30 13:54:53 +0000925 EXPECT_EQ("#include \"a\" // comment\n"
Manuel Klimek5c24cca2013-05-23 10:56:37 +0000926 "#include \"a/b/c\" // comment",
927 format("#include \\\n"
928 " \"a\" // comment\n"
929 "#include \"a/b/c\" // comment"));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000930
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000931 verifyFormat("enum E {\n"
932 " // comment\n"
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000933 " VAL_A, // comment\n"
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000934 " VAL_B\n"
935 "};");
Daniel Jaspere25509f2012-12-17 11:29:41 +0000936
937 verifyFormat(
938 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000939 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // Trailing comment");
Daniel Jasperd8bb2db2013-01-09 09:33:39 +0000940 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
941 " // Comment inside a statement.\n"
942 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper4281c5a2014-10-07 14:45:34 +0000943 verifyFormat("SomeFunction(a,\n"
944 " // comment\n"
945 " b + x);");
946 verifyFormat("SomeFunction(a, a,\n"
947 " // comment\n"
948 " b + x);");
Daniel Jasper38396592013-02-06 15:23:09 +0000949 verifyFormat(
950 "bool aaaaaaaaaaaaa = // comment\n"
951 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
952 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Manuel Klimekc74d2922013-01-07 08:54:53 +0000953
Daniel Jasper525264c2013-02-13 19:25:54 +0000954 verifyFormat("int aaaa; // aaaaa\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000955 "int aa; // aaaaaaa",
956 getLLVMStyleWithColumns(20));
Daniel Jasper525264c2013-02-13 19:25:54 +0000957
Daniel Jasper304a9862013-01-21 22:49:20 +0000958 EXPECT_EQ("void f() { // This does something ..\n"
959 "}\n"
960 "int a; // This is unrelated",
961 format("void f() { // This does something ..\n"
962 " }\n"
963 "int a; // This is unrelated"));
Daniel Jasper251b3c92013-07-01 11:22:57 +0000964 EXPECT_EQ("class C {\n"
965 " void f() { // This does something ..\n"
966 " } // awesome..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +0000967 "\n"
Daniel Jasper251b3c92013-07-01 11:22:57 +0000968 " int a; // This is unrelated\n"
969 "};",
970 format("class C{void f() { // This does something ..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +0000971 " } // awesome..\n"
972 " \n"
Daniel Jasper251b3c92013-07-01 11:22:57 +0000973 "int a; // This is unrelated\n"
974 "};"));
Daniel Jasper304a9862013-01-21 22:49:20 +0000975
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000976 EXPECT_EQ("int i; // single line trailing comment",
Manuel Klimekc74d2922013-01-07 08:54:53 +0000977 format("int i;\\\n// single line trailing comment"));
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000978
979 verifyGoogleFormat("int a; // Trailing comment.");
Daniel Jasperddaa9be2013-01-29 19:41:55 +0000980
981 verifyFormat("someFunction(anotherFunction( // Force break.\n"
982 " parameter));");
Daniel Jaspera885dbe2013-02-05 09:34:14 +0000983
984 verifyGoogleFormat("#endif // HEADER_GUARD");
Daniel Jasperf79f9352013-02-06 22:04:05 +0000985
986 verifyFormat("const char *test[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +0000987 " // A\n"
988 " \"aaaa\",\n"
989 " // B\n"
990 " \"aaaaa\"};");
Daniel Jaspereef30492013-02-11 12:36:37 +0000991 verifyGoogleFormat(
992 "aaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +0000993 " aaaaaaaaaaaaaaaaaaaaaa); // 81_cols_with_this_comment");
Alexander Kornienkob1be9d62013-04-03 12:38:53 +0000994 EXPECT_EQ("D(a, {\n"
995 " // test\n"
996 " int a;\n"
997 "});",
998 format("D(a, {\n"
999 "// test\n"
1000 "int a;\n"
1001 "});"));
Manuel Klimekc5730802013-05-23 11:42:52 +00001002
1003 EXPECT_EQ("lineWith(); // comment\n"
1004 "// at start\n"
1005 "otherLine();",
1006 format("lineWith(); // comment\n"
1007 "// at start\n"
1008 "otherLine();"));
1009 EXPECT_EQ("lineWith(); // comment\n"
Daniel Jasperbb37a2f2016-02-01 11:20:55 +00001010 "/*\n"
1011 " * at start */\n"
1012 "otherLine();",
1013 format("lineWith(); // comment\n"
1014 "/*\n"
1015 " * at start */\n"
1016 "otherLine();"));
1017 EXPECT_EQ("lineWith(); // comment\n"
Manuel Klimekc5730802013-05-23 11:42:52 +00001018 " // at start\n"
1019 "otherLine();",
1020 format("lineWith(); // comment\n"
1021 " // at start\n"
1022 "otherLine();"));
Manuel Klimekb27375f2013-05-23 19:54:43 +00001023
1024 EXPECT_EQ("lineWith(); // comment\n"
1025 "// at start\n"
1026 "otherLine(); // comment",
1027 format("lineWith(); // comment\n"
1028 "// at start\n"
1029 "otherLine(); // comment"));
Manuel Klimek75ef31f2013-05-23 20:46:07 +00001030 EXPECT_EQ("lineWith();\n"
1031 "// at start\n"
1032 "otherLine(); // comment",
1033 format("lineWith();\n"
1034 " // at start\n"
1035 "otherLine(); // comment"));
1036 EXPECT_EQ("// first\n"
1037 "// at start\n"
1038 "otherLine(); // comment",
1039 format("// first\n"
1040 " // at start\n"
1041 "otherLine(); // comment"));
1042 EXPECT_EQ("f();\n"
1043 "// first\n"
1044 "// at start\n"
1045 "otherLine(); // comment",
1046 format("f();\n"
1047 "// first\n"
1048 " // at start\n"
1049 "otherLine(); // comment"));
Daniel Jasper0e93cdb2013-11-08 23:31:14 +00001050 verifyFormat("f(); // comment\n"
1051 "// first\n"
1052 "// at start\n"
1053 "otherLine();");
1054 EXPECT_EQ("f(); // comment\n"
1055 "// first\n"
1056 "// at start\n"
1057 "otherLine();",
1058 format("f(); // comment\n"
1059 "// first\n"
1060 " // at start\n"
1061 "otherLine();"));
1062 EXPECT_EQ("f(); // comment\n"
1063 " // first\n"
1064 "// at start\n"
1065 "otherLine();",
1066 format("f(); // comment\n"
1067 " // first\n"
1068 "// at start\n"
1069 "otherLine();"));
Daniel Jasper49532102015-01-07 14:00:11 +00001070 EXPECT_EQ("void f() {\n"
1071 " lineWith(); // comment\n"
1072 " // at start\n"
1073 "}",
1074 format("void f() {\n"
1075 " lineWith(); // comment\n"
1076 " // at start\n"
1077 "}"));
Benjamin Kramerdab50462016-01-11 16:27:16 +00001078 EXPECT_EQ("int xy; // a\n"
1079 "int z; // b",
1080 format("int xy; // a\n"
1081 "int z; //b"));
1082 EXPECT_EQ("int xy; // a\n"
1083 "int z; // bb",
1084 format("int xy; // a\n"
1085 "int z; //bb",
1086 getLLVMStyleWithColumns(12)));
Daniel Jasper66935022014-04-27 10:03:19 +00001087
Daniel Jaspera44991332015-04-29 13:06:49 +00001088 verifyFormat("#define A \\\n"
1089 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1090 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1091 getLLVMStyleWithColumns(60));
Daniel Jasper66935022014-04-27 10:03:19 +00001092 verifyFormat(
1093 "#define A \\\n"
1094 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1095 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1096 getLLVMStyleWithColumns(61));
Daniel Jasper8acf8222014-05-07 09:23:05 +00001097
1098 verifyFormat("if ( // This is some comment\n"
1099 " x + 3) {\n"
1100 "}");
1101 EXPECT_EQ("if ( // This is some comment\n"
1102 " // spanning two lines\n"
1103 " x + 3) {\n"
1104 "}",
1105 format("if( // This is some comment\n"
1106 " // spanning two lines\n"
1107 " x + 3) {\n"
1108 "}"));
Daniel Jasper9b79efb2015-01-19 11:49:32 +00001109
1110 verifyNoCrash("/\\\n/");
1111 verifyNoCrash("/\\\n* */");
Daniel Jasper62c78f52015-05-06 08:58:57 +00001112 // The 0-character somehow makes the lexer return a proper comment.
1113 verifyNoCrash(StringRef("/*\\\0\n/", 6));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001114}
1115
Daniel Jasper14e58e52014-03-21 11:58:45 +00001116TEST_F(FormatTest, KeepsParameterWithTrailingCommentsOnTheirOwnLine) {
1117 EXPECT_EQ("SomeFunction(a,\n"
1118 " b, // comment\n"
1119 " c);",
1120 format("SomeFunction(a,\n"
1121 " b, // comment\n"
1122 " c);"));
Daniel Jasper28df0a32014-03-21 12:15:40 +00001123 EXPECT_EQ("SomeFunction(a, b,\n"
1124 " // comment\n"
1125 " c);",
1126 format("SomeFunction(a,\n"
1127 " b,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001128 " // comment\n"
Daniel Jasper28df0a32014-03-21 12:15:40 +00001129 " c);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001130 EXPECT_EQ("SomeFunction(a, b, // comment (unclear relation)\n"
1131 " c);",
1132 format("SomeFunction(a, b, // comment (unclear relation)\n"
1133 " c);"));
1134 EXPECT_EQ("SomeFunction(a, // comment\n"
1135 " b,\n"
1136 " c); // comment",
1137 format("SomeFunction(a, // comment\n"
1138 " b,\n"
1139 " c); // comment"));
Daniel Jasper35e41222016-11-29 09:40:01 +00001140 EXPECT_EQ("aaaaaaaaaa(aaaa(aaaa,\n"
1141 " aaaa), //\n"
1142 " aaaa, bbbbb);",
1143 format("aaaaaaaaaa(aaaa(aaaa,\n"
1144 "aaaa), //\n"
1145 "aaaa, bbbbb);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001146}
1147
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001148TEST_F(FormatTest, RemovesTrailingWhitespaceOfComments) {
1149 EXPECT_EQ("// comment", format("// comment "));
1150 EXPECT_EQ("int aaaaaaa, bbbbbbb; // comment",
1151 format("int aaaaaaa, bbbbbbb; // comment ",
1152 getLLVMStyleWithColumns(33)));
Alexander Kornienko9ab4a772013-09-06 17:24:54 +00001153 EXPECT_EQ("// comment\\\n", format("// comment\\\n \t \v \f "));
1154 EXPECT_EQ("// comment \\\n", format("// comment \\\n \t \v \f "));
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001155}
1156
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001157TEST_F(FormatTest, UnderstandsBlockComments) {
Nico Weber8084cff2013-06-26 00:15:19 +00001158 verifyFormat("f(/*noSpaceAfterParameterNamingComment=*/true);");
Daniel Jasper2b2c9672016-05-08 18:14:01 +00001159 verifyFormat("void f() { g(/*aaa=*/x, /*bbb=*/!y, /*c=*/::c); }");
Daniel Jasper38c82402013-11-29 09:27:43 +00001160 EXPECT_EQ("f(aaaaaaaaaaaaaaaaaaaaaaaaa, /* Trailing comment for aa... */\n"
1161 " bbbbbbbbbbbbbbbbbbbbbbbbb);",
1162 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \\\n"
1163 "/* Trailing comment for aa... */\n"
1164 " bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001165 EXPECT_EQ(
1166 "f(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1167 " /* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);",
1168 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \n"
1169 "/* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper61a40782013-06-06 16:08:57 +00001170 EXPECT_EQ(
1171 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1172 " aaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001173 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001174 "}",
1175 format("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1176 " aaaaaaaaaaaaaaaaaa ,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001177 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001178 "}"));
Daniel Jasper99302ed2016-05-27 08:59:34 +00001179 verifyFormat("f(/* aaaaaaaaaaaaaaaaaa = */\n"
1180 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperddaa9be2013-01-29 19:41:55 +00001181
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00001182 FormatStyle NoBinPacking = getLLVMStyle();
1183 NoBinPacking.BinPackParameters = false;
1184 verifyFormat("aaaaaaaa(/* parameter 1 */ aaaaaa,\n"
1185 " /* parameter 2 */ aaaaaa,\n"
1186 " /* parameter 3 */ aaaaaa,\n"
1187 " /* parameter 4 */ aaaaaa);",
1188 NoBinPacking);
Daniel Jasper03b1bc72014-03-28 15:06:01 +00001189
1190 // Aligning block comments in macros.
1191 verifyGoogleFormat("#define A \\\n"
1192 " int i; /*a*/ \\\n"
1193 " int jjj; /*b*/");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001194}
1195
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001196TEST_F(FormatTest, AlignsBlockComments) {
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001197 EXPECT_EQ("/*\n"
1198 " * Really multi-line\n"
1199 " * comment.\n"
1200 " */\n"
1201 "void f() {}",
1202 format(" /*\n"
1203 " * Really multi-line\n"
1204 " * comment.\n"
1205 " */\n"
1206 " void f() {}"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001207 EXPECT_EQ("class C {\n"
1208 " /*\n"
1209 " * Another multi-line\n"
1210 " * comment.\n"
1211 " */\n"
1212 " void f() {}\n"
1213 "};",
1214 format("class C {\n"
1215 "/*\n"
1216 " * Another multi-line\n"
1217 " * comment.\n"
1218 " */\n"
1219 "void f() {}\n"
1220 "};"));
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001221 EXPECT_EQ("/*\n"
1222 " 1. This is a comment with non-trivial formatting.\n"
1223 " 1.1. We have to indent/outdent all lines equally\n"
1224 " 1.1.1. to keep the formatting.\n"
1225 " */",
1226 format(" /*\n"
1227 " 1. This is a comment with non-trivial formatting.\n"
1228 " 1.1. We have to indent/outdent all lines equally\n"
1229 " 1.1.1. to keep the formatting.\n"
1230 " */"));
1231 EXPECT_EQ("/*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001232 "Don't try to outdent if there's not enough indentation.\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001233 "*/",
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001234 format(" /*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001235 " Don't try to outdent if there's not enough indentation.\n"
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001236 " */"));
Manuel Klimek281dcbe2013-05-28 08:55:01 +00001237
1238 EXPECT_EQ("int i; /* Comment with empty...\n"
1239 " *\n"
1240 " * line. */",
1241 format("int i; /* Comment with empty...\n"
1242 " *\n"
1243 " * line. */"));
Alexander Kornienko67d9c8c2014-04-17 16:12:46 +00001244 EXPECT_EQ("int foobar = 0; /* comment */\n"
1245 "int bar = 0; /* multiline\n"
1246 " comment 1 */\n"
1247 "int baz = 0; /* multiline\n"
1248 " comment 2 */\n"
1249 "int bzz = 0; /* multiline\n"
1250 " comment 3 */",
1251 format("int foobar = 0; /* comment */\n"
1252 "int bar = 0; /* multiline\n"
1253 " comment 1 */\n"
1254 "int baz = 0; /* multiline\n"
1255 " comment 2 */\n"
1256 "int bzz = 0; /* multiline\n"
1257 " comment 3 */"));
1258 EXPECT_EQ("int foobar = 0; /* comment */\n"
1259 "int bar = 0; /* multiline\n"
1260 " comment */\n"
1261 "int baz = 0; /* multiline\n"
1262 "comment */",
1263 format("int foobar = 0; /* comment */\n"
1264 "int bar = 0; /* multiline\n"
1265 "comment */\n"
1266 "int baz = 0; /* multiline\n"
1267 "comment */"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001268}
1269
Daniel Jaspera0a50392015-12-01 13:28:53 +00001270TEST_F(FormatTest, CommentReflowingCanBeTurnedOff) {
1271 FormatStyle Style = getLLVMStyleWithColumns(20);
1272 Style.ReflowComments = false;
1273 verifyFormat("// aaaaaaaaa aaaaaaaaaa aaaaaaaaaa", Style);
1274 verifyFormat("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa */", Style);
1275}
1276
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001277TEST_F(FormatTest, CorrectlyHandlesLengthOfBlockComments) {
1278 EXPECT_EQ("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1279 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */",
1280 format("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1281 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */"));
Alexander Kornienkoaa620e12013-07-01 13:42:42 +00001282 EXPECT_EQ(
1283 "void ffffffffffff(\n"
1284 " int aaaaaaaa, int bbbbbbbb,\n"
1285 " int cccccccccccc) { /*\n"
1286 " aaaaaaaaaa\n"
1287 " aaaaaaaaaaaaa\n"
1288 " bbbbbbbbbbbbbb\n"
1289 " bbbbbbbbbb\n"
1290 " */\n"
1291 "}",
1292 format("void ffffffffffff(int aaaaaaaa, int bbbbbbbb, int cccccccccccc)\n"
1293 "{ /*\n"
1294 " aaaaaaaaaa aaaaaaaaaaaaa\n"
1295 " bbbbbbbbbbbbbb bbbbbbbbbb\n"
1296 " */\n"
1297 "}",
1298 getLLVMStyleWithColumns(40)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001299}
1300
Alexander Kornienko94042342013-07-16 23:47:22 +00001301TEST_F(FormatTest, DontBreakNonTrailingBlockComments) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00001302 EXPECT_EQ("void ffffffffff(\n"
1303 " int aaaaa /* test */);",
Alexander Kornienko94042342013-07-16 23:47:22 +00001304 format("void ffffffffff(int aaaaa /* test */);",
1305 getLLVMStyleWithColumns(35)));
1306}
1307
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001308TEST_F(FormatTest, SplitsLongCxxComments) {
1309 EXPECT_EQ("// A comment that\n"
1310 "// doesn't fit on\n"
1311 "// one line",
1312 format("// A comment that doesn't fit on one line",
1313 getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001314 EXPECT_EQ("/// A comment that\n"
1315 "/// doesn't fit on\n"
1316 "/// one line",
1317 format("/// A comment that doesn't fit on one line",
1318 getLLVMStyleWithColumns(20)));
1319 EXPECT_EQ("//! A comment that\n"
1320 "//! doesn't fit on\n"
1321 "//! one line",
1322 format("//! A comment that doesn't fit on one line",
1323 getLLVMStyleWithColumns(20)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00001324 EXPECT_EQ("// a b c d\n"
1325 "// e f g\n"
1326 "// h i j k",
Daniel Jaspera44991332015-04-29 13:06:49 +00001327 format("// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
1328 EXPECT_EQ(
1329 "// a b c d\n"
1330 "// e f g\n"
1331 "// h i j k",
1332 format("\\\n// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001333 EXPECT_EQ("if (true) // A comment that\n"
1334 " // doesn't fit on\n"
1335 " // one line",
1336 format("if (true) // A comment that doesn't fit on one line ",
1337 getLLVMStyleWithColumns(30)));
1338 EXPECT_EQ("// Don't_touch_leading_whitespace",
1339 format("// Don't_touch_leading_whitespace",
1340 getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001341 EXPECT_EQ("// Add leading\n"
1342 "// whitespace",
1343 format("//Add leading whitespace", getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001344 EXPECT_EQ("/// Add leading\n"
1345 "/// whitespace",
1346 format("///Add leading whitespace", getLLVMStyleWithColumns(20)));
1347 EXPECT_EQ("//! Add leading\n"
1348 "//! whitespace",
1349 format("//!Add leading whitespace", getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001350 EXPECT_EQ("// whitespace", format("//whitespace", getLLVMStyle()));
1351 EXPECT_EQ("// Even if it makes the line exceed the column\n"
1352 "// limit",
1353 format("//Even if it makes the line exceed the column limit",
1354 getLLVMStyleWithColumns(51)));
1355 EXPECT_EQ("//--But not here", format("//--But not here", getLLVMStyle()));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001356
1357 EXPECT_EQ("// aa bb cc dd",
1358 format("// aa bb cc dd ",
1359 getLLVMStyleWithColumns(15)));
1360
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001361 EXPECT_EQ("// A comment before\n"
1362 "// a macro\n"
1363 "// definition\n"
1364 "#define a b",
1365 format("// A comment before a macro definition\n"
1366 "#define a b",
1367 getLLVMStyleWithColumns(20)));
Daniel Jaspere068ac72014-10-27 17:13:59 +00001368 EXPECT_EQ("void ffffff(\n"
1369 " int aaaaaaaaa, // wwww\n"
1370 " int bbbbbbbbbb, // xxxxxxx\n"
1371 " // yyyyyyyyyy\n"
1372 " int c, int d, int e) {}",
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001373 format("void ffffff(\n"
1374 " int aaaaaaaaa, // wwww\n"
Daniel Jasper19a541e2013-12-19 16:45:34 +00001375 " int bbbbbbbbbb, // xxxxxxx yyyyyyyyyy\n"
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001376 " int c, int d, int e) {}",
1377 getLLVMStyleWithColumns(40)));
Alexander Kornienkob93062e2013-06-20 13:58:37 +00001378 EXPECT_EQ("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1379 format("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1380 getLLVMStyleWithColumns(20)));
Alexander Kornienko3abbb8a2013-11-12 17:30:49 +00001381 EXPECT_EQ(
1382 "#define XXX // a b c d\n"
1383 " // e f g h",
1384 format("#define XXX // a b c d e f g h", getLLVMStyleWithColumns(22)));
1385 EXPECT_EQ(
1386 "#define XXX // q w e r\n"
1387 " // t y u i",
1388 format("#define XXX //q w e r t y u i", getLLVMStyleWithColumns(22)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001389}
Manuel Klimek9043c742013-05-27 15:23:34 +00001390
Alexander Kornienko4504f932014-03-10 13:14:56 +00001391TEST_F(FormatTest, PreservesHangingIndentInCxxComments) {
1392 EXPECT_EQ("// A comment\n"
1393 "// that doesn't\n"
1394 "// fit on one\n"
1395 "// line",
1396 format("// A comment that doesn't fit on one line",
1397 getLLVMStyleWithColumns(20)));
1398 EXPECT_EQ("/// A comment\n"
1399 "/// that doesn't\n"
1400 "/// fit on one\n"
1401 "/// line",
1402 format("/// A comment that doesn't fit on one line",
1403 getLLVMStyleWithColumns(20)));
1404}
1405
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001406TEST_F(FormatTest, DontSplitLineCommentsWithEscapedNewlines) {
1407 EXPECT_EQ("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1408 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1409 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1410 format("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1411 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1412 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
1413 EXPECT_EQ("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1414 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1415 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1416 format("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1417 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1418 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1419 getLLVMStyleWithColumns(50)));
1420 // FIXME: One day we might want to implement adjustment of leading whitespace
1421 // of the consecutive lines in this kind of comment:
Daniel Jasper4355e7f2014-07-09 07:50:33 +00001422 EXPECT_EQ("double\n"
1423 " a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1424 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1425 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1426 format("double a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1427 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1428 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001429 getLLVMStyleWithColumns(49)));
1430}
1431
Alexander Kornienkoce9161a2014-01-02 15:13:14 +00001432TEST_F(FormatTest, DontSplitLineCommentsWithPragmas) {
1433 FormatStyle Pragmas = getLLVMStyleWithColumns(30);
1434 Pragmas.CommentPragmas = "^ IWYU pragma:";
1435 EXPECT_EQ(
1436 "// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb",
1437 format("// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb", Pragmas));
1438 EXPECT_EQ(
1439 "/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */",
1440 format("/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */", Pragmas));
1441}
1442
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001443TEST_F(FormatTest, PriorityOfCommentBreaking) {
Daniel Jasper2739af32013-08-28 10:03:58 +00001444 EXPECT_EQ("if (xxx ==\n"
1445 " yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001446 " zzz)\n"
1447 " q();",
1448 format("if (xxx == yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
1449 " zzz) q();",
1450 getLLVMStyleWithColumns(40)));
1451 EXPECT_EQ("if (xxxxxxxxxx ==\n"
1452 " yyy && // aaaaaa bbbbbbbb cccc\n"
1453 " zzz)\n"
1454 " q();",
1455 format("if (xxxxxxxxxx == yyy && // aaaaaa bbbbbbbb cccc\n"
1456 " zzz) q();",
1457 getLLVMStyleWithColumns(40)));
1458 EXPECT_EQ("if (xxxxxxxxxx &&\n"
1459 " yyy || // aaaaaa bbbbbbbb cccc\n"
1460 " zzz)\n"
1461 " q();",
1462 format("if (xxxxxxxxxx && yyy || // aaaaaa bbbbbbbb cccc\n"
1463 " zzz) q();",
1464 getLLVMStyleWithColumns(40)));
Daniel Jasper19a541e2013-12-19 16:45:34 +00001465 EXPECT_EQ("fffffffff(\n"
1466 " &xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1467 " zzz);",
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001468 format("fffffffff(&xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1469 " zzz);",
1470 getLLVMStyleWithColumns(40)));
Manuel Klimek9043c742013-05-27 15:23:34 +00001471}
1472
1473TEST_F(FormatTest, MultiLineCommentsInDefines) {
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001474 EXPECT_EQ("#define A(x) /* \\\n"
1475 " a comment \\\n"
1476 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001477 " f();",
1478 format("#define A(x) /* \\\n"
1479 " a comment \\\n"
1480 " inside */ \\\n"
1481 " f();",
1482 getLLVMStyleWithColumns(17)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001483 EXPECT_EQ("#define A( \\\n"
1484 " x) /* \\\n"
1485 " a comment \\\n"
1486 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001487 " f();",
1488 format("#define A( \\\n"
1489 " x) /* \\\n"
1490 " a comment \\\n"
1491 " inside */ \\\n"
1492 " f();",
1493 getLLVMStyleWithColumns(17)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001494}
1495
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001496TEST_F(FormatTest, ParsesCommentsAdjacentToPPDirectives) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001497 EXPECT_EQ("namespace {}\n// Test\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001498 format("namespace {}\n // Test\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001499 EXPECT_EQ("namespace {}\n/* Test */\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001500 format("namespace {}\n /* Test */\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001501 EXPECT_EQ("namespace {}\n/* Test */ #define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001502 format("namespace {}\n /* Test */ #define A"));
1503}
1504
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001505TEST_F(FormatTest, SplitsLongLinesInComments) {
1506 EXPECT_EQ("/* This is a long\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001507 " * comment that\n"
1508 " * doesn't\n"
1509 " * fit on one line.\n"
1510 " */",
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001511 format("/* "
1512 "This is a long "
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001513 "comment that "
1514 "doesn't "
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001515 "fit on one line. */",
1516 getLLVMStyleWithColumns(20)));
Daniel Jaspera44991332015-04-29 13:06:49 +00001517 EXPECT_EQ(
1518 "/* a b c d\n"
1519 " * e f g\n"
1520 " * h i j k\n"
1521 " */",
1522 format("/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
1523 EXPECT_EQ(
1524 "/* a b c d\n"
1525 " * e f g\n"
1526 " * h i j k\n"
1527 " */",
1528 format("\\\n/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001529 EXPECT_EQ("/*\n"
1530 "This is a long\n"
1531 "comment that doesn't\n"
1532 "fit on one line.\n"
1533 "*/",
1534 format("/*\n"
1535 "This is a long "
1536 "comment that doesn't "
1537 "fit on one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001538 "*/",
1539 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001540 EXPECT_EQ("/*\n"
1541 " * This is a long\n"
1542 " * comment that\n"
1543 " * doesn't fit on\n"
1544 " * one line.\n"
1545 " */",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001546 format("/* \n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001547 " * This is a long "
1548 " comment that "
1549 " doesn't fit on "
1550 " one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001551 " */",
1552 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001553 EXPECT_EQ("/*\n"
1554 " * This_is_a_comment_with_words_that_dont_fit_on_one_line\n"
1555 " * so_it_should_be_broken\n"
1556 " * wherever_a_space_occurs\n"
1557 " */",
1558 format("/*\n"
1559 " * This_is_a_comment_with_words_that_dont_fit_on_one_line "
1560 " so_it_should_be_broken "
1561 " wherever_a_space_occurs \n"
1562 " */",
1563 getLLVMStyleWithColumns(20)));
1564 EXPECT_EQ("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001565 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001566 " */",
1567 format("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001568 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001569 " */",
1570 getLLVMStyleWithColumns(20)));
1571 EXPECT_EQ("{\n"
1572 " /*\n"
1573 " This is another\n"
1574 " long comment that\n"
1575 " doesn't fit on one\n"
1576 " line 1234567890\n"
1577 " */\n"
1578 "}",
1579 format("{\n"
1580 "/*\n"
1581 "This is another "
1582 " long comment that "
1583 " doesn't fit on one"
1584 " line 1234567890\n"
1585 "*/\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001586 "}",
1587 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001588 EXPECT_EQ("{\n"
1589 " /*\n"
1590 " * This i s\n"
1591 " * another comment\n"
1592 " * t hat doesn' t\n"
1593 " * fit on one l i\n"
1594 " * n e\n"
1595 " */\n"
1596 "}",
1597 format("{\n"
1598 "/*\n"
1599 " * This i s"
1600 " another comment"
1601 " t hat doesn' t"
1602 " fit on one l i"
1603 " n e\n"
1604 " */\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001605 "}",
1606 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001607 EXPECT_EQ("/*\n"
1608 " * This is a long\n"
1609 " * comment that\n"
1610 " * doesn't fit on\n"
1611 " * one line\n"
1612 " */",
1613 format(" /*\n"
1614 " * This is a long comment that doesn't fit on one line\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001615 " */",
1616 getLLVMStyleWithColumns(20)));
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001617 EXPECT_EQ("{\n"
1618 " if (something) /* This is a\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001619 " long\n"
1620 " comment */\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001621 " ;\n"
1622 "}",
1623 format("{\n"
1624 " if (something) /* This is a long comment */\n"
1625 " ;\n"
1626 "}",
1627 getLLVMStyleWithColumns(30)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001628
1629 EXPECT_EQ("/* A comment before\n"
1630 " * a macro\n"
1631 " * definition */\n"
1632 "#define a b",
1633 format("/* A comment before a macro definition */\n"
1634 "#define a b",
1635 getLLVMStyleWithColumns(20)));
1636
1637 EXPECT_EQ("/* some comment\n"
1638 " * a comment\n"
1639 "* that we break\n"
1640 " * another comment\n"
1641 "* we have to break\n"
1642 "* a left comment\n"
1643 " */",
1644 format(" /* some comment\n"
1645 " * a comment that we break\n"
1646 " * another comment we have to break\n"
1647 "* a left comment\n"
1648 " */",
1649 getLLVMStyleWithColumns(20)));
1650
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00001651 EXPECT_EQ("/**\n"
1652 " * multiline block\n"
1653 " * comment\n"
1654 " *\n"
1655 " */",
1656 format("/**\n"
1657 " * multiline block comment\n"
1658 " *\n"
1659 " */",
1660 getLLVMStyleWithColumns(20)));
1661
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001662 EXPECT_EQ("/*\n"
1663 "\n"
1664 "\n"
1665 " */\n",
1666 format(" /* \n"
1667 " \n"
1668 " \n"
1669 " */\n"));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001670
1671 EXPECT_EQ("/* a a */",
1672 format("/* a a */", getLLVMStyleWithColumns(15)));
1673 EXPECT_EQ("/* a a bc */",
1674 format("/* a a bc */", getLLVMStyleWithColumns(15)));
1675 EXPECT_EQ("/* aaa aaa\n"
1676 " * aaaaa */",
1677 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
1678 EXPECT_EQ("/* aaa aaa\n"
1679 " * aaaaa */",
1680 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001681}
1682
1683TEST_F(FormatTest, SplitsLongLinesInCommentsInPreprocessor) {
1684 EXPECT_EQ("#define X \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001685 " /* \\\n"
1686 " Test \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001687 " Macro comment \\\n"
1688 " with a long \\\n"
1689 " line \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001690 " */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001691 " A + B",
1692 format("#define X \\\n"
1693 " /*\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001694 " Test\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001695 " Macro comment with a long line\n"
1696 " */ \\\n"
1697 " A + B",
1698 getLLVMStyleWithColumns(20)));
1699 EXPECT_EQ("#define X \\\n"
1700 " /* Macro comment \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001701 " with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001702 " line */ \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001703 " A + B",
1704 format("#define X \\\n"
1705 " /* Macro comment with a long\n"
1706 " line */ \\\n"
1707 " A + B",
1708 getLLVMStyleWithColumns(20)));
1709 EXPECT_EQ("#define X \\\n"
1710 " /* Macro comment \\\n"
1711 " * with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001712 " * line */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001713 " A + B",
1714 format("#define X \\\n"
1715 " /* Macro comment with a long line */ \\\n"
1716 " A + B",
1717 getLLVMStyleWithColumns(20)));
1718}
1719
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001720TEST_F(FormatTest, CommentsInStaticInitializers) {
1721 EXPECT_EQ(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001722 "static SomeType type = {aaaaaaaaaaaaaaaaaaaa, /* comment */\n"
1723 " aaaaaaaaaaaaaaaaaaaa /* comment */,\n"
1724 " /* comment */ aaaaaaaaaaaaaaaaaaaa,\n"
1725 " aaaaaaaaaaaaaaaaaaaa, // comment\n"
1726 " aaaaaaaaaaaaaaaaaaaa};",
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001727 format("static SomeType type = { aaaaaaaaaaaaaaaaaaaa , /* comment */\n"
1728 " aaaaaaaaaaaaaaaaaaaa /* comment */ ,\n"
1729 " /* comment */ aaaaaaaaaaaaaaaaaaaa ,\n"
1730 " aaaaaaaaaaaaaaaaaaaa , // comment\n"
1731 " aaaaaaaaaaaaaaaaaaaa };"));
Chandler Carruthf8b72662014-03-02 12:37:31 +00001732 verifyFormat("static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1733 " bbbbbbbbbbb, ccccccccccc};");
1734 verifyFormat("static SomeType type = {aaaaaaaaaaa,\n"
1735 " // comment for bb....\n"
1736 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001737 verifyGoogleFormat(
Daniel Jaspere5777d22013-05-23 10:15:45 +00001738 "static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1739 " bbbbbbbbbbb, ccccccccccc};");
1740 verifyGoogleFormat("static SomeType type = {aaaaaaaaaaa,\n"
1741 " // comment for bb....\n"
1742 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001743
Chandler Carruthf8b72662014-03-02 12:37:31 +00001744 verifyFormat("S s = {{a, b, c}, // Group #1\n"
1745 " {d, e, f}, // Group #2\n"
1746 " {g, h, i}}; // Group #3");
1747 verifyFormat("S s = {{// Group #1\n"
1748 " a, b, c},\n"
1749 " {// Group #2\n"
1750 " d, e, f},\n"
1751 " {// Group #3\n"
1752 " g, h, i}};");
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001753
1754 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001755 " // Some comment\n"
1756 " a,\n"
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001757 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001758 " // Comment after empty line\n"
1759 " b}",
Daniel Jasperfb5e2412013-02-26 13:10:34 +00001760 format("S s = {\n"
1761 " // Some comment\n"
1762 " a,\n"
1763 " \n"
1764 " // Comment after empty line\n"
1765 " b\n"
1766 "}"));
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001767 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001768 " /* Some comment */\n"
1769 " a,\n"
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001770 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001771 " /* Comment after empty line */\n"
1772 " b}",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001773 format("S s = {\n"
1774 " /* Some comment */\n"
1775 " a,\n"
1776 " \n"
1777 " /* Comment after empty line */\n"
1778 " b\n"
1779 "}"));
Daniel Jaspera400cab2013-02-28 15:04:12 +00001780 verifyFormat("const uint8_t aaaaaaaaaaaaaaaaaaaaaa[0] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001781 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1782 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1783 " 0x00, 0x00, 0x00, 0x00}; // comment\n");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001784}
1785
Alexander Kornienkof2e02122013-05-24 18:24:24 +00001786TEST_F(FormatTest, IgnoresIf0Contents) {
1787 EXPECT_EQ("#if 0\n"
1788 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
1789 "#endif\n"
1790 "void f() {}",
1791 format("#if 0\n"
1792 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
1793 "#endif\n"
1794 "void f( ) { }"));
1795 EXPECT_EQ("#if false\n"
1796 "void f( ) { }\n"
1797 "#endif\n"
1798 "void g() {}\n",
1799 format("#if false\n"
1800 "void f( ) { }\n"
1801 "#endif\n"
1802 "void g( ) { }\n"));
1803 EXPECT_EQ("enum E {\n"
1804 " One,\n"
1805 " Two,\n"
1806 "#if 0\n"
1807 "Three,\n"
1808 " Four,\n"
1809 "#endif\n"
1810 " Five\n"
1811 "};",
1812 format("enum E {\n"
1813 " One,Two,\n"
1814 "#if 0\n"
1815 "Three,\n"
1816 " Four,\n"
1817 "#endif\n"
1818 " Five};"));
1819 EXPECT_EQ("enum F {\n"
1820 " One,\n"
1821 "#if 1\n"
1822 " Two,\n"
1823 "#if 0\n"
1824 "Three,\n"
1825 " Four,\n"
1826 "#endif\n"
1827 " Five\n"
1828 "#endif\n"
1829 "};",
1830 format("enum F {\n"
1831 "One,\n"
1832 "#if 1\n"
1833 "Two,\n"
1834 "#if 0\n"
1835 "Three,\n"
1836 " Four,\n"
1837 "#endif\n"
1838 "Five\n"
1839 "#endif\n"
1840 "};"));
1841 EXPECT_EQ("enum G {\n"
1842 " One,\n"
1843 "#if 0\n"
1844 "Two,\n"
1845 "#else\n"
1846 " Three,\n"
1847 "#endif\n"
1848 " Four\n"
1849 "};",
1850 format("enum G {\n"
1851 "One,\n"
1852 "#if 0\n"
1853 "Two,\n"
1854 "#else\n"
1855 "Three,\n"
1856 "#endif\n"
1857 "Four\n"
1858 "};"));
1859 EXPECT_EQ("enum H {\n"
1860 " One,\n"
1861 "#if 0\n"
1862 "#ifdef Q\n"
1863 "Two,\n"
1864 "#else\n"
1865 "Three,\n"
1866 "#endif\n"
1867 "#endif\n"
1868 " Four\n"
1869 "};",
1870 format("enum H {\n"
1871 "One,\n"
1872 "#if 0\n"
1873 "#ifdef Q\n"
1874 "Two,\n"
1875 "#else\n"
1876 "Three,\n"
1877 "#endif\n"
1878 "#endif\n"
1879 "Four\n"
1880 "};"));
1881 EXPECT_EQ("enum I {\n"
1882 " One,\n"
1883 "#if /* test */ 0 || 1\n"
1884 "Two,\n"
1885 "Three,\n"
1886 "#endif\n"
1887 " Four\n"
1888 "};",
1889 format("enum I {\n"
1890 "One,\n"
1891 "#if /* test */ 0 || 1\n"
1892 "Two,\n"
1893 "Three,\n"
1894 "#endif\n"
1895 "Four\n"
1896 "};"));
1897 EXPECT_EQ("enum J {\n"
1898 " One,\n"
1899 "#if 0\n"
1900 "#if 0\n"
1901 "Two,\n"
1902 "#else\n"
1903 "Three,\n"
1904 "#endif\n"
1905 "Four,\n"
1906 "#endif\n"
1907 " Five\n"
1908 "};",
1909 format("enum J {\n"
1910 "One,\n"
1911 "#if 0\n"
1912 "#if 0\n"
1913 "Two,\n"
1914 "#else\n"
1915 "Three,\n"
1916 "#endif\n"
1917 "Four,\n"
1918 "#endif\n"
1919 "Five\n"
1920 "};"));
Alexander Kornienkof2e02122013-05-24 18:24:24 +00001921}
1922
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001923//===----------------------------------------------------------------------===//
1924// Tests for classes, namespaces, etc.
1925//===----------------------------------------------------------------------===//
1926
1927TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001928 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001929}
1930
1931TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1932 verifyFormat("class A {\n"
1933 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00001934 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001935 "protected:\n"
1936 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001937 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001938 "};");
1939 verifyGoogleFormat("class A {\n"
1940 " public:\n"
1941 " protected:\n"
1942 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00001943 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001944 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00001945 verifyFormat("class A {\n"
1946 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001947 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00001948 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001949 " void f2() {}\n"
1950 "protected slots:\n"
1951 " void f3() {}\n"
1952 "protected Q_SLOTS:\n"
1953 " void f4() {}\n"
1954 "private slots:\n"
1955 " void f5() {}\n"
1956 "private Q_SLOTS:\n"
1957 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00001958 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00001959 " void g1();\n"
1960 "Q_SIGNALS:\n"
1961 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00001962 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00001963
1964 // Don't interpret 'signals' the wrong way.
1965 verifyFormat("signals.set();");
1966 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00001967 verifyFormat("{\n"
1968 " signals.set(); // This needs indentation.\n"
1969 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00001970 verifyFormat("void f() {\n"
1971 "label:\n"
1972 " signals.baz();\n"
1973 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001974}
1975
Alexander Kornienkofd433362013-03-27 17:08:02 +00001976TEST_F(FormatTest, SeparatesLogicalBlocks) {
1977 EXPECT_EQ("class A {\n"
1978 "public:\n"
1979 " void f();\n"
1980 "\n"
1981 "private:\n"
1982 " void g() {}\n"
1983 " // test\n"
1984 "protected:\n"
1985 " int h;\n"
1986 "};",
1987 format("class A {\n"
1988 "public:\n"
1989 "void f();\n"
1990 "private:\n"
1991 "void g() {}\n"
1992 "// test\n"
1993 "protected:\n"
1994 "int h;\n"
1995 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00001996 EXPECT_EQ("class A {\n"
1997 "protected:\n"
1998 "public:\n"
1999 " void f();\n"
2000 "};",
2001 format("class A {\n"
2002 "protected:\n"
2003 "\n"
2004 "public:\n"
2005 "\n"
2006 " void f();\n"
2007 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00002008
2009 // Even ensure proper spacing inside macros.
2010 EXPECT_EQ("#define B \\\n"
2011 " class A { \\\n"
2012 " protected: \\\n"
2013 " public: \\\n"
2014 " void f(); \\\n"
2015 " };",
2016 format("#define B \\\n"
2017 " class A { \\\n"
2018 " protected: \\\n"
2019 " \\\n"
2020 " public: \\\n"
2021 " \\\n"
2022 " void f(); \\\n"
2023 " };",
2024 getGoogleStyle()));
2025 // But don't remove empty lines after macros ending in access specifiers.
2026 EXPECT_EQ("#define A private:\n"
2027 "\n"
2028 "int i;",
2029 format("#define A private:\n"
2030 "\n"
2031 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00002032}
2033
Daniel Jasper83193602013-04-05 17:22:09 +00002034TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002035 verifyFormat("class A : public B {};");
2036 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002037
2038 verifyFormat(
2039 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002040 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00002041 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
2042 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002043 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002044 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002045 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002046 verifyFormat("class AAAAAAAAAAAA : public B,\n"
2047 " public C,\n"
2048 " public D,\n"
2049 " public E,\n"
2050 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002051 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00002052
2053 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002054 " ReallyReallyLongClassName {\n"
2055 " int i;\n"
2056 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00002057 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00002058 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
2059 " aaaaaaaaaaaaaaaa> {};");
2060 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
2061 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
2062 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00002063 verifyFormat("template <class R, class C>\n"
2064 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
2065 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00002066 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00002067}
2068
Manuel Klimek28cacc72013-01-07 18:10:23 +00002069TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002070 verifyFormat("class A {\n} a, b;");
2071 verifyFormat("struct A {\n} a, b;");
2072 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00002073}
2074
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002075TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002076 verifyFormat("enum {\n"
2077 " Zero,\n"
2078 " One = 1,\n"
2079 " Two = One + 1,\n"
2080 " Three = (One + Two),\n"
2081 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2082 " Five = (One, Two, Three, Four, 5)\n"
2083 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002084 verifyGoogleFormat("enum {\n"
2085 " Zero,\n"
2086 " One = 1,\n"
2087 " Two = One + 1,\n"
2088 " Three = (One + Two),\n"
2089 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2090 " Five = (One, Two, Three, Four, 5)\n"
2091 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002092 verifyFormat("enum Enum {};");
2093 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002094 verifyFormat("enum X E {} d;");
2095 verifyFormat("enum __attribute__((...)) E {} d;");
2096 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00002097 verifyFormat("enum {\n"
2098 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002099 "};",
2100 getLLVMStyleWithColumns(30));
2101
2102 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00002103 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002104
2105 EXPECT_EQ("enum KeepEmptyLines {\n"
2106 " ONE,\n"
2107 "\n"
2108 " TWO,\n"
2109 "\n"
2110 " THREE\n"
2111 "}",
2112 format("enum KeepEmptyLines {\n"
2113 " ONE,\n"
2114 "\n"
2115 " TWO,\n"
2116 "\n"
2117 "\n"
2118 " THREE\n"
2119 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00002120 verifyFormat("enum E { // comment\n"
2121 " ONE,\n"
2122 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00002123 "};\n"
2124 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002125 // Not enums.
2126 verifyFormat("enum X f() {\n"
2127 " a();\n"
2128 " return 42;\n"
2129 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00002130 verifyFormat("enum X Type::f() {\n"
2131 " a();\n"
2132 " return 42;\n"
2133 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002134 verifyFormat("enum ::X f() {\n"
2135 " a();\n"
2136 " return 42;\n"
2137 "}");
2138 verifyFormat("enum ns::X f() {\n"
2139 " a();\n"
2140 " return 42;\n"
2141 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002142}
2143
Daniel Jasperb7150872013-08-30 10:10:19 +00002144TEST_F(FormatTest, FormatsEnumsWithErrors) {
2145 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002146 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002147 " Two = 1;\n"
2148 "};");
2149 verifyFormat("namespace n {\n"
2150 "enum Type {\n"
2151 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002152 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002153 " int i;\n"
2154 "}\n"
2155 "void g() {}");
2156}
2157
Daniel Jasper2b41a822013-08-20 12:42:50 +00002158TEST_F(FormatTest, FormatsEnumStruct) {
2159 verifyFormat("enum struct {\n"
2160 " Zero,\n"
2161 " One = 1,\n"
2162 " Two = One + 1,\n"
2163 " Three = (One + Two),\n"
2164 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2165 " Five = (One, Two, Three, Four, 5)\n"
2166 "};");
2167 verifyFormat("enum struct Enum {};");
2168 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002169 verifyFormat("enum struct X E {} d;");
2170 verifyFormat("enum struct __attribute__((...)) E {} d;");
2171 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002172 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
2173}
2174
2175TEST_F(FormatTest, FormatsEnumClass) {
2176 verifyFormat("enum class {\n"
2177 " Zero,\n"
2178 " One = 1,\n"
2179 " Two = One + 1,\n"
2180 " Three = (One + Two),\n"
2181 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2182 " Five = (One, Two, Three, Four, 5)\n"
2183 "};");
2184 verifyFormat("enum class Enum {};");
2185 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002186 verifyFormat("enum class X E {} d;");
2187 verifyFormat("enum class __attribute__((...)) E {} d;");
2188 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002189 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
2190}
2191
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002192TEST_F(FormatTest, FormatsEnumTypes) {
2193 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002194 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002195 " B\n"
2196 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00002197 verifyFormat("enum X : int { A, B };");
2198 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002199}
2200
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002201TEST_F(FormatTest, FormatsNSEnums) {
2202 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
2203 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
2204 " // Information about someDecentlyLongValue.\n"
2205 " someDecentlyLongValue,\n"
2206 " // Information about anotherDecentlyLongValue.\n"
2207 " anotherDecentlyLongValue,\n"
2208 " // Information about aThirdDecentlyLongValue.\n"
2209 " aThirdDecentlyLongValue\n"
2210 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00002211 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
2212 " a = 1,\n"
2213 " b = 2,\n"
2214 " c = 3,\n"
2215 "};");
2216 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
2217 " a = 1,\n"
2218 " b = 2,\n"
2219 " c = 3,\n"
2220 "};");
2221 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
2222 " a = 1,\n"
2223 " b = 2,\n"
2224 " c = 3,\n"
2225 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002226}
2227
Nico Weber7769a902013-01-14 05:49:49 +00002228TEST_F(FormatTest, FormatsBitfields) {
2229 verifyFormat("struct Bitfields {\n"
2230 " unsigned sClass : 8;\n"
2231 " unsigned ValueKind : 2;\n"
2232 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00002233 verifyFormat("struct A {\n"
2234 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
2235 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
2236 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00002237 verifyFormat("struct MyStruct {\n"
2238 " uchar data;\n"
2239 " uchar : 8;\n"
2240 " uchar : 8;\n"
2241 " uchar other;\n"
2242 "};");
Nico Weber7769a902013-01-14 05:49:49 +00002243}
2244
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002245TEST_F(FormatTest, FormatsNamespaces) {
2246 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002247 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002248 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002249 "}");
2250 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002251 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002252 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002253 "}");
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002254 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002255 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002256 "void f() { f(); }\n"
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002257 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002258 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002259 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002260 "void f() { f(); }");
Manuel Klimek046b9302013-02-06 16:08:09 +00002261
2262 // This code is more common than we thought; if we
2263 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002264 // its own line, which is undesirable.
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002265 verifyFormat("namespace {};");
Manuel Klimek046b9302013-02-06 16:08:09 +00002266 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002267 "class A {};\n"
Manuel Klimek046b9302013-02-06 16:08:09 +00002268 "};");
Daniel Jasper251b3c92013-07-01 11:22:57 +00002269
2270 verifyFormat("namespace {\n"
2271 "int SomeVariable = 0; // comment\n"
2272 "} // namespace");
2273 EXPECT_EQ("#ifndef HEADER_GUARD\n"
2274 "#define HEADER_GUARD\n"
2275 "namespace my_namespace {\n"
2276 "int i;\n"
2277 "} // my_namespace\n"
2278 "#endif // HEADER_GUARD",
2279 format("#ifndef HEADER_GUARD\n"
2280 " #define HEADER_GUARD\n"
2281 " namespace my_namespace {\n"
2282 "int i;\n"
2283 "} // my_namespace\n"
2284 "#endif // HEADER_GUARD"));
Daniel Jasper65ee3472013-07-31 23:16:02 +00002285
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00002286 EXPECT_EQ("namespace A::B {\n"
2287 "class C {};\n"
2288 "}",
2289 format("namespace A::B {\n"
2290 "class C {};\n"
2291 "}"));
2292
Daniel Jasper65ee3472013-07-31 23:16:02 +00002293 FormatStyle Style = getLLVMStyle();
2294 Style.NamespaceIndentation = FormatStyle::NI_All;
2295 EXPECT_EQ("namespace out {\n"
2296 " int i;\n"
2297 " namespace in {\n"
2298 " int i;\n"
2299 " } // namespace\n"
2300 "} // namespace",
2301 format("namespace out {\n"
2302 "int i;\n"
2303 "namespace in {\n"
2304 "int i;\n"
2305 "} // namespace\n"
2306 "} // namespace",
2307 Style));
2308
2309 Style.NamespaceIndentation = FormatStyle::NI_Inner;
2310 EXPECT_EQ("namespace out {\n"
2311 "int i;\n"
2312 "namespace in {\n"
2313 " int i;\n"
2314 "} // namespace\n"
2315 "} // namespace",
2316 format("namespace out {\n"
2317 "int i;\n"
2318 "namespace in {\n"
2319 "int i;\n"
2320 "} // namespace\n"
2321 "} // namespace",
2322 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002323}
2324
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002325TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00002326
Daniel Jasper40aacf42013-03-14 13:45:21 +00002327TEST_F(FormatTest, FormatsInlineASM) {
2328 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00002329 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00002330 verifyFormat(
2331 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2332 " \"cpuid\\n\\t\"\n"
2333 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00002334 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00002335 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00002336 EXPECT_EQ(
2337 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002338 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002339 " mov edx,[that] // vtable in edx\n"
2340 " mov eax,methodIndex\n"
2341 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002342 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002343 "}",
2344 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2345 " __asm {\n"
2346 " mov edx,[that] // vtable in edx\n"
2347 " mov eax,methodIndex\n"
2348 " call [edx][eax*4] // stdcall\n"
2349 " }\n"
2350 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00002351 EXPECT_EQ("_asm {\n"
2352 " xor eax, eax;\n"
2353 " cpuid;\n"
2354 "}",
2355 format("_asm {\n"
2356 " xor eax, eax;\n"
2357 " cpuid;\n"
2358 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00002359 verifyFormat("void function() {\n"
2360 " // comment\n"
2361 " asm(\"\");\n"
2362 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00002363 EXPECT_EQ("__asm {\n"
2364 "}\n"
2365 "int i;",
2366 format("__asm {\n"
2367 "}\n"
2368 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00002369}
2370
Nico Weberd5650bd2013-01-07 16:36:17 +00002371TEST_F(FormatTest, FormatTryCatch) {
2372 verifyFormat("try {\n"
2373 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002374 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002375 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002376 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002377 " exit(42);\n"
2378 "}");
2379
2380 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00002381 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002382 " return 5;\n"
2383 "}");
2384 verifyFormat("class A {\n"
2385 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002386 " A() try : a(0) {\n"
2387 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002388 " throw;\n"
2389 " }\n"
2390 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00002391
2392 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002393 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00002394}
2395
Nico Weberfac23712015-02-04 15:26:27 +00002396TEST_F(FormatTest, FormatSEHTryCatch) {
2397 verifyFormat("__try {\n"
2398 " int a = b * c;\n"
2399 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2400 " // Do nothing.\n"
2401 "}");
2402
2403 verifyFormat("__try {\n"
2404 " int a = b * c;\n"
2405 "} __finally {\n"
2406 " // Do nothing.\n"
2407 "}");
2408
2409 verifyFormat("DEBUG({\n"
2410 " __try {\n"
2411 " } __finally {\n"
2412 " }\n"
2413 "});\n");
2414}
2415
Daniel Jasper04a71a42014-05-08 11:58:24 +00002416TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2417 verifyFormat("try {\n"
2418 " f();\n"
2419 "} catch {\n"
2420 " g();\n"
2421 "}");
2422 verifyFormat("try {\n"
2423 " f();\n"
2424 "} catch (A a) MACRO(x) {\n"
2425 " g();\n"
2426 "} catch (B b) MACRO(x) {\n"
2427 " g();\n"
2428 "}");
2429}
2430
2431TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2432 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00002433 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2434 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00002435 Style.BreakBeforeBraces = BraceStyle;
2436 verifyFormat("try {\n"
2437 " // something\n"
2438 "} catch (...) {\n"
2439 " // something\n"
2440 "}",
2441 Style);
2442 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00002443 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2444 verifyFormat("try {\n"
2445 " // something\n"
2446 "}\n"
2447 "catch (...) {\n"
2448 " // something\n"
2449 "}",
2450 Style);
Nico Weberfac23712015-02-04 15:26:27 +00002451 verifyFormat("__try {\n"
2452 " // something\n"
2453 "}\n"
2454 "__finally {\n"
2455 " // something\n"
2456 "}",
2457 Style);
Nico Weber33381f52015-02-07 01:57:32 +00002458 verifyFormat("@try {\n"
2459 " // something\n"
2460 "}\n"
2461 "@finally {\n"
2462 " // something\n"
2463 "}",
2464 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00002465 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2466 verifyFormat("try\n"
2467 "{\n"
2468 " // something\n"
2469 "}\n"
2470 "catch (...)\n"
2471 "{\n"
2472 " // something\n"
2473 "}",
2474 Style);
2475 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
2476 verifyFormat("try\n"
2477 " {\n"
2478 " // something\n"
2479 " }\n"
2480 "catch (...)\n"
2481 " {\n"
2482 " // something\n"
2483 " }",
2484 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00002485 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2486 Style.BraceWrapping.BeforeCatch = true;
2487 verifyFormat("try {\n"
2488 " // something\n"
2489 "}\n"
2490 "catch (...) {\n"
2491 " // something\n"
2492 "}",
2493 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00002494}
2495
Daniel Jaspere25509f2012-12-17 11:29:41 +00002496TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002497 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00002498
Daniel Jaspera44991332015-04-29 13:06:49 +00002499 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
2500 " 100000000, "
2501 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00002502
Daniel Jasper473c62c2013-05-17 09:35:01 +00002503 // Here, everything other than the "}" would fit on a line.
2504 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002505 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002506 EXPECT_EQ("S s = {a,\n"
2507 "\n"
2508 " b};",
2509 format("S s = {\n"
2510 " a,\n"
2511 "\n"
2512 " b\n"
2513 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00002514
2515 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
2516 // line. However, the formatting looks a bit off and this probably doesn't
2517 // happen often in practice.
2518 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002519 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00002520 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00002521}
2522
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002523TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002524 verifyFormat("const struct A a = {.a = 1, .b = 2};");
2525 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
2526 " .bbbbbbbbbb = 2,\n"
2527 " .cccccccccc = 3,\n"
2528 " .dddddddddd = 4,\n"
2529 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002530 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002531 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
2532 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
2533 " .ccccccccccccccccccccccccccc = 3,\n"
2534 " .ddddddddddddddddddddddddddd = 4,\n"
2535 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00002536
2537 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
2538}
2539
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002540TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00002541 verifyFormat("static A x = {{{}}};\n");
2542 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2543 " {init1, init2, init3, init4}}};",
2544 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00002545
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002546 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00002547 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2548 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2549 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2550 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00002551 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002552 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2553 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2554 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00002555 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2556 " {rect.fRight - rect.fLeft, rect.fBottom - "
2557 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002558
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002559 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00002560 "SomeArrayOfSomeType a = {\n"
2561 " {{1, 2, 3},\n"
2562 " {1, 2, 3},\n"
2563 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
2564 " 333333333333333333333333333333},\n"
2565 " {1, 2, 3},\n"
2566 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00002567 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00002568 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002569 " {{1, 2, 3}},\n"
2570 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00002571 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2572 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00002573 " {{1, 2, 3}},\n"
2574 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00002575
Daniel Jaspera44991332015-04-29 13:06:49 +00002576 verifyFormat("struct {\n"
2577 " unsigned bit;\n"
2578 " const char *const name;\n"
2579 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2580 " {kOsWin, \"Windows\"},\n"
2581 " {kOsLinux, \"Linux\"},\n"
2582 " {kOsCrOS, \"Chrome OS\"}};");
2583 verifyFormat("struct {\n"
2584 " unsigned bit;\n"
2585 " const char *const name;\n"
2586 "} kBitsToOs[] = {\n"
2587 " {kOsMac, \"Mac\"},\n"
2588 " {kOsWin, \"Windows\"},\n"
2589 " {kOsLinux, \"Linux\"},\n"
2590 " {kOsCrOS, \"Chrome OS\"},\n"
2591 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00002592}
2593
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002594TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2595 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2596 " \\\n"
2597 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2598}
2599
Daniel Jasperda16db32013-01-07 10:48:50 +00002600TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002601 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2602 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00002603
2604 // Do break defaulted and deleted functions.
2605 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2606 " default;",
2607 getLLVMStyleWithColumns(40));
2608 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2609 " delete;",
2610 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00002611}
2612
2613TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2614 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2615 getLLVMStyleWithColumns(40));
2616 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2617 getLLVMStyleWithColumns(40));
2618 EXPECT_EQ("#define Q \\\n"
2619 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
2620 " \"aaaaaaaa.cpp\"",
2621 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2622 getLLVMStyleWithColumns(40)));
2623}
2624
2625TEST_F(FormatTest, UnderstandsLinePPDirective) {
2626 EXPECT_EQ("# 123 \"A string literal\"",
2627 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00002628}
2629
Manuel Klimek591b5802013-01-31 15:58:48 +00002630TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00002631 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00002632 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002633}
2634
2635TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2636 EXPECT_EQ("#line 42 \"test\"\n",
2637 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002638 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
2639 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002640}
2641
2642TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2643 EXPECT_EQ("#line 42 \"test\"",
2644 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002645 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00002646}
2647
Daniel Jasper877615c2013-10-11 19:45:02 +00002648TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2649 verifyFormat("#define A \\x20");
2650 verifyFormat("#define A \\ x20");
2651 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
2652 verifyFormat("#define A ''");
2653 verifyFormat("#define A ''qqq");
2654 verifyFormat("#define A `qqq");
2655 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00002656 EXPECT_EQ("const char *c = STRINGIFY(\n"
2657 "\\na : b);",
2658 format("const char * c = STRINGIFY(\n"
2659 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00002660
2661 verifyFormat("a\r\\");
2662 verifyFormat("a\v\\");
2663 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00002664}
2665
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002666TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002667 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2668 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002669 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002670 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00002671 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00002672
2673 verifyFormat("#define A A\n#define A A");
2674 verifyFormat("#define A(X) A\n#define A A");
2675
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002676 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2677 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002678}
2679
2680TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002681 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002682 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00002683 "#define A( \\\n"
2684 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002685 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002686 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00002687 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00002688 " #include \"a.h\"\n"
2689 "#define A(A,\\\n"
2690 " B)\n"
2691 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00002692 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002693 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00002694}
2695
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002696TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002697
2698TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2699 EXPECT_EQ("#define A \\\n"
2700 " c; \\\n"
2701 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002702 "f;",
2703 format("#define A c; e;\n"
2704 "f;",
2705 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002706}
2707
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002708TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00002709
Manuel Klimek1abf7892013-01-04 23:34:14 +00002710TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00002711 EXPECT_EQ("int x,\n"
2712 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002713 " y;",
2714 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00002715}
2716
Manuel Klimek09e07972013-01-05 21:34:55 +00002717TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00002718 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00002719 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00002720 verifyFormat("#define A \\\n"
2721 " { \\\n"
2722 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002723 " }",
2724 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00002725
2726 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002727 " void function##X()",
2728 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002729
2730 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002731 " void a##b##c()",
2732 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00002733
Daniel Jasper39825ea2013-01-14 15:40:57 +00002734 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00002735}
2736
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002737TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00002738 EXPECT_EQ("#define A (x)", format("#define A (x)"));
2739 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00002740}
2741
Manuel Klimek0c137952013-02-11 12:33:24 +00002742TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2743 EXPECT_EQ("#define A b;", format("#define A \\\n"
2744 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002745 " b;",
2746 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002747 EXPECT_EQ("#define A \\\n"
2748 " \\\n"
2749 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002750 " b;",
2751 format("#define A \\\n"
2752 " \\\n"
2753 " a; \\\n"
2754 " b;",
2755 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002756 EXPECT_EQ("#define A \\\n"
2757 " a; \\\n"
2758 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002759 " b;",
2760 format("#define A \\\n"
2761 " a; \\\n"
2762 " \\\n"
2763 " b;",
2764 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00002765}
2766
Daniel Jasper00475962013-02-19 17:14:38 +00002767TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002768 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00002769 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00002770 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00002771 " case 2\n",
2772 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00002773 verifyFormat("#define MACRO(a) \\\n"
2774 " if (a) \\\n"
2775 " f(); \\\n"
2776 " else \\\n"
2777 " g()",
2778 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00002779 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002780 verifyIncompleteFormat("#define STR(x) #x\n"
2781 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00002782 verifyFormat("#pragma omp threadprivate( \\\n"
2783 " y)), // expected-warning",
2784 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00002785 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00002786 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002787 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00002788 "#define b \\\n"
2789 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002790 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00002791 "a",
2792 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00002793 verifyFormat("#define A \\\n"
2794 " { \\\n"
2795 " {\n"
2796 "#define B \\\n"
2797 " } \\\n"
2798 " }",
2799 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00002800 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00002801 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00002802 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00002803 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00002804}
2805
Daniel Jasper40e19212013-05-29 13:16:10 +00002806TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2807 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2808 EXPECT_EQ("class A : public QObject {\n"
2809 " Q_OBJECT\n"
2810 "\n"
2811 " A() {}\n"
2812 "};",
2813 format("class A : public QObject {\n"
2814 " Q_OBJECT\n"
2815 "\n"
2816 " A() {\n}\n"
2817 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00002818 EXPECT_EQ("MACRO\n"
2819 "/*static*/ int i;",
2820 format("MACRO\n"
2821 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00002822 EXPECT_EQ("SOME_MACRO\n"
2823 "namespace {\n"
2824 "void f();\n"
2825 "}",
2826 format("SOME_MACRO\n"
2827 " namespace {\n"
2828 "void f( );\n"
2829 "}"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002830 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00002831 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2832 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00002833 // Only if everything is upper case.
2834 EXPECT_EQ("class A : public QObject {\n"
2835 " Q_Object A() {}\n"
2836 "};",
2837 format("class A : public QObject {\n"
2838 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00002839 " A() {\n}\n"
2840 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00002841
2842 // Only if the next line can actually start an unwrapped line.
2843 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2844 format("SOME_WEIRD_LOG_MACRO\n"
2845 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00002846
2847 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00002848 "(n, buffers))\n",
2849 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00002850}
2851
Alexander Kornienkode644272013-04-08 22:16:06 +00002852TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2853 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2854 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2855 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002856 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00002857 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2858 "int *createScopDetectionPass() { return 0; }",
2859 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2860 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2861 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2862 " class X {};\n"
2863 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2864 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002865 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2866 // braces, so that inner block is indented one level more.
2867 EXPECT_EQ("int q() {\n"
2868 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2869 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2870 " IPC_END_MESSAGE_MAP()\n"
2871 "}",
2872 format("int q() {\n"
2873 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2874 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2875 " IPC_END_MESSAGE_MAP()\n"
2876 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00002877
Daniel Jasper352dae12014-01-03 11:50:46 +00002878 // Same inside macros.
2879 EXPECT_EQ("#define LIST(L) \\\n"
2880 " L(A) \\\n"
2881 " L(B) \\\n"
2882 " L(C)",
2883 format("#define LIST(L) \\\n"
2884 " L(A) \\\n"
2885 " L(B) \\\n"
2886 " L(C)",
2887 getGoogleStyle()));
2888
Daniel Jasper545c6522013-09-17 09:26:07 +00002889 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002890 EXPECT_EQ("int q() {\n"
2891 " f(x);\n"
2892 " f(x) {}\n"
2893 " f(x)->g();\n"
2894 " f(x)->*g();\n"
2895 " f(x).g();\n"
2896 " f(x) = x;\n"
2897 " f(x) += x;\n"
2898 " f(x) -= x;\n"
2899 " f(x) *= x;\n"
2900 " f(x) /= x;\n"
2901 " f(x) %= x;\n"
2902 " f(x) &= x;\n"
2903 " f(x) |= x;\n"
2904 " f(x) ^= x;\n"
2905 " f(x) >>= x;\n"
2906 " f(x) <<= x;\n"
2907 " f(x)[y].z();\n"
2908 " LOG(INFO) << x;\n"
2909 " ifstream(x) >> x;\n"
2910 "}\n",
2911 format("int q() {\n"
2912 " f(x)\n;\n"
2913 " f(x)\n {}\n"
2914 " f(x)\n->g();\n"
2915 " f(x)\n->*g();\n"
2916 " f(x)\n.g();\n"
2917 " f(x)\n = x;\n"
2918 " f(x)\n += x;\n"
2919 " f(x)\n -= x;\n"
2920 " f(x)\n *= x;\n"
2921 " f(x)\n /= x;\n"
2922 " f(x)\n %= x;\n"
2923 " f(x)\n &= x;\n"
2924 " f(x)\n |= x;\n"
2925 " f(x)\n ^= x;\n"
2926 " f(x)\n >>= x;\n"
2927 " f(x)\n <<= x;\n"
2928 " f(x)\n[y].z();\n"
2929 " LOG(INFO)\n << x;\n"
2930 " ifstream(x)\n >> x;\n"
2931 "}\n"));
2932 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002933 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002934 " if (1) {\n"
2935 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002936 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002937 " while (1) {\n"
2938 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002939 " F(x)\n"
2940 " G(x);\n"
2941 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002942 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002943 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002944 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002945 " }\n"
2946 "}\n",
2947 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002948 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002949 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002950 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002951 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00002952 "F(x)\n"
2953 "G(x);\n"
2954 "F(x)\n"
2955 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002956 "}\n"));
2957 EXPECT_EQ("class A {\n"
2958 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002959 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002960 " A(X x)\n" // FIXME: function-level try blocks are broken.
2961 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002962 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002963 " }\n"
2964 "};",
2965 format("class A {\n"
2966 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00002967 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00002968 " A(X x)\n"
2969 " try : t(0) {} catch (...) {}\n"
2970 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00002971 EXPECT_EQ("class SomeClass {\n"
2972 "public:\n"
2973 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2974 "};",
2975 format("class SomeClass {\n"
2976 "public:\n"
2977 " SomeClass()\n"
2978 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2979 "};"));
2980 EXPECT_EQ("class SomeClass {\n"
2981 "public:\n"
2982 " SomeClass()\n"
2983 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2984 "};",
2985 format("class SomeClass {\n"
2986 "public:\n"
2987 " SomeClass()\n"
2988 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2989 "};",
2990 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00002991
2992 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00002993}
2994
Manuel Klimek4fe43002013-05-22 12:51:29 +00002995TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2996 verifyFormat("#define A \\\n"
2997 " f({ \\\n"
2998 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00002999 " });",
3000 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00003001}
3002
Manuel Klimekef2cfb12013-01-05 22:14:16 +00003003TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
3004 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
3005}
3006
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003007TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003008 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003009}
3010
Manuel Klimek1058d982013-01-06 20:07:31 +00003011TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3012 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
3013 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3014 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
3015 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3016}
Manuel Klimek1abf7892013-01-04 23:34:14 +00003017
Daniel Jaspere2408e32015-05-06 11:16:43 +00003018TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003019 EXPECT_EQ(
3020 "#define A \\\n int i; \\\n int j;",
3021 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003022 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00003023 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003024 EXPECT_EQ("/* \\ \\ \\\n*/", format("\\\n/* \\ \\ \\\n*/"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00003025 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003026}
3027
Alexander Kornienko00691cf2015-01-12 13:11:12 +00003028TEST_F(FormatTest, DontCrashOnBlockComments) {
3029 EXPECT_EQ(
3030 "int xxxxxxxxx; /* "
3031 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\n"
3032 "zzzzzz\n"
3033 "0*/",
3034 format("int xxxxxxxxx; /* "
3035 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzz\n"
3036 "0*/"));
3037}
3038
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003039TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3040 verifyFormat("#define A \\\n"
3041 " int v( \\\n"
3042 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003043 " int i;",
3044 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003045}
3046
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003047TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00003048 EXPECT_EQ(
3049 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3050 " \\\n"
3051 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3052 "\n"
3053 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3054 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3055 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
3056 "\\\n"
3057 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3058 " \n"
3059 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3060 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003061}
3062
Manuel Klimek52b15152013-01-09 15:25:02 +00003063TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3064 EXPECT_EQ("int\n"
3065 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003066 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003067 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003068 verifyFormat("functionCallTo(\n"
3069 " someOtherFunction(\n"
3070 " withSomeParameters, whichInSequence,\n"
3071 " areLongerThanALine(andAnotherCall,\n"
3072 "#define A B\n"
3073 " withMoreParamters,\n"
3074 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003075 " andMoreParameters),\n"
3076 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003077 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00003078 verifyFormat("Foo::Foo()\n"
3079 "#ifdef BAR\n"
3080 " : baz(0)\n"
3081 "#endif\n"
3082 "{\n"
3083 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00003084 verifyFormat("void f() {\n"
3085 " if (true)\n"
3086 "#ifdef A\n"
3087 " f(42);\n"
3088 " x();\n"
3089 "#else\n"
3090 " g();\n"
3091 " x();\n"
3092 "#endif\n"
3093 "}");
3094 verifyFormat("void f(param1, param2,\n"
3095 " param3,\n"
3096 "#ifdef A\n"
3097 " param4(param5,\n"
3098 "#ifdef A1\n"
3099 " param6,\n"
3100 "#ifdef A2\n"
3101 " param7),\n"
3102 "#else\n"
3103 " param8),\n"
3104 " param9,\n"
3105 "#endif\n"
3106 " param10,\n"
3107 "#endif\n"
3108 " param11)\n"
3109 "#else\n"
3110 " param12)\n"
3111 "#endif\n"
3112 "{\n"
3113 " x();\n"
3114 "}",
3115 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00003116 verifyFormat("#if 1\n"
3117 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003118 verifyFormat("#if 1\n"
3119 "#endif\n"
3120 "#if 1\n"
3121 "#else\n"
3122 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00003123 verifyFormat("DEBUG({\n"
3124 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3125 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3126 "});\n"
3127 "#if a\n"
3128 "#else\n"
3129 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00003130
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003131 verifyIncompleteFormat("void f(\n"
3132 "#if A\n"
3133 " );\n"
3134 "#else\n"
3135 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00003136}
3137
Manuel Klimek14bd9172014-01-29 08:49:02 +00003138TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3139 verifyFormat("#endif\n"
3140 "#if B");
3141}
3142
Manuel Klimek88033d72013-10-21 08:11:15 +00003143TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3144 FormatStyle SingleLine = getLLVMStyle();
3145 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00003146 verifyFormat("#if 0\n"
3147 "#elif 1\n"
3148 "#endif\n"
3149 "void foo() {\n"
3150 " if (test) foo2();\n"
3151 "}",
3152 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00003153}
3154
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003155TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00003156 verifyFormat("functionCall({ int i; });");
3157 verifyFormat("functionCall({\n"
3158 " int i;\n"
3159 " int j;\n"
3160 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00003161 verifyFormat("functionCall(\n"
3162 " {\n"
3163 " int i;\n"
3164 " int j;\n"
3165 " },\n"
3166 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00003167 verifyFormat("functionA(functionB({\n"
3168 " int i;\n"
3169 " int j;\n"
3170 " }),\n"
3171 " aaaa, bbbb, cccc);");
3172 verifyFormat("functionCall(\n"
3173 " {\n"
3174 " int i;\n"
3175 " int j;\n"
3176 " },\n"
3177 " aaaa, bbbb, // comment\n"
3178 " cccc);");
3179 verifyFormat("functionA(functionB({\n"
3180 " int i;\n"
3181 " int j;\n"
3182 " }),\n"
3183 " aaaa, bbbb, // comment\n"
3184 " cccc);");
3185 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3186 verifyFormat("functionCall(aaaa, bbbb, {\n"
3187 " int i;\n"
3188 " int j;\n"
3189 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00003190 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00003191 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00003192 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003193 " int i; // break\n"
3194 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00003195 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3196 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003197 verifyFormat("DEBUG({\n"
3198 " if (a)\n"
3199 " f();\n"
3200 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003201}
3202
3203TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003204 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003205 "int i;",
3206 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003207}
3208
3209TEST_F(FormatTest, LayoutNestedBlocks) {
3210 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3211 " struct s {\n"
3212 " int i;\n"
3213 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003214 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003215 " for (int i = 0; i < 10; ++i)\n"
3216 " return;\n"
3217 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003218 verifyFormat("call(parameter, {\n"
3219 " something();\n"
3220 " // Comment using all columns.\n"
3221 " somethingelse();\n"
3222 "});",
3223 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00003224 verifyFormat("DEBUG( //\n"
3225 " { f(); }, a);");
3226 verifyFormat("DEBUG( //\n"
3227 " {\n"
3228 " f(); //\n"
3229 " },\n"
3230 " a);");
3231
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003232 EXPECT_EQ("call(parameter, {\n"
3233 " something();\n"
3234 " // Comment too\n"
3235 " // looooooooooong.\n"
3236 " somethingElse();\n"
3237 "});",
3238 format("call(parameter, {\n"
3239 " something();\n"
3240 " // Comment too looooooooooong.\n"
3241 " somethingElse();\n"
3242 "});",
3243 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003244 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003245 EXPECT_EQ("DEBUG({ // comment\n"
3246 " int i;\n"
3247 "});",
3248 format("DEBUG({ // comment\n"
3249 "int i;\n"
3250 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003251 EXPECT_EQ("DEBUG({\n"
3252 " int i;\n"
3253 "\n"
3254 " // comment\n"
3255 " int j;\n"
3256 "});",
3257 format("DEBUG({\n"
3258 " int i;\n"
3259 "\n"
3260 " // comment\n"
3261 " int j;\n"
3262 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003263
3264 verifyFormat("DEBUG({\n"
3265 " if (a)\n"
3266 " return;\n"
3267 "});");
3268 verifyGoogleFormat("DEBUG({\n"
3269 " if (a) return;\n"
3270 "});");
3271 FormatStyle Style = getGoogleStyle();
3272 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003273 verifyFormat("Debug(aaaaa,\n"
3274 " {\n"
3275 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3276 " },\n"
3277 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003278 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003279
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003280 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3281
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003282 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003283}
3284
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003285TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3286 EXPECT_EQ("#define MACRO() \\\n"
3287 " Debug(aaa, /* force line break */ \\\n"
3288 " { \\\n"
3289 " int i; \\\n"
3290 " int j; \\\n"
3291 " })",
3292 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3293 " { int i; int j; })",
3294 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003295
3296 EXPECT_EQ("#define A \\\n"
3297 " [] { \\\n"
3298 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3299 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3300 " }",
3301 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3302 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3303 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003304}
3305
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003306TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3307 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003308 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003309 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003310}
3311
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003312TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3313 FormatStyle Style = getLLVMStyle();
3314 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3315 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3316 verifyFormat("FOO_BEGIN\n"
3317 " FOO_ENTRY\n"
3318 "FOO_END", Style);
3319 verifyFormat("FOO_BEGIN\n"
3320 " NESTED_FOO_BEGIN\n"
3321 " NESTED_FOO_ENTRY\n"
3322 " NESTED_FOO_END\n"
3323 "FOO_END", Style);
3324 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3325 " int x;\n"
3326 " x = 1;\n"
3327 "FOO_END(Baz)", Style);
3328}
3329
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003330//===----------------------------------------------------------------------===//
3331// Line break tests.
3332//===----------------------------------------------------------------------===//
3333
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003334TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003335 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003336 "void f() {\n"
3337 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3338 " parameter, parameter, parameter)),\n"
3339 " SecondLongCall(parameter));\n"
3340 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003341 verifyFormat(
3342 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3343 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3344 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3345 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3346 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003347 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3348 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3349 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3350 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003351 verifyFormat(
3352 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3353 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3354 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3355 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003356 verifyFormat("int a = bbbb && ccc && fffff(\n"
3357 "#define A Just forcing a new line\n"
3358 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003359}
3360
Daniel Jasperd69fc772013-05-08 14:12:04 +00003361TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3362 verifyFormat(
3363 "bool aaaaaaa =\n"
3364 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3365 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003366 verifyFormat(
3367 "bool aaaaaaa =\n"
3368 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3369 " bbbbbbbb();");
3370
Daniel Jasperd69fc772013-05-08 14:12:04 +00003371 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3372 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3373 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003374 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3375 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3376 " ccccccccc == ddddddddddd;");
3377 verifyFormat(
3378 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3379 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3380 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003381
3382 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3383 " aaaaaa) &&\n"
3384 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003385 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3386 " aaaaaa) >>\n"
3387 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003388 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003389 " SourceMgr.getSpellingColumnNumber(\n"
3390 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3391 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003392
Daniel Jasper68d888c2013-06-03 08:42:05 +00003393 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3394 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3395 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003396 verifyFormat("b = a &&\n"
3397 " // Comment\n"
3398 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003399
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003400 // If the LHS of a comparison is not a binary expression itself, the
3401 // additional linebreak confuses many people.
3402 verifyFormat(
3403 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3404 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3405 "}");
3406 verifyFormat(
3407 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3408 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3409 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003410 verifyFormat(
3411 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3412 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3413 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003414 // Even explicit parentheses stress the precedence enough to make the
3415 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003416 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3417 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3418 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003419 // This cases is borderline, but with the indentation it is still readable.
3420 verifyFormat(
3421 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3422 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3423 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3424 "}",
3425 getLLVMStyleWithColumns(75));
3426
3427 // If the LHS is a binary expression, we should still use the additional break
3428 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003429 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3430 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3431 " 5) {\n"
3432 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003433
Daniel Jasper571f1af2013-05-14 20:39:56 +00003434 FormatStyle OnePerLine = getLLVMStyle();
3435 OnePerLine.BinPackParameters = false;
3436 verifyFormat(
3437 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3438 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3439 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3440 OnePerLine);
Daniel Jasperd69fc772013-05-08 14:12:04 +00003441}
3442
Daniel Jasper6bee6822013-04-08 20:33:42 +00003443TEST_F(FormatTest, ExpressionIndentation) {
3444 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3445 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3446 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3447 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3448 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3449 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3450 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3451 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3452 " ccccccccccccccccccccccccccccccccccccccccc;");
3453 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3454 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3455 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3456 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3457 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3458 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3459 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3460 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3461 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3462 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3463 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3464 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003465 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00003466 "} else if (aaaaa &&\n"
3467 " bbbbb > // break\n"
3468 " ccccc) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003469 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00003470
3471 // Presence of a trailing comment used to change indentation of b.
3472 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3473 " b;\n"
3474 "return aaaaaaaaaaaaaaaaaaa +\n"
3475 " b; //",
3476 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003477}
3478
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003479TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3480 // Not sure what the best system is here. Like this, the LHS can be found
3481 // immediately above an operator (everything with the same or a higher
3482 // indent). The RHS is aligned right of the operator and so compasses
3483 // everything until something with the same indent as the operator is found.
3484 // FIXME: Is this a good system?
3485 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003486 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003487 verifyFormat(
3488 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003489 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3490 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3491 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3492 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3493 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003494 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003495 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3496 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003497 Style);
3498 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003499 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3500 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003501 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3502 Style);
3503 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003504 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3505 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003506 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3507 Style);
3508 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3509 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003510 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3511 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003512 Style);
3513 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003514 "} else if (aaaaa\n"
3515 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003516 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003517 "}",
3518 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003519 verifyFormat("return (a)\n"
3520 " // comment\n"
3521 " + b;",
3522 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003523 verifyFormat(
3524 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3525 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3526 " + cc;",
3527 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003528
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003529 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3530 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3531 Style);
3532
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003533 // Forced by comments.
3534 verifyFormat(
3535 "unsigned ContentSize =\n"
3536 " sizeof(int16_t) // DWARF ARange version number\n"
3537 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3538 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
3539 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00003540
3541 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3542 " == boost::fusion::at_c<1>(iiii).second;",
3543 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00003544
3545 Style.ColumnLimit = 60;
3546 verifyFormat("zzzzzzzzzz\n"
3547 " = bbbbbbbbbbbbbbbbb\n"
3548 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3549 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003550}
3551
Daniel Jasper3219e432014-12-02 13:24:51 +00003552TEST_F(FormatTest, NoOperandAlignment) {
3553 FormatStyle Style = getLLVMStyle();
3554 Style.AlignOperands = false;
3555 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00003556 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3557 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3558 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3559 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3560 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3561 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3562 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3563 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3564 " > ccccccccccccccccccccccccccccccccccccccccc;",
3565 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003566
3567 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3568 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3569 " + cc;",
3570 Style);
3571 verifyFormat("int a = aa\n"
3572 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3573 " * cccccccccccccccccccccccccccccccccccc;",
3574 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00003575
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003576 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00003577 verifyFormat("return (a > b\n"
3578 " // comment1\n"
3579 " // comment2\n"
3580 " || c);",
3581 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003582}
3583
Daniel Jasperac043c92014-09-15 11:11:00 +00003584TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3585 FormatStyle Style = getLLVMStyle();
3586 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3587 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3588 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00003589 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3590 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00003591}
3592
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003593TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003594 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003595 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3596 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003597 verifyFormat("Constructor()\n"
3598 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003599 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003600 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003601 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003602 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003603
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003604 verifyFormat("template <typename T>\n"
3605 "Constructor() : Initializer(FitsOnTheLine) {}",
3606 getLLVMStyleWithColumns(45));
3607
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003608 verifyFormat(
3609 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003610 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003611
3612 verifyFormat(
3613 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003614 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003615 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003616 verifyFormat(
3617 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003618 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003619 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003620 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3621 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3622 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003623
3624 verifyFormat("Constructor()\n"
3625 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3626 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3627 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003628 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003629
Daniel Jasper65585ed2013-01-28 13:31:35 +00003630 verifyFormat("Constructor()\n"
3631 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003632 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003633
Daniel Jasper62e68172013-02-25 15:59:54 +00003634 verifyFormat("Constructor(int Parameter = 0)\n"
3635 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3636 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003637 verifyFormat("Constructor()\n"
3638 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3639 "}",
3640 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003641 verifyFormat("Constructor()\n"
3642 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3643 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003644
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003645 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003646 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003647 verifyFormat("Constructor()\n"
3648 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3649 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3650 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003651
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003652 FormatStyle OnePerLine = getLLVMStyle();
3653 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003654 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003655 verifyFormat("SomeClass::Constructor()\n"
3656 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3657 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003658 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003659 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003660 verifyFormat("SomeClass::Constructor()\n"
3661 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3662 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003663 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003664 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003665 verifyFormat("MyClass::MyClass(int var)\n"
3666 " : some_var_(var), // 4 space indent\n"
3667 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003668 "}",
3669 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003670 verifyFormat("Constructor()\n"
3671 " : aaaaa(aaaaaa),\n"
3672 " aaaaa(aaaaaa),\n"
3673 " aaaaa(aaaaaa),\n"
3674 " aaaaa(aaaaaa),\n"
3675 " aaaaa(aaaaaa) {}",
3676 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003677 verifyFormat("Constructor()\n"
3678 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3679 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3680 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003681 OnePerLine.BinPackParameters = false;
3682 verifyFormat(
3683 "Constructor()\n"
3684 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3685 " aaaaaaaaaaa().aaa(),\n"
3686 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3687 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003688 OnePerLine.ColumnLimit = 60;
3689 verifyFormat("Constructor()\n"
3690 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3691 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3692 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003693
3694 EXPECT_EQ("Constructor()\n"
3695 " : // Comment forcing unwanted break.\n"
3696 " aaaa(aaaa) {}",
3697 format("Constructor() :\n"
3698 " // Comment forcing unwanted break.\n"
3699 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003700}
3701
3702TEST_F(FormatTest, MemoizationTests) {
3703 // This breaks if the memoization lookup does not take \c Indent and
3704 // \c LastSpace into account.
3705 verifyFormat(
3706 "extern CFRunLoopTimerRef\n"
3707 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3708 " CFTimeInterval interval, CFOptionFlags flags,\n"
3709 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003710 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003711
3712 // Deep nesting somewhat works around our memoization.
3713 verifyFormat(
3714 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3715 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3716 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3717 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3718 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3719 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003720 verifyFormat(
3721 "aaaaa(\n"
3722 " aaaaa,\n"
3723 " aaaaa(\n"
3724 " aaaaa,\n"
3725 " aaaaa(\n"
3726 " aaaaa,\n"
3727 " aaaaa(\n"
3728 " aaaaa,\n"
3729 " aaaaa(\n"
3730 " aaaaa,\n"
3731 " aaaaa(\n"
3732 " aaaaa,\n"
3733 " aaaaa(\n"
3734 " aaaaa,\n"
3735 " aaaaa(\n"
3736 " aaaaa,\n"
3737 " aaaaa(\n"
3738 " aaaaa,\n"
3739 " aaaaa(\n"
3740 " aaaaa,\n"
3741 " aaaaa(\n"
3742 " aaaaa,\n"
3743 " aaaaa(\n"
3744 " aaaaa,\n"
3745 " aaaaa))))))))))));",
3746 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003747 verifyFormat(
3748 "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"
3749 " a),\n"
3750 " a),\n"
3751 " a),\n"
3752 " a),\n"
3753 " a),\n"
3754 " a),\n"
3755 " a),\n"
3756 " a),\n"
3757 " a),\n"
3758 " a),\n"
3759 " a),\n"
3760 " a),\n"
3761 " a),\n"
3762 " a),\n"
3763 " a),\n"
3764 " a),\n"
3765 " a)",
3766 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003767
3768 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003769 FormatStyle OnePerLine = getLLVMStyle();
3770 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003771 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003772 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003773 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003774 for (unsigned i = 0, e = 80; i != e; ++i) {
3775 input += " a,\n";
3776 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003777 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003778 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003779}
3780
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003781TEST_F(FormatTest, BreaksAsHighAsPossible) {
3782 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003783 "void f() {\n"
3784 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3785 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3786 " f();\n"
3787 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00003788 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003789 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003790}
3791
Daniel Jasper6728fc12013-04-11 14:29:13 +00003792TEST_F(FormatTest, BreaksFunctionDeclarations) {
3793 // Principially, we break function declarations in a certain order:
3794 // 1) break amongst arguments.
3795 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3796 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003797 verifyFormat("template <class TemplateIt>\n"
3798 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3799 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00003800
3801 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00003802 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003803 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003804 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003805 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003806
3807 // 3) break after (.
3808 verifyFormat(
3809 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00003810 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3811 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003812
3813 // 4) break before after nested name specifiers.
3814 verifyFormat(
3815 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003816 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3817 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003818 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003819
3820 // However, there are exceptions, if a sufficient amount of lines can be
3821 // saved.
3822 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3823 // more adjusting.
3824 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3825 " Cccccccccccccc cccccccccc,\n"
3826 " Cccccccccccccc cccccccccc,\n"
3827 " Cccccccccccccc cccccccccc,\n"
3828 " Cccccccccccccc cccccccccc);");
3829 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003830 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003831 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3832 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3833 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003834 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003835 verifyFormat(
3836 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3837 " Cccccccccccccc cccccccccc,\n"
3838 " Cccccccccccccc cccccccccc,\n"
3839 " Cccccccccccccc cccccccccc,\n"
3840 " Cccccccccccccc cccccccccc,\n"
3841 " Cccccccccccccc cccccccccc,\n"
3842 " Cccccccccccccc cccccccccc);");
3843 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3844 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3845 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3846 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3847 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00003848
3849 // Break after multi-line parameters.
3850 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3851 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3852 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3853 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00003854 verifyFormat("void SomeLoooooooooooongFunction(\n"
3855 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3856 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3857 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003858
3859 // Treat overloaded operators like other functions.
3860 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3861 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00003862 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3863 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00003864 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3865 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3866 verifyGoogleFormat(
3867 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3868 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003869 verifyGoogleFormat(
3870 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3871 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00003872 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3873 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3874 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3875 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00003876 verifyGoogleFormat(
3877 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3878 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3879 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00003880 verifyGoogleFormat(
3881 "template <typename T>\n"
3882 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3883 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3884 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00003885
3886 FormatStyle Style = getLLVMStyle();
3887 Style.PointerAlignment = FormatStyle::PAS_Left;
3888 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3889 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3890 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003891 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3892 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3893 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00003894}
3895
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003896TEST_F(FormatTest, TrailingReturnType) {
3897 verifyFormat("auto foo() -> int;\n");
3898 verifyFormat("struct S {\n"
3899 " auto bar() const -> int;\n"
3900 "};");
3901 verifyFormat("template <size_t Order, typename T>\n"
3902 "auto load_img(const std::string &filename)\n"
3903 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00003904 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3905 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00003906 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00003907 verifyFormat("template <typename T>\n"
3908 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3909 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00003910
3911 // Not trailing return types.
3912 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003913}
3914
Daniel Jasper5be31f72013-05-21 09:16:31 +00003915TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003916 // Avoid breaking before trailing 'const' or other trailing annotations, if
3917 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00003918 FormatStyle Style = getGoogleStyle();
3919 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00003920 verifyFormat("void someLongFunction(\n"
3921 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00003922 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00003923 verifyFormat("LoooooongReturnType\n"
3924 "someLoooooooongFunction() const {}",
3925 getLLVMStyleWithColumns(47));
3926 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3927 " const {}",
3928 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003929 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3930 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3931 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3932 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3933 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3934 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00003935 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3936 " aaaaaaaaaaa aaaaa) const override;");
3937 verifyGoogleFormat(
3938 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3939 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003940
Daniel Jasper5550de62014-02-17 07:57:46 +00003941 // Even if the first parameter has to be wrapped.
3942 verifyFormat("void someLongFunction(\n"
3943 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003944 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00003945 verifyFormat("void someLongFunction(\n"
3946 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003947 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00003948 verifyFormat("void someLongFunction(\n"
3949 " int someLongParameter) override {}",
3950 Style);
3951 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003952 " int someLongParameter) OVERRIDE {}",
3953 Style);
3954 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003955 " int someLongParameter) final {}",
3956 Style);
3957 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003958 " int someLongParameter) FINAL {}",
3959 Style);
3960 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003961 " int parameter) const override {}",
3962 Style);
3963
Daniel Jaspere3f907f2014-06-02 09:52:08 +00003964 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3965 verifyFormat("void someLongFunction(\n"
3966 " int someLongParameter) const\n"
3967 "{\n"
3968 "}",
3969 Style);
3970
Daniel Jasper5550de62014-02-17 07:57:46 +00003971 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003972 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
3973 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3974 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00003975
3976 // Breaking before function-like trailing annotations is fine to keep them
3977 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00003978 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3979 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3980 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3981 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3982 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3983 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00003984 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
3985 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00003986 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003987
3988 verifyFormat(
3989 "void aaaaaaaaaaaaaaaaaa()\n"
3990 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
3991 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
3992 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3993 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003994 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003995 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003996 " GUARDED_BY(aaaaaaaaaaaa);");
3997 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00003998 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00003999 " GUARDED_BY(aaaaaaaaaaaa);");
4000 verifyGoogleFormat(
4001 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4002 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004003 verifyGoogleFormat(
4004 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4005 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004006}
4007
Daniel Jasperf090f032015-05-18 09:47:22 +00004008TEST_F(FormatTest, FunctionAnnotations) {
4009 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004010 "int OldFunction(const string &parameter) {}");
4011 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004012 "string OldFunction(const string &parameter) {}");
4013 verifyFormat("template <typename T>\n"
4014 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4015 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004016
4017 // Not function annotations.
4018 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4019 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004020 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4021 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004022 verifyFormat("MACRO(abc).function() // wrap\n"
4023 " << abc;");
4024 verifyFormat("MACRO(abc)->function() // wrap\n"
4025 " << abc;");
4026 verifyFormat("MACRO(abc)::function() // wrap\n"
4027 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004028}
4029
Daniel Jasperf7935112012-12-03 18:12:45 +00004030TEST_F(FormatTest, BreaksDesireably) {
4031 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4032 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004033 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004034 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4035 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4036 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004037
4038 verifyFormat(
4039 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004040 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004041
4042 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4043 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4044 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004045
4046 verifyFormat(
4047 "aaaaaaaa(aaaaaaaaaaaaa, aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4048 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4049 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4050 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004051
4052 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4053 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4054
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004055 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004056 "void f() {\n"
4057 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4058 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4059 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004060 verifyFormat(
4061 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4062 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4063 verifyFormat(
4064 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4065 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jaspera44991332015-04-29 13:06:49 +00004066 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4067 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4068 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004069
Daniel Jasper739b85f2015-06-29 10:42:59 +00004070 // Indent consistently independent of call expression and unary operator.
4071 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4072 " dddddddddddddddddddddddddddddd));");
4073 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4074 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004075 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004076 " dddddddddddddddddddddddddddddd));");
4077
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004078 // This test case breaks on an incorrect memoization, i.e. an optimization not
4079 // taking into account the StopAt value.
4080 verifyFormat(
4081 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004082 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4083 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4084 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004085
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004086 verifyFormat("{\n {\n {\n"
4087 " Annotation.SpaceRequiredBefore =\n"
4088 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4089 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4090 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004091
4092 // Break on an outer level if there was a break on an inner level.
4093 EXPECT_EQ("f(g(h(a, // comment\n"
4094 " b, c),\n"
4095 " d, e),\n"
4096 " x, y);",
4097 format("f(g(h(a, // comment\n"
4098 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004099
4100 // Prefer breaking similar line breaks.
4101 verifyFormat(
4102 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4103 " NSTrackingMouseEnteredAndExited |\n"
4104 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004105}
4106
Daniel Jasper18210d72014-10-09 09:52:05 +00004107TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4108 FormatStyle NoBinPacking = getGoogleStyle();
4109 NoBinPacking.BinPackParameters = false;
4110 NoBinPacking.BinPackArguments = true;
4111 verifyFormat("void f() {\n"
4112 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4113 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4114 "}",
4115 NoBinPacking);
4116 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4117 " int aaaaaaaaaaaaaaaaaaaa,\n"
4118 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4119 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004120
Daniel Jasper00693b082016-01-09 15:56:47 +00004121 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4122 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4123 " vector<int> bbbbbbbbbbbbbbb);",
4124 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004125 // FIXME: This behavior difference is probably not wanted. However, currently
4126 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4127 // template arguments from BreakBeforeParameter being set because of the
4128 // one-per-line formatting.
4129 verifyFormat(
4130 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4131 " aaaaaaaaaa> aaaaaaaaaa);",
4132 NoBinPacking);
4133 verifyFormat(
4134 "void fffffffffff(\n"
4135 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4136 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004137}
4138
Daniel Jasper9278eb92013-01-16 14:59:02 +00004139TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004140 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004141 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004142 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004143 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4144 " aaaaaaaaaaaaaaaaaaaa,\n"
4145 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4146 NoBinPacking);
4147 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4148 " aaaaaaaaaaaaa,\n"
4149 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4150 NoBinPacking);
4151 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004152 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4153 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4154 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4155 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004156 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4157 NoBinPacking);
4158 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4159 " .aaaaaaaaaaaaaaaaaa();",
4160 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004161 verifyFormat("void f() {\n"
4162 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4163 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4164 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004165 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004166
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004167 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004168 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4169 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004170 " aaaaaaaaaaaa);",
4171 NoBinPacking);
4172 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004173 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4174 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004175 " test);",
4176 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004177
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004178 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4179 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004180 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4181 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004182 NoBinPacking);
4183 verifyFormat("a(\"a\"\n"
4184 " \"a\",\n"
4185 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004186
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004187 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004188 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004189 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004190 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004191 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004192 verifyFormat(
4193 "void f() {\n"
4194 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4195 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004196 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004197 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004198 verifyFormat(
4199 "template <class SomeType, class SomeOtherType>\n"
4200 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4201 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004202}
4203
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004204TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4205 FormatStyle Style = getLLVMStyleWithColumns(15);
4206 Style.ExperimentalAutoDetectBinPacking = true;
4207 EXPECT_EQ("aaa(aaaa,\n"
4208 " aaaa,\n"
4209 " aaaa);\n"
4210 "aaa(aaaa,\n"
4211 " aaaa,\n"
4212 " aaaa);",
4213 format("aaa(aaaa,\n" // one-per-line
4214 " aaaa,\n"
4215 " aaaa );\n"
4216 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4217 Style));
4218 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4219 " aaaa);\n"
4220 "aaa(aaaa, aaaa,\n"
4221 " aaaa);",
4222 format("aaa(aaaa, aaaa,\n" // bin-packed
4223 " aaaa );\n"
4224 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4225 Style));
4226}
4227
Daniel Jasper04468962013-01-18 10:56:38 +00004228TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004229 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4230 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4231 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4232 " .StartsWith(\".init\", ORDER_INIT)\n"
4233 " .StartsWith(\".fini\", ORDER_FINI)\n"
4234 " .StartsWith(\".hash\", ORDER_HASH)\n"
4235 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004236
Daniel Jaspereb50c672013-02-15 20:33:06 +00004237 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004238 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004239 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004240 "aaaaaaa->aaaaaaa\n"
4241 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4242 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004243 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004244 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004245 "aaaaaaa->aaaaaaa\n"
4246 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4247 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4248 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004249 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004250 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004251 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004252 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4253 " aaaaaa->aaaaaaaaaaaa()\n"
4254 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004255 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004256 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004257 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004258 "void f() {\n"
4259 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004260 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004261 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004262 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004263 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004264 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004265 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004266 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004267 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004268 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004269 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004270 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004271
4272 verifyFormat(
4273 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4274 verifyFormat("aaaaaaaaaaaaaaa()\n"
4275 " .aaaaaaaaaaaaaaa()\n"
4276 " .aaaaaaaaaaaaaaa()\n"
4277 " .aaaaaaaaaaaaaaa()\n"
4278 " .aaaaaaaaaaaaaaa();");
4279 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4280 " .aaaaaaaaaaaaaaa()\n"
4281 " .aaaaaaaaaaaaaaa()\n"
4282 " .aaaaaaaaaaaaaaa();");
4283 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4284 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4285 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004286 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4287 " ->aaaaaaaaaaaaaae(0)\n"
4288 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004289
Daniel Jasper775954b2015-04-24 10:08:09 +00004290 // Don't linewrap after very short segments.
4291 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4292 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4293 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4294 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4295 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4296 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4297 verifyFormat("aaa()\n"
4298 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4299 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4300 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4301
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004302 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4303 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4304 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4305 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4306 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004307 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004308
Daniel Jaspera41aa532014-09-19 08:01:25 +00004309 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004310 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4311 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004312
4313 // Prefer not to create "hanging" indents.
4314 verifyFormat(
4315 "return !soooooooooooooome_map\n"
4316 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4317 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004318 verifyFormat(
4319 "return aaaaaaaaaaaaaaaa\n"
4320 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4321 " .aaaa(aaaaaaaaaaaaaa);");
4322 // No hanging indent here.
4323 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4324 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4325 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4326 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004327 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4328 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4329 getLLVMStyleWithColumns(60));
4330 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4331 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4332 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4333 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004334 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4335 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4336 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004337}
4338
Daniel Jasperde5c2072012-12-24 00:13:23 +00004339TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4340 verifyFormat(
4341 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004342 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004343 verifyFormat(
4344 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4345 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4346
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004347 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004348 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004349 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4350 " ccccccccccccccccccccccccc) {\n}");
4351
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004352 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004353 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004354 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4355 " ccccccccccccccccccccccccc) {\n}");
4356
Daniel Jasperde5c2072012-12-24 00:13:23 +00004357 verifyFormat(
4358 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004359 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004360 verifyFormat(
4361 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4362 " ccccccccccccccccccccccccc) {\n}");
4363
Daniel Jasper400adc62013-02-08 15:28:42 +00004364 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4365 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4366 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4367 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004368 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4369 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4370 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4371 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4372
Daniel Jasper400adc62013-02-08 15:28:42 +00004373 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4374 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4375 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004376 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4377 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4378 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004379}
4380
Daniel Jasper43b65482013-01-23 12:27:43 +00004381TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004382 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004383 "unsigned Cost =\n"
4384 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4385 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004386 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004387 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4388 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004389
4390 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004391 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4392 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004393 verifyFormat("unsigned OriginalStartColumn =\n"
4394 " SourceMgr.getSpellingColumnNumber(\n"
4395 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4396 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004397}
4398
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004399TEST_F(FormatTest, AlignsAfterAssignments) {
4400 verifyFormat(
4401 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004402 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004403 verifyFormat(
4404 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004405 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004406 verifyFormat(
4407 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004408 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004409 verifyFormat(
4410 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004411 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004412 verifyFormat(
4413 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4414 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4415 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004416}
4417
4418TEST_F(FormatTest, AlignsAfterReturn) {
4419 verifyFormat(
4420 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4421 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4422 verifyFormat(
4423 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4424 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004425 verifyFormat(
4426 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004427 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004428 verifyFormat(
4429 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004430 " aaaaaaaaaaaaaaaaaaaaaa());");
4431 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4432 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4433 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4434 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4435 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004436 verifyFormat("return\n"
4437 " // true if code is one of a or b.\n"
4438 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004439}
4440
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004441TEST_F(FormatTest, AlignsAfterOpenBracket) {
4442 verifyFormat(
4443 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4444 " aaaaaaaaa aaaaaaa) {}");
4445 verifyFormat(
4446 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4447 " aaaaaaaaaaa aaaaaaaaa);");
4448 verifyFormat(
4449 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4450 " aaaaaaaaaaaaaaaaaaaaa));");
4451 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004452 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004453 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4454 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4455 Style);
4456 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4457 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4458 Style);
4459 verifyFormat("SomeLongVariableName->someFunction(\n"
4460 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4461 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004462 verifyFormat(
4463 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4464 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4465 Style);
4466 verifyFormat(
4467 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4468 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4469 Style);
4470 verifyFormat(
4471 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4472 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4473 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004474
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004475 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4476 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4477 " b));",
4478 Style);
4479
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004480 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4481 Style.BinPackArguments = false;
4482 Style.BinPackParameters = false;
4483 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4484 " aaaaaaaaaaa aaaaaaaa,\n"
4485 " aaaaaaaaa aaaaaaa,\n"
4486 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4487 Style);
4488 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4489 " aaaaaaaaaaa aaaaaaaaa,\n"
4490 " aaaaaaaaaaa aaaaaaaaa,\n"
4491 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4492 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004493 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4494 " aaaaaaaaaaaaaaa,\n"
4495 " aaaaaaaaaaaaaaaaaaaaa,\n"
4496 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004497 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004498 verifyFormat(
4499 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4500 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4501 Style);
4502 verifyFormat(
4503 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4504 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4505 Style);
4506 verifyFormat(
4507 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4508 " aaaaaaaaaaaaaaaaaaaaa(\n"
4509 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4510 " aaaaaaaaaaaaaaaa);",
4511 Style);
4512 verifyFormat(
4513 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4514 " aaaaaaaaaaaaaaaaaaaaa(\n"
4515 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4516 " aaaaaaaaaaaaaaaa);",
4517 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004518}
4519
Daniel Jasper3219e432014-12-02 13:24:51 +00004520TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4521 FormatStyle Style = getLLVMStyleWithColumns(40);
4522 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4523 " bbbbbbbbbbbbbbbbbbbbbb);",
4524 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004525 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004526 Style.AlignOperands = false;
4527 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4528 " bbbbbbbbbbbbbbbbbbbbbb);",
4529 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004530 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004531 Style.AlignOperands = true;
4532 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4533 " bbbbbbbbbbbbbbbbbbbbbb);",
4534 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004535 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004536 Style.AlignOperands = false;
4537 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4538 " bbbbbbbbbbbbbbbbbbbbbb);",
4539 Style);
4540}
4541
Daniel Jasper399d24b2013-01-09 07:06:56 +00004542TEST_F(FormatTest, BreaksConditionalExpressions) {
4543 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004544 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
4545 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4546 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004547 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004548 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
4549 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4550 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004551 verifyFormat(
4552 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4553 " : aaaaaaaaaaaaa);");
4554 verifyFormat(
4555 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004556 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004557 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4558 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004559 verifyFormat(
4560 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4561 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4562 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004563 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4564 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4565 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4566 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4567 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4568 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4569 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4570 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4571 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4572 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4573 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4574 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004575 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4576 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4577 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4578 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4579 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004580 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4581 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4582 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004583 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4584 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4585 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4586 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004587 verifyFormat(
4588 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4589 " ? aaaaaaaaaaaaaaa\n"
4590 " : aaaaaaaaaaaaaaa;");
4591 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004592 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004593 " ? b\n"
4594 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004595 verifyFormat("return aaaa == bbbb\n"
4596 " // comment\n"
4597 " ? aaaa\n"
4598 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004599 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004600 " format(TheLine.First,\n"
4601 " IndentForLevel[TheLine.Level] >= 0\n"
4602 " ? IndentForLevel[TheLine.Level]\n"
4603 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004604 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004605 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004606 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4607 " ? aaaaaaaaaaaaaaa\n"
4608 " : bbbbbbbbbbbbbbb //\n"
4609 " ? ccccccccccccccc\n"
4610 " : ddddddddddddddd;");
4611 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4612 " ? aaaaaaaaaaaaaaa\n"
4613 " : (bbbbbbbbbbbbbbb //\n"
4614 " ? ccccccccccccccc\n"
4615 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004616 verifyFormat(
4617 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4618 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4619 " aaaaaaaaaaaaaaaaaaaaa +\n"
4620 " aaaaaaaaaaaaaaaaaaaaa\n"
4621 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004622 verifyFormat(
4623 "aaaaaa = aaaaaaaaaaaa\n"
4624 " ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4625 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4626 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004627
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004628 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004629 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004630 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004631 "void f() {\n"
4632 " g(aaa,\n"
4633 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4634 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4635 " ? aaaaaaaaaaaaaaa\n"
4636 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004637 "}",
4638 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004639 verifyFormat(
4640 "void f() {\n"
4641 " g(aaa,\n"
4642 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4643 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4644 " ?: aaaaaaaaaaaaaaa);\n"
4645 "}",
4646 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004647
4648 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4649 " // comment.\n"
4650 " ccccccccccccccccccccccccccccccccccccccc\n"
4651 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4652 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004653
4654 // Assignments in conditional expressions. Apparently not uncommon :-(.
4655 verifyFormat("return a != b\n"
4656 " // comment\n"
4657 " ? a = b\n"
4658 " : a = b;");
4659 verifyFormat("return a != b\n"
4660 " // comment\n"
4661 " ? a = a != b\n"
4662 " // comment\n"
4663 " ? a = b\n"
4664 " : a\n"
4665 " : a;\n");
4666 verifyFormat("return a != b\n"
4667 " // comment\n"
4668 " ? a\n"
4669 " : a = a != b\n"
4670 " // comment\n"
4671 " ? a = b\n"
4672 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004673}
4674
Daniel Jasper165b29e2013-11-08 00:57:11 +00004675TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4676 FormatStyle Style = getLLVMStyle();
4677 Style.BreakBeforeTernaryOperators = false;
4678 Style.ColumnLimit = 70;
4679 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004680 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
4681 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4682 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004683 Style);
4684 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004685 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
4686 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4687 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004688 Style);
4689 verifyFormat(
4690 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4691 " aaaaaaaaaaaaa);",
4692 Style);
4693 verifyFormat(
4694 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4695 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4696 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4697 " aaaaaaaaaaaaa);",
4698 Style);
4699 verifyFormat(
4700 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4701 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4702 " aaaaaaaaaaaaa);",
4703 Style);
4704 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4705 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4706 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4707 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4708 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4709 Style);
4710 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4711 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4712 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4713 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4714 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4715 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4716 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4717 Style);
4718 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4719 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4720 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4721 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4722 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4723 Style);
4724 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4725 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4726 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4727 Style);
4728 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004729 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004730 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4731 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4732 Style);
4733 verifyFormat(
4734 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4735 " aaaaaaaaaaaaaaa :\n"
4736 " aaaaaaaaaaaaaaa;",
4737 Style);
4738 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4739 " aaaaaaaaa ?\n"
4740 " b :\n"
4741 " c);",
4742 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00004743 verifyFormat("unsigned Indent =\n"
4744 " format(TheLine.First,\n"
4745 " IndentForLevel[TheLine.Level] >= 0 ?\n"
4746 " IndentForLevel[TheLine.Level] :\n"
4747 " TheLine * 2,\n"
4748 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4749 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004750 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4751 " aaaaaaaaaaaaaaa :\n"
4752 " bbbbbbbbbbbbbbb ? //\n"
4753 " ccccccccccccccc :\n"
4754 " ddddddddddddddd;",
4755 Style);
4756 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4757 " aaaaaaaaaaaaaaa :\n"
4758 " (bbbbbbbbbbbbbbb ? //\n"
4759 " ccccccccccccccc :\n"
4760 " ddddddddddddddd);",
4761 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00004762 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4763 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4764 " ccccccccccccccccccccccccccc;",
4765 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00004766 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4767 " aaaaa :\n"
4768 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
4769 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004770}
4771
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004772TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4773 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4774 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4775 verifyFormat("bool a = true, b = false;");
4776
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004777 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004778 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004779 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00004780 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004781 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00004782 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004783 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00004784 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00004785 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4786 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4787 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4788 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4789 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4790 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004791
Daniel Jasperbea1ab42015-03-01 18:55:26 +00004792 FormatStyle Style = getGoogleStyle();
4793 Style.PointerAlignment = FormatStyle::PAS_Left;
4794 Style.DerivePointerAlignment = false;
4795 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4796 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4797 " *b = bbbbbbbbbbbbbbbbbbb;",
4798 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004799 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4800 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4801 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00004802 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00004803 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004804}
4805
Nico Weber4a5030c2013-01-12 01:28:06 +00004806TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4807 verifyFormat("arr[foo ? bar : baz];");
4808 verifyFormat("f()[foo ? bar : baz];");
4809 verifyFormat("(a + b)[foo ? bar : baz];");
4810 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4811}
4812
Daniel Jasperf7935112012-12-03 18:12:45 +00004813TEST_F(FormatTest, AlignsStringLiterals) {
4814 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4815 " \"short literal\");");
4816 verifyFormat(
4817 "looooooooooooooooooooooooongFunction(\n"
4818 " \"short literal\"\n"
4819 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004820 verifyFormat("someFunction(\"Always break between multi-line\"\n"
4821 " \" string literals\",\n"
4822 " and, other, parameters);");
Manuel Klimek02f640a2013-02-20 15:25:48 +00004823 EXPECT_EQ("fun + \"1243\" /* comment */\n"
4824 " \"5678\";",
4825 format("fun + \"1243\" /* comment */\n"
4826 " \"5678\";",
4827 getLLVMStyleWithColumns(28)));
4828 EXPECT_EQ(
4829 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4830 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4831 " \"aaaaaaaaaaaaaaaa\";",
4832 format("aaaaaa ="
4833 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4834 "aaaaaaaaaaaaaaaaaaaaa\" "
4835 "\"aaaaaaaaaaaaaaaa\";"));
Manuel Klimek0c915712013-02-20 15:32:58 +00004836 verifyFormat("a = a + \"a\"\n"
4837 " \"a\"\n"
4838 " \"a\";");
Daniel Jasper7dd22c51b2013-05-16 04:26:02 +00004839 verifyFormat("f(\"a\", \"b\"\n"
4840 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00004841
4842 verifyFormat(
4843 "#define LL_FORMAT \"ll\"\n"
4844 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4845 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00004846
4847 verifyFormat("#define A(X) \\\n"
4848 " \"aaaaa\" #X \"bbbbbb\" \\\n"
4849 " \"ccccc\"",
4850 getLLVMStyleWithColumns(23));
4851 verifyFormat("#define A \"def\"\n"
4852 "f(\"abc\" A \"ghi\"\n"
4853 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004854
4855 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004856 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004857 verifyFormat("#define A(X) \\\n"
4858 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4859 " L\"ccccc\"",
4860 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00004861
4862 verifyFormat("f(@\"a\"\n"
4863 " @\"b\");");
4864 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00004865 " @\"b\"\n"
4866 " @\"c\";");
4867 verifyFormat("NSString s = @\"a\"\n"
4868 " \"b\"\n"
4869 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00004870}
4871
Zachary Turner448592e2015-12-18 22:20:15 +00004872TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004873 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004874 // No declarations or definitions should be moved to own line.
4875 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4876 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004877 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004878 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004879 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004880 "int f() { return 1; }\n"
4881 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004882 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00004883
4884 // All declarations and definitions should have the return type moved to its
4885 // own
4886 // line.
4887 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4888 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004889 " int\n"
4890 " f() {\n"
4891 " return 1;\n"
4892 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004893 " int\n"
4894 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004895 "};\n"
4896 "int\n"
4897 "f() {\n"
4898 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004899 "}\n"
4900 "int\n"
4901 "g();\n",
4902 Style);
4903
4904 // Top-level definitions, and no kinds of declarations should have the
4905 // return type moved to its own line.
4906 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4907 verifyFormat("class B {\n"
4908 " int f() { return 1; }\n"
4909 " int g();\n"
4910 "};\n"
4911 "int\n"
4912 "f() {\n"
4913 " return 1;\n"
4914 "}\n"
4915 "int g();\n",
4916 Style);
4917
4918 // Top-level definitions and declarations should have the return type moved
4919 // to its own line.
4920 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4921 verifyFormat("class C {\n"
4922 " int f() { return 1; }\n"
4923 " int g();\n"
4924 "};\n"
4925 "int\n"
4926 "f() {\n"
4927 " return 1;\n"
4928 "}\n"
4929 "int\n"
4930 "g();\n",
4931 Style);
4932
4933 // All definitions should have the return type moved to its own line, but no
4934 // kinds of declarations.
4935 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4936 verifyFormat("class D {\n"
4937 " int\n"
4938 " f() {\n"
4939 " return 1;\n"
4940 " }\n"
4941 " int g();\n"
4942 "};\n"
4943 "int\n"
4944 "f() {\n"
4945 " return 1;\n"
4946 "}\n"
4947 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004948 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004949 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004950 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004951 " return \"\";\n"
4952 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004953 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004954 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004955 verifyFormat("template <class T>\n"
4956 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004957 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004958 " return NULL;\n"
4959 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004960 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004961 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00004962 verifyFormat("class C {\n"
4963 " int\n"
4964 " operator+() {\n"
4965 " return 1;\n"
4966 " }\n"
4967 " int\n"
4968 " operator()() {\n"
4969 " return 1;\n"
4970 " }\n"
4971 "};\n",
4972 Style);
4973 verifyFormat("void\n"
4974 "A::operator()() {}\n"
4975 "void\n"
4976 "A::operator>>() {}\n"
4977 "void\n"
4978 "A::operator+() {}\n",
4979 Style);
4980 verifyFormat("void *operator new(std::size_t s);", // No break here.
4981 Style);
4982 verifyFormat("void *\n"
4983 "operator new(std::size_t s) {}",
4984 Style);
4985 verifyFormat("void *\n"
4986 "operator delete[](void *ptr) {}",
4987 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004988 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00004989 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004990 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004991 "{\n"
4992 " return \"\";\n"
4993 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004994 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004995 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004996 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004997 "T *\n" // Problem here: no line break
4998 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004999 "{\n"
5000 " return NULL;\n"
5001 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005002 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005003 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005004}
5005
Alexander Kornienko58611712013-07-04 12:02:44 +00005006TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5007 FormatStyle NoBreak = getLLVMStyle();
5008 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5009 FormatStyle Break = getLLVMStyle();
5010 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005011 verifyFormat("aaaa = \"bbbb\"\n"
5012 " \"cccc\";",
5013 NoBreak);
5014 verifyFormat("aaaa =\n"
5015 " \"bbbb\"\n"
5016 " \"cccc\";",
5017 Break);
5018 verifyFormat("aaaa(\"bbbb\"\n"
5019 " \"cccc\");",
5020 NoBreak);
5021 verifyFormat("aaaa(\n"
5022 " \"bbbb\"\n"
5023 " \"cccc\");",
5024 Break);
5025 verifyFormat("aaaa(qqq, \"bbbb\"\n"
5026 " \"cccc\");",
5027 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005028 verifyFormat("aaaa(qqq,\n"
5029 " \"bbbb\"\n"
5030 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005031 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005032 verifyFormat("aaaa(qqq,\n"
5033 " L\"bbbb\"\n"
5034 " L\"cccc\");",
5035 Break);
5036 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5037 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005038 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005039 verifyFormat("string s = someFunction(\n"
5040 " \"abc\"\n"
5041 " \"abc\");",
5042 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005043
Daniel Jasper3251fff2014-06-10 06:27:23 +00005044 // As we break before unary operators, breaking right after them is bad.
5045 verifyFormat("string foo = abc ? \"x\"\n"
5046 " \"blah blah blah blah blah blah\"\n"
5047 " : \"y\";",
5048 Break);
5049
Daniel Jasperc834c702013-07-17 15:38:19 +00005050 // Don't break if there is no column gain.
5051 verifyFormat("f(\"aaaa\"\n"
5052 " \"bbbb\");",
5053 Break);
5054
5055 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005056 EXPECT_EQ("x = \"a\\\n"
5057 "b\\\n"
5058 "c\";",
5059 format("x = \"a\\\n"
5060 "b\\\n"
5061 "c\";",
5062 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005063 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005064 " \"a\\\n"
5065 "b\\\n"
5066 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005067 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005068 "b\\\n"
5069 "c\";",
5070 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005071
5072 // Exempt ObjC strings for now.
5073 EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005074 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005075 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005076 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005077 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005078
5079 Break.ColumnLimit = 0;
5080 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005081}
5082
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005083TEST_F(FormatTest, AlignsPipes) {
5084 verifyFormat(
5085 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5086 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5087 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5088 verifyFormat(
5089 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5090 " << aaaaaaaaaaaaaaaaaaaa;");
5091 verifyFormat(
5092 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5093 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5094 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005095 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5096 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5097 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005098 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5099 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5100 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5101 verifyFormat(
5102 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5103 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5104 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005105 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5106 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5107 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5108 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005109 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5110 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005111 verifyFormat(
5112 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5113 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005114
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005115 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5116 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005117 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5118 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5119 " aaaaaaaaaaaaaaaaaaaaa)\n"
5120 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005121 verifyFormat("LOG_IF(aaa == //\n"
5122 " bbb)\n"
5123 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005124
Daniel Jasper467ddb12013-08-12 12:58:05 +00005125 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005126 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5127 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005128 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5129 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5130 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005131 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5132 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005133 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5134 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5135 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5136 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5137 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5138 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5139 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005140
Daniel Jasperc238c872013-04-02 14:33:13 +00005141 verifyFormat(
5142 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5143 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005144
5145 // Incomplete string literal.
5146 EXPECT_EQ("llvm::errs() << \"\n"
5147 " << a;",
5148 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005149
5150 verifyFormat("void f() {\n"
5151 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5152 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5153 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005154
5155 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005156 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5157 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5158 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005159
5160 // Handle '\n'.
5161 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5162 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5163 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5164 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5165 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5166 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5167 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005168}
5169
Daniel Jasper7209bb92016-12-13 11:16:42 +00005170TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5171 verifyFormat("return out << \"somepacket = {\\n\"\n"
5172 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5173 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5174 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5175 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5176 " << \"}\";");
5177
5178 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5179 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5180 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5181 verifyFormat(
5182 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5183 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5184 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5185 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5186 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5187 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5188 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5189 verifyFormat(
5190 "void f() {\n"
5191 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5192 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5193 "}");
5194
5195 // Breaking before the first "<<" is generally not desirable.
5196 verifyFormat(
5197 "llvm::errs()\n"
5198 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5199 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5200 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5201 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5202 getLLVMStyleWithColumns(70));
5203 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5204 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5205 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5206 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5207 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5208 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5209 getLLVMStyleWithColumns(70));
5210
5211 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5212 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5213 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5214 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5215 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5216 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005217 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5218 " (aaaa + aaaa);",
5219 getLLVMStyleWithColumns(40));
5220 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5221 " (aaaaaaa + aaaaa));",
5222 getLLVMStyleWithColumns(40));
Daniel Jasper7209bb92016-12-13 11:16:42 +00005223}
5224
Daniel Jasperf7935112012-12-03 18:12:45 +00005225TEST_F(FormatTest, UnderstandsEquals) {
5226 verifyFormat(
5227 "aaaaaaaaaaaaaaaaa =\n"
5228 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5229 verifyFormat(
5230 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005231 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005232 verifyFormat(
5233 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005234 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005235 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005236 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5237 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005238
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005239 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5240 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005241}
5242
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005243TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005244 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5245 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005246
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005247 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5248 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005249
5250 verifyFormat(
5251 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5252 " Parameter2);");
5253
5254 verifyFormat(
5255 "ShortObject->shortFunction(\n"
5256 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5257 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5258
5259 verifyFormat("loooooooooooooongFunction(\n"
5260 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5261
5262 verifyFormat(
5263 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5264 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5265
Daniel Jasper687af3b2013-02-14 14:26:07 +00005266 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5267 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005268 verifyFormat("void f() {\n"
5269 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5270 " .Times(2)\n"
5271 " .WillRepeatedly(Return(SomeValue));\n"
5272 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005273 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5274 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005275 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005276 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5277 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005278 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005279 verifyFormat("void f() {\n"
5280 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5281 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5282 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005283 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5284 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5285 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5286 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5287 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005288 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5289 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5290 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5291 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5292 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005293
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005294 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005295 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005296 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005297 verifyFormat(
5298 "aaaaaaaaaaa->aaaaaaaaa(\n"
5299 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5300 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005301
5302 verifyFormat(
5303 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5304 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005305 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5306 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5307 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5308 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005309
Daniel Jasper9b334242013-03-15 14:57:30 +00005310 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005311 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5312 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005313
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005314 FormatStyle NoBinPacking = getLLVMStyle();
5315 NoBinPacking.BinPackParameters = false;
5316 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5317 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5318 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5319 " aaaaaaaaaaaaaaaaaaa,\n"
5320 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5321 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005322
5323 // If there is a subsequent call, change to hanging indentation.
5324 verifyFormat(
5325 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5326 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5327 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5328 verifyFormat(
5329 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5330 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005331 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5332 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5333 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5334 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5335 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5336 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005337}
5338
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005339TEST_F(FormatTest, WrapsTemplateDeclarations) {
5340 verifyFormat("template <typename T>\n"
5341 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005342 verifyFormat("template <typename T>\n"
5343 "// T should be one of {A, B}.\n"
5344 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005345 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005346 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005347 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005348 verifyFormat("template <typename T>\n"
5349 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5350 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005351 verifyFormat(
5352 "template <typename T>\n"
5353 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5354 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005355 verifyFormat(
5356 "template <typename T>\n"
5357 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5358 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5359 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005360 verifyFormat("template <typename T>\n"
5361 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005362 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005363 verifyFormat(
5364 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5365 " typename T4 = char>\n"
5366 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005367 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5368 " template <typename> class cccccccccccccccccccccc,\n"
5369 " typename ddddddddddddd>\n"
5370 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005371 verifyFormat(
5372 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5373 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005374
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005375 verifyFormat("void f() {\n"
5376 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5377 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5378 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005379
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005380 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005381 verifyFormat("template <typename T> void f();");
5382 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005383 verifyFormat(
5384 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5385 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5386 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5387 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5388 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5389 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5390 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5391 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005392 EXPECT_EQ("static_cast<A< //\n"
5393 " B> *>(\n"
5394 "\n"
5395 " );",
5396 format("static_cast<A<//\n"
5397 " B>*>(\n"
5398 "\n"
5399 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005400 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5401 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005402
5403 FormatStyle AlwaysBreak = getLLVMStyle();
5404 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5405 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5406 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5407 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5408 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5409 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5410 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5411 verifyFormat("template <template <typename> class Fooooooo,\n"
5412 " template <typename> class Baaaaaaar>\n"
5413 "struct C {};",
5414 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005415 verifyFormat("template <typename T> // T can be A, B or C.\n"
5416 "struct C {};",
5417 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005418 verifyFormat("template <enum E> class A {\n"
5419 "public:\n"
5420 " E *f();\n"
5421 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005422}
5423
Daniel Jasper45797022013-01-25 10:57:27 +00005424TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5425 verifyFormat(
5426 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5427 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5428 verifyFormat(
5429 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5430 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5431 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5432
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005433 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005434 verifyFormat(
5435 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5436 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005437 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005438
Daniel Jasper45797022013-01-25 10:57:27 +00005439 verifyFormat(
5440 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005441 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005442
5443 // Breaking at nested name specifiers is generally not desirable.
5444 verifyFormat(
5445 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5446 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005447
5448 verifyFormat(
5449 "aaaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5450 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5451 " aaaaaaaaaaaaaaaaaaaaa);",
5452 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005453
5454 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5455 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5456 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005457}
5458
Daniel Jasperf7935112012-12-03 18:12:45 +00005459TEST_F(FormatTest, UnderstandsTemplateParameters) {
5460 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005461 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005462 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5463 verifyFormat("bool x = a < 1 || 2 > a;");
5464 verifyFormat("bool x = 5 < f<int>();");
5465 verifyFormat("bool x = f<int>() > 5;");
5466 verifyFormat("bool x = 5 < a<int>::x;");
5467 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5468 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5469
5470 verifyGoogleFormat("A<A<int>> a;");
5471 verifyGoogleFormat("A<A<A<int>>> a;");
5472 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005473 verifyGoogleFormat("A<A<int> > a;");
5474 verifyGoogleFormat("A<A<A<int> > > a;");
5475 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005476 verifyGoogleFormat("A<::A<int>> a;");
5477 verifyGoogleFormat("A<::A> a;");
5478 verifyGoogleFormat("A< ::A> a;");
5479 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005480 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5481 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005482 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5483 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005484 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5485 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005486
Nico Weber7533b4d2014-09-24 17:17:32 +00005487 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5488
Daniel Jasperf7935112012-12-03 18:12:45 +00005489 verifyFormat("test >> a >> b;");
5490 verifyFormat("test << a >> b;");
5491
5492 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005493 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005494 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005495 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5496 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005497 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005498 verifyFormat("f(a.operator()<A>());");
5499 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5500 " .template operator()<A>());",
5501 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005502
5503 // Not template parameters.
5504 verifyFormat("return a < b && c > d;");
5505 verifyFormat("void f() {\n"
5506 " while (a < b && c > d) {\n"
5507 " }\n"
5508 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005509 verifyFormat("template <typename... Types>\n"
5510 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005511
5512 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5513 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5514 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005515 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005516 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005517 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005518}
5519
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005520TEST_F(FormatTest, BitshiftOperatorWidth) {
5521 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5522 " bar */",
5523 format("int a=1<<2; /* foo\n"
5524 " bar */"));
5525
5526 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5527 " bar */",
5528 format("int b =256>>1 ; /* foo\n"
5529 " bar */"));
5530}
5531
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005532TEST_F(FormatTest, UnderstandsBinaryOperators) {
5533 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005534 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005535}
5536
5537TEST_F(FormatTest, UnderstandsPointersToMembers) {
5538 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005539 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005540 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005541 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005542 verifyFormat("void f() {\n"
5543 " (a->*f)();\n"
5544 " a->*x;\n"
5545 " (a.*f)();\n"
5546 " ((*a).*f)();\n"
5547 " a.*x;\n"
5548 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005549 verifyFormat("void f() {\n"
5550 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5551 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5552 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005553 verifyFormat(
5554 "(aaaaaaaaaa->*bbbbbbb)(\n"
5555 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005556 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005557 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005558 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005559}
5560
Daniel Jasper8dd40472012-12-21 09:41:31 +00005561TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005562 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005563 verifyFormat("f(-1, -2, -3);");
5564 verifyFormat("a[-1] = 5;");
5565 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005566 verifyFormat("if (i == -1) {\n}");
5567 verifyFormat("if (i != -1) {\n}");
5568 verifyFormat("if (i > -1) {\n}");
5569 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005570 verifyFormat("++(a->f());");
5571 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005572 verifyFormat("(a->f())++;");
5573 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005574 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005575
5576 verifyFormat("a-- > b;");
5577 verifyFormat("b ? -a : c;");
5578 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005579 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005580 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005581 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005582
5583 verifyFormat("return -1;");
5584 verifyFormat("switch (a) {\n"
5585 "case -1:\n"
5586 " break;\n"
5587 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005588 verifyFormat("#define X -1");
5589 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005590
Chandler Carruthf8b72662014-03-02 12:37:31 +00005591 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5592 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005593
5594 verifyFormat("int a = /* confusing comment */ -1;");
5595 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5596 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005597}
5598
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005599TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005600 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005601 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005602 "}");
5603 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005604 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005605 verifyFormat("*aaa = aaaaaaa( // break\n"
5606 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005607}
5608
Daniel Jasper8863ada2013-08-26 08:10:17 +00005609TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005610 verifyFormat("bool operator<();");
5611 verifyFormat("bool operator>();");
5612 verifyFormat("bool operator=();");
5613 verifyFormat("bool operator==();");
5614 verifyFormat("bool operator!=();");
5615 verifyFormat("int operator+();");
5616 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00005617 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005618 verifyFormat("bool operator();");
5619 verifyFormat("bool operator()();");
5620 verifyFormat("bool operator[]();");
5621 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005622 verifyFormat("operator int();");
5623 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005624 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005625 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005626 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005627 verifyFormat("void *operator new(std::size_t size);");
5628 verifyFormat("void *operator new[](std::size_t size);");
5629 verifyFormat("void operator delete(void *ptr);");
5630 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005631 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5632 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005633 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005634 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005635
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005636 verifyFormat(
5637 "ostream &operator<<(ostream &OutputStream,\n"
5638 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005639 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5640 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5641 " return left.group < right.group;\n"
5642 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005643 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005644 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005645
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005646 verifyGoogleFormat("operator void*();");
5647 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005648 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005649
5650 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005651 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5652 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005653}
5654
Daniel Jasper1c220482015-02-25 10:30:06 +00005655TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005656 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5657 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5658 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5659 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5660 verifyFormat("Deleted &operator=(const Deleted &) &;");
5661 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5662 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5663 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5664 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5665 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5666 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00005667 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005668 verifyFormat("template <typename T>\n"
5669 "void F(T) && = delete;",
5670 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005671
Daniel Jasperaf642c62015-08-25 13:40:51 +00005672 FormatStyle AlignLeft = getLLVMStyle();
5673 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005674 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005675 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5676 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5677 AlignLeft);
5678 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5679 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005680 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5681 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5682 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5683 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00005684 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005685
5686 FormatStyle Spaces = getLLVMStyle();
5687 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005688 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5689 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5690 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5691 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005692
5693 Spaces.SpacesInCStyleCastParentheses = false;
5694 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005695 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5696 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5697 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5698 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005699}
5700
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005701TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005702 verifyFormat("void f() {\n"
5703 " A *a = new A;\n"
5704 " A *a = new (placement) A;\n"
5705 " delete a;\n"
5706 " delete (A *)a;\n"
5707 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005708 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5709 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005710 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5711 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5712 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005713 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005714}
5715
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005716TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005717 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005718 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005719 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005720 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005721 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005722 verifyIndependentOfContext("int a = b * 10;");
5723 verifyIndependentOfContext("int a = 10 * b;");
5724 verifyIndependentOfContext("int a = b * c;");
5725 verifyIndependentOfContext("int a += b * c;");
5726 verifyIndependentOfContext("int a -= b * c;");
5727 verifyIndependentOfContext("int a *= b * c;");
5728 verifyIndependentOfContext("int a /= b * c;");
5729 verifyIndependentOfContext("int a = *b;");
5730 verifyIndependentOfContext("int a = *b * c;");
5731 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005732 verifyIndependentOfContext("int a = b * (10);");
5733 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005734 verifyIndependentOfContext("return 10 * b;");
5735 verifyIndependentOfContext("return *b * *c;");
5736 verifyIndependentOfContext("return a & ~b;");
5737 verifyIndependentOfContext("f(b ? *c : *d);");
5738 verifyIndependentOfContext("int a = b ? *c : *d;");
5739 verifyIndependentOfContext("*b = a;");
5740 verifyIndependentOfContext("a * ~b;");
5741 verifyIndependentOfContext("a * !b;");
5742 verifyIndependentOfContext("a * +b;");
5743 verifyIndependentOfContext("a * -b;");
5744 verifyIndependentOfContext("a * ++b;");
5745 verifyIndependentOfContext("a * --b;");
5746 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005747 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005748 verifyIndependentOfContext("f() * b;");
5749 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005750 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005751 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005752 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005753 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005754 verifyIndependentOfContext("return sizeof(int **);");
5755 verifyIndependentOfContext("return sizeof(int ******);");
5756 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005757 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005758 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005759 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005760 verifyGoogleFormat("return sizeof(int**);");
5761 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5762 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005763 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005764 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005765 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005766 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005767 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005768 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005769 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005770 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005771 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005772 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005773 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005774 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005775 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005776 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005777 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005778 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasper27234032012-12-07 09:52:15 +00005779
Daniel Jasper5b49f472013-01-23 12:10:53 +00005780 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005781
Daniel Jasper5b49f472013-01-23 12:10:53 +00005782 verifyIndependentOfContext("A<int *> a;");
5783 verifyIndependentOfContext("A<int **> a;");
5784 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005785 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005786 verifyIndependentOfContext(
5787 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005788 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005789 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005790 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005791 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005792 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005793
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005794 verifyFormat(
5795 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5796 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5797
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005798 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005799 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005800 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005801 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005802 verifyGoogleFormat("A<int*> a;");
5803 verifyGoogleFormat("A<int**> a;");
5804 verifyGoogleFormat("A<int*, int*> a;");
5805 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005806 verifyGoogleFormat("f(b ? *c : *d);");
5807 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005808 verifyGoogleFormat("Type* t = **x;");
5809 verifyGoogleFormat("Type* t = *++*x;");
5810 verifyGoogleFormat("*++*x;");
5811 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5812 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005813 verifyGoogleFormat(
5814 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005815 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005816 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5817 verifyGoogleFormat("template <typename T>\n"
5818 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005819
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005820 FormatStyle Left = getLLVMStyle();
5821 Left.PointerAlignment = FormatStyle::PAS_Left;
5822 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00005823 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005824 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005825
Daniel Jasper5b49f472013-01-23 12:10:53 +00005826 verifyIndependentOfContext("a = *(x + y);");
5827 verifyIndependentOfContext("a = &(x + y);");
5828 verifyIndependentOfContext("*(x + y).call();");
5829 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005830 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005831
Daniel Jasper5b49f472013-01-23 12:10:53 +00005832 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005833 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005834 "int *MyValues = {\n"
5835 " *A, // Operator detection might be confused by the '{'\n"
5836 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005837 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005838
Daniel Jasper5b49f472013-01-23 12:10:53 +00005839 verifyIndependentOfContext("if (int *a = &b)");
5840 verifyIndependentOfContext("if (int &a = *b)");
5841 verifyIndependentOfContext("if (a & b[i])");
5842 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5843 verifyIndependentOfContext("if (*b[i])");
5844 verifyIndependentOfContext("if (int *a = (&b))");
5845 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005846 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005847 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005848 verifyFormat("void f() {\n"
5849 " for (const int &v : Values) {\n"
5850 " }\n"
5851 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005852 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5853 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005854 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005855
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005856 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005857 verifyFormat("#define MACRO \\\n"
5858 " int *i = a * b; \\\n"
5859 " void f(a *b);",
5860 getLLVMStyleWithColumns(19));
5861
Daniel Jasper97b89482013-03-13 07:49:51 +00005862 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005863 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005864 verifyIndependentOfContext("T **t = new T *;");
5865 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005866 verifyGoogleFormat("A = new SomeType*[Length]();");
5867 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005868 verifyGoogleFormat("T** t = new T*;");
5869 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005870
Daniel Jasper990ff972013-05-07 14:17:18 +00005871 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005872 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00005873 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00005874 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5875 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005876 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005877 "typename t::if<x && y>::type f() {}");
5878 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005879 verifyFormat("vector<int *> v;");
5880 verifyFormat("vector<int *const> v;");
5881 verifyFormat("vector<int *const **const *> v;");
5882 verifyFormat("vector<int *volatile> v;");
5883 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005884 verifyFormat("foo<b && false>();");
5885 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005886 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005887 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005888 "template <class T,\n"
5889 " class = typename std::enable_if<\n"
5890 " std::is_integral<T>::value &&\n"
5891 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005892 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005893 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005894 verifyFormat(
5895 "template <class T,\n"
5896 " class = typename ::std::enable_if<\n"
5897 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
5898 "void F();",
5899 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005900
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005901 verifyIndependentOfContext("MACRO(int *i);");
5902 verifyIndependentOfContext("MACRO(auto *a);");
5903 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00005904 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00005905 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005906 // FIXME: Is there a way to make this work?
5907 // verifyIndependentOfContext("MACRO(A *a);");
5908
Daniel Jasper32ccb032014-06-23 07:36:18 +00005909 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00005910 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00005911
Daniel Jasper866468a2014-04-14 13:15:29 +00005912 EXPECT_EQ("#define OP(x) \\\n"
5913 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5914 " return s << a.DebugString(); \\\n"
5915 " }",
5916 format("#define OP(x) \\\n"
5917 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5918 " return s << a.DebugString(); \\\n"
5919 " }",
5920 getLLVMStyleWithColumns(50)));
5921
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005922 // FIXME: We cannot handle this case yet; we might be able to figure out that
5923 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00005924 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00005925
5926 FormatStyle PointerMiddle = getLLVMStyle();
5927 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
5928 verifyFormat("delete *x;", PointerMiddle);
5929 verifyFormat("int * x;", PointerMiddle);
5930 verifyFormat("template <int * y> f() {}", PointerMiddle);
5931 verifyFormat("int * f(int * a) {}", PointerMiddle);
5932 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
5933 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
5934 verifyFormat("A<int *> a;", PointerMiddle);
5935 verifyFormat("A<int **> a;", PointerMiddle);
5936 verifyFormat("A<int *, int *> a;", PointerMiddle);
5937 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00005938 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5939 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00005940 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005941
5942 // Member function reference qualifiers aren't binary operators.
5943 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005944 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005945 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005946 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005947 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005948 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005949}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005950
Daniel Jasperee6d6502013-07-17 20:25:02 +00005951TEST_F(FormatTest, UnderstandsAttributes) {
5952 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00005953 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5954 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005955 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005956 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005957 verifyFormat("__attribute__((nodebug)) void\n"
5958 "foo() {}\n",
5959 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00005960}
5961
Daniel Jasper10cd5812013-05-06 06:35:44 +00005962TEST_F(FormatTest, UnderstandsEllipsis) {
5963 verifyFormat("int printf(const char *fmt, ...);");
5964 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005965 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5966
5967 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005968 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005969 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005970}
5971
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005972TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005973 EXPECT_EQ("int *a;\n"
5974 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005975 "int *a;",
5976 format("int *a;\n"
5977 "int* a;\n"
5978 "int *a;",
5979 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005980 EXPECT_EQ("int* a;\n"
5981 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005982 "int* a;",
5983 format("int* a;\n"
5984 "int* a;\n"
5985 "int *a;",
5986 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005987 EXPECT_EQ("int *a;\n"
5988 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005989 "int *a;",
5990 format("int *a;\n"
5991 "int * a;\n"
5992 "int * a;",
5993 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005994 EXPECT_EQ("auto x = [] {\n"
5995 " int *a;\n"
5996 " int *a;\n"
5997 " int *a;\n"
5998 "};",
5999 format("auto x=[]{int *a;\n"
6000 "int * a;\n"
6001 "int * a;};",
6002 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006003}
6004
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006005TEST_F(FormatTest, UnderstandsRvalueReferences) {
6006 verifyFormat("int f(int &&a) {}");
6007 verifyFormat("int f(int a, char &&b) {}");
6008 verifyFormat("void f() { int &&a = b; }");
6009 verifyGoogleFormat("int f(int a, char&& b) {}");
6010 verifyGoogleFormat("void f() { int&& a = b; }");
6011
Daniel Jasper1eff9082013-05-27 16:36:33 +00006012 verifyIndependentOfContext("A<int &&> a;");
6013 verifyIndependentOfContext("A<int &&, int &&> a;");
6014 verifyGoogleFormat("A<int&&> a;");
6015 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006016
6017 // Not rvalue references:
6018 verifyFormat("template <bool B, bool C> class A {\n"
6019 " static_assert(B && C, \"Something is wrong\");\n"
6020 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006021 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6022 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006023 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006024}
6025
Manuel Klimekc1237a82013-01-23 14:08:21 +00006026TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6027 verifyFormat("void f() {\n"
6028 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006029 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006030 "}",
6031 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006032}
6033
Daniel Jasperef906a92013-01-13 08:01:36 +00006034TEST_F(FormatTest, FormatsCasts) {
6035 verifyFormat("Type *A = static_cast<Type *>(P);");
6036 verifyFormat("Type *A = (Type *)P;");
6037 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6038 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006039 verifyFormat("int a = (int)2.0f;");
6040 verifyFormat("x[(int32)y];");
6041 verifyFormat("x = (int32)y;");
6042 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6043 verifyFormat("int a = (int)*b;");
6044 verifyFormat("int a = (int)2.0f;");
6045 verifyFormat("int a = (int)~0;");
6046 verifyFormat("int a = (int)++a;");
6047 verifyFormat("int a = (int)sizeof(int);");
6048 verifyFormat("int a = (int)+2;");
6049 verifyFormat("my_int a = (my_int)2.0f;");
6050 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006051 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006052 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006053 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006054 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006055 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006056
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006057 verifyFormat("void f() { my_int a = (my_int)*b; }");
6058 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6059 verifyFormat("my_int a = (my_int)~0;");
6060 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006061 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006062 verifyFormat("my_int a = (my_int)1;");
6063 verifyFormat("my_int a = (my_int *)1;");
6064 verifyFormat("my_int a = (const my_int)-1;");
6065 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006066 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006067 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006068 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006069 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006070
6071 // FIXME: single value wrapped with paren will be treated as cast.
6072 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006073
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006074 verifyFormat("{ (void)F; }");
6075
Daniel Jasper998cabc2013-07-18 14:46:07 +00006076 // Don't break after a cast's
6077 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6078 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6079 " bbbbbbbbbbbbbbbbbbbbbb);");
6080
Daniel Jasperef906a92013-01-13 08:01:36 +00006081 // These are not casts.
6082 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006083 verifyFormat("f(foo)->b;");
6084 verifyFormat("f(foo).b;");
6085 verifyFormat("f(foo)(b);");
6086 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006087 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006088 verifyFormat("(*funptr)(foo)[4];");
6089 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006090 verifyFormat("void f(int *);");
6091 verifyFormat("void f(int *) = 0;");
6092 verifyFormat("void f(SmallVector<int>) {}");
6093 verifyFormat("void f(SmallVector<int>);");
6094 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006095 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006096 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006097 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006098 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6099 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006100 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006101
Daniel Jasperba0bda92013-02-23 08:07:18 +00006102 // These are not casts, but at some point were confused with casts.
6103 verifyFormat("virtual void foo(int *) override;");
6104 verifyFormat("virtual void foo(char &) const;");
6105 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006106 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006107 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006108 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006109 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006110
6111 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6112 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006113 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006114 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006115 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6116 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6117 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006118}
6119
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006120TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006121 verifyFormat("A<bool()> a;");
6122 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006123 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006124 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006125 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006126 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006127 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006128 verifyFormat("template <class CallbackClass>\n"
6129 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006130
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006131 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6132 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006133 verifyGoogleFormat(
6134 "template <class CallbackClass>\n"
6135 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006136
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006137 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006138 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006139 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006140 verifyFormat("some_var = function(*some_pointer_var)[0];");
6141 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006142 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006143 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006144}
6145
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006146TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6147 verifyFormat("A (*foo_)[6];");
6148 verifyFormat("vector<int> (*foo_)[6];");
6149}
6150
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006151TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6152 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6153 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6154 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6155 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006156 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6157 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006158
6159 // Different ways of ()-initializiation.
6160 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6161 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6162 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6163 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6164 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6165 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006166 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6167 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006168}
6169
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006170TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006171 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006172 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006173 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006174 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006175 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006176 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006177 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6178 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006179 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6180 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006181 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6182 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006183 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6184 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006185 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6186 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006187 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6188 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6189 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6190 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006191 FormatStyle Indented = getLLVMStyle();
6192 Indented.IndentWrappedFunctionNames = true;
6193 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6194 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6195 Indented);
6196 verifyFormat(
6197 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6198 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6199 Indented);
6200 verifyFormat(
6201 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6202 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6203 Indented);
6204 verifyFormat(
6205 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6206 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6207 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006208
6209 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006210 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6211 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6212 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006213
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006214 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006215 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006216 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006217 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6218 " SourceLocation L, IdentifierIn *II,\n"
6219 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006220 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006221 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006222 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006223 " const SomeType<string, SomeOtherTemplateParameter>\n"
6224 " &ReallyReallyLongParameterName,\n"
6225 " const SomeType<string, SomeOtherTemplateParameter>\n"
6226 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006227 verifyFormat("template <typename A>\n"
6228 "SomeLoooooooooooooooooooooongType<\n"
6229 " typename some_namespace::SomeOtherType<A>::Type>\n"
6230 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006231
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006232 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006233 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6234 " aaaaaaaaaaaaaaaaaaaaaaa;");
6235 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006236 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6237 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006238 verifyGoogleFormat(
6239 "some_namespace::LongReturnType\n"
6240 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006241 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006242
6243 verifyGoogleFormat("template <typename T>\n"
6244 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006245 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006246 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6247 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006248
6249 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006250 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6251 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006252 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6253 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6254 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6255 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6256 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6257 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6258 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006259}
6260
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006261TEST_F(FormatTest, FormatsArrays) {
6262 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6263 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006264 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6265 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006266 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6267 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006268 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6269 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6270 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6271 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6272 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6273 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6274 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6275 verifyFormat(
6276 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6277 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6278 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006279 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6280 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006281
6282 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6283 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006284 verifyFormat(
6285 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6286 " .aaaaaaa[0]\n"
6287 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006288 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006289
6290 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006291
6292 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6293 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006294}
6295
Daniel Jaspere9de2602012-12-06 09:56:08 +00006296TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6297 verifyFormat("(a)->b();");
6298 verifyFormat("--a;");
6299}
6300
Daniel Jasper8b529712012-12-04 13:02:32 +00006301TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006302 verifyFormat("#include <string>\n"
6303 "#include <a/b/c.h>\n"
6304 "#include \"a/b/string\"\n"
6305 "#include \"string.h\"\n"
6306 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006307 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006308 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006309 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006310 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006311 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006312 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
6313 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006314 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6315 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006316
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006317 verifyFormat("#import <string>");
6318 verifyFormat("#import <a/b/c.h>");
6319 verifyFormat("#import \"a/b/string\"");
6320 verifyFormat("#import \"string.h\"");
6321 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006322 verifyFormat("#if __has_include(<strstream>)\n"
6323 "#include <strstream>\n"
6324 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006325
Daniel Jasper343643b2014-08-13 08:29:18 +00006326 verifyFormat("#define MY_IMPORT <a/b>");
6327
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006328 // Protocol buffer definition or missing "#".
6329 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6330 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006331
6332 FormatStyle Style = getLLVMStyle();
6333 Style.AlwaysBreakBeforeMultilineStrings = true;
6334 Style.ColumnLimit = 0;
6335 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006336
6337 // But 'import' might also be a regular C++ namespace.
6338 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6339 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006340}
6341
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006342//===----------------------------------------------------------------------===//
6343// Error recovery tests.
6344//===----------------------------------------------------------------------===//
6345
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006346TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006347 FormatStyle NoBinPacking = getLLVMStyle();
6348 NoBinPacking.BinPackParameters = false;
6349 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6350 " double *min_x,\n"
6351 " double *max_x,\n"
6352 " double *min_y,\n"
6353 " double *max_y,\n"
6354 " double *min_z,\n"
6355 " double *max_z, ) {}",
6356 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006357}
6358
Daniel Jasper83a54d22013-01-10 09:26:47 +00006359TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006360 verifyFormat("void f() { return; }\n42");
6361 verifyFormat("void f() {\n"
6362 " if (0)\n"
6363 " return;\n"
6364 "}\n"
6365 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006366 verifyFormat("void f() { return }\n42");
6367 verifyFormat("void f() {\n"
6368 " if (0)\n"
6369 " return\n"
6370 "}\n"
6371 "42");
6372}
6373
6374TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6375 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6376 EXPECT_EQ("void f() {\n"
6377 " if (a)\n"
6378 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006379 "}",
6380 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006381 EXPECT_EQ("namespace N {\n"
6382 "void f()\n"
6383 "}",
6384 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006385 EXPECT_EQ("namespace N {\n"
6386 "void f() {}\n"
6387 "void g()\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006388 "}",
6389 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006390}
6391
Daniel Jasper2df93312013-01-09 10:16:05 +00006392TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6393 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006394 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006395 " b;",
6396 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006397 verifyFormat("function(\n"
6398 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006399 " LoooooooooooongArgument);\n",
6400 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006401}
6402
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006403TEST_F(FormatTest, IncorrectAccessSpecifier) {
6404 verifyFormat("public:");
6405 verifyFormat("class A {\n"
6406 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006407 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006408 "};");
6409 verifyFormat("public\n"
6410 "int qwerty;");
6411 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006412 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006413 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006414 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006415 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006416 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006417}
Daniel Jasperf7935112012-12-03 18:12:45 +00006418
Daniel Jasper291f9362013-03-20 15:58:10 +00006419TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6420 verifyFormat("{");
6421 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006422 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006423}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006424
6425TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006426 verifyFormat("do {\n}");
6427 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006428 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006429 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006430 "wheeee(fun);");
6431 verifyFormat("do {\n"
6432 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006433 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006434}
6435
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006436TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006437 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006438 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006439 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006440 verifyFormat("while {\n foo;\n foo();\n}");
6441 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006442}
6443
Daniel Jasperc0880a92013-01-04 18:52:56 +00006444TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006445 verifyIncompleteFormat("namespace {\n"
6446 "class Foo { Foo (\n"
6447 "};\n"
6448 "} // comment");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006449}
6450
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006451TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006452 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006453 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6454 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006455 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006456
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006457 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006458 " {\n"
6459 " breakme(\n"
6460 " qwe);\n"
6461 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006462 format("{\n"
6463 " {\n"
6464 " breakme(qwe);\n"
6465 "}\n",
6466 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006467}
6468
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006469TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006470 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006471 " avariable,\n"
6472 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006473 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006474}
6475
Manuel Klimek762dd182013-01-21 10:07:49 +00006476TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006477 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006478}
6479
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006480TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006481 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006482 verifyFormat("vector<int> x{\n"
6483 " 1, 2, 3, 4,\n"
6484 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006485 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6486 verifyFormat("f({1, 2});");
6487 verifyFormat("auto v = Foo{-1};");
6488 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6489 verifyFormat("Class::Class : member{1, 2, 3} {}");
6490 verifyFormat("new vector<int>{1, 2, 3};");
6491 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006492 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006493 verifyFormat("return {arg1, arg2};");
6494 verifyFormat("return {arg1, SomeType{parameter}};");
6495 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6496 verifyFormat("new T{arg1, arg2};");
6497 verifyFormat("f(MyMap[{composite, key}]);");
6498 verifyFormat("class Class {\n"
6499 " T member = {arg1, arg2};\n"
6500 "};");
6501 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006502 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6503 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006504
Daniel Jasper438059e2014-05-22 12:11:13 +00006505 verifyFormat("int foo(int i) { return fo1{}(i); }");
6506 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006507 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006508 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006509 verifyFormat("Node n{1, Node{1000}, //\n"
6510 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006511 verifyFormat("Aaaa aaaaaaa{\n"
6512 " {\n"
6513 " aaaa,\n"
6514 " },\n"
6515 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006516 verifyFormat("class C : public D {\n"
6517 " SomeClass SC{2};\n"
6518 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006519 verifyFormat("class C : public A {\n"
6520 " class D : public B {\n"
6521 " void f() { int i{2}; }\n"
6522 " };\n"
6523 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006524 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006525
Daniel Jaspere4ada022016-12-13 10:05:03 +00006526 // Cases where distinguising braced lists and blocks is hard.
6527 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6528 verifyFormat("void f() {\n"
6529 " return; // comment\n"
6530 "}\n"
6531 "SomeType t;");
6532 verifyFormat("void f() {\n"
6533 " if (a) {\n"
6534 " f();\n"
6535 " }\n"
6536 "}\n"
6537 "SomeType t;");
6538
Daniel Jasper08434342015-05-26 07:26:26 +00006539 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006540 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006541 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006542 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6543 " bbbbb,\n"
6544 " ccccc,\n"
6545 " ddddd,\n"
6546 " eeeee,\n"
6547 " ffffff,\n"
6548 " ggggg,\n"
6549 " hhhhhh,\n"
6550 " iiiiii,\n"
6551 " jjjjjj,\n"
6552 " kkkkkk};",
6553 NoBinPacking);
6554 verifyFormat("const Aaaaaa aaaaa = {\n"
6555 " aaaaa,\n"
6556 " bbbbb,\n"
6557 " ccccc,\n"
6558 " ddddd,\n"
6559 " eeeee,\n"
6560 " ffffff,\n"
6561 " ggggg,\n"
6562 " hhhhhh,\n"
6563 " iiiiii,\n"
6564 " jjjjjj,\n"
6565 " kkkkkk,\n"
6566 "};",
6567 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006568 verifyFormat(
6569 "const Aaaaaa aaaaa = {\n"
6570 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6571 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6572 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6573 "};",
6574 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006575
Chandler Carruthf8b72662014-03-02 12:37:31 +00006576 // FIXME: The alignment of these trailing comments might be bad. Then again,
6577 // this might be utterly useless in real code.
6578 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006579 " : some_value{ //\n"
6580 " aaaaaaa, //\n"
6581 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006582
Chandler Carruthf8b72662014-03-02 12:37:31 +00006583 // In braced lists, the first comment is always assumed to belong to the
6584 // first element. Thus, it can be moved to the next or previous line as
6585 // appropriate.
6586 EXPECT_EQ("function({// First element:\n"
6587 " 1,\n"
6588 " // Second element:\n"
6589 " 2});",
6590 format("function({\n"
6591 " // First element:\n"
6592 " 1,\n"
6593 " // Second element:\n"
6594 " 2});"));
6595 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6596 " // First element:\n"
6597 " 1,\n"
6598 " // Second element:\n"
6599 " 2};",
6600 format("std::vector<int> MyNumbers{// First element:\n"
6601 " 1,\n"
6602 " // Second element:\n"
6603 " 2};",
6604 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00006605 // A trailing comma should still lead to an enforced line break.
6606 EXPECT_EQ("vector<int> SomeVector = {\n"
6607 " // aaa\n"
6608 " 1, 2,\n"
6609 "};",
6610 format("vector<int> SomeVector = { // aaa\n"
6611 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006612
Chandler Carruthf8b72662014-03-02 12:37:31 +00006613 FormatStyle ExtraSpaces = getLLVMStyle();
6614 ExtraSpaces.Cpp11BracedListStyle = false;
6615 ExtraSpaces.ColumnLimit = 75;
6616 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6617 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6618 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6619 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6620 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6621 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6622 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6623 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6624 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6625 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6626 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6627 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6628 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6629 verifyFormat("class Class {\n"
6630 " T member = { arg1, arg2 };\n"
6631 "};",
6632 ExtraSpaces);
6633 verifyFormat(
6634 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6635 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6636 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6637 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6638 ExtraSpaces);
6639 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006640 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006641 ExtraSpaces);
6642 verifyFormat(
6643 "someFunction(OtherParam,\n"
6644 " BracedList{ // comment 1 (Forcing interesting break)\n"
6645 " param1, param2,\n"
6646 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006647 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006648 ExtraSpaces);
6649 verifyFormat(
6650 "std::this_thread::sleep_for(\n"
6651 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6652 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00006653 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006654 " aaaaaaa,\n"
6655 " aaaaaaaaaa,\n"
6656 " aaaaa,\n"
6657 " aaaaaaaaaaaaaaa,\n"
6658 " aaa,\n"
6659 " aaaaaaaaaa,\n"
6660 " a,\n"
6661 " aaaaaaaaaaaaaaaaaaaaa,\n"
6662 " aaaaaaaaaaaa,\n"
6663 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6664 " aaaaaaa,\n"
6665 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006666 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006667}
6668
Daniel Jasper33b909c2013-10-25 14:29:37 +00006669TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006670 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6671 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6672 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6673 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6674 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6675 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006676 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006677 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006678 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006679 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6680 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006681 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006682 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6683 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6684 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6685 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6686 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6687 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6688 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006689 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006690 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6691 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006692 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6693 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6694 " // Separating comment.\n"
6695 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6696 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6697 " // Leading comment\n"
6698 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6699 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006700 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6701 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006702 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006703 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6704 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006705 getLLVMStyleWithColumns(38));
6706 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006707 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6708 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006709 verifyFormat(
6710 "static unsigned SomeValues[10][3] = {\n"
6711 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6712 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6713 verifyFormat("static auto fields = new vector<string>{\n"
6714 " \"aaaaaaaaaaaaa\",\n"
6715 " \"aaaaaaaaaaaaa\",\n"
6716 " \"aaaaaaaaaaaa\",\n"
6717 " \"aaaaaaaaaaaaaa\",\n"
6718 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6719 " \"aaaaaaaaaaaa\",\n"
6720 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6721 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006722 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6723 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6724 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6725 " 3, cccccccccccccccccccccc};",
6726 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006727
6728 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006729 verifyFormat("vector<int> x = {\n"
6730 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6731 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006732 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006733 verifyFormat("vector<int> x = {\n"
6734 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006735 "};",
6736 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006737 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6738 " 1, 1, 1, 1,\n"
6739 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006740 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006741
Daniel Jasper60c27072015-05-13 08:16:00 +00006742 // Trailing comment in the first line.
6743 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6744 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6745 " 111111111, 222222222, 3333333333, 444444444, //\n"
6746 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006747 // Trailing comment in the last line.
6748 verifyFormat("int aaaaa[] = {\n"
6749 " 1, 2, 3, // comment\n"
6750 " 4, 5, 6 // comment\n"
6751 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006752
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006753 // With nested lists, we should either format one item per line or all nested
6754 // lists one on line.
6755 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006756 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6757 " {aaaaaaaaaaaaaaaaaaa},\n"
6758 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6759 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006760 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006761 verifyFormat(
6762 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006763 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6764 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6765 " {aaa, aaa},\n"
6766 " {aaa, aaa},\n"
6767 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6768 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6769 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006770
6771 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006772 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
6773 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006774
6775 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006776
Daniel Jaspereb65e912015-12-21 18:31:15 +00006777 // No braced initializer here.
6778 verifyFormat("void f() {\n"
6779 " struct Dummy {};\n"
6780 " f(v);\n"
6781 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006782
6783 // Long lists should be formatted in columns even if they are nested.
6784 verifyFormat(
6785 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6786 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6787 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6788 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6789 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6790 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00006791
6792 // Allow "single-column" layout even if that violates the column limit. There
6793 // isn't going to be a better way.
6794 verifyFormat("std::vector<int> a = {\n"
6795 " aaaaaaaa,\n"
6796 " aaaaaaaa,\n"
6797 " aaaaaaaa,\n"
6798 " aaaaaaaa,\n"
6799 " aaaaaaaaaa,\n"
6800 " aaaaaaaa,\n"
6801 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
6802 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00006803 verifyFormat("vector<int> aaaa = {\n"
6804 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6805 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6806 " aaaaaa.aaaaaaa,\n"
6807 " aaaaaa.aaaaaaa,\n"
6808 " aaaaaa.aaaaaaa,\n"
6809 " aaaaaa.aaaaaaa,\n"
6810 "};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006811}
6812
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006813TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006814 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006815 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006816
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006817 verifyFormat("void f() { return 42; }");
6818 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006819 " return 42;\n"
6820 "}",
6821 DoNotMerge);
6822 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006823 " // Comment\n"
6824 "}");
6825 verifyFormat("{\n"
6826 "#error {\n"
6827 " int a;\n"
6828 "}");
6829 verifyFormat("{\n"
6830 " int a;\n"
6831 "#error {\n"
6832 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00006833 verifyFormat("void f() {} // comment");
6834 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00006835 verifyFormat("void f() {\n"
6836 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006837 DoNotMerge);
6838 verifyFormat("void f() {\n"
6839 " int a;\n"
6840 "} // comment",
6841 DoNotMerge);
6842 verifyFormat("void f() {\n"
6843 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00006844 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006845
6846 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
6847 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
6848
6849 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
6850 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00006851 verifyFormat("class C {\n"
6852 " C()\n"
6853 " : iiiiiiii(nullptr),\n"
6854 " kkkkkkk(nullptr),\n"
6855 " mmmmmmm(nullptr),\n"
6856 " nnnnnnn(nullptr) {}\n"
6857 "};",
6858 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00006859
6860 FormatStyle NoColumnLimit = getLLVMStyle();
6861 NoColumnLimit.ColumnLimit = 0;
6862 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
6863 EXPECT_EQ("class C {\n"
6864 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00006865 "};",
6866 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00006867 EXPECT_EQ("A()\n"
6868 " : b(0) {\n"
6869 "}",
6870 format("A()\n:b(0)\n{\n}", NoColumnLimit));
6871
6872 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00006873 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
6874 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00006875 EXPECT_EQ("A()\n"
6876 " : b(0) {\n"
6877 "}",
6878 format("A():b(0){}", DoNotMergeNoColumnLimit));
6879 EXPECT_EQ("A()\n"
6880 " : b(0) {\n"
6881 "}",
6882 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00006883
6884 verifyFormat("#define A \\\n"
6885 " void f() { \\\n"
6886 " int i; \\\n"
6887 " }",
6888 getLLVMStyleWithColumns(20));
6889 verifyFormat("#define A \\\n"
6890 " void f() { int i; }",
6891 getLLVMStyleWithColumns(21));
6892 verifyFormat("#define A \\\n"
6893 " void f() { \\\n"
6894 " int i; \\\n"
6895 " } \\\n"
6896 " int j;",
6897 getLLVMStyleWithColumns(22));
6898 verifyFormat("#define A \\\n"
6899 " void f() { int i; } \\\n"
6900 " int j;",
6901 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006902}
6903
Daniel Jasperd74cf402014-04-08 12:46:38 +00006904TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
6905 FormatStyle MergeInlineOnly = getLLVMStyle();
6906 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6907 verifyFormat("class C {\n"
6908 " int f() { return 42; }\n"
6909 "};",
6910 MergeInlineOnly);
6911 verifyFormat("int f() {\n"
6912 " return 42;\n"
6913 "}",
6914 MergeInlineOnly);
6915}
6916
Manuel Klimeke01bab52013-01-15 13:38:33 +00006917TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
6918 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006919 verifyFormat("struct foo a = {bar};\nint n;");
6920 verifyFormat("class foo a = {bar};\nint n;");
6921 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006922
6923 // Elaborate types inside function definitions.
6924 verifyFormat("struct foo f() {}\nint n;");
6925 verifyFormat("class foo f() {}\nint n;");
6926 verifyFormat("union foo f() {}\nint n;");
6927
6928 // Templates.
6929 verifyFormat("template <class X> void f() {}\nint n;");
6930 verifyFormat("template <struct X> void f() {}\nint n;");
6931 verifyFormat("template <union X> void f() {}\nint n;");
6932
6933 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006934 verifyFormat("struct {\n} n;");
6935 verifyFormat(
6936 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006937 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006938 verifyFormat("class MACRO Z {\n} n;");
6939 verifyFormat("class MACRO(X) Z {\n} n;");
6940 verifyFormat("class __attribute__(X) Z {\n} n;");
6941 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00006942 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00006943 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00006944 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6945 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006946
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006947 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006948 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006949
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006950 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00006951 verifyFormat(
6952 "template <typename F>\n"
6953 "Matcher(const Matcher<F> &Other,\n"
6954 " typename enable_if_c<is_base_of<F, T>::value &&\n"
6955 " !is_same<F, T>::value>::type * = 0)\n"
6956 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6957
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006958 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006959 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00006960 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006961
6962 // FIXME:
6963 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006964 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006965
Manuel Klimeke01bab52013-01-15 13:38:33 +00006966 // Elaborate types where incorrectly parsing the structural element would
6967 // break the indent.
6968 verifyFormat("if (true)\n"
6969 " class X x;\n"
6970 "else\n"
6971 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00006972
6973 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00006974 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00006975}
6976
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006977TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00006978 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
6979 format("#error Leave all white!!!!! space* alone!\n"));
6980 EXPECT_EQ(
6981 "#warning Leave all white!!!!! space* alone!\n",
6982 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006983 EXPECT_EQ("#error 1", format(" # error 1"));
6984 EXPECT_EQ("#warning 1", format(" # warning 1"));
6985}
6986
Daniel Jasper4431aa92013-04-23 13:54:04 +00006987TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00006988 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00006989 verifyFormat("#if (AAAA && BBBB)");
6990 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00006991 // FIXME: Come up with a better indentation for #elif.
6992 verifyFormat(
6993 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
6994 " defined(BBBBBBBB)\n"
6995 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
6996 " defined(BBBBBBBB)\n"
6997 "#endif",
6998 getLLVMStyleWithColumns(65));
6999}
7000
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007001TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7002 FormatStyle AllowsMergedIf = getGoogleStyle();
7003 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7004 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7005 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007006 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7007 EXPECT_EQ("if (true) return 42;",
7008 format("if (true)\nreturn 42;", AllowsMergedIf));
7009 FormatStyle ShortMergedIf = AllowsMergedIf;
7010 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007011 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007012 " if (true) return 42;",
7013 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007014 verifyFormat("#define A \\\n"
7015 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007016 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007017 "#define B",
7018 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007019 verifyFormat("#define A \\\n"
7020 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007021 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007022 "g();",
7023 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007024 verifyFormat("{\n"
7025 "#ifdef A\n"
7026 " // Comment\n"
7027 " if (true) continue;\n"
7028 "#endif\n"
7029 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007030 " if (true) continue;\n"
7031 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007032 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007033 ShortMergedIf.ColumnLimit = 29;
7034 verifyFormat("#define A \\\n"
7035 " if (aaaaaaaaaa) return 1; \\\n"
7036 " return 2;",
7037 ShortMergedIf);
7038 ShortMergedIf.ColumnLimit = 28;
7039 verifyFormat("#define A \\\n"
7040 " if (aaaaaaaaaa) \\\n"
7041 " return 1; \\\n"
7042 " return 2;",
7043 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007044}
7045
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007046TEST_F(FormatTest, BlockCommentsInControlLoops) {
7047 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7048 " f();\n"
7049 "}");
7050 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7051 " f();\n"
7052 "} /* another comment */ else /* comment #3 */ {\n"
7053 " g();\n"
7054 "}");
7055 verifyFormat("while (0) /* a comment in a strange place */ {\n"
7056 " f();\n"
7057 "}");
7058 verifyFormat("for (;;) /* a comment in a strange place */ {\n"
7059 " f();\n"
7060 "}");
7061 verifyFormat("do /* a comment in a strange place */ {\n"
7062 " f();\n"
7063 "} /* another comment */ while (0);");
7064}
7065
7066TEST_F(FormatTest, BlockComments) {
7067 EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
7068 format("/* *//* */ /* */\n/* *//* */ /* */"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007069 EXPECT_EQ("/* */ a /* */ b;", format(" /* */ a/* */ b;"));
Daniel Jaspera49393f2013-08-28 09:07:32 +00007070 EXPECT_EQ("#define A /*123*/ \\\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007071 " b\n"
7072 "/* */\n"
7073 "someCall(\n"
7074 " parameter);",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00007075 format("#define A /*123*/ b\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007076 "/* */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007077 "someCall(parameter);",
7078 getLLVMStyleWithColumns(15)));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007079
7080 EXPECT_EQ("#define A\n"
7081 "/* */ someCall(\n"
7082 " parameter);",
7083 format("#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007084 "/* */someCall(parameter);",
7085 getLLVMStyleWithColumns(15)));
Daniel Jasper51fb2b22013-05-30 06:40:07 +00007086 EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007087 EXPECT_EQ("/*\n"
7088 "*\n"
7089 " * aaaaaa\n"
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00007090 " * aaaaaa\n"
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007091 "*/",
7092 format("/*\n"
7093 "*\n"
7094 " * aaaaaa aaaaaa\n"
7095 "*/",
7096 getLLVMStyleWithColumns(10)));
Daniel Jasperce257f22013-05-30 17:27:48 +00007097 EXPECT_EQ("/*\n"
7098 "**\n"
7099 "* aaaaaa\n"
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007100 "*aaaaaa\n"
Daniel Jasperce257f22013-05-30 17:27:48 +00007101 "*/",
7102 format("/*\n"
7103 "**\n"
7104 "* aaaaaa aaaaaa\n"
7105 "*/",
7106 getLLVMStyleWithColumns(10)));
Daniel Jasperacadc8e2016-06-08 09:45:08 +00007107 EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7108 " /* line 1\n"
7109 " bbbbbbbbbbbb */\n"
7110 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7111 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7112 " /* line 1\n"
7113 " bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7114 getLLVMStyleWithColumns(50)));
Daniel Jasper1f140982013-02-04 07:32:14 +00007115
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007116 FormatStyle NoBinPacking = getLLVMStyle();
7117 NoBinPacking.BinPackParameters = false;
Daniel Jasper1f140982013-02-04 07:32:14 +00007118 EXPECT_EQ("someFunction(1, /* comment 1 */\n"
7119 " 2, /* comment 2 */\n"
7120 " 3, /* comment 3 */\n"
Daniel Jasper14e40ec2013-02-04 08:34:57 +00007121 " aaaa,\n"
7122 " bbbb);",
Daniel Jasper1f140982013-02-04 07:32:14 +00007123 format("someFunction (1, /* comment 1 */\n"
7124 " 2, /* comment 2 */ \n"
7125 " 3, /* comment 3 */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007126 "aaaa, bbbb );",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007127 NoBinPacking));
Daniel Jasper38396592013-02-06 15:23:09 +00007128 verifyFormat(
7129 "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7130 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7131 EXPECT_EQ(
7132 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7133 " aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7134 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
7135 format(
7136 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7137 " aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7138 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
Daniel Jasper94f0e132013-02-06 20:07:35 +00007139 EXPECT_EQ(
7140 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7141 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7142 "int cccccccccccccccccccccccccccccc; /* comment */\n",
7143 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7144 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7145 "int cccccccccccccccccccccccccccccc; /* comment */\n"));
Daniel Jasper022612d2013-07-01 09:34:09 +00007146
7147 verifyFormat("void f(int * /* unused */) {}");
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007148
7149 EXPECT_EQ("/*\n"
7150 " **\n"
7151 " */",
7152 format("/*\n"
7153 " **\n"
7154 " */"));
7155 EXPECT_EQ("/*\n"
7156 " *q\n"
7157 " */",
7158 format("/*\n"
7159 " *q\n"
7160 " */"));
7161 EXPECT_EQ("/*\n"
7162 " * q\n"
7163 " */",
7164 format("/*\n"
7165 " * q\n"
7166 " */"));
7167 EXPECT_EQ("/*\n"
7168 " **/",
7169 format("/*\n"
7170 " **/"));
7171 EXPECT_EQ("/*\n"
7172 " ***/",
7173 format("/*\n"
7174 " ***/"));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007175}
7176
Manuel Klimek82b836a2013-02-06 16:40:56 +00007177TEST_F(FormatTest, BlockCommentsInMacros) {
7178 EXPECT_EQ("#define A \\\n"
7179 " { \\\n"
7180 " /* one line */ \\\n"
7181 " someCall();",
7182 format("#define A { \\\n"
7183 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007184 " someCall();",
7185 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007186 EXPECT_EQ("#define A \\\n"
7187 " { \\\n"
7188 " /* previous */ \\\n"
7189 " /* one line */ \\\n"
7190 " someCall();",
7191 format("#define A { \\\n"
7192 " /* previous */ \\\n"
7193 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007194 " someCall();",
7195 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007196}
7197
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007198TEST_F(FormatTest, BlockCommentsAtEndOfLine) {
7199 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007200 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007201 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007202 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007203 "};",
7204 getLLVMStyleWithColumns(15)));
7205 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007206 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007207 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007208 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007209 "};",
7210 getLLVMStyleWithColumns(15)));
7211
7212 // FIXME: The formatting is still wrong here.
7213 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007214 " 1111 /* a\n"
7215 " */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007216 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007217 format("a = {1111 /* a */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007218 "};",
7219 getLLVMStyleWithColumns(15)));
7220}
7221
Manuel Klimek82b836a2013-02-06 16:40:56 +00007222TEST_F(FormatTest, IndentLineCommentsInStartOfBlockAtEndOfFile) {
Manuel Klimek82b836a2013-02-06 16:40:56 +00007223 verifyFormat("{\n"
Marianne Mailhot-Sarrasin03137c62016-04-14 14:56:49 +00007224 " // a\n"
7225 " // b");
Manuel Klimek82b836a2013-02-06 16:40:56 +00007226}
7227
Manuel Klimekd33516e2013-01-23 10:09:28 +00007228TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007229 verifyFormat("void f(int *a);");
7230 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007231 verifyFormat("class A {\n void f(int *a);\n};");
7232 verifyFormat("class A {\n int *a;\n};");
7233 verifyFormat("namespace a {\n"
7234 "namespace b {\n"
7235 "class A {\n"
7236 " void f() {}\n"
7237 " int *a;\n"
7238 "};\n"
7239 "}\n"
7240 "}");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007241}
7242
Manuel Klimekd33516e2013-01-23 10:09:28 +00007243TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7244 verifyFormat("while");
7245 verifyFormat("operator");
7246}
7247
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007248TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7249 // This code would be painfully slow to format if we didn't skip it.
7250 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
7251 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7252 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7253 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7254 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7255 "A(1, 1)\n"
7256 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7257 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7258 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7259 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7260 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7261 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7262 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7263 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7264 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7265 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7266 // Deeply nested part is untouched, rest is formatted.
7267 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7268 format(std::string("int i;\n") + Code + "int j;\n",
7269 getLLVMStyle(), IC_ExpectIncomplete));
7270}
7271
Nico Weber7e6a7a12013-01-08 17:56:31 +00007272//===----------------------------------------------------------------------===//
7273// Objective-C tests.
7274//===----------------------------------------------------------------------===//
7275
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007276TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7277 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7278 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7279 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007280 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007281 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7282 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7283 format("-(NSInteger)Method3:(id)anObject;"));
7284 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7285 format("-(NSInteger)Method4:(id)anObject;"));
7286 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7287 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7288 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7289 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007290 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7291 "forAllCells:(BOOL)flag;",
7292 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7293 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007294
7295 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007296 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7297 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007298 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7299 " inRange:(NSRange)range\n"
7300 " outRange:(NSRange)out_range\n"
7301 " outRange1:(NSRange)out_range1\n"
7302 " outRange2:(NSRange)out_range2\n"
7303 " outRange3:(NSRange)out_range3\n"
7304 " outRange4:(NSRange)out_range4\n"
7305 " outRange5:(NSRange)out_range5\n"
7306 " outRange6:(NSRange)out_range6\n"
7307 " outRange7:(NSRange)out_range7\n"
7308 " outRange8:(NSRange)out_range8\n"
7309 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007310
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007311 // When the function name has to be wrapped.
7312 FormatStyle Style = getLLVMStyle();
7313 Style.IndentWrappedFunctionNames = false;
7314 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7315 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7316 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7317 "}",
7318 Style);
7319 Style.IndentWrappedFunctionNames = true;
7320 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7321 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7322 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7323 "}",
7324 Style);
7325
Nico Weberd6f962f2013-01-10 20:18:33 +00007326 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007327 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007328 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7329 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007330 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007331
Daniel Jasper37194282013-05-28 08:33:00 +00007332 verifyFormat("- (int (*)())foo:(int (*)())f;");
7333 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007334
7335 // If there's no return type (very rare in practice!), LLVM and Google style
7336 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007337 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007338 verifyFormat("- foo:(int)f;");
7339 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007340}
7341
Nico Weber0588b502013-02-07 00:19:29 +00007342
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007343TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007344 EXPECT_EQ("\"some text \"\n"
7345 "\"other\";",
7346 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007347 EXPECT_EQ("\"some text \"\n"
7348 "\"other\";",
7349 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007350 EXPECT_EQ(
7351 "#define A \\\n"
7352 " \"some \" \\\n"
7353 " \"text \" \\\n"
7354 " \"other\";",
7355 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7356 EXPECT_EQ(
7357 "#define A \\\n"
7358 " \"so \" \\\n"
7359 " \"text \" \\\n"
7360 " \"other\";",
7361 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7362
7363 EXPECT_EQ("\"some text\"",
7364 format("\"some text\"", getLLVMStyleWithColumns(1)));
7365 EXPECT_EQ("\"some text\"",
7366 format("\"some text\"", getLLVMStyleWithColumns(11)));
7367 EXPECT_EQ("\"some \"\n"
7368 "\"text\"",
7369 format("\"some text\"", getLLVMStyleWithColumns(10)));
7370 EXPECT_EQ("\"some \"\n"
7371 "\"text\"",
7372 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007373 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007374 "\" tex\"\n"
7375 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007376 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007377 EXPECT_EQ("\"some\"\n"
7378 "\" tex\"\n"
7379 "\" and\"",
7380 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7381 EXPECT_EQ("\"some\"\n"
7382 "\"/tex\"\n"
7383 "\"/and\"",
7384 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007385
7386 EXPECT_EQ("variable =\n"
7387 " \"long string \"\n"
7388 " \"literal\";",
7389 format("variable = \"long string literal\";",
7390 getLLVMStyleWithColumns(20)));
7391
7392 EXPECT_EQ("variable = f(\n"
7393 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007394 " \"literal\",\n"
7395 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007396 " loooooooooooooooooooong);",
7397 format("variable = f(\"long string literal\", short, "
7398 "loooooooooooooooooooong);",
7399 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007400
Daniel Jaspera44991332015-04-29 13:06:49 +00007401 EXPECT_EQ(
7402 "f(g(\"long string \"\n"
7403 " \"literal\"),\n"
7404 " b);",
7405 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007406 EXPECT_EQ("f(g(\"long string \"\n"
7407 " \"literal\",\n"
7408 " a),\n"
7409 " b);",
7410 format("f(g(\"long string literal\", a), b);",
7411 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007412 EXPECT_EQ(
7413 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00007414 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007415 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7416 EXPECT_EQ("f(\"one two three four five six \"\n"
7417 " \"seven\".split(\n"
7418 " really_looooong_variable));",
7419 format("f(\"one two three four five six seven\"."
7420 "split(really_looooong_variable));",
7421 getLLVMStyleWithColumns(33)));
7422
7423 EXPECT_EQ("f(\"some \"\n"
7424 " \"text\",\n"
7425 " other);",
7426 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00007427
7428 // Only break as a last resort.
7429 verifyFormat(
7430 "aaaaaaaaaaaaaaaaaaaa(\n"
7431 " aaaaaaaaaaaaaaaaaaaa,\n"
7432 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00007433
Daniel Jaspera44991332015-04-29 13:06:49 +00007434 EXPECT_EQ("\"splitmea\"\n"
7435 "\"trandomp\"\n"
7436 "\"oint\"",
7437 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00007438
Daniel Jaspera44991332015-04-29 13:06:49 +00007439 EXPECT_EQ("\"split/\"\n"
7440 "\"pathat/\"\n"
7441 "\"slashes\"",
7442 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007443
Daniel Jaspera44991332015-04-29 13:06:49 +00007444 EXPECT_EQ("\"split/\"\n"
7445 "\"pathat/\"\n"
7446 "\"slashes\"",
7447 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00007448 EXPECT_EQ("\"split at \"\n"
7449 "\"spaces/at/\"\n"
7450 "\"slashes.at.any$\"\n"
7451 "\"non-alphanumeric%\"\n"
7452 "\"1111111111characte\"\n"
7453 "\"rs\"",
7454 format("\"split at "
7455 "spaces/at/"
7456 "slashes.at."
7457 "any$non-"
7458 "alphanumeric%"
7459 "1111111111characte"
7460 "rs\"",
7461 getLLVMStyleWithColumns(20)));
7462
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007463 // Verify that splitting the strings understands
7464 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00007465 EXPECT_EQ(
7466 "aaaaaaaaaaaa(\n"
7467 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
7468 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
7469 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
7470 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7471 "aaaaaaaaaaaaaaaaaaaaaa\");",
7472 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00007473 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7474 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
7475 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
7476 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7477 "aaaaaaaaaaaaaaaaaaaaaa\";",
7478 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00007479 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7480 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7481 format("llvm::outs() << "
7482 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
7483 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00007484 EXPECT_EQ("ffff(\n"
7485 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7486 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7487 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
7488 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7489 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007490
Daniel Jaspere1a7b762016-02-01 11:21:02 +00007491 FormatStyle Style = getLLVMStyleWithColumns(12);
7492 Style.BreakStringLiterals = false;
7493 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
7494
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007495 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
7496 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00007497 EXPECT_EQ("#define A \\\n"
7498 " \"some \" \\\n"
7499 " \"text \" \\\n"
7500 " \"other\";",
7501 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007502}
7503
Manuel Klimek9e321992015-07-28 15:50:24 +00007504TEST_F(FormatTest, FullyRemoveEmptyLines) {
7505 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
7506 NoEmptyLines.MaxEmptyLinesToKeep = 0;
7507 EXPECT_EQ("int i = a(b());",
7508 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
7509}
7510
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007511TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
7512 EXPECT_EQ(
7513 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7514 "(\n"
7515 " \"x\t\");",
7516 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7517 "aaaaaaa("
7518 "\"x\t\");"));
7519}
7520
Daniel Jasper174b0122014-01-09 14:18:12 +00007521TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00007522 EXPECT_EQ(
7523 "u8\"utf8 string \"\n"
7524 "u8\"literal\";",
7525 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
7526 EXPECT_EQ(
7527 "u\"utf16 string \"\n"
7528 "u\"literal\";",
7529 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
7530 EXPECT_EQ(
7531 "U\"utf32 string \"\n"
7532 "U\"literal\";",
7533 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
7534 EXPECT_EQ("L\"wide string \"\n"
7535 "L\"literal\";",
7536 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00007537 EXPECT_EQ("@\"NSString \"\n"
7538 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00007539 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00007540
7541 // This input makes clang-format try to split the incomplete unicode escape
7542 // sequence, which used to lead to a crasher.
7543 verifyNoCrash(
7544 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7545 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007546}
7547
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00007548TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
7549 FormatStyle Style = getGoogleStyleWithColumns(15);
7550 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
7551 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
7552 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
7553 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
7554 EXPECT_EQ("u8R\"x(raw literal)x\";",
7555 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007556}
7557
7558TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
7559 FormatStyle Style = getLLVMStyleWithColumns(20);
7560 EXPECT_EQ(
7561 "_T(\"aaaaaaaaaaaaaa\")\n"
7562 "_T(\"aaaaaaaaaaaaaa\")\n"
7563 "_T(\"aaaaaaaaaaaa\")",
7564 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
7565 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
7566 " _T(\"aaaaaa\"),\n"
7567 " z);",
7568 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
7569
7570 // FIXME: Handle embedded spaces in one iteration.
7571 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
7572 // "_T(\"aaaaaaaaaaaaa\")\n"
7573 // "_T(\"aaaaaaaaaaaaa\")\n"
7574 // "_T(\"a\")",
7575 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7576 // getLLVMStyleWithColumns(20)));
7577 EXPECT_EQ(
7578 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7579 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007580 EXPECT_EQ("f(\n"
7581 "#if !TEST\n"
7582 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7583 "#endif\n"
7584 " );",
7585 format("f(\n"
7586 "#if !TEST\n"
7587 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7588 "#endif\n"
7589 ");"));
7590 EXPECT_EQ("f(\n"
7591 "\n"
7592 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
7593 format("f(\n"
7594 "\n"
7595 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007596}
7597
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007598TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007599 EXPECT_EQ(
7600 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7601 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7602 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7603 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7604 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7605 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
7606}
7607
7608TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
7609 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007610 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007611 EXPECT_EQ("fffffffffff(g(R\"x(\n"
7612 "multiline raw string literal xxxxxxxxxxxxxx\n"
7613 ")x\",\n"
7614 " a),\n"
7615 " b);",
7616 format("fffffffffff(g(R\"x(\n"
7617 "multiline raw string literal xxxxxxxxxxxxxx\n"
7618 ")x\", a), b);",
7619 getGoogleStyleWithColumns(20)));
7620 EXPECT_EQ("fffffffffff(\n"
7621 " g(R\"x(qqq\n"
7622 "multiline raw string literal xxxxxxxxxxxxxx\n"
7623 ")x\",\n"
7624 " a),\n"
7625 " b);",
7626 format("fffffffffff(g(R\"x(qqq\n"
7627 "multiline raw string literal xxxxxxxxxxxxxx\n"
7628 ")x\", a), b);",
7629 getGoogleStyleWithColumns(20)));
7630
7631 EXPECT_EQ("fffffffffff(R\"x(\n"
7632 "multiline raw string literal xxxxxxxxxxxxxx\n"
7633 ")x\");",
7634 format("fffffffffff(R\"x(\n"
7635 "multiline raw string literal xxxxxxxxxxxxxx\n"
7636 ")x\");",
7637 getGoogleStyleWithColumns(20)));
7638 EXPECT_EQ("fffffffffff(R\"x(\n"
7639 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007640 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007641 format("fffffffffff(R\"x(\n"
7642 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007643 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007644 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007645 EXPECT_EQ("fffffffffff(\n"
7646 " R\"x(\n"
7647 "multiline raw string literal xxxxxxxxxxxxxx\n"
7648 ")x\" +\n"
7649 " bbbbbb);",
7650 format("fffffffffff(\n"
7651 " R\"x(\n"
7652 "multiline raw string literal xxxxxxxxxxxxxx\n"
7653 ")x\" + bbbbbb);",
7654 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007655}
7656
Alexander Kornienkobe633902013-06-14 11:46:10 +00007657TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00007658 verifyFormat("string a = \"unterminated;");
7659 EXPECT_EQ("function(\"unterminated,\n"
7660 " OtherParameter);",
7661 format("function( \"unterminated,\n"
7662 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00007663}
7664
7665TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007666 FormatStyle Style = getLLVMStyle();
7667 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00007668 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007669 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00007670}
7671
Daniel Jaspera44991332015-04-29 13:06:49 +00007672TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00007673
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007674TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
7675 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
7676 " \"ddeeefff\");",
7677 format("someFunction(\"aaabbbcccdddeeefff\");",
7678 getLLVMStyleWithColumns(25)));
7679 EXPECT_EQ("someFunction1234567890(\n"
7680 " \"aaabbbcccdddeeefff\");",
7681 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7682 getLLVMStyleWithColumns(26)));
7683 EXPECT_EQ("someFunction1234567890(\n"
7684 " \"aaabbbcccdddeeeff\"\n"
7685 " \"f\");",
7686 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7687 getLLVMStyleWithColumns(25)));
7688 EXPECT_EQ("someFunction1234567890(\n"
7689 " \"aaabbbcccdddeeeff\"\n"
7690 " \"f\");",
7691 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7692 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00007693 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
7694 " \"ddde \"\n"
7695 " \"efff\");",
7696 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007697 getLLVMStyleWithColumns(25)));
7698 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
7699 " \"ddeeefff\");",
7700 format("someFunction(\"aaabbbccc ddeeefff\");",
7701 getLLVMStyleWithColumns(25)));
7702 EXPECT_EQ("someFunction1234567890(\n"
7703 " \"aaabb \"\n"
7704 " \"cccdddeeefff\");",
7705 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
7706 getLLVMStyleWithColumns(25)));
7707 EXPECT_EQ("#define A \\\n"
7708 " string s = \\\n"
7709 " \"123456789\" \\\n"
7710 " \"0\"; \\\n"
7711 " int i;",
7712 format("#define A string s = \"1234567890\"; int i;",
7713 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00007714 // FIXME: Put additional penalties on breaking at non-whitespace locations.
7715 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
7716 " \"dddeeeff\"\n"
7717 " \"f\");",
7718 format("someFunction(\"aaabbbcc dddeeefff\");",
7719 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007720}
7721
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007722TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00007723 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
7724 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007725 EXPECT_EQ("\"test\"\n"
7726 "\"\\n\"",
7727 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
7728 EXPECT_EQ("\"tes\\\\\"\n"
7729 "\"n\"",
7730 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
7731 EXPECT_EQ("\"\\\\\\\\\"\n"
7732 "\"\\n\"",
7733 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00007734 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007735 EXPECT_EQ("\"\\uff01\"\n"
7736 "\"test\"",
7737 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
7738 EXPECT_EQ("\"\\Uff01ff02\"",
7739 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
7740 EXPECT_EQ("\"\\x000000000001\"\n"
7741 "\"next\"",
7742 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
7743 EXPECT_EQ("\"\\x000000000001next\"",
7744 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
7745 EXPECT_EQ("\"\\x000000000001\"",
7746 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
7747 EXPECT_EQ("\"test\"\n"
7748 "\"\\000000\"\n"
7749 "\"000001\"",
7750 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
7751 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007752 "\"00000000\"\n"
7753 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007754 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007755}
7756
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00007757TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
7758 verifyFormat("void f() {\n"
7759 " return g() {}\n"
7760 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007761 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00007762 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00007763 "}");
7764}
7765
Manuel Klimek421147e2014-01-24 09:25:23 +00007766TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
7767 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00007768 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00007769}
7770
Manuel Klimek13b97d82013-05-13 08:42:42 +00007771TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
7772 verifyFormat("class X {\n"
7773 " void f() {\n"
7774 " }\n"
7775 "};",
7776 getLLVMStyleWithColumns(12));
7777}
7778
7779TEST_F(FormatTest, ConfigurableIndentWidth) {
7780 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
7781 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00007782 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00007783 verifyFormat("void f() {\n"
7784 " someFunction();\n"
7785 " if (true) {\n"
7786 " f();\n"
7787 " }\n"
7788 "}",
7789 EightIndent);
7790 verifyFormat("class X {\n"
7791 " void f() {\n"
7792 " }\n"
7793 "};",
7794 EightIndent);
7795 verifyFormat("int x[] = {\n"
7796 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007797 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00007798 EightIndent);
7799}
7800
Alexander Kornienko34a87e82013-06-22 01:35:36 +00007801TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00007802 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00007803 "f();",
7804 getLLVMStyleWithColumns(8));
7805}
7806
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007807TEST_F(FormatTest, ConfigurableUseOfTab) {
7808 FormatStyle Tab = getLLVMStyleWithColumns(42);
7809 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007810 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007811 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00007812
7813 EXPECT_EQ("if (aaaaaaaa && // q\n"
7814 " bb)\t\t// w\n"
7815 "\t;",
7816 format("if (aaaaaaaa &&// q\n"
7817 "bb)// w\n"
7818 ";",
7819 Tab));
7820 EXPECT_EQ("if (aaa && bbb) // w\n"
7821 "\t;",
7822 format("if(aaa&&bbb)// w\n"
7823 ";",
7824 Tab));
7825
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007826 verifyFormat("class X {\n"
7827 "\tvoid f() {\n"
7828 "\t\tsomeFunction(parameter1,\n"
7829 "\t\t\t parameter2);\n"
7830 "\t}\n"
7831 "};",
7832 Tab);
7833 verifyFormat("#define A \\\n"
7834 "\tvoid f() { \\\n"
7835 "\t\tsomeFunction( \\\n"
7836 "\t\t parameter1, \\\n"
7837 "\t\t parameter2); \\\n"
7838 "\t}",
7839 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00007840
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00007841 Tab.TabWidth = 4;
7842 Tab.IndentWidth = 8;
7843 verifyFormat("class TabWidth4Indent8 {\n"
7844 "\t\tvoid f() {\n"
7845 "\t\t\t\tsomeFunction(parameter1,\n"
7846 "\t\t\t\t\t\t\t parameter2);\n"
7847 "\t\t}\n"
7848 "};",
7849 Tab);
7850
7851 Tab.TabWidth = 4;
7852 Tab.IndentWidth = 4;
7853 verifyFormat("class TabWidth4Indent4 {\n"
7854 "\tvoid f() {\n"
7855 "\t\tsomeFunction(parameter1,\n"
7856 "\t\t\t\t\t parameter2);\n"
7857 "\t}\n"
7858 "};",
7859 Tab);
7860
7861 Tab.TabWidth = 8;
7862 Tab.IndentWidth = 4;
7863 verifyFormat("class TabWidth8Indent4 {\n"
7864 " void f() {\n"
7865 "\tsomeFunction(parameter1,\n"
7866 "\t\t parameter2);\n"
7867 " }\n"
7868 "};",
7869 Tab);
7870
Alexander Kornienko39856b72013-09-10 09:38:25 +00007871 Tab.TabWidth = 8;
7872 Tab.IndentWidth = 8;
7873 EXPECT_EQ("/*\n"
7874 "\t a\t\tcomment\n"
7875 "\t in multiple lines\n"
7876 " */",
7877 format(" /*\t \t \n"
7878 " \t \t a\t\tcomment\t \t\n"
7879 " \t \t in multiple lines\t\n"
7880 " \t */",
7881 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00007882
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007883 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00007884 verifyFormat("{\n"
7885 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7886 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7887 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7888 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7889 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7890 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00007891 "};",
7892 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00007893 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00007894 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00007895 "\ta2,\n"
7896 "\ta3\n"
7897 "};",
7898 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007899 EXPECT_EQ("if (aaaaaaaa && // q\n"
7900 " bb) // w\n"
7901 "\t;",
7902 format("if (aaaaaaaa &&// q\n"
7903 "bb)// w\n"
7904 ";",
7905 Tab));
7906 verifyFormat("class X {\n"
7907 "\tvoid f() {\n"
7908 "\t\tsomeFunction(parameter1,\n"
7909 "\t\t parameter2);\n"
7910 "\t}\n"
7911 "};",
7912 Tab);
7913 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00007914 "\tQ(\n"
7915 "\t {\n"
7916 "\t\t int a;\n"
7917 "\t\t someFunction(aaaaaaaa,\n"
7918 "\t\t bbbbbbb);\n"
7919 "\t },\n"
7920 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007921 "}",
7922 Tab);
7923 EXPECT_EQ("{\n"
7924 "\t/* aaaa\n"
7925 "\t bbbb */\n"
7926 "}",
7927 format("{\n"
7928 "/* aaaa\n"
7929 " bbbb */\n"
7930 "}",
7931 Tab));
7932 EXPECT_EQ("{\n"
7933 "\t/*\n"
7934 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7935 "\t bbbbbbbbbbbbb\n"
7936 "\t*/\n"
7937 "}",
7938 format("{\n"
7939 "/*\n"
7940 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7941 "*/\n"
7942 "}",
7943 Tab));
7944 EXPECT_EQ("{\n"
7945 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7946 "\t// bbbbbbbbbbbbb\n"
7947 "}",
7948 format("{\n"
7949 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7950 "}",
7951 Tab));
7952 EXPECT_EQ("{\n"
7953 "\t/*\n"
7954 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7955 "\t bbbbbbbbbbbbb\n"
7956 "\t*/\n"
7957 "}",
7958 format("{\n"
7959 "\t/*\n"
7960 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7961 "\t*/\n"
7962 "}",
7963 Tab));
7964 EXPECT_EQ("{\n"
7965 "\t/*\n"
7966 "\n"
7967 "\t*/\n"
7968 "}",
7969 format("{\n"
7970 "\t/*\n"
7971 "\n"
7972 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00007973 "}",
7974 Tab));
7975 EXPECT_EQ("{\n"
7976 "\t/*\n"
7977 " asdf\n"
7978 "\t*/\n"
7979 "}",
7980 format("{\n"
7981 "\t/*\n"
7982 " asdf\n"
7983 "\t*/\n"
7984 "}",
7985 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007986
7987 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00007988 EXPECT_EQ("/*\n"
7989 " a\t\tcomment\n"
7990 " in multiple lines\n"
7991 " */",
7992 format(" /*\t \t \n"
7993 " \t \t a\t\tcomment\t \t\n"
7994 " \t \t in multiple lines\t\n"
7995 " \t */",
7996 Tab));
7997 EXPECT_EQ("/* some\n"
7998 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00007999 format(" \t \t /* some\n"
8000 " \t \t comment */",
8001 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008002 EXPECT_EQ("int a; /* some\n"
8003 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008004 format(" \t \t int a; /* some\n"
8005 " \t \t comment */",
8006 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008007
Alexander Kornienko39856b72013-09-10 09:38:25 +00008008 EXPECT_EQ("int a; /* some\n"
8009 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008010 format(" \t \t int\ta; /* some\n"
8011 " \t \t comment */",
8012 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008013 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8014 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008015 format(" \t \t f(\"\t\t\"); /* some\n"
8016 " \t \t comment */",
8017 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008018 EXPECT_EQ("{\n"
8019 " /*\n"
8020 " * Comment\n"
8021 " */\n"
8022 " int i;\n"
8023 "}",
8024 format("{\n"
8025 "\t/*\n"
8026 "\t * Comment\n"
8027 "\t */\n"
8028 "\t int i;\n"
8029 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008030
8031 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8032 Tab.TabWidth = 8;
8033 Tab.IndentWidth = 8;
8034 EXPECT_EQ("if (aaaaaaaa && // q\n"
8035 " bb) // w\n"
8036 "\t;",
8037 format("if (aaaaaaaa &&// q\n"
8038 "bb)// w\n"
8039 ";",
8040 Tab));
8041 EXPECT_EQ("if (aaa && bbb) // w\n"
8042 "\t;",
8043 format("if(aaa&&bbb)// w\n"
8044 ";",
8045 Tab));
8046 verifyFormat("class X {\n"
8047 "\tvoid f() {\n"
8048 "\t\tsomeFunction(parameter1,\n"
8049 "\t\t\t parameter2);\n"
8050 "\t}\n"
8051 "};",
8052 Tab);
8053 verifyFormat("#define A \\\n"
8054 "\tvoid f() { \\\n"
8055 "\t\tsomeFunction( \\\n"
8056 "\t\t parameter1, \\\n"
8057 "\t\t parameter2); \\\n"
8058 "\t}",
8059 Tab);
8060 Tab.TabWidth = 4;
8061 Tab.IndentWidth = 8;
8062 verifyFormat("class TabWidth4Indent8 {\n"
8063 "\t\tvoid f() {\n"
8064 "\t\t\t\tsomeFunction(parameter1,\n"
8065 "\t\t\t\t\t\t\t parameter2);\n"
8066 "\t\t}\n"
8067 "};",
8068 Tab);
8069 Tab.TabWidth = 4;
8070 Tab.IndentWidth = 4;
8071 verifyFormat("class TabWidth4Indent4 {\n"
8072 "\tvoid f() {\n"
8073 "\t\tsomeFunction(parameter1,\n"
8074 "\t\t\t\t\t parameter2);\n"
8075 "\t}\n"
8076 "};",
8077 Tab);
8078 Tab.TabWidth = 8;
8079 Tab.IndentWidth = 4;
8080 verifyFormat("class TabWidth8Indent4 {\n"
8081 " void f() {\n"
8082 "\tsomeFunction(parameter1,\n"
8083 "\t\t parameter2);\n"
8084 " }\n"
8085 "};",
8086 Tab);
8087 Tab.TabWidth = 8;
8088 Tab.IndentWidth = 8;
8089 EXPECT_EQ("/*\n"
8090 "\t a\t\tcomment\n"
8091 "\t in multiple lines\n"
8092 " */",
8093 format(" /*\t \t \n"
8094 " \t \t a\t\tcomment\t \t\n"
8095 " \t \t in multiple lines\t\n"
8096 " \t */",
8097 Tab));
8098 verifyFormat("{\n"
8099 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8100 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8101 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8102 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8103 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8104 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8105 "};",
8106 Tab);
8107 verifyFormat("enum AA {\n"
8108 "\ta1, // Force multiple lines\n"
8109 "\ta2,\n"
8110 "\ta3\n"
8111 "};",
8112 Tab);
8113 EXPECT_EQ("if (aaaaaaaa && // q\n"
8114 " bb) // w\n"
8115 "\t;",
8116 format("if (aaaaaaaa &&// q\n"
8117 "bb)// w\n"
8118 ";",
8119 Tab));
8120 verifyFormat("class X {\n"
8121 "\tvoid f() {\n"
8122 "\t\tsomeFunction(parameter1,\n"
8123 "\t\t\t parameter2);\n"
8124 "\t}\n"
8125 "};",
8126 Tab);
8127 verifyFormat("{\n"
8128 "\tQ(\n"
8129 "\t {\n"
8130 "\t\t int a;\n"
8131 "\t\t someFunction(aaaaaaaa,\n"
8132 "\t\t\t\t bbbbbbb);\n"
8133 "\t },\n"
8134 "\t p);\n"
8135 "}",
8136 Tab);
8137 EXPECT_EQ("{\n"
8138 "\t/* aaaa\n"
8139 "\t bbbb */\n"
8140 "}",
8141 format("{\n"
8142 "/* aaaa\n"
8143 " bbbb */\n"
8144 "}",
8145 Tab));
8146 EXPECT_EQ("{\n"
8147 "\t/*\n"
8148 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8149 "\t bbbbbbbbbbbbb\n"
8150 "\t*/\n"
8151 "}",
8152 format("{\n"
8153 "/*\n"
8154 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8155 "*/\n"
8156 "}",
8157 Tab));
8158 EXPECT_EQ("{\n"
8159 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8160 "\t// bbbbbbbbbbbbb\n"
8161 "}",
8162 format("{\n"
8163 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8164 "}",
8165 Tab));
8166 EXPECT_EQ("{\n"
8167 "\t/*\n"
8168 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8169 "\t bbbbbbbbbbbbb\n"
8170 "\t*/\n"
8171 "}",
8172 format("{\n"
8173 "\t/*\n"
8174 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8175 "\t*/\n"
8176 "}",
8177 Tab));
8178 EXPECT_EQ("{\n"
8179 "\t/*\n"
8180 "\n"
8181 "\t*/\n"
8182 "}",
8183 format("{\n"
8184 "\t/*\n"
8185 "\n"
8186 "\t*/\n"
8187 "}",
8188 Tab));
8189 EXPECT_EQ("{\n"
8190 "\t/*\n"
8191 " asdf\n"
8192 "\t*/\n"
8193 "}",
8194 format("{\n"
8195 "\t/*\n"
8196 " asdf\n"
8197 "\t*/\n"
8198 "}",
8199 Tab));
8200 EXPECT_EQ("/*\n"
8201 "\t a\t\tcomment\n"
8202 "\t in multiple lines\n"
8203 " */",
8204 format(" /*\t \t \n"
8205 " \t \t a\t\tcomment\t \t\n"
8206 " \t \t in multiple lines\t\n"
8207 " \t */",
8208 Tab));
8209 EXPECT_EQ("/* some\n"
8210 " comment */",
8211 format(" \t \t /* some\n"
8212 " \t \t comment */",
8213 Tab));
8214 EXPECT_EQ("int a; /* some\n"
8215 " comment */",
8216 format(" \t \t int a; /* some\n"
8217 " \t \t comment */",
8218 Tab));
8219 EXPECT_EQ("int a; /* some\n"
8220 "comment */",
8221 format(" \t \t int\ta; /* some\n"
8222 " \t \t comment */",
8223 Tab));
8224 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8225 " comment */",
8226 format(" \t \t f(\"\t\t\"); /* some\n"
8227 " \t \t comment */",
8228 Tab));
8229 EXPECT_EQ("{\n"
8230 " /*\n"
8231 " * Comment\n"
8232 " */\n"
8233 " int i;\n"
8234 "}",
8235 format("{\n"
8236 "\t/*\n"
8237 "\t * Comment\n"
8238 "\t */\n"
8239 "\t int i;\n"
8240 "}"));
8241 Tab.AlignConsecutiveAssignments = true;
8242 Tab.AlignConsecutiveDeclarations = true;
8243 Tab.TabWidth = 4;
8244 Tab.IndentWidth = 4;
8245 verifyFormat("class Assign {\n"
8246 "\tvoid f() {\n"
8247 "\t\tint x = 123;\n"
8248 "\t\tint random = 4;\n"
8249 "\t\tstd::string alphabet =\n"
8250 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8251 "\t}\n"
8252 "};",
8253 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008254}
8255
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008256TEST_F(FormatTest, CalculatesOriginalColumn) {
8257 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8258 "q\"; /* some\n"
8259 " comment */",
8260 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8261 "q\"; /* some\n"
8262 " comment */",
8263 getLLVMStyle()));
8264 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8265 "/* some\n"
8266 " comment */",
8267 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8268 " /* some\n"
8269 " comment */",
8270 getLLVMStyle()));
8271 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8272 "qqq\n"
8273 "/* some\n"
8274 " comment */",
8275 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8276 "qqq\n"
8277 " /* some\n"
8278 " comment */",
8279 getLLVMStyle()));
8280 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8281 "wwww; /* some\n"
8282 " comment */",
8283 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8284 "wwww; /* some\n"
8285 " comment */",
8286 getLLVMStyle()));
8287}
8288
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008289TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008290 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008291 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008292
8293 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008294 " continue;",
8295 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008296 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008297 " continue;",
8298 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008299 verifyFormat("if(true)\n"
8300 " f();\n"
8301 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008302 " f();",
8303 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008304 verifyFormat("do {\n"
8305 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008306 "} while(something());",
8307 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008308 verifyFormat("switch(x) {\n"
8309 "default:\n"
8310 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008311 "}",
8312 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008313 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008314 verifyFormat("size_t x = sizeof(x);", NoSpace);
8315 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8316 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8317 verifyFormat("alignas(128) char a[128];", NoSpace);
8318 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8319 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8320 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008321 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008322 verifyFormat("T A::operator()();", NoSpace);
8323 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008324
8325 FormatStyle Space = getLLVMStyle();
8326 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8327
8328 verifyFormat("int f ();", Space);
8329 verifyFormat("void f (int a, T b) {\n"
8330 " while (true)\n"
8331 " continue;\n"
8332 "}",
8333 Space);
8334 verifyFormat("if (true)\n"
8335 " f ();\n"
8336 "else if (true)\n"
8337 " f ();",
8338 Space);
8339 verifyFormat("do {\n"
8340 " do_something ();\n"
8341 "} while (something ());",
8342 Space);
8343 verifyFormat("switch (x) {\n"
8344 "default:\n"
8345 " break;\n"
8346 "}",
8347 Space);
8348 verifyFormat("A::A () : a (1) {}", Space);
8349 verifyFormat("void f () __attribute__ ((asdf));", Space);
8350 verifyFormat("*(&a + 1);\n"
8351 "&((&a)[1]);\n"
8352 "a[(b + c) * d];\n"
8353 "(((a + 1) * 2) + 3) * 4;",
8354 Space);
8355 verifyFormat("#define A(x) x", Space);
8356 verifyFormat("#define A (x) x", Space);
8357 verifyFormat("#if defined(x)\n"
8358 "#endif",
8359 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008360 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008361 verifyFormat("size_t x = sizeof (x);", Space);
8362 verifyFormat("auto f (int x) -> decltype (x);", Space);
8363 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8364 verifyFormat("alignas (128) char a[128];", Space);
8365 verifyFormat("size_t x = alignof (MyType);", Space);
8366 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8367 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008368 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008369 verifyFormat("T A::operator() ();", Space);
8370 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008371}
8372
8373TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8374 FormatStyle Spaces = getLLVMStyle();
8375
8376 Spaces.SpacesInParentheses = true;
8377 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008378 verifyFormat("call();", Spaces);
8379 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008380 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8381 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008382 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008383 " continue;",
8384 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008385 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008386 " continue;",
8387 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008388 verifyFormat("if ( true )\n"
8389 " f();\n"
8390 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008391 " f();",
8392 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008393 verifyFormat("do {\n"
8394 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008395 "} while ( something() );",
8396 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008397 verifyFormat("switch ( x ) {\n"
8398 "default:\n"
8399 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008400 "}",
8401 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008402
8403 Spaces.SpacesInParentheses = false;
8404 Spaces.SpacesInCStyleCastParentheses = true;
8405 verifyFormat("Type *A = ( Type * )P;", Spaces);
8406 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8407 verifyFormat("x = ( int32 )y;", Spaces);
8408 verifyFormat("int a = ( int )(2.0f);", Spaces);
8409 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8410 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8411 verifyFormat("#define x (( int )-1)", Spaces);
8412
Daniel Jasper92e09822015-03-18 12:59:19 +00008413 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008414 Spaces.SpacesInParentheses = false;
8415 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008416 Spaces.SpacesInCStyleCastParentheses = true;
8417 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008418 verifyFormat("call( );", Spaces);
8419 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008420 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008421 " continue;",
8422 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008423 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008424 " continue;",
8425 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008426 verifyFormat("if (true)\n"
8427 " f( );\n"
8428 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008429 " f( );",
8430 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008431 verifyFormat("do {\n"
8432 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008433 "} while (something( ));",
8434 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008435 verifyFormat("switch (x) {\n"
8436 "default:\n"
8437 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008438 "}",
8439 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008440
Daniel Jasper92e09822015-03-18 12:59:19 +00008441 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008442 Spaces.SpaceAfterCStyleCast = true;
8443 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008444 verifyFormat("call( );", Spaces);
8445 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008446 verifyFormat("while (( bool ) 1)\n"
8447 " continue;",
8448 Spaces);
8449 verifyFormat("for (;;)\n"
8450 " continue;",
8451 Spaces);
8452 verifyFormat("if (true)\n"
8453 " f( );\n"
8454 "else if (true)\n"
8455 " f( );",
8456 Spaces);
8457 verifyFormat("do {\n"
8458 " do_something(( int ) i);\n"
8459 "} while (something( ));",
8460 Spaces);
8461 verifyFormat("switch (x) {\n"
8462 "default:\n"
8463 " break;\n"
8464 "}",
8465 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008466
8467 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008468 Spaces.SpacesInCStyleCastParentheses = false;
8469 Spaces.SpaceAfterCStyleCast = true;
8470 verifyFormat("while ((bool) 1)\n"
8471 " continue;",
8472 Spaces);
8473 verifyFormat("do {\n"
8474 " do_something((int) i);\n"
8475 "} while (something( ));",
8476 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008477}
8478
Daniel Jasperad981f82014-08-26 11:41:14 +00008479TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8480 verifyFormat("int a[5];");
8481 verifyFormat("a[3] += 42;");
8482
8483 FormatStyle Spaces = getLLVMStyle();
8484 Spaces.SpacesInSquareBrackets = true;
8485 // Lambdas unchanged.
8486 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8487 verifyFormat("return [i, args...] {};", Spaces);
8488
8489 // Not lambdas.
8490 verifyFormat("int a[ 5 ];", Spaces);
8491 verifyFormat("a[ 3 ] += 42;", Spaces);
8492 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
8493 verifyFormat("double &operator[](int i) { return 0; }\n"
8494 "int i;",
8495 Spaces);
8496 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
8497 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
8498 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
8499}
8500
Daniel Jasperd94bff32013-09-25 15:15:02 +00008501TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
8502 verifyFormat("int a = 5;");
8503 verifyFormat("a += 42;");
8504 verifyFormat("a or_eq 8;");
8505
8506 FormatStyle Spaces = getLLVMStyle();
8507 Spaces.SpaceBeforeAssignmentOperators = false;
8508 verifyFormat("int a= 5;", Spaces);
8509 verifyFormat("a+= 42;", Spaces);
8510 verifyFormat("a or_eq 8;", Spaces);
8511}
8512
Daniel Jaspera44991332015-04-29 13:06:49 +00008513TEST_F(FormatTest, AlignConsecutiveAssignments) {
8514 FormatStyle Alignment = getLLVMStyle();
8515 Alignment.AlignConsecutiveAssignments = false;
8516 verifyFormat("int a = 5;\n"
8517 "int oneTwoThree = 123;",
8518 Alignment);
8519 verifyFormat("int a = 5;\n"
8520 "int oneTwoThree = 123;",
8521 Alignment);
8522
8523 Alignment.AlignConsecutiveAssignments = true;
8524 verifyFormat("int a = 5;\n"
8525 "int oneTwoThree = 123;",
8526 Alignment);
8527 verifyFormat("int a = method();\n"
8528 "int oneTwoThree = 133;",
8529 Alignment);
8530 verifyFormat("a &= 5;\n"
8531 "bcd *= 5;\n"
8532 "ghtyf += 5;\n"
8533 "dvfvdb -= 5;\n"
8534 "a /= 5;\n"
8535 "vdsvsv %= 5;\n"
8536 "sfdbddfbdfbb ^= 5;\n"
8537 "dvsdsv |= 5;\n"
8538 "int dsvvdvsdvvv = 123;",
8539 Alignment);
8540 verifyFormat("int i = 1, j = 10;\n"
8541 "something = 2000;",
8542 Alignment);
8543 verifyFormat("something = 2000;\n"
8544 "int i = 1, j = 10;\n",
8545 Alignment);
8546 verifyFormat("something = 2000;\n"
8547 "another = 911;\n"
8548 "int i = 1, j = 10;\n"
8549 "oneMore = 1;\n"
8550 "i = 2;",
8551 Alignment);
8552 verifyFormat("int a = 5;\n"
8553 "int one = 1;\n"
8554 "method();\n"
8555 "int oneTwoThree = 123;\n"
8556 "int oneTwo = 12;",
8557 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00008558 verifyFormat("int oneTwoThree = 123;\n"
8559 "int oneTwo = 12;\n"
8560 "method();\n",
8561 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008562 verifyFormat("int oneTwoThree = 123; // comment\n"
8563 "int oneTwo = 12; // comment",
8564 Alignment);
8565 EXPECT_EQ("int a = 5;\n"
8566 "\n"
8567 "int oneTwoThree = 123;",
8568 format("int a = 5;\n"
8569 "\n"
8570 "int oneTwoThree= 123;",
8571 Alignment));
8572 EXPECT_EQ("int a = 5;\n"
8573 "int one = 1;\n"
8574 "\n"
8575 "int oneTwoThree = 123;",
8576 format("int a = 5;\n"
8577 "int one = 1;\n"
8578 "\n"
8579 "int oneTwoThree = 123;",
8580 Alignment));
8581 EXPECT_EQ("int a = 5;\n"
8582 "int one = 1;\n"
8583 "\n"
8584 "int oneTwoThree = 123;\n"
8585 "int oneTwo = 12;",
8586 format("int a = 5;\n"
8587 "int one = 1;\n"
8588 "\n"
8589 "int oneTwoThree = 123;\n"
8590 "int oneTwo = 12;",
8591 Alignment));
8592 Alignment.AlignEscapedNewlinesLeft = true;
8593 verifyFormat("#define A \\\n"
8594 " int aaaa = 12; \\\n"
8595 " int b = 23; \\\n"
8596 " int ccc = 234; \\\n"
8597 " int dddddddddd = 2345;",
8598 Alignment);
8599 Alignment.AlignEscapedNewlinesLeft = false;
8600 verifyFormat("#define A "
8601 " \\\n"
8602 " int aaaa = 12; "
8603 " \\\n"
8604 " int b = 23; "
8605 " \\\n"
8606 " int ccc = 234; "
8607 " \\\n"
8608 " int dddddddddd = 2345;",
8609 Alignment);
8610 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8611 "k = 4, int l = 5,\n"
8612 " int m = 6) {\n"
8613 " int j = 10;\n"
8614 " otherThing = 1;\n"
8615 "}",
8616 Alignment);
8617 verifyFormat("void SomeFunction(int parameter = 0) {\n"
8618 " int i = 1;\n"
8619 " int j = 2;\n"
8620 " int big = 10000;\n"
8621 "}",
8622 Alignment);
8623 verifyFormat("class C {\n"
8624 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00008625 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008626 " virtual void f() = 0;\n"
8627 "};",
8628 Alignment);
8629 verifyFormat("int i = 1;\n"
8630 "if (SomeType t = getSomething()) {\n"
8631 "}\n"
8632 "int j = 2;\n"
8633 "int big = 10000;",
8634 Alignment);
8635 verifyFormat("int j = 7;\n"
8636 "for (int k = 0; k < N; ++k) {\n"
8637 "}\n"
8638 "int j = 2;\n"
8639 "int big = 10000;\n"
8640 "}",
8641 Alignment);
8642 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8643 verifyFormat("int i = 1;\n"
8644 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8645 " = someLooooooooooooooooongFunction();\n"
8646 "int j = 2;",
8647 Alignment);
8648 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8649 verifyFormat("int i = 1;\n"
8650 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8651 " someLooooooooooooooooongFunction();\n"
8652 "int j = 2;",
8653 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00008654
8655 verifyFormat("auto lambda = []() {\n"
8656 " auto i = 0;\n"
8657 " return 0;\n"
8658 "};\n"
8659 "int i = 0;\n"
8660 "auto v = type{\n"
8661 " i = 1, //\n"
8662 " (i = 2), //\n"
8663 " i = 3 //\n"
8664 "};",
8665 Alignment);
8666
Daniel Jaspera44991332015-04-29 13:06:49 +00008667 // FIXME: Should align all three assignments
8668 verifyFormat(
8669 "int i = 1;\n"
8670 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
8671 " loooooooooooooooooooooongParameterB);\n"
8672 "int j = 2;",
8673 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00008674
8675 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
8676 " typename B = very_long_type_name_1,\n"
8677 " typename T_2 = very_long_type_name_2>\n"
8678 "auto foo() {}\n",
8679 Alignment);
8680 verifyFormat("int a, b = 1;\n"
8681 "int c = 2;\n"
8682 "int dd = 3;\n",
8683 Alignment);
8684 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8685 "float b[1][] = {{3.f}};\n",
8686 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008687}
8688
Daniel Jaspere12597c2015-10-01 10:06:54 +00008689TEST_F(FormatTest, AlignConsecutiveDeclarations) {
8690 FormatStyle Alignment = getLLVMStyle();
8691 Alignment.AlignConsecutiveDeclarations = false;
8692 verifyFormat("float const a = 5;\n"
8693 "int oneTwoThree = 123;",
8694 Alignment);
8695 verifyFormat("int a = 5;\n"
8696 "float const oneTwoThree = 123;",
8697 Alignment);
8698
8699 Alignment.AlignConsecutiveDeclarations = true;
8700 verifyFormat("float const a = 5;\n"
8701 "int oneTwoThree = 123;",
8702 Alignment);
8703 verifyFormat("int a = method();\n"
8704 "float const oneTwoThree = 133;",
8705 Alignment);
8706 verifyFormat("int i = 1, j = 10;\n"
8707 "something = 2000;",
8708 Alignment);
8709 verifyFormat("something = 2000;\n"
8710 "int i = 1, j = 10;\n",
8711 Alignment);
8712 verifyFormat("float something = 2000;\n"
8713 "double another = 911;\n"
8714 "int i = 1, j = 10;\n"
8715 "const int *oneMore = 1;\n"
8716 "unsigned i = 2;",
8717 Alignment);
8718 verifyFormat("float a = 5;\n"
8719 "int one = 1;\n"
8720 "method();\n"
8721 "const double oneTwoThree = 123;\n"
8722 "const unsigned int oneTwo = 12;",
8723 Alignment);
8724 verifyFormat("int oneTwoThree{0}; // comment\n"
8725 "unsigned oneTwo; // comment",
8726 Alignment);
8727 EXPECT_EQ("float const a = 5;\n"
8728 "\n"
8729 "int oneTwoThree = 123;",
8730 format("float const a = 5;\n"
8731 "\n"
8732 "int oneTwoThree= 123;",
8733 Alignment));
8734 EXPECT_EQ("float a = 5;\n"
8735 "int one = 1;\n"
8736 "\n"
8737 "unsigned oneTwoThree = 123;",
8738 format("float a = 5;\n"
8739 "int one = 1;\n"
8740 "\n"
8741 "unsigned oneTwoThree = 123;",
8742 Alignment));
8743 EXPECT_EQ("float a = 5;\n"
8744 "int one = 1;\n"
8745 "\n"
8746 "unsigned oneTwoThree = 123;\n"
8747 "int oneTwo = 12;",
8748 format("float a = 5;\n"
8749 "int one = 1;\n"
8750 "\n"
8751 "unsigned oneTwoThree = 123;\n"
8752 "int oneTwo = 12;",
8753 Alignment));
8754 Alignment.AlignConsecutiveAssignments = true;
8755 verifyFormat("float something = 2000;\n"
8756 "double another = 911;\n"
8757 "int i = 1, j = 10;\n"
8758 "const int *oneMore = 1;\n"
8759 "unsigned i = 2;",
8760 Alignment);
8761 verifyFormat("int oneTwoThree = {0}; // comment\n"
8762 "unsigned oneTwo = 0; // comment",
8763 Alignment);
8764 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
8765 " int const i = 1;\n"
8766 " int * j = 2;\n"
8767 " int big = 10000;\n"
8768 "\n"
8769 " unsigned oneTwoThree = 123;\n"
8770 " int oneTwo = 12;\n"
8771 " method();\n"
8772 " float k = 2;\n"
8773 " int ll = 10000;\n"
8774 "}",
8775 format("void SomeFunction(int parameter= 0) {\n"
8776 " int const i= 1;\n"
8777 " int *j=2;\n"
8778 " int big = 10000;\n"
8779 "\n"
8780 "unsigned oneTwoThree =123;\n"
8781 "int oneTwo = 12;\n"
8782 " method();\n"
8783 "float k= 2;\n"
8784 "int ll=10000;\n"
8785 "}",
8786 Alignment));
8787 Alignment.AlignConsecutiveAssignments = false;
8788 Alignment.AlignEscapedNewlinesLeft = true;
8789 verifyFormat("#define A \\\n"
8790 " int aaaa = 12; \\\n"
8791 " float b = 23; \\\n"
8792 " const int ccc = 234; \\\n"
8793 " unsigned dddddddddd = 2345;",
8794 Alignment);
8795 Alignment.AlignEscapedNewlinesLeft = false;
8796 Alignment.ColumnLimit = 30;
8797 verifyFormat("#define A \\\n"
8798 " int aaaa = 12; \\\n"
8799 " float b = 23; \\\n"
8800 " const int ccc = 234; \\\n"
8801 " int dddddddddd = 2345;",
8802 Alignment);
8803 Alignment.ColumnLimit = 80;
8804 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8805 "k = 4, int l = 5,\n"
8806 " int m = 6) {\n"
8807 " const int j = 10;\n"
8808 " otherThing = 1;\n"
8809 "}",
8810 Alignment);
8811 verifyFormat("void SomeFunction(int parameter = 0) {\n"
8812 " int const i = 1;\n"
8813 " int * j = 2;\n"
8814 " int big = 10000;\n"
8815 "}",
8816 Alignment);
8817 verifyFormat("class C {\n"
8818 "public:\n"
8819 " int i = 1;\n"
8820 " virtual void f() = 0;\n"
8821 "};",
8822 Alignment);
8823 verifyFormat("float i = 1;\n"
8824 "if (SomeType t = getSomething()) {\n"
8825 "}\n"
8826 "const unsigned j = 2;\n"
8827 "int big = 10000;",
8828 Alignment);
8829 verifyFormat("float j = 7;\n"
8830 "for (int k = 0; k < N; ++k) {\n"
8831 "}\n"
8832 "unsigned j = 2;\n"
8833 "int big = 10000;\n"
8834 "}",
8835 Alignment);
8836 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8837 verifyFormat("float i = 1;\n"
8838 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8839 " = someLooooooooooooooooongFunction();\n"
8840 "int j = 2;",
8841 Alignment);
8842 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8843 verifyFormat("int i = 1;\n"
8844 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8845 " someLooooooooooooooooongFunction();\n"
8846 "int j = 2;",
8847 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00008848
8849 Alignment.AlignConsecutiveAssignments = true;
8850 verifyFormat("auto lambda = []() {\n"
8851 " auto ii = 0;\n"
8852 " float j = 0;\n"
8853 " return 0;\n"
8854 "};\n"
8855 "int i = 0;\n"
8856 "float i2 = 0;\n"
8857 "auto v = type{\n"
8858 " i = 1, //\n"
8859 " (i = 2), //\n"
8860 " i = 3 //\n"
8861 "};",
8862 Alignment);
8863 Alignment.AlignConsecutiveAssignments = false;
8864
Daniel Jaspere12597c2015-10-01 10:06:54 +00008865 // FIXME: Should align all three declarations
8866 verifyFormat(
8867 "int i = 1;\n"
8868 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
8869 " loooooooooooooooooooooongParameterB);\n"
8870 "int j = 2;",
8871 Alignment);
8872
8873 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
8874 // We expect declarations and assignments to align, as long as it doesn't
8875 // exceed the column limit, starting a new alignemnt sequence whenever it
8876 // happens.
8877 Alignment.AlignConsecutiveAssignments = true;
8878 Alignment.ColumnLimit = 30;
8879 verifyFormat("float ii = 1;\n"
8880 "unsigned j = 2;\n"
8881 "int someVerylongVariable = 1;\n"
8882 "AnotherLongType ll = 123456;\n"
8883 "VeryVeryLongType k = 2;\n"
8884 "int myvar = 1;",
8885 Alignment);
8886 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00008887 Alignment.AlignConsecutiveAssignments = false;
8888
8889 verifyFormat(
8890 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
8891 " typename LongType, typename B>\n"
8892 "auto foo() {}\n",
8893 Alignment);
8894 verifyFormat("float a, b = 1;\n"
8895 "int c = 2;\n"
8896 "int dd = 3;\n",
8897 Alignment);
8898 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8899 "float b[1][] = {{3.f}};\n",
8900 Alignment);
8901 Alignment.AlignConsecutiveAssignments = true;
8902 verifyFormat("float a, b = 1;\n"
8903 "int c = 2;\n"
8904 "int dd = 3;\n",
8905 Alignment);
8906 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8907 "float b[1][] = {{3.f}};\n",
8908 Alignment);
8909 Alignment.AlignConsecutiveAssignments = false;
8910
8911 Alignment.ColumnLimit = 30;
8912 Alignment.BinPackParameters = false;
8913 verifyFormat("void foo(float a,\n"
8914 " float b,\n"
8915 " int c,\n"
8916 " uint32_t *d) {\n"
8917 " int * e = 0;\n"
8918 " float f = 0;\n"
8919 " double g = 0;\n"
8920 "}\n"
8921 "void bar(ino_t a,\n"
8922 " int b,\n"
8923 " uint32_t *c,\n"
8924 " bool d) {}\n",
8925 Alignment);
8926 Alignment.BinPackParameters = true;
8927 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00008928}
8929
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008930TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008931 FormatStyle LinuxBraceStyle = getLLVMStyle();
8932 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008933 verifyFormat("namespace a\n"
8934 "{\n"
8935 "class A\n"
8936 "{\n"
8937 " void f()\n"
8938 " {\n"
8939 " if (true) {\n"
8940 " a();\n"
8941 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00008942 " } else {\n"
8943 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008944 " }\n"
8945 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008946 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008947 "};\n"
8948 "struct B {\n"
8949 " int x;\n"
8950 "};\n"
8951 "}\n",
8952 LinuxBraceStyle);
8953 verifyFormat("enum X {\n"
8954 " Y = 0,\n"
8955 "}\n",
8956 LinuxBraceStyle);
8957 verifyFormat("struct S {\n"
8958 " int Type;\n"
8959 " union {\n"
8960 " int x;\n"
8961 " double y;\n"
8962 " } Value;\n"
8963 " class C\n"
8964 " {\n"
8965 " MyFavoriteType Value;\n"
8966 " } Class;\n"
8967 "}\n",
8968 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008969}
8970
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00008971TEST_F(FormatTest, MozillaBraceBreaking) {
8972 FormatStyle MozillaBraceStyle = getLLVMStyle();
8973 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
8974 verifyFormat("namespace a {\n"
8975 "class A\n"
8976 "{\n"
8977 " void f()\n"
8978 " {\n"
8979 " if (true) {\n"
8980 " a();\n"
8981 " b();\n"
8982 " }\n"
8983 " }\n"
8984 " void g() { return; }\n"
8985 "};\n"
8986 "enum E\n"
8987 "{\n"
8988 " A,\n"
8989 " // foo\n"
8990 " B,\n"
8991 " C\n"
8992 "};\n"
8993 "struct B\n"
8994 "{\n"
8995 " int x;\n"
8996 "};\n"
8997 "}\n",
8998 MozillaBraceStyle);
8999 verifyFormat("struct S\n"
9000 "{\n"
9001 " int Type;\n"
9002 " union\n"
9003 " {\n"
9004 " int x;\n"
9005 " double y;\n"
9006 " } Value;\n"
9007 " class C\n"
9008 " {\n"
9009 " MyFavoriteType Value;\n"
9010 " } Class;\n"
9011 "}\n",
9012 MozillaBraceStyle);
9013}
9014
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009015TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009016 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9017 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009018 verifyFormat("namespace a {\n"
9019 "class A {\n"
9020 " void f()\n"
9021 " {\n"
9022 " if (true) {\n"
9023 " a();\n"
9024 " b();\n"
9025 " }\n"
9026 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009027 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009028 "};\n"
9029 "struct B {\n"
9030 " int x;\n"
9031 "};\n"
9032 "}\n",
9033 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009034
Daniel Jasperd9670872014-08-05 12:06:20 +00009035 verifyFormat("void foo()\n"
9036 "{\n"
9037 " if (a) {\n"
9038 " a();\n"
9039 " }\n"
9040 " else {\n"
9041 " b();\n"
9042 " }\n"
9043 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009044 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009045
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009046 verifyFormat("#ifdef _DEBUG\n"
9047 "int foo(int i = 0)\n"
9048 "#else\n"
9049 "int foo(int i = 5)\n"
9050 "#endif\n"
9051 "{\n"
9052 " return i;\n"
9053 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009054 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009055
9056 verifyFormat("void foo() {}\n"
9057 "void bar()\n"
9058 "#ifdef _DEBUG\n"
9059 "{\n"
9060 " foo();\n"
9061 "}\n"
9062 "#else\n"
9063 "{\n"
9064 "}\n"
9065 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009066 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009067
9068 verifyFormat("void foobar() { int i = 5; }\n"
9069 "#ifdef _DEBUG\n"
9070 "void bar() {}\n"
9071 "#else\n"
9072 "void bar() { foobar(); }\n"
9073 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009074 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009075}
9076
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009077TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009078 FormatStyle AllmanBraceStyle = getLLVMStyle();
9079 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009080 verifyFormat("namespace a\n"
9081 "{\n"
9082 "class A\n"
9083 "{\n"
9084 " void f()\n"
9085 " {\n"
9086 " if (true)\n"
9087 " {\n"
9088 " a();\n"
9089 " b();\n"
9090 " }\n"
9091 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009092 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009093 "};\n"
9094 "struct B\n"
9095 "{\n"
9096 " int x;\n"
9097 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009098 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009099 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009100
9101 verifyFormat("void f()\n"
9102 "{\n"
9103 " if (true)\n"
9104 " {\n"
9105 " a();\n"
9106 " }\n"
9107 " else if (false)\n"
9108 " {\n"
9109 " b();\n"
9110 " }\n"
9111 " else\n"
9112 " {\n"
9113 " c();\n"
9114 " }\n"
9115 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009116 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009117
9118 verifyFormat("void f()\n"
9119 "{\n"
9120 " for (int i = 0; i < 10; ++i)\n"
9121 " {\n"
9122 " a();\n"
9123 " }\n"
9124 " while (false)\n"
9125 " {\n"
9126 " b();\n"
9127 " }\n"
9128 " do\n"
9129 " {\n"
9130 " c();\n"
9131 " } while (false)\n"
9132 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009133 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009134
9135 verifyFormat("void f(int a)\n"
9136 "{\n"
9137 " switch (a)\n"
9138 " {\n"
9139 " case 0:\n"
9140 " break;\n"
9141 " case 1:\n"
9142 " {\n"
9143 " break;\n"
9144 " }\n"
9145 " case 2:\n"
9146 " {\n"
9147 " }\n"
9148 " break;\n"
9149 " default:\n"
9150 " break;\n"
9151 " }\n"
9152 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009153 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009154
9155 verifyFormat("enum X\n"
9156 "{\n"
9157 " Y = 0,\n"
9158 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009159 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009160 verifyFormat("enum X\n"
9161 "{\n"
9162 " Y = 0\n"
9163 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009164 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009165
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009166 verifyFormat("@interface BSApplicationController ()\n"
9167 "{\n"
9168 "@private\n"
9169 " id _extraIvar;\n"
9170 "}\n"
9171 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009172 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009173
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009174 verifyFormat("#ifdef _DEBUG\n"
9175 "int foo(int i = 0)\n"
9176 "#else\n"
9177 "int foo(int i = 5)\n"
9178 "#endif\n"
9179 "{\n"
9180 " return i;\n"
9181 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009182 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009183
9184 verifyFormat("void foo() {}\n"
9185 "void bar()\n"
9186 "#ifdef _DEBUG\n"
9187 "{\n"
9188 " foo();\n"
9189 "}\n"
9190 "#else\n"
9191 "{\n"
9192 "}\n"
9193 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009194 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009195
9196 verifyFormat("void foobar() { int i = 5; }\n"
9197 "#ifdef _DEBUG\n"
9198 "void bar() {}\n"
9199 "#else\n"
9200 "void bar() { foobar(); }\n"
9201 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009202 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009203
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009204 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009205 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009206 " // ...\n"
9207 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009208 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009209 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009210 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009211 " // ...\n"
9212 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009213 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009214 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009215 // .. or dict literals.
9216 verifyFormat("void f()\n"
9217 "{\n"
9218 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
9219 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009220 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009221 verifyFormat("int f()\n"
9222 "{ // comment\n"
9223 " return 42;\n"
9224 "}",
9225 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009226
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009227 AllmanBraceStyle.ColumnLimit = 19;
9228 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9229 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009230 verifyFormat("void f()\n"
9231 "{\n"
9232 " int i;\n"
9233 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009234 AllmanBraceStyle);
9235 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009236
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009237 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009238 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9239 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9240 verifyFormat("void f(bool b)\n"
9241 "{\n"
9242 " if (b)\n"
9243 " {\n"
9244 " return;\n"
9245 " }\n"
9246 "}\n",
9247 BreakBeforeBraceShortIfs);
9248 verifyFormat("void f(bool b)\n"
9249 "{\n"
9250 " if (b) return;\n"
9251 "}\n",
9252 BreakBeforeBraceShortIfs);
9253 verifyFormat("void f(bool b)\n"
9254 "{\n"
9255 " while (b)\n"
9256 " {\n"
9257 " return;\n"
9258 " }\n"
9259 "}\n",
9260 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009261}
9262
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009263TEST_F(FormatTest, GNUBraceBreaking) {
9264 FormatStyle GNUBraceStyle = getLLVMStyle();
9265 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9266 verifyFormat("namespace a\n"
9267 "{\n"
9268 "class A\n"
9269 "{\n"
9270 " void f()\n"
9271 " {\n"
9272 " int a;\n"
9273 " {\n"
9274 " int b;\n"
9275 " }\n"
9276 " if (true)\n"
9277 " {\n"
9278 " a();\n"
9279 " b();\n"
9280 " }\n"
9281 " }\n"
9282 " void g() { return; }\n"
9283 "}\n"
9284 "}",
9285 GNUBraceStyle);
9286
9287 verifyFormat("void f()\n"
9288 "{\n"
9289 " if (true)\n"
9290 " {\n"
9291 " a();\n"
9292 " }\n"
9293 " else if (false)\n"
9294 " {\n"
9295 " b();\n"
9296 " }\n"
9297 " else\n"
9298 " {\n"
9299 " c();\n"
9300 " }\n"
9301 "}\n",
9302 GNUBraceStyle);
9303
9304 verifyFormat("void f()\n"
9305 "{\n"
9306 " for (int i = 0; i < 10; ++i)\n"
9307 " {\n"
9308 " a();\n"
9309 " }\n"
9310 " while (false)\n"
9311 " {\n"
9312 " b();\n"
9313 " }\n"
9314 " do\n"
9315 " {\n"
9316 " c();\n"
9317 " }\n"
9318 " while (false);\n"
9319 "}\n",
9320 GNUBraceStyle);
9321
9322 verifyFormat("void f(int a)\n"
9323 "{\n"
9324 " switch (a)\n"
9325 " {\n"
9326 " case 0:\n"
9327 " break;\n"
9328 " case 1:\n"
9329 " {\n"
9330 " break;\n"
9331 " }\n"
9332 " case 2:\n"
9333 " {\n"
9334 " }\n"
9335 " break;\n"
9336 " default:\n"
9337 " break;\n"
9338 " }\n"
9339 "}\n",
9340 GNUBraceStyle);
9341
9342 verifyFormat("enum X\n"
9343 "{\n"
9344 " Y = 0,\n"
9345 "}\n",
9346 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009347
9348 verifyFormat("@interface BSApplicationController ()\n"
9349 "{\n"
9350 "@private\n"
9351 " id _extraIvar;\n"
9352 "}\n"
9353 "@end\n",
9354 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009355
9356 verifyFormat("#ifdef _DEBUG\n"
9357 "int foo(int i = 0)\n"
9358 "#else\n"
9359 "int foo(int i = 5)\n"
9360 "#endif\n"
9361 "{\n"
9362 " return i;\n"
9363 "}",
9364 GNUBraceStyle);
9365
9366 verifyFormat("void foo() {}\n"
9367 "void bar()\n"
9368 "#ifdef _DEBUG\n"
9369 "{\n"
9370 " foo();\n"
9371 "}\n"
9372 "#else\n"
9373 "{\n"
9374 "}\n"
9375 "#endif",
9376 GNUBraceStyle);
9377
9378 verifyFormat("void foobar() { int i = 5; }\n"
9379 "#ifdef _DEBUG\n"
9380 "void bar() {}\n"
9381 "#else\n"
9382 "void bar() { foobar(); }\n"
9383 "#endif",
9384 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009385}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009386
9387TEST_F(FormatTest, WebKitBraceBreaking) {
9388 FormatStyle WebKitBraceStyle = getLLVMStyle();
9389 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
9390 verifyFormat("namespace a {\n"
9391 "class A {\n"
9392 " void f()\n"
9393 " {\n"
9394 " if (true) {\n"
9395 " a();\n"
9396 " b();\n"
9397 " }\n"
9398 " }\n"
9399 " void g() { return; }\n"
9400 "};\n"
9401 "enum E {\n"
9402 " A,\n"
9403 " // foo\n"
9404 " B,\n"
9405 " C\n"
9406 "};\n"
9407 "struct B {\n"
9408 " int x;\n"
9409 "};\n"
9410 "}\n",
9411 WebKitBraceStyle);
9412 verifyFormat("struct S {\n"
9413 " int Type;\n"
9414 " union {\n"
9415 " int x;\n"
9416 " double y;\n"
9417 " } Value;\n"
9418 " class C {\n"
9419 " MyFavoriteType Value;\n"
9420 " } Class;\n"
9421 "};\n",
9422 WebKitBraceStyle);
9423}
9424
Manuel Klimekd5735502013-08-12 03:51:17 +00009425TEST_F(FormatTest, CatchExceptionReferenceBinding) {
9426 verifyFormat("void f() {\n"
9427 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00009428 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00009429 " }\n"
9430 "}\n",
9431 getLLVMStyle());
9432}
9433
Daniel Jasper9613c812013-08-07 16:29:23 +00009434TEST_F(FormatTest, UnderstandsPragmas) {
9435 verifyFormat("#pragma omp reduction(| : var)");
9436 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00009437
9438 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
9439 "(including parentheses).",
9440 format("#pragma mark Any non-hyphenated or hyphenated string "
9441 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +00009442}
9443
Daniel Jasperee4a8a12015-04-22 09:45:42 +00009444TEST_F(FormatTest, UnderstandPragmaOption) {
9445 verifyFormat("#pragma option -C -A");
9446
9447 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
9448}
9449
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009450#define EXPECT_ALL_STYLES_EQUAL(Styles) \
9451 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +00009452 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
9453 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +00009454
9455TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009456 SmallVector<FormatStyle, 3> Styles;
9457 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009458
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009459 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009460 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
9461 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
9462 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009463
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009464 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009465 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
9466 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
9467 EXPECT_ALL_STYLES_EQUAL(Styles);
9468
Nico Weber514ecc82014-02-02 20:50:45 +00009469 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009470 EXPECT_TRUE(
9471 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
9472 EXPECT_TRUE(
9473 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
9474 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009475
Nico Weber514ecc82014-02-02 20:50:45 +00009476 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009477 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
9478 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
9479 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009480
9481 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009482 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
9483 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
9484 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009485
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009486 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009487 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
9488 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
9489 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009490
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +00009491 Styles[0] = getGNUStyle();
9492 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
9493 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
9494 EXPECT_ALL_STYLES_EQUAL(Styles);
9495
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009496 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
9497}
9498
9499TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
9500 SmallVector<FormatStyle, 8> Styles;
9501 Styles.resize(2);
9502
9503 Styles[0] = getGoogleStyle();
9504 Styles[1] = getLLVMStyle();
9505 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9506 EXPECT_ALL_STYLES_EQUAL(Styles);
9507
9508 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +00009509 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009510 Styles[1] = getLLVMStyle();
9511 Styles[1].Language = FormatStyle::LK_JavaScript;
9512 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9513
9514 Styles[2] = getLLVMStyle();
9515 Styles[2].Language = FormatStyle::LK_JavaScript;
9516 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
9517 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009518 &Styles[2])
9519 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009520
9521 Styles[3] = getLLVMStyle();
9522 Styles[3].Language = FormatStyle::LK_JavaScript;
9523 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
9524 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009525 &Styles[3])
9526 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009527
9528 Styles[4] = getLLVMStyle();
9529 Styles[4].Language = FormatStyle::LK_JavaScript;
9530 EXPECT_EQ(0, parseConfiguration("---\n"
9531 "BasedOnStyle: LLVM\n"
9532 "IndentWidth: 123\n"
9533 "---\n"
9534 "BasedOnStyle: Google\n"
9535 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009536 &Styles[4])
9537 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009538 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009539}
9540
Daniel Jasper91881d92014-09-29 08:07:46 +00009541#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +00009542 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +00009543 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009544 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +00009545 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +00009546 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009547
Daniel Jasper91881d92014-09-29 08:07:46 +00009548#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
9549
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009550#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
9551 Style.STRUCT.FIELD = false; \
9552 EXPECT_EQ(0, \
9553 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
9554 .value()); \
9555 EXPECT_TRUE(Style.STRUCT.FIELD); \
9556 EXPECT_EQ(0, \
9557 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
9558 .value()); \
9559 EXPECT_FALSE(Style.STRUCT.FIELD);
9560
9561#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
9562 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
9563
Daniel Jasper00853002014-09-16 16:22:30 +00009564#define CHECK_PARSE(TEXT, FIELD, VALUE) \
9565 EXPECT_NE(VALUE, Style.FIELD); \
9566 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
9567 EXPECT_EQ(VALUE, Style.FIELD)
9568
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009569TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009570 FormatStyle Style = {};
9571 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009572 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +00009573 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +00009574 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +00009575 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009576 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009577 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +00009578 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +00009579 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009580 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +00009581 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00009582 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +00009583 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00009584 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00009585 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +00009586 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00009587 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00009588 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009589 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +00009590 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +00009591 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +00009592 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009593 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00009594 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +00009595 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +00009596 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009597 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +00009598 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +00009599 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +00009600 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009601 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +00009602 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009603 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009604 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +00009605 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009606 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009607 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00009608 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +00009609 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009610
9611 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
9612 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
9613 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
9614 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
9615 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
9616 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
9617 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
9618 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
9619 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
9620 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
9621 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009622}
Alexander Kornienkod6538332013-05-07 15:32:14 +00009623
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009624#undef CHECK_PARSE_BOOL
9625
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009626TEST_F(FormatTest, ParsesConfiguration) {
9627 FormatStyle Style = {};
9628 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009629 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009630 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
9631 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +00009632 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009633 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
9634 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +00009635 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
9636 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009637 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
9638 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
9639 PenaltyReturnTypeOnItsOwnLine, 1234u);
9640 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
9641 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +00009642 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +00009643 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00009644 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +00009645
Daniel Jasper553d4872014-06-17 12:40:34 +00009646 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +00009647 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
9648 FormatStyle::PAS_Left);
9649 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
9650 FormatStyle::PAS_Right);
9651 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
9652 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +00009653 // For backward compatibility:
9654 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
9655 FormatStyle::PAS_Left);
9656 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
9657 FormatStyle::PAS_Right);
9658 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
9659 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +00009660
Alexander Kornienkod6538332013-05-07 15:32:14 +00009661 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +00009662 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
9663 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009664 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
9665 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
9666 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
9667
Daniel Jasperac043c92014-09-15 11:11:00 +00009668 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +00009669 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
9670 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +00009671 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
9672 FormatStyle::BOS_None);
9673 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
9674 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00009675 // For backward compatibility:
9676 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
9677 FormatStyle::BOS_None);
9678 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
9679 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +00009680
Daniel Jasper6501f7e2015-10-27 12:38:37 +00009681 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9682 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
9683 FormatStyle::BAS_Align);
9684 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
9685 FormatStyle::BAS_DontAlign);
9686 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
9687 FormatStyle::BAS_AlwaysBreak);
9688 // For backward compatibility:
9689 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
9690 FormatStyle::BAS_DontAlign);
9691 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
9692 FormatStyle::BAS_Align);
9693
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009694 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009695 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
9696 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
9697 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00009698 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
9699 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +00009700 // For backward compatibility:
9701 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
9702 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009703
Daniel Jasperd74cf402014-04-08 12:46:38 +00009704 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +00009705 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
9706 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
9707 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
9708 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +00009709 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
9710 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +00009711 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
9712 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00009713 // For backward compatibility:
9714 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
9715 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
9716 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
9717 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +00009718
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009719 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
9720 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
9721 FormatStyle::SBPO_Never);
9722 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
9723 FormatStyle::SBPO_Always);
9724 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
9725 FormatStyle::SBPO_ControlStatements);
9726 // For backward compatibility:
9727 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
9728 FormatStyle::SBPO_Never);
9729 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
9730 FormatStyle::SBPO_ControlStatements);
9731
Alexander Kornienkod6538332013-05-07 15:32:14 +00009732 Style.ColumnLimit = 123;
9733 FormatStyle BaseStyle = getLLVMStyle();
9734 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
9735 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
9736
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009737 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
9738 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
9739 FormatStyle::BS_Attach);
9740 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
9741 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009742 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
9743 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009744 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
9745 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009746 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
9747 FormatStyle::BS_Allman);
9748 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009749 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
9750 FormatStyle::BS_WebKit);
9751 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
9752 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009753
Zachary Turner448592e2015-12-18 22:20:15 +00009754 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
9755 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
9756 FormatStyle::RTBS_None);
9757 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
9758 FormatStyle::RTBS_All);
9759 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +00009760 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +00009761 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
9762 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
9763 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
9764 AlwaysBreakAfterReturnType,
9765 FormatStyle::RTBS_TopLevelDefinitions);
9766
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00009767 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
9768 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
9769 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
9770 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
9771 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
9772 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
9773 AlwaysBreakAfterDefinitionReturnType,
9774 FormatStyle::DRTBS_TopLevel);
9775
Daniel Jasper65ee3472013-07-31 23:16:02 +00009776 Style.NamespaceIndentation = FormatStyle::NI_All;
9777 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
9778 FormatStyle::NI_None);
9779 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
9780 FormatStyle::NI_Inner);
9781 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
9782 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +00009783
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00009784 // FIXME: This is required because parsing a configuration simply overwrites
9785 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +00009786 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +00009787 std::vector<std::string> BoostForeach;
9788 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00009789 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +00009790 std::vector<std::string> BoostAndQForeach;
9791 BoostAndQForeach.push_back("BOOST_FOREACH");
9792 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00009793 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
9794 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00009795
9796 Style.IncludeCategories.clear();
9797 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
9798 {".*", 1}};
9799 CHECK_PARSE("IncludeCategories:\n"
9800 " - Regex: abc/.*\n"
9801 " Priority: 2\n"
9802 " - Regex: .*\n"
9803 " Priority: 1",
9804 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00009805 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009806}
9807
9808TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
9809 FormatStyle Style = {};
9810 Style.Language = FormatStyle::LK_Cpp;
9811 CHECK_PARSE("Language: Cpp\n"
9812 "IndentWidth: 12",
9813 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +00009814 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
9815 "IndentWidth: 34",
9816 &Style),
9817 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009818 EXPECT_EQ(12u, Style.IndentWidth);
9819 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
9820 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
9821
9822 Style.Language = FormatStyle::LK_JavaScript;
9823 CHECK_PARSE("Language: JavaScript\n"
9824 "IndentWidth: 12",
9825 IndentWidth, 12u);
9826 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +00009827 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
9828 "IndentWidth: 34",
9829 &Style),
9830 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009831 EXPECT_EQ(23u, Style.IndentWidth);
9832 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
9833 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
9834
9835 CHECK_PARSE("BasedOnStyle: LLVM\n"
9836 "IndentWidth: 67",
9837 IndentWidth, 67u);
9838
9839 CHECK_PARSE("---\n"
9840 "Language: JavaScript\n"
9841 "IndentWidth: 12\n"
9842 "---\n"
9843 "Language: Cpp\n"
9844 "IndentWidth: 34\n"
9845 "...\n",
9846 IndentWidth, 12u);
9847
9848 Style.Language = FormatStyle::LK_Cpp;
9849 CHECK_PARSE("---\n"
9850 "Language: JavaScript\n"
9851 "IndentWidth: 12\n"
9852 "---\n"
9853 "Language: Cpp\n"
9854 "IndentWidth: 34\n"
9855 "...\n",
9856 IndentWidth, 34u);
9857 CHECK_PARSE("---\n"
9858 "IndentWidth: 78\n"
9859 "---\n"
9860 "Language: JavaScript\n"
9861 "IndentWidth: 56\n"
9862 "...\n",
9863 IndentWidth, 78u);
9864
9865 Style.ColumnLimit = 123;
9866 Style.IndentWidth = 234;
9867 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
9868 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +00009869 EXPECT_FALSE(parseConfiguration("---\n"
9870 "IndentWidth: 456\n"
9871 "BreakBeforeBraces: Allman\n"
9872 "---\n"
9873 "Language: JavaScript\n"
9874 "IndentWidth: 111\n"
9875 "TabWidth: 111\n"
9876 "---\n"
9877 "Language: Cpp\n"
9878 "BreakBeforeBraces: Stroustrup\n"
9879 "TabWidth: 789\n"
9880 "...\n",
9881 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009882 EXPECT_EQ(123u, Style.ColumnLimit);
9883 EXPECT_EQ(456u, Style.IndentWidth);
9884 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
9885 EXPECT_EQ(789u, Style.TabWidth);
9886
Rafael Espindola1f243172014-06-12 11:35:17 +00009887 EXPECT_EQ(parseConfiguration("---\n"
9888 "Language: JavaScript\n"
9889 "IndentWidth: 56\n"
9890 "---\n"
9891 "IndentWidth: 78\n"
9892 "...\n",
9893 &Style),
9894 ParseError::Error);
9895 EXPECT_EQ(parseConfiguration("---\n"
9896 "Language: JavaScript\n"
9897 "IndentWidth: 56\n"
9898 "---\n"
9899 "Language: JavaScript\n"
9900 "IndentWidth: 78\n"
9901 "...\n",
9902 &Style),
9903 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009904
9905 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
9906}
Daniel Jasper65ee3472013-07-31 23:16:02 +00009907
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009908#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009909
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009910TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
9911 FormatStyle Style = {};
9912 Style.Language = FormatStyle::LK_JavaScript;
9913 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009914 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00009915 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009916
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009917 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009918 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009919 "BasedOnStyle: Google\n"
9920 "---\n"
9921 "Language: JavaScript\n"
9922 "IndentWidth: 76\n"
9923 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009924 &Style)
9925 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00009926 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009927 EXPECT_EQ(76u, Style.IndentWidth);
9928 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
9929}
9930
Alexander Kornienkod6538332013-05-07 15:32:14 +00009931TEST_F(FormatTest, ConfigurationRoundTripTest) {
9932 FormatStyle Style = getLLVMStyle();
9933 std::string YAML = configurationAsText(Style);
9934 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009935 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009936 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
9937 EXPECT_EQ(Style, ParsedStyle);
9938}
9939
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009940TEST_F(FormatTest, WorksFor8bitEncodings) {
9941 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
9942 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
9943 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
9944 "\"\xef\xee\xf0\xf3...\"",
9945 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
9946 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
9947 "\xef\xee\xf0\xf3...\"",
9948 getLLVMStyleWithColumns(12)));
9949}
9950
Alexander Kornienko393e3082013-11-13 14:04:17 +00009951TEST_F(FormatTest, HandlesUTF8BOM) {
9952 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
9953 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
9954 format("\xef\xbb\xbf#include <iostream>"));
9955 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
9956 format("\xef\xbb\xbf\n#include <iostream>"));
9957}
9958
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +00009959// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
9960#if !defined(_MSC_VER)
9961
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009962TEST_F(FormatTest, CountsUTF8CharactersProperly) {
9963 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
9964 getLLVMStyleWithColumns(35));
9965 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009966 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009967 verifyFormat("// Однажды в студёную зимнюю пору...",
9968 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +00009969 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009970 verifyFormat("/* Однажды в студёную зимнюю пору... */",
9971 getLLVMStyleWithColumns(39));
9972 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009973 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009974}
9975
9976TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +00009977 // Non-printable characters' width is currently considered to be the length in
9978 // bytes in UTF8. The characters can be displayed in very different manner
9979 // (zero-width, single width with a substitution glyph, expanded to their code
9980 // (e.g. "<8d>"), so there's no single correct way to handle them.
9981 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00009982 "\"\xc2\x8d\";",
9983 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +00009984 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +00009985 "\"\xc2\x8d\";",
9986 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +00009987 EXPECT_EQ("\"Однажды, в \"\n"
9988 "\"студёную \"\n"
9989 "\"зимнюю \"\n"
9990 "\"пору,\"",
9991 format("\"Однажды, в студёную зимнюю пору,\"",
9992 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009993 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +00009994 "\"一 二 三 \"\n"
9995 "\"四 五六 \"\n"
9996 "\"七 八 九 \"\n"
9997 "\"十\"",
9998 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009999 EXPECT_EQ("\"一\t二 \"\n"
10000 "\"\t三 \"\n"
10001 "\"四 五\t六 \"\n"
10002 "\"\t七 \"\n"
10003 "\"八九十\tqq\"",
10004 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10005 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010006
10007 // UTF8 character in an escape sequence.
10008 EXPECT_EQ("\"aaaaaa\"\n"
10009 "\"\\\xC2\x8D\"",
10010 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010011}
10012
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010013TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10014 EXPECT_EQ("const char *sssss =\n"
10015 " \"一二三四五六七八\\\n"
10016 " 九 十\";",
10017 format("const char *sssss = \"一二三四五六七八\\\n"
10018 " 九 十\";",
10019 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010020}
10021
10022TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010023 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10024 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010025 EXPECT_EQ("// Я из лесу\n"
10026 "// вышел; был\n"
10027 "// сильный\n"
10028 "// мороз.",
10029 format("// Я из лесу вышел; был сильный мороз.",
10030 getLLVMStyleWithColumns(13)));
10031 EXPECT_EQ("// 一二三\n"
10032 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010033 "// 八 九\n"
10034 "// 十",
10035 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010036}
10037
10038TEST_F(FormatTest, SplitsUTF8BlockComments) {
10039 EXPECT_EQ("/* Гляжу,\n"
10040 " * поднимается\n"
10041 " * медленно в\n"
10042 " * гору\n"
10043 " * Лошадка,\n"
10044 " * везущая\n"
10045 " * хворосту\n"
10046 " * воз. */",
10047 format("/* Гляжу, поднимается медленно в гору\n"
10048 " * Лошадка, везущая хворосту воз. */",
10049 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010050 EXPECT_EQ(
10051 "/* 一二三\n"
10052 " * 四五六七\n"
10053 " * 八 九\n"
10054 " * 十 */",
10055 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010056 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10057 " * 𝕓𝕪𝕥𝕖\n"
10058 " * 𝖀𝕿𝕱-𝟠 */",
10059 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010060}
10061
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010062#endif // _MSC_VER
10063
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010064TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10065 FormatStyle Style = getLLVMStyle();
10066
10067 Style.ConstructorInitializerIndentWidth = 4;
10068 verifyFormat(
10069 "SomeClass::Constructor()\n"
10070 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10071 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10072 Style);
10073
10074 Style.ConstructorInitializerIndentWidth = 2;
10075 verifyFormat(
10076 "SomeClass::Constructor()\n"
10077 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10078 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10079 Style);
10080
10081 Style.ConstructorInitializerIndentWidth = 0;
10082 verifyFormat(
10083 "SomeClass::Constructor()\n"
10084 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10085 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10086 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010087 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10088 verifyFormat(
10089 "SomeLongTemplateVariableName<\n"
10090 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10091 Style);
10092 verifyFormat(
10093 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10094 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10095 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010096}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010097
Daniel Jasper00853002014-09-16 16:22:30 +000010098TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10099 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010100 Style.BreakConstructorInitializersBeforeComma = true;
10101 Style.ConstructorInitializerIndentWidth = 4;
10102 verifyFormat("SomeClass::Constructor()\n"
10103 " : a(a)\n"
10104 " , b(b)\n"
10105 " , c(c) {}",
10106 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010107 verifyFormat("SomeClass::Constructor()\n"
10108 " : a(a) {}",
10109 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010110
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010111 Style.ColumnLimit = 0;
10112 verifyFormat("SomeClass::Constructor()\n"
10113 " : a(a) {}",
10114 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010115 verifyFormat("SomeClass::Constructor() noexcept\n"
10116 " : a(a) {}",
10117 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010118 verifyFormat("SomeClass::Constructor()\n"
10119 " : a(a)\n"
10120 " , b(b)\n"
10121 " , c(c) {}",
10122 Style);
10123 verifyFormat("SomeClass::Constructor()\n"
10124 " : a(a) {\n"
10125 " foo();\n"
10126 " bar();\n"
10127 "}",
10128 Style);
10129
Daniel Jasperd74cf402014-04-08 12:46:38 +000010130 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010131 verifyFormat("SomeClass::Constructor()\n"
10132 " : a(a)\n"
10133 " , b(b)\n"
10134 " , c(c) {\n}",
10135 Style);
10136 verifyFormat("SomeClass::Constructor()\n"
10137 " : a(a) {\n}",
10138 Style);
10139
10140 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010141 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010142 Style.ConstructorInitializerIndentWidth = 2;
10143 verifyFormat("SomeClass::Constructor()\n"
10144 " : a(a)\n"
10145 " , b(b)\n"
10146 " , c(c) {}",
10147 Style);
10148
10149 Style.ConstructorInitializerIndentWidth = 0;
10150 verifyFormat("SomeClass::Constructor()\n"
10151 ": a(a)\n"
10152 ", b(b)\n"
10153 ", c(c) {}",
10154 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010155
10156 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10157 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010158 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10159 verifyFormat(
10160 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10161 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010162 verifyFormat(
10163 "SomeClass::Constructor()\n"
10164 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10165 Style);
10166 Style.ConstructorInitializerIndentWidth = 4;
10167 Style.ColumnLimit = 60;
10168 verifyFormat("SomeClass::Constructor()\n"
10169 " : aaaaaaaa(aaaaaaaa)\n"
10170 " , aaaaaaaa(aaaaaaaa)\n"
10171 " , aaaaaaaa(aaaaaaaa) {}",
10172 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010173}
10174
Daniel Jasper38efc132014-10-21 07:51:54 +000010175TEST_F(FormatTest, Destructors) {
10176 verifyFormat("void F(int &i) { i.~int(); }");
10177 verifyFormat("void F(int &i) { i->~int(); }");
10178}
10179
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010180TEST_F(FormatTest, FormatsWithWebKitStyle) {
10181 FormatStyle Style = getWebKitStyle();
10182
10183 // Don't indent in outer namespaces.
10184 verifyFormat("namespace outer {\n"
10185 "int i;\n"
10186 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010187 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010188 "} // namespace inner\n"
10189 "} // namespace outer\n"
10190 "namespace other_outer {\n"
10191 "int i;\n"
10192 "}",
10193 Style);
10194
10195 // Don't indent case labels.
10196 verifyFormat("switch (variable) {\n"
10197 "case 1:\n"
10198 "case 2:\n"
10199 " doSomething();\n"
10200 " break;\n"
10201 "default:\n"
10202 " ++variable;\n"
10203 "}",
10204 Style);
10205
10206 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010207 EXPECT_EQ("void f()\n"
10208 "{\n"
10209 " if (aaaaaaaaaaaaaaaa\n"
10210 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10211 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10212 " return;\n"
10213 "}",
10214 format("void f() {\n"
10215 "if (aaaaaaaaaaaaaaaa\n"
10216 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10217 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10218 "return;\n"
10219 "}",
10220 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010221
Daniel Jasper35995672014-04-29 14:05:20 +000010222 // Allow functions on a single line.
10223 verifyFormat("void f() { return; }", Style);
10224
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010225 // Constructor initializers are formatted one per line with the "," on the
10226 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010227 verifyFormat("Constructor()\n"
10228 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10229 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010230 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010231 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10232 "{\n"
10233 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010234 Style);
10235 verifyFormat("SomeClass::Constructor()\n"
10236 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010237 "{\n"
10238 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010239 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010240 EXPECT_EQ("SomeClass::Constructor()\n"
10241 " : a(a)\n"
10242 "{\n"
10243 "}",
10244 format("SomeClass::Constructor():a(a){}", Style));
10245 verifyFormat("SomeClass::Constructor()\n"
10246 " : a(a)\n"
10247 " , b(b)\n"
10248 " , c(c)\n"
10249 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010250 "}",
10251 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010252 verifyFormat("SomeClass::Constructor()\n"
10253 " : a(a)\n"
10254 "{\n"
10255 " foo();\n"
10256 " bar();\n"
10257 "}",
10258 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010259
Daniel Jasper65ee3472013-07-31 23:16:02 +000010260 // Access specifiers should be aligned left.
10261 verifyFormat("class C {\n"
10262 "public:\n"
10263 " int i;\n"
10264 "};",
10265 Style);
10266
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010267 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010268 verifyFormat("int a; // Do not\n"
10269 "double b; // align comments.",
10270 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010271
Daniel Jasper3219e432014-12-02 13:24:51 +000010272 // Do not align operands.
10273 EXPECT_EQ("ASSERT(aaaa\n"
10274 " || bbbb);",
10275 format("ASSERT ( aaaa\n||bbbb);", Style));
10276
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010277 // Accept input's line breaks.
10278 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10279 " || bbbbbbbbbbbbbbb) {\n"
10280 " i++;\n"
10281 "}",
10282 format("if (aaaaaaaaaaaaaaa\n"
10283 "|| bbbbbbbbbbbbbbb) { i++; }",
10284 Style));
10285 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10286 " i++;\n"
10287 "}",
10288 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010289
10290 // Don't automatically break all macro definitions (llvm.org/PR17842).
10291 verifyFormat("#define aNumber 10", Style);
10292 // However, generally keep the line breaks that the user authored.
10293 EXPECT_EQ("#define aNumber \\\n"
10294 " 10",
10295 format("#define aNumber \\\n"
10296 " 10",
10297 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010298
10299 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010300 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10301 " copyItems:YES];",
10302 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10303 "copyItems:YES];",
10304 Style));
10305 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10306 " copyItems:YES];",
10307 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10308 " copyItems:YES];",
10309 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010310 // FIXME: This does not seem right, there should be more indentation before
10311 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010312 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010313 " @\"a\",\n"
10314 " @\"a\"\n"
10315 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010316 " copyItems:YES];",
10317 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10318 " @\"a\",\n"
10319 " @\"a\"\n"
10320 " ]\n"
10321 " copyItems:YES];",
10322 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010323 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010324 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10325 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010326 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10327 " copyItems:YES];",
10328 Style));
10329
10330 verifyFormat("[self.a b:c c:d];", Style);
10331 EXPECT_EQ("[self.a b:c\n"
10332 " c:d];",
10333 format("[self.a b:c\n"
10334 "c:d];",
10335 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010336}
10337
Manuel Klimekffdeb592013-09-03 15:10:01 +000010338TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010339 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10340 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10341 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10342 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10343 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010344 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010345 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010346 verifyFormat("void f() {\n"
10347 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10348 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010349 verifyFormat("void f() {\n"
10350 " other(x.begin(), //\n"
10351 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000010352 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010353 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000010354 verifyFormat("SomeFunction([]() { // A cool function...\n"
10355 " return 43;\n"
10356 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000010357 EXPECT_EQ("SomeFunction([]() {\n"
10358 "#define A a\n"
10359 " return 43;\n"
10360 "});",
10361 format("SomeFunction([](){\n"
10362 "#define A a\n"
10363 "return 43;\n"
10364 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000010365 verifyFormat("void f() {\n"
10366 " SomeFunction([](decltype(x), A *a) {});\n"
10367 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010368 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10369 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000010370 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10371 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
10372 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000010373 verifyFormat("Constructor()\n"
10374 " : Field([] { // comment\n"
10375 " int i;\n"
10376 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000010377 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
10378 " return some_parameter.size();\n"
10379 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000010380 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
10381 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000010382 verifyFormat("int i = aaaaaa ? 1 //\n"
10383 " : [] {\n"
10384 " return 2; //\n"
10385 " }();");
10386 verifyFormat("llvm::errs() << \"number of twos is \"\n"
10387 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
10388 " return x == 2; // force break\n"
10389 " });");
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000010390 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n"
10391 " int iiiiiiiiiiii) {\n"
10392 " return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n"
10393 "});",
10394 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000010395 verifyFormat("SomeFunction({[&] {\n"
10396 " // comment\n"
10397 " },\n"
10398 " [&] {\n"
10399 " // comment\n"
10400 " }});");
10401 verifyFormat("SomeFunction({[&] {\n"
10402 " // comment\n"
10403 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000010404 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
10405 " [&]() { return true; },\n"
10406 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010407
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010408 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000010409 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000010410 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000010411 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
10412 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010413 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000010414 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010415 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
10416 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000010417 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010418 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
10419 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010420 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010421 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000010422 verifyFormat(
10423 "aaaaaaaaaaaaaaaaaaaaaa(\n"
10424 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
10425 " return aaaaaaaaaaaaaaaaa;\n"
10426 " });",
10427 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000010428 verifyFormat("[]() //\n"
10429 " -> int {\n"
10430 " return 1; //\n"
10431 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010432
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010433 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000010434 verifyFormat("SomeFunction(\n"
10435 " []() {\n"
10436 " int i = 42;\n"
10437 " return i;\n"
10438 " },\n"
10439 " []() {\n"
10440 " int j = 43;\n"
10441 " return j;\n"
10442 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010443
Daniel Jasperda18fd82014-06-10 06:39:03 +000010444 // More complex introducers.
10445 verifyFormat("return [i, args...] {};");
10446
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010447 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000010448 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000010449 verifyFormat("double &operator[](int i) { return 0; }\n"
10450 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000010451 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000010452 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000010453 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000010454
10455 // Other corner cases.
10456 verifyFormat("void f() {\n"
10457 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
10458 " );\n"
10459 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000010460
10461 // Lambdas created through weird macros.
10462 verifyFormat("void f() {\n"
10463 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000010464 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000010465 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000010466
10467 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
10468 " doo_dah();\n"
10469 " doo_dah();\n"
10470 " })) {\n"
10471 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000010472 verifyFormat("auto lambda = []() {\n"
10473 " int a = 2\n"
10474 "#if A\n"
10475 " + 2\n"
10476 "#endif\n"
10477 " ;\n"
10478 "};");
Manuel Klimekffdeb592013-09-03 15:10:01 +000010479}
10480
Manuel Klimek516e0542013-09-04 13:25:30 +000010481TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000010482 FormatStyle ShortBlocks = getLLVMStyle();
10483 ShortBlocks.AllowShortBlocksOnASingleLine = true;
10484 verifyFormat("int (^Block)(int, int);", ShortBlocks);
10485 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
10486 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
10487 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
10488 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
10489 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000010490
Daniel Jasper76284682014-10-22 09:12:44 +000010491 verifyFormat("foo(^{ bar(); });", ShortBlocks);
10492 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
10493 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000010494
Daniel Jasper76284682014-10-22 09:12:44 +000010495 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010496 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010497 "}];");
10498 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010499 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010500 "}]};");
10501 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010502 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010503 "}];");
10504 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010505 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010506 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000010507 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010508 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010509 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010510 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010511 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010512
10513 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010514 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010515 "}];",
10516 getLLVMStyleWithColumns(60));
10517 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010518 " NSString *path = [self sessionFilePath];\n"
10519 " if (path) {\n"
10520 " // ...\n"
10521 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010522 "});");
10523 verifyFormat("[[SessionService sharedService]\n"
10524 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010525 " if (window) {\n"
10526 " [self windowDidLoad:window];\n"
10527 " } else {\n"
10528 " [self errorLoadingWindow];\n"
10529 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010530 " }];");
10531 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010532 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010533 "};\n",
10534 getLLVMStyleWithColumns(40));
10535 verifyFormat("[[SessionService sharedService]\n"
10536 " loadWindowWithCompletionBlock: //\n"
10537 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010538 " if (window) {\n"
10539 " [self windowDidLoad:window];\n"
10540 " } else {\n"
10541 " [self errorLoadingWindow];\n"
10542 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010543 " }];",
10544 getLLVMStyleWithColumns(60));
10545 verifyFormat("[myObject doSomethingWith:arg1\n"
10546 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010547 " // ...\n"
10548 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010549 " }\n"
10550 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010551 " // ...\n"
10552 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000010553 " }\n"
10554 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010555 " // ...\n"
10556 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010557 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000010558 verifyFormat("[myObject doSomethingWith:arg1\n"
10559 " firstBlock:-1\n"
10560 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010561 " // ...\n"
10562 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000010563 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010564
10565 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010566 " @autoreleasepool {\n"
10567 " if (a) {\n"
10568 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010569 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010570 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010571 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000010572 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000010573 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
10574 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000010575
10576 FormatStyle FourIndent = getLLVMStyle();
10577 FourIndent.ObjCBlockIndentWidth = 4;
10578 verifyFormat("[operation setCompletionBlock:^{\n"
10579 " [self onOperationDone];\n"
10580 "}];",
10581 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000010582}
10583
Daniel Jasper289afc02015-04-23 09:23:17 +000010584TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
10585 FormatStyle ZeroColumn = getLLVMStyle();
10586 ZeroColumn.ColumnLimit = 0;
10587
10588 verifyFormat("[[SessionService sharedService] "
10589 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10590 " if (window) {\n"
10591 " [self windowDidLoad:window];\n"
10592 " } else {\n"
10593 " [self errorLoadingWindow];\n"
10594 " }\n"
10595 "}];",
10596 ZeroColumn);
10597 EXPECT_EQ("[[SessionService sharedService]\n"
10598 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10599 " if (window) {\n"
10600 " [self windowDidLoad:window];\n"
10601 " } else {\n"
10602 " [self errorLoadingWindow];\n"
10603 " }\n"
10604 " }];",
10605 format("[[SessionService sharedService]\n"
10606 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10607 " if (window) {\n"
10608 " [self windowDidLoad:window];\n"
10609 " } else {\n"
10610 " [self errorLoadingWindow];\n"
10611 " }\n"
10612 "}];",
10613 ZeroColumn));
10614 verifyFormat("[myObject doSomethingWith:arg1\n"
10615 " firstBlock:^(Foo *a) {\n"
10616 " // ...\n"
10617 " int i;\n"
10618 " }\n"
10619 " secondBlock:^(Bar *b) {\n"
10620 " // ...\n"
10621 " int i;\n"
10622 " }\n"
10623 " thirdBlock:^Foo(Bar *b) {\n"
10624 " // ...\n"
10625 " int i;\n"
10626 " }];",
10627 ZeroColumn);
10628 verifyFormat("f(^{\n"
10629 " @autoreleasepool {\n"
10630 " if (a) {\n"
10631 " g();\n"
10632 " }\n"
10633 " }\n"
10634 "});",
10635 ZeroColumn);
10636 verifyFormat("void (^largeBlock)(void) = ^{\n"
10637 " // ...\n"
10638 "};",
10639 ZeroColumn);
10640
10641 ZeroColumn.AllowShortBlocksOnASingleLine = true;
10642 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010643 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000010644 ZeroColumn.AllowShortBlocksOnASingleLine = false;
10645 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
10646 " int i;\n"
10647 "};",
10648 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
10649}
10650
Alexander Kornienko9e649af2013-09-11 12:25:57 +000010651TEST_F(FormatTest, SupportsCRLF) {
10652 EXPECT_EQ("int a;\r\n"
10653 "int b;\r\n"
10654 "int c;\r\n",
10655 format("int a;\r\n"
10656 " int b;\r\n"
10657 " int c;\r\n",
10658 getLLVMStyle()));
10659 EXPECT_EQ("int a;\r\n"
10660 "int b;\r\n"
10661 "int c;\r\n",
10662 format("int a;\r\n"
10663 " int b;\n"
10664 " int c;\r\n",
10665 getLLVMStyle()));
10666 EXPECT_EQ("int a;\n"
10667 "int b;\n"
10668 "int c;\n",
10669 format("int a;\r\n"
10670 " int b;\n"
10671 " int c;\n",
10672 getLLVMStyle()));
10673 EXPECT_EQ("\"aaaaaaa \"\r\n"
10674 "\"bbbbbbb\";\r\n",
10675 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
10676 EXPECT_EQ("#define A \\\r\n"
10677 " b; \\\r\n"
10678 " c; \\\r\n"
10679 " d;\r\n",
10680 format("#define A \\\r\n"
10681 " b; \\\r\n"
10682 " c; d; \r\n",
10683 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000010684
10685 EXPECT_EQ("/*\r\n"
10686 "multi line block comments\r\n"
10687 "should not introduce\r\n"
10688 "an extra carriage return\r\n"
10689 "*/\r\n",
10690 format("/*\r\n"
10691 "multi line block comments\r\n"
10692 "should not introduce\r\n"
10693 "an extra carriage return\r\n"
10694 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000010695}
10696
Manuel Klimekb212f3b2013-10-12 22:46:56 +000010697TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
10698 verifyFormat("MY_CLASS(C) {\n"
10699 " int i;\n"
10700 " int j;\n"
10701 "};");
10702}
10703
Daniel Jasper6633ab82013-10-18 10:38:14 +000010704TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
10705 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
10706 TwoIndent.ContinuationIndentWidth = 2;
10707
10708 EXPECT_EQ("int i =\n"
10709 " longFunction(\n"
10710 " arg);",
10711 format("int i = longFunction(arg);", TwoIndent));
10712
10713 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
10714 SixIndent.ContinuationIndentWidth = 6;
10715
10716 EXPECT_EQ("int i =\n"
10717 " longFunction(\n"
10718 " arg);",
10719 format("int i = longFunction(arg);", SixIndent));
10720}
10721
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010722TEST_F(FormatTest, SpacesInAngles) {
10723 FormatStyle Spaces = getLLVMStyle();
10724 Spaces.SpacesInAngles = true;
10725
10726 verifyFormat("static_cast< int >(arg);", Spaces);
10727 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
10728 verifyFormat("f< int, float >();", Spaces);
10729 verifyFormat("template <> g() {}", Spaces);
10730 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000010731 verifyFormat("std::function< void(int, int) > fct;", Spaces);
10732 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
10733 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010734
10735 Spaces.Standard = FormatStyle::LS_Cpp03;
10736 Spaces.SpacesInAngles = true;
10737 verifyFormat("A< A< int > >();", Spaces);
10738
10739 Spaces.SpacesInAngles = false;
10740 verifyFormat("A<A<int> >();", Spaces);
10741
10742 Spaces.Standard = FormatStyle::LS_Cpp11;
10743 Spaces.SpacesInAngles = true;
10744 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000010745
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010746 Spaces.SpacesInAngles = false;
10747 verifyFormat("A<A<int>>();", Spaces);
10748}
10749
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010750TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
10751 FormatStyle Style = getLLVMStyle();
10752 Style.SpaceAfterTemplateKeyword = false;
10753 verifyFormat("template<int> void foo();", Style);
10754}
10755
Jacques Pienaarfc275112015-02-18 23:48:37 +000010756TEST_F(FormatTest, TripleAngleBrackets) {
10757 verifyFormat("f<<<1, 1>>>();");
10758 verifyFormat("f<<<1, 1, 1, s>>>();");
10759 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000010760 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010761 verifyFormat("f<param><<<1, 1>>>();");
10762 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000010763 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010764 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10765 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000010766 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
10767 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000010768}
10769
10770TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000010771 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000010772 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010773 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10774 "aaallvm::outs() <<");
10775 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10776 "aaaallvm::outs()\n <<");
10777}
10778
Manuel Klimek819788d2014-03-18 11:22:45 +000010779TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
10780 std::string code = "#if A\n"
10781 "#if B\n"
10782 "a.\n"
10783 "#endif\n"
10784 " a = 1;\n"
10785 "#else\n"
10786 "#endif\n"
10787 "#if C\n"
10788 "#else\n"
10789 "#endif\n";
10790 EXPECT_EQ(code, format(code));
10791}
10792
Manuel Klimek68b03042014-04-14 09:14:11 +000010793TEST_F(FormatTest, HandleConflictMarkers) {
10794 // Git/SVN conflict markers.
10795 EXPECT_EQ("int a;\n"
10796 "void f() {\n"
10797 " callme(some(parameter1,\n"
10798 "<<<<<<< text by the vcs\n"
10799 " parameter2),\n"
10800 "||||||| text by the vcs\n"
10801 " parameter2),\n"
10802 " parameter3,\n"
10803 "======= text by the vcs\n"
10804 " parameter2, parameter3),\n"
10805 ">>>>>>> text by the vcs\n"
10806 " otherparameter);\n",
10807 format("int a;\n"
10808 "void f() {\n"
10809 " callme(some(parameter1,\n"
10810 "<<<<<<< text by the vcs\n"
10811 " parameter2),\n"
10812 "||||||| text by the vcs\n"
10813 " parameter2),\n"
10814 " parameter3,\n"
10815 "======= text by the vcs\n"
10816 " parameter2,\n"
10817 " parameter3),\n"
10818 ">>>>>>> text by the vcs\n"
10819 " otherparameter);\n"));
10820
10821 // Perforce markers.
10822 EXPECT_EQ("void f() {\n"
10823 " function(\n"
10824 ">>>> text by the vcs\n"
10825 " parameter,\n"
10826 "==== text by the vcs\n"
10827 " parameter,\n"
10828 "==== text by the vcs\n"
10829 " parameter,\n"
10830 "<<<< text by the vcs\n"
10831 " parameter);\n",
10832 format("void f() {\n"
10833 " function(\n"
10834 ">>>> text by the vcs\n"
10835 " parameter,\n"
10836 "==== text by the vcs\n"
10837 " parameter,\n"
10838 "==== text by the vcs\n"
10839 " parameter,\n"
10840 "<<<< text by the vcs\n"
10841 " parameter);\n"));
10842
10843 EXPECT_EQ("<<<<<<<\n"
10844 "|||||||\n"
10845 "=======\n"
10846 ">>>>>>>",
10847 format("<<<<<<<\n"
10848 "|||||||\n"
10849 "=======\n"
10850 ">>>>>>>"));
10851
10852 EXPECT_EQ("<<<<<<<\n"
10853 "|||||||\n"
10854 "int i;\n"
10855 "=======\n"
10856 ">>>>>>>",
10857 format("<<<<<<<\n"
10858 "|||||||\n"
10859 "int i;\n"
10860 "=======\n"
10861 ">>>>>>>"));
10862
10863 // FIXME: Handle parsing of macros around conflict markers correctly:
10864 EXPECT_EQ("#define Macro \\\n"
10865 "<<<<<<<\n"
10866 "Something \\\n"
10867 "|||||||\n"
10868 "Else \\\n"
10869 "=======\n"
10870 "Other \\\n"
10871 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000010872 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000010873 format("#define Macro \\\n"
10874 "<<<<<<<\n"
10875 " Something \\\n"
10876 "|||||||\n"
10877 " Else \\\n"
10878 "=======\n"
10879 " Other \\\n"
10880 ">>>>>>>\n"
10881 " End\n"
10882 "int i;\n"));
10883}
10884
Daniel Jasper471894432014-08-06 13:40:26 +000010885TEST_F(FormatTest, DisableRegions) {
10886 EXPECT_EQ("int i;\n"
10887 "// clang-format off\n"
10888 " int j;\n"
10889 "// clang-format on\n"
10890 "int k;",
10891 format(" int i;\n"
10892 " // clang-format off\n"
10893 " int j;\n"
10894 " // clang-format on\n"
10895 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000010896 EXPECT_EQ("int i;\n"
10897 "/* clang-format off */\n"
10898 " int j;\n"
10899 "/* clang-format on */\n"
10900 "int k;",
10901 format(" int i;\n"
10902 " /* clang-format off */\n"
10903 " int j;\n"
10904 " /* clang-format on */\n"
10905 " int k;"));
Daniel Jasper471894432014-08-06 13:40:26 +000010906}
10907
Manuel Klimekf0c95b32015-06-11 10:14:13 +000010908TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
10909 format("? ) =");
10910 verifyNoCrash("#define a\\\n /**/}");
10911}
Manuel Klimek5f594f82014-08-13 14:00:41 +000010912
Daniel Jasper498f5582015-12-25 08:53:31 +000010913TEST_F(FormatTest, FormatsTableGenCode) {
10914 FormatStyle Style = getLLVMStyle();
10915 Style.Language = FormatStyle::LK_TableGen;
10916 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
10917}
10918
Nico Weberb2673a12016-11-10 21:49:25 +000010919TEST_F(FormatTest, ArrayOfTemplates) {
10920 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
10921 format("auto a = new unique_ptr<int > [ 10];"));
10922
10923 FormatStyle Spaces = getLLVMStyle();
10924 Spaces.SpacesInSquareBrackets = true;
10925 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
10926 format("auto a = new unique_ptr<int > [10];", Spaces));
10927}
10928
10929TEST_F(FormatTest, ArrayAsTemplateType) {
10930 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
10931 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
10932
10933 FormatStyle Spaces = getLLVMStyle();
10934 Spaces.SpacesInSquareBrackets = true;
10935 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
10936 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
10937}
10938
Eric Liu547d8792016-03-24 13:22:42 +000010939TEST(FormatStyle, GetStyleOfFile) {
10940 vfs::InMemoryFileSystem FS;
10941 // Test 1: format file in the same directory.
10942 ASSERT_TRUE(
10943 FS.addFile("/a/.clang-format", 0,
10944 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
10945 ASSERT_TRUE(
10946 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010947 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Eric Liu547d8792016-03-24 13:22:42 +000010948 ASSERT_EQ(Style1, getLLVMStyle());
10949
10950 // Test 2: fallback to default.
10951 ASSERT_TRUE(
10952 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010953 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Eric Liu547d8792016-03-24 13:22:42 +000010954 ASSERT_EQ(Style2, getMozillaStyle());
10955
10956 // Test 3: format file in parent directory.
10957 ASSERT_TRUE(
10958 FS.addFile("/c/.clang-format", 0,
10959 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
10960 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
10961 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010962 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Eric Liu547d8792016-03-24 13:22:42 +000010963 ASSERT_EQ(Style3, getGoogleStyle());
10964}
10965
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010966TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
10967 // Column limit is 20.
10968 std::string Code = "Type *a =\n"
10969 " new Type();\n"
10970 "g(iiiii, 0, jjjjj,\n"
10971 " 0, kkkkk, 0, mm);\n"
10972 "int bad = format ;";
10973 std::string Expected = "auto a = new Type();\n"
10974 "g(iiiii, nullptr,\n"
10975 " jjjjj, nullptr,\n"
10976 " kkkkk, nullptr,\n"
10977 " mm);\n"
10978 "int bad = format ;";
10979 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000010980 tooling::Replacements Replaces = toReplacements(
10981 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
10982 "auto "),
10983 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
10984 "nullptr"),
10985 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
10986 "nullptr"),
10987 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
10988 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010989
10990 format::FormatStyle Style = format::getLLVMStyle();
10991 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000010992 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
10993 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
10994 << llvm::toString(FormattedReplaces.takeError()) << "\n";
10995 auto Result = applyAllReplacements(Code, *FormattedReplaces);
10996 EXPECT_TRUE(static_cast<bool>(Result));
10997 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010998}
10999
Eric Liubaf58c22016-05-18 13:43:48 +000011000TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11001 std::string Code = "#include \"a.h\"\n"
11002 "#include \"c.h\"\n"
11003 "\n"
11004 "int main() {\n"
11005 " return 0;\n"
11006 "}";
11007 std::string Expected = "#include \"a.h\"\n"
11008 "#include \"b.h\"\n"
11009 "#include \"c.h\"\n"
11010 "\n"
11011 "int main() {\n"
11012 " return 0;\n"
11013 "}";
11014 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011015 tooling::Replacements Replaces = toReplacements(
11016 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11017 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011018
11019 format::FormatStyle Style = format::getLLVMStyle();
11020 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011021 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11022 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11023 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11024 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11025 EXPECT_TRUE(static_cast<bool>(Result));
11026 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011027}
11028
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011029TEST_F(FormatTest, AllignTrailingComments) {
11030 EXPECT_EQ("#define MACRO(V) \\\n"
11031 " V(Rt2) /* one more char */ \\\n"
11032 " V(Rs) /* than here */ \\\n"
11033 "/* comment 3 */\n",
11034 format("#define MACRO(V)\\\n"
11035 "V(Rt2) /* one more char */ \\\n"
11036 "V(Rs) /* than here */ \\\n"
11037 "/* comment 3 */ \\\n",
11038 getLLVMStyleWithColumns(40)));
11039}
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011040} // end namespace
11041} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011042} // end namespace clang