blob: 150f6077f2149270ea69bda224afd565a718fde5 [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 Jaspere61f9f92017-01-13 23:18:16 +00003441
3442 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3443 " .aaa(aaaaaaaaaaaaa) *\n"
3444 " aaaaaaa +\n"
3445 " aaaaaaa;",
3446 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00003447}
3448
Daniel Jasper6bee6822013-04-08 20:33:42 +00003449TEST_F(FormatTest, ExpressionIndentation) {
3450 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3451 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3452 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3453 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3454 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3455 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3456 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3457 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3458 " ccccccccccccccccccccccccccccccccccccccccc;");
3459 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3460 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3461 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3462 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3463 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3464 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3465 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3466 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3467 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3468 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3469 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3470 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003471 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00003472 "} else if (aaaaa &&\n"
3473 " bbbbb > // break\n"
3474 " ccccc) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003475 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00003476
3477 // Presence of a trailing comment used to change indentation of b.
3478 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3479 " b;\n"
3480 "return aaaaaaaaaaaaaaaaaaa +\n"
3481 " b; //",
3482 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00003483}
3484
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003485TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3486 // Not sure what the best system is here. Like this, the LHS can be found
3487 // immediately above an operator (everything with the same or a higher
3488 // indent). The RHS is aligned right of the operator and so compasses
3489 // everything until something with the same indent as the operator is found.
3490 // FIXME: Is this a good system?
3491 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00003492 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003493 verifyFormat(
3494 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003495 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3496 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3497 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3498 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3499 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003500 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003501 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3502 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003503 Style);
3504 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003505 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3506 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003507 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3508 Style);
3509 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003510 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3511 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003512 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3513 Style);
3514 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3515 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003516 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3517 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003518 Style);
3519 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00003520 "} else if (aaaaa\n"
3521 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00003522 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003523 "}",
3524 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00003525 verifyFormat("return (a)\n"
3526 " // comment\n"
3527 " + b;",
3528 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003529 verifyFormat(
3530 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3531 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3532 " + cc;",
3533 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003534
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00003535 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3536 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3537 Style);
3538
Daniel Jasper9e5ede02013-11-08 19:56:28 +00003539 // Forced by comments.
3540 verifyFormat(
3541 "unsigned ContentSize =\n"
3542 " sizeof(int16_t) // DWARF ARange version number\n"
3543 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3544 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
3545 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00003546
3547 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3548 " == boost::fusion::at_c<1>(iiii).second;",
3549 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00003550
3551 Style.ColumnLimit = 60;
3552 verifyFormat("zzzzzzzzzz\n"
3553 " = bbbbbbbbbbbbbbbbb\n"
3554 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3555 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00003556}
3557
Daniel Jasper3219e432014-12-02 13:24:51 +00003558TEST_F(FormatTest, NoOperandAlignment) {
3559 FormatStyle Style = getLLVMStyle();
3560 Style.AlignOperands = false;
3561 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00003562 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3563 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3564 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3565 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3566 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3567 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3568 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3569 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3570 " > ccccccccccccccccccccccccccccccccccccccccc;",
3571 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003572
3573 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3574 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3575 " + cc;",
3576 Style);
3577 verifyFormat("int a = aa\n"
3578 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3579 " * cccccccccccccccccccccccccccccccccccc;",
3580 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00003581
Daniel Jasper6501f7e2015-10-27 12:38:37 +00003582 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00003583 verifyFormat("return (a > b\n"
3584 " // comment1\n"
3585 " // comment2\n"
3586 " || c);",
3587 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00003588}
3589
Daniel Jasperac043c92014-09-15 11:11:00 +00003590TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3591 FormatStyle Style = getLLVMStyle();
3592 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3593 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3594 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00003595 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3596 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00003597}
3598
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003599TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003600 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003601 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3602 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003603 verifyFormat("Constructor()\n"
3604 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003605 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003606 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003607 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003608 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003609
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003610 verifyFormat("template <typename T>\n"
3611 "Constructor() : Initializer(FitsOnTheLine) {}",
3612 getLLVMStyleWithColumns(45));
3613
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003614 verifyFormat(
3615 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003616 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003617
3618 verifyFormat(
3619 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003620 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003621 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00003622 verifyFormat(
3623 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003624 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003625 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00003626 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3627 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3628 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003629
3630 verifyFormat("Constructor()\n"
3631 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3632 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3633 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003634 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003635
Daniel Jasper65585ed2013-01-28 13:31:35 +00003636 verifyFormat("Constructor()\n"
3637 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003638 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00003639
Daniel Jasper62e68172013-02-25 15:59:54 +00003640 verifyFormat("Constructor(int Parameter = 0)\n"
3641 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3642 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00003643 verifyFormat("Constructor()\n"
3644 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3645 "}",
3646 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00003647 verifyFormat("Constructor()\n"
3648 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3649 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00003650
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003651 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003652 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003653 verifyFormat("Constructor()\n"
3654 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3655 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
3656 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003657
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003658 FormatStyle OnePerLine = getLLVMStyle();
3659 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003660 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003661 verifyFormat("SomeClass::Constructor()\n"
3662 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3663 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003664 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003665 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003666 verifyFormat("SomeClass::Constructor()\n"
3667 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3668 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003669 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003670 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00003671 verifyFormat("MyClass::MyClass(int var)\n"
3672 " : some_var_(var), // 4 space indent\n"
3673 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003674 "}",
3675 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00003676 verifyFormat("Constructor()\n"
3677 " : aaaaa(aaaaaa),\n"
3678 " aaaaa(aaaaaa),\n"
3679 " aaaaa(aaaaaa),\n"
3680 " aaaaa(aaaaaa),\n"
3681 " aaaaa(aaaaaa) {}",
3682 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00003683 verifyFormat("Constructor()\n"
3684 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3685 " aaaaaaaaaaaaaaaaaaaaaa) {}",
3686 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00003687 OnePerLine.BinPackParameters = false;
3688 verifyFormat(
3689 "Constructor()\n"
3690 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3691 " aaaaaaaaaaa().aaa(),\n"
3692 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3693 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00003694 OnePerLine.ColumnLimit = 60;
3695 verifyFormat("Constructor()\n"
3696 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
3697 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3698 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00003699
3700 EXPECT_EQ("Constructor()\n"
3701 " : // Comment forcing unwanted break.\n"
3702 " aaaa(aaaa) {}",
3703 format("Constructor() :\n"
3704 " // Comment forcing unwanted break.\n"
3705 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003706}
3707
3708TEST_F(FormatTest, MemoizationTests) {
3709 // This breaks if the memoization lookup does not take \c Indent and
3710 // \c LastSpace into account.
3711 verifyFormat(
3712 "extern CFRunLoopTimerRef\n"
3713 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3714 " CFTimeInterval interval, CFOptionFlags flags,\n"
3715 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003716 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003717
3718 // Deep nesting somewhat works around our memoization.
3719 verifyFormat(
3720 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3721 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3722 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3723 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3724 " aaaaa())))))))))))))))))))))))))))))))))))))));",
3725 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00003726 verifyFormat(
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(\n"
3746 " aaaaa,\n"
3747 " aaaaa(\n"
3748 " aaaaa,\n"
3749 " aaaaa(\n"
3750 " aaaaa,\n"
3751 " aaaaa))))))))))));",
3752 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00003753 verifyFormat(
3754 "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"
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),\n"
3766 " a),\n"
3767 " a),\n"
3768 " a),\n"
3769 " a),\n"
3770 " a),\n"
3771 " a)",
3772 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00003773
3774 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00003775 FormatStyle OnePerLine = getLLVMStyle();
3776 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003777 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00003778 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00003779 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00003780 for (unsigned i = 0, e = 80; i != e; ++i) {
3781 input += " a,\n";
3782 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00003783 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00003784 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00003785}
3786
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003787TEST_F(FormatTest, BreaksAsHighAsPossible) {
3788 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00003789 "void f() {\n"
3790 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3791 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3792 " f();\n"
3793 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00003794 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00003795 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003796}
3797
Daniel Jasper6728fc12013-04-11 14:29:13 +00003798TEST_F(FormatTest, BreaksFunctionDeclarations) {
3799 // Principially, we break function declarations in a certain order:
3800 // 1) break amongst arguments.
3801 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3802 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00003803 verifyFormat("template <class TemplateIt>\n"
3804 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3805 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00003806
3807 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00003808 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003809 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003810 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003811 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003812
3813 // 3) break after (.
3814 verifyFormat(
3815 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00003816 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3817 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003818
3819 // 4) break before after nested name specifiers.
3820 verifyFormat(
3821 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003822 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3823 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003824 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003825
3826 // However, there are exceptions, if a sufficient amount of lines can be
3827 // saved.
3828 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3829 // more adjusting.
3830 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3831 " Cccccccccccccc cccccccccc,\n"
3832 " Cccccccccccccc cccccccccc,\n"
3833 " Cccccccccccccc cccccccccc,\n"
3834 " Cccccccccccccc cccccccccc);");
3835 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00003836 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003837 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3838 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3839 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00003840 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00003841 verifyFormat(
3842 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3843 " Cccccccccccccc cccccccccc,\n"
3844 " Cccccccccccccc cccccccccc,\n"
3845 " Cccccccccccccc cccccccccc,\n"
3846 " Cccccccccccccc cccccccccc,\n"
3847 " Cccccccccccccc cccccccccc,\n"
3848 " Cccccccccccccc cccccccccc);");
3849 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3850 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3851 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3852 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3853 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00003854
3855 // Break after multi-line parameters.
3856 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3857 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3858 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3859 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00003860 verifyFormat("void SomeLoooooooooooongFunction(\n"
3861 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3862 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3863 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003864
3865 // Treat overloaded operators like other functions.
3866 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3867 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00003868 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3869 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00003870 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3871 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3872 verifyGoogleFormat(
3873 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3874 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00003875 verifyGoogleFormat(
3876 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3877 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00003878 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3879 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3880 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3881 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00003882 verifyGoogleFormat(
3883 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3884 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3885 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00003886 verifyGoogleFormat(
3887 "template <typename T>\n"
3888 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3889 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3890 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00003891
3892 FormatStyle Style = getLLVMStyle();
3893 Style.PointerAlignment = FormatStyle::PAS_Left;
3894 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3895 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3896 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00003897 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3898 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3899 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00003900}
3901
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003902TEST_F(FormatTest, TrailingReturnType) {
3903 verifyFormat("auto foo() -> int;\n");
3904 verifyFormat("struct S {\n"
3905 " auto bar() const -> int;\n"
3906 "};");
3907 verifyFormat("template <size_t Order, typename T>\n"
3908 "auto load_img(const std::string &filename)\n"
3909 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00003910 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3911 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00003912 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00003913 verifyFormat("template <typename T>\n"
3914 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3915 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00003916
3917 // Not trailing return types.
3918 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00003919}
3920
Daniel Jasper5be31f72013-05-21 09:16:31 +00003921TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003922 // Avoid breaking before trailing 'const' or other trailing annotations, if
3923 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00003924 FormatStyle Style = getGoogleStyle();
3925 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00003926 verifyFormat("void someLongFunction(\n"
3927 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00003928 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00003929 verifyFormat("LoooooongReturnType\n"
3930 "someLoooooooongFunction() const {}",
3931 getLLVMStyleWithColumns(47));
3932 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3933 " const {}",
3934 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003935 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3936 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3937 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3938 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3939 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3940 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00003941 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3942 " aaaaaaaaaaa aaaaa) const override;");
3943 verifyGoogleFormat(
3944 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3945 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003946
Daniel Jasper5550de62014-02-17 07:57:46 +00003947 // Even if the first parameter has to be wrapped.
3948 verifyFormat("void someLongFunction(\n"
3949 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003950 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00003951 verifyFormat("void someLongFunction(\n"
3952 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003953 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00003954 verifyFormat("void someLongFunction(\n"
3955 " int someLongParameter) override {}",
3956 Style);
3957 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003958 " int someLongParameter) OVERRIDE {}",
3959 Style);
3960 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003961 " int someLongParameter) final {}",
3962 Style);
3963 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00003964 " int someLongParameter) FINAL {}",
3965 Style);
3966 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00003967 " int parameter) const override {}",
3968 Style);
3969
Daniel Jaspere3f907f2014-06-02 09:52:08 +00003970 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3971 verifyFormat("void someLongFunction(\n"
3972 " int someLongParameter) const\n"
3973 "{\n"
3974 "}",
3975 Style);
3976
Daniel Jasper5550de62014-02-17 07:57:46 +00003977 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00003978 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
3979 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3980 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00003981
3982 // Breaking before function-like trailing annotations is fine to keep them
3983 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00003984 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3985 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3986 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3987 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3988 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3989 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00003990 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
3991 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00003992 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00003993
3994 verifyFormat(
3995 "void aaaaaaaaaaaaaaaaaa()\n"
3996 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
3997 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
3998 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3999 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004000 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004001 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004002 " GUARDED_BY(aaaaaaaaaaaa);");
4003 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004004 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004005 " GUARDED_BY(aaaaaaaaaaaa);");
4006 verifyGoogleFormat(
4007 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4008 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004009 verifyGoogleFormat(
4010 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4011 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004012}
4013
Daniel Jasperf090f032015-05-18 09:47:22 +00004014TEST_F(FormatTest, FunctionAnnotations) {
4015 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004016 "int OldFunction(const string &parameter) {}");
4017 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004018 "string OldFunction(const string &parameter) {}");
4019 verifyFormat("template <typename T>\n"
4020 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4021 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004022
4023 // Not function annotations.
4024 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4025 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004026 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4027 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004028 verifyFormat("MACRO(abc).function() // wrap\n"
4029 " << abc;");
4030 verifyFormat("MACRO(abc)->function() // wrap\n"
4031 " << abc;");
4032 verifyFormat("MACRO(abc)::function() // wrap\n"
4033 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004034}
4035
Daniel Jasperf7935112012-12-03 18:12:45 +00004036TEST_F(FormatTest, BreaksDesireably) {
4037 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4038 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004039 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004040 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4041 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4042 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004043
4044 verifyFormat(
4045 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004046 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004047
4048 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4049 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4050 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004051
4052 verifyFormat(
4053 "aaaaaaaa(aaaaaaaaaaaaa, aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4054 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4055 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4056 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004057
4058 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4059 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4060
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004061 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004062 "void f() {\n"
4063 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4064 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4065 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004066 verifyFormat(
4067 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4068 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4069 verifyFormat(
4070 "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4071 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jaspera44991332015-04-29 13:06:49 +00004072 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4073 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4074 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004075
Daniel Jasper739b85f2015-06-29 10:42:59 +00004076 // Indent consistently independent of call expression and unary operator.
4077 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4078 " dddddddddddddddddddddddddddddd));");
4079 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4080 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004081 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004082 " dddddddddddddddddddddddddddddd));");
4083
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004084 // This test case breaks on an incorrect memoization, i.e. an optimization not
4085 // taking into account the StopAt value.
4086 verifyFormat(
4087 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004088 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4089 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4090 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004091
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004092 verifyFormat("{\n {\n {\n"
4093 " Annotation.SpaceRequiredBefore =\n"
4094 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4095 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4096 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004097
4098 // Break on an outer level if there was a break on an inner level.
4099 EXPECT_EQ("f(g(h(a, // comment\n"
4100 " b, c),\n"
4101 " d, e),\n"
4102 " x, y);",
4103 format("f(g(h(a, // comment\n"
4104 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004105
4106 // Prefer breaking similar line breaks.
4107 verifyFormat(
4108 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4109 " NSTrackingMouseEnteredAndExited |\n"
4110 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004111}
4112
Daniel Jasper18210d72014-10-09 09:52:05 +00004113TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4114 FormatStyle NoBinPacking = getGoogleStyle();
4115 NoBinPacking.BinPackParameters = false;
4116 NoBinPacking.BinPackArguments = true;
4117 verifyFormat("void f() {\n"
4118 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4119 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4120 "}",
4121 NoBinPacking);
4122 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4123 " int aaaaaaaaaaaaaaaaaaaa,\n"
4124 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4125 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004126
Daniel Jasper00693b082016-01-09 15:56:47 +00004127 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4128 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4129 " vector<int> bbbbbbbbbbbbbbb);",
4130 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004131 // FIXME: This behavior difference is probably not wanted. However, currently
4132 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4133 // template arguments from BreakBeforeParameter being set because of the
4134 // one-per-line formatting.
4135 verifyFormat(
4136 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4137 " aaaaaaaaaa> aaaaaaaaaa);",
4138 NoBinPacking);
4139 verifyFormat(
4140 "void fffffffffff(\n"
4141 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4142 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004143}
4144
Daniel Jasper9278eb92013-01-16 14:59:02 +00004145TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004146 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004147 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004148 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004149 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4150 " aaaaaaaaaaaaaaaaaaaa,\n"
4151 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4152 NoBinPacking);
4153 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4154 " aaaaaaaaaaaaa,\n"
4155 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4156 NoBinPacking);
4157 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004158 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4159 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4160 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4161 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004162 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4163 NoBinPacking);
4164 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4165 " .aaaaaaaaaaaaaaaaaa();",
4166 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004167 verifyFormat("void f() {\n"
4168 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4169 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4170 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004171 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004172
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004173 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004174 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4175 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004176 " aaaaaaaaaaaa);",
4177 NoBinPacking);
4178 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004179 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4180 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004181 " test);",
4182 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004183
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004184 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4185 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004186 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4187 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004188 NoBinPacking);
4189 verifyFormat("a(\"a\"\n"
4190 " \"a\",\n"
4191 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004192
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004193 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004194 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004195 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004196 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004197 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004198 verifyFormat(
4199 "void f() {\n"
4200 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4201 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004202 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004203 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004204 verifyFormat(
4205 "template <class SomeType, class SomeOtherType>\n"
4206 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4207 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004208}
4209
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004210TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4211 FormatStyle Style = getLLVMStyleWithColumns(15);
4212 Style.ExperimentalAutoDetectBinPacking = true;
4213 EXPECT_EQ("aaa(aaaa,\n"
4214 " aaaa,\n"
4215 " aaaa);\n"
4216 "aaa(aaaa,\n"
4217 " aaaa,\n"
4218 " aaaa);",
4219 format("aaa(aaaa,\n" // one-per-line
4220 " aaaa,\n"
4221 " aaaa );\n"
4222 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4223 Style));
4224 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4225 " aaaa);\n"
4226 "aaa(aaaa, aaaa,\n"
4227 " aaaa);",
4228 format("aaa(aaaa, aaaa,\n" // bin-packed
4229 " aaaa );\n"
4230 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4231 Style));
4232}
4233
Daniel Jasper04468962013-01-18 10:56:38 +00004234TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004235 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4236 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4237 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4238 " .StartsWith(\".init\", ORDER_INIT)\n"
4239 " .StartsWith(\".fini\", ORDER_FINI)\n"
4240 " .StartsWith(\".hash\", ORDER_HASH)\n"
4241 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004242
Daniel Jaspereb50c672013-02-15 20:33:06 +00004243 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004244 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004245 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004246 "aaaaaaa->aaaaaaa\n"
4247 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4248 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004249 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004250 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004251 "aaaaaaa->aaaaaaa\n"
4252 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4253 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4254 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004255 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004256 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004257 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004258 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4259 " aaaaaa->aaaaaaaaaaaa()\n"
4260 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004261 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004262 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004263 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004264 "void f() {\n"
4265 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004266 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004267 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004268 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004269 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004270 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004271 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004272 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004273 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004274 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004275 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004276 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004277
4278 verifyFormat(
4279 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4280 verifyFormat("aaaaaaaaaaaaaaa()\n"
4281 " .aaaaaaaaaaaaaaa()\n"
4282 " .aaaaaaaaaaaaaaa()\n"
4283 " .aaaaaaaaaaaaaaa()\n"
4284 " .aaaaaaaaaaaaaaa();");
4285 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4286 " .aaaaaaaaaaaaaaa()\n"
4287 " .aaaaaaaaaaaaaaa()\n"
4288 " .aaaaaaaaaaaaaaa();");
4289 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4290 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4291 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004292 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4293 " ->aaaaaaaaaaaaaae(0)\n"
4294 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004295
Daniel Jasper775954b2015-04-24 10:08:09 +00004296 // Don't linewrap after very short segments.
4297 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4298 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4299 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4300 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4301 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4302 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4303 verifyFormat("aaa()\n"
4304 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4305 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4306 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4307
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004308 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4309 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4310 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4311 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4312 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004313 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004314
Daniel Jaspera41aa532014-09-19 08:01:25 +00004315 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004316 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4317 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004318
4319 // Prefer not to create "hanging" indents.
4320 verifyFormat(
4321 "return !soooooooooooooome_map\n"
4322 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4323 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004324 verifyFormat(
4325 "return aaaaaaaaaaaaaaaa\n"
4326 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4327 " .aaaa(aaaaaaaaaaaaaa);");
4328 // No hanging indent here.
4329 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4330 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4331 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4332 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004333 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4334 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4335 getLLVMStyleWithColumns(60));
4336 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4337 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4338 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4339 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004340 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4341 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4342 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004343}
4344
Daniel Jasperde5c2072012-12-24 00:13:23 +00004345TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4346 verifyFormat(
4347 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004348 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004349 verifyFormat(
4350 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4351 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4352
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004353 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004354 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004355 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4356 " ccccccccccccccccccccccccc) {\n}");
4357
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004358 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004359 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004360 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4361 " ccccccccccccccccccccccccc) {\n}");
4362
Daniel Jasperde5c2072012-12-24 00:13:23 +00004363 verifyFormat(
4364 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004365 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004366 verifyFormat(
4367 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4368 " ccccccccccccccccccccccccc) {\n}");
4369
Daniel Jasper400adc62013-02-08 15:28:42 +00004370 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4371 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4372 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4373 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004374 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4375 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4376 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4377 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4378
Daniel Jasper400adc62013-02-08 15:28:42 +00004379 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4380 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4381 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004382 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4383 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4384 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004385}
4386
Daniel Jasper43b65482013-01-23 12:27:43 +00004387TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004388 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004389 "unsigned Cost =\n"
4390 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4391 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004392 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004393 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4394 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004395
4396 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004397 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4398 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004399 verifyFormat("unsigned OriginalStartColumn =\n"
4400 " SourceMgr.getSpellingColumnNumber(\n"
4401 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4402 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004403}
4404
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004405TEST_F(FormatTest, AlignsAfterAssignments) {
4406 verifyFormat(
4407 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004408 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004409 verifyFormat(
4410 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004411 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004412 verifyFormat(
4413 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004414 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004415 verifyFormat(
4416 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004417 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004418 verifyFormat(
4419 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4420 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4421 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004422}
4423
4424TEST_F(FormatTest, AlignsAfterReturn) {
4425 verifyFormat(
4426 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4427 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4428 verifyFormat(
4429 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4430 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004431 verifyFormat(
4432 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004433 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004434 verifyFormat(
4435 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004436 " aaaaaaaaaaaaaaaaaaaaaa());");
4437 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4438 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4439 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4440 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4441 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004442 verifyFormat("return\n"
4443 " // true if code is one of a or b.\n"
4444 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004445}
4446
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004447TEST_F(FormatTest, AlignsAfterOpenBracket) {
4448 verifyFormat(
4449 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4450 " aaaaaaaaa aaaaaaa) {}");
4451 verifyFormat(
4452 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4453 " aaaaaaaaaaa aaaaaaaaa);");
4454 verifyFormat(
4455 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4456 " aaaaaaaaaaaaaaaaaaaaa));");
4457 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004458 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004459 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4460 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4461 Style);
4462 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4463 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4464 Style);
4465 verifyFormat("SomeLongVariableName->someFunction(\n"
4466 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4467 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004468 verifyFormat(
4469 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4470 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4471 Style);
4472 verifyFormat(
4473 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4474 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4475 Style);
4476 verifyFormat(
4477 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4478 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4479 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004480
Daniel Jasper2a9f7202016-02-08 09:52:54 +00004481 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4482 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
4483 " b));",
4484 Style);
4485
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004486 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4487 Style.BinPackArguments = false;
4488 Style.BinPackParameters = false;
4489 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4490 " aaaaaaaaaaa aaaaaaaa,\n"
4491 " aaaaaaaaa aaaaaaa,\n"
4492 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4493 Style);
4494 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4495 " aaaaaaaaaaa aaaaaaaaa,\n"
4496 " aaaaaaaaaaa aaaaaaaaa,\n"
4497 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4498 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004499 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4500 " aaaaaaaaaaaaaaa,\n"
4501 " aaaaaaaaaaaaaaaaaaaaa,\n"
4502 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00004503 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00004504 verifyFormat(
4505 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4506 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4507 Style);
4508 verifyFormat(
4509 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4510 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4511 Style);
4512 verifyFormat(
4513 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4514 " aaaaaaaaaaaaaaaaaaaaa(\n"
4515 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4516 " aaaaaaaaaaaaaaaa);",
4517 Style);
4518 verifyFormat(
4519 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4520 " aaaaaaaaaaaaaaaaaaaaa(\n"
4521 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4522 " aaaaaaaaaaaaaaaa);",
4523 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004524}
4525
Daniel Jasper3219e432014-12-02 13:24:51 +00004526TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4527 FormatStyle Style = getLLVMStyleWithColumns(40);
4528 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4529 " bbbbbbbbbbbbbbbbbbbbbb);",
4530 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004531 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00004532 Style.AlignOperands = false;
4533 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4534 " bbbbbbbbbbbbbbbbbbbbbb);",
4535 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004536 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004537 Style.AlignOperands = true;
4538 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4539 " bbbbbbbbbbbbbbbbbbbbbb);",
4540 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004541 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00004542 Style.AlignOperands = false;
4543 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4544 " bbbbbbbbbbbbbbbbbbbbbb);",
4545 Style);
4546}
4547
Daniel Jasper399d24b2013-01-09 07:06:56 +00004548TEST_F(FormatTest, BreaksConditionalExpressions) {
4549 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004550 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
4551 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4552 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00004553 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004554 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
4555 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4556 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004557 verifyFormat(
4558 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4559 " : aaaaaaaaaaaaa);");
4560 verifyFormat(
4561 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00004562 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00004563 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4564 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004565 verifyFormat(
4566 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4567 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4568 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00004569 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4570 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4571 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4572 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4573 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4574 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4575 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4576 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4577 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4578 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4579 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4580 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004581 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4582 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4583 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4584 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4585 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00004586 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4587 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4588 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00004589 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4590 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4591 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4592 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004593 verifyFormat(
4594 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4595 " ? aaaaaaaaaaaaaaa\n"
4596 " : aaaaaaaaaaaaaaa;");
4597 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004598 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00004599 " ? b\n"
4600 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00004601 verifyFormat("return aaaa == bbbb\n"
4602 " // comment\n"
4603 " ? aaaa\n"
4604 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00004605 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00004606 " format(TheLine.First,\n"
4607 " IndentForLevel[TheLine.Level] >= 0\n"
4608 " ? IndentForLevel[TheLine.Level]\n"
4609 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004610 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00004611 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00004612 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4613 " ? aaaaaaaaaaaaaaa\n"
4614 " : bbbbbbbbbbbbbbb //\n"
4615 " ? ccccccccccccccc\n"
4616 " : ddddddddddddddd;");
4617 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4618 " ? aaaaaaaaaaaaaaa\n"
4619 " : (bbbbbbbbbbbbbbb //\n"
4620 " ? ccccccccccccccc\n"
4621 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004622 verifyFormat(
4623 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4624 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4625 " aaaaaaaaaaaaaaaaaaaaa +\n"
4626 " aaaaaaaaaaaaaaaaaaaaa\n"
4627 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00004628 verifyFormat(
4629 "aaaaaa = aaaaaaaaaaaa\n"
4630 " ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4631 " : aaaaaaaaaaaaaaaaaaaaaa\n"
4632 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00004633
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004634 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00004635 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004636 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00004637 "void f() {\n"
4638 " g(aaa,\n"
4639 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4640 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4641 " ? aaaaaaaaaaaaaaa\n"
4642 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004643 "}",
4644 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00004645 verifyFormat(
4646 "void f() {\n"
4647 " g(aaa,\n"
4648 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4649 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4650 " ?: aaaaaaaaaaaaaaa);\n"
4651 "}",
4652 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00004653
4654 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4655 " // comment.\n"
4656 " ccccccccccccccccccccccccccccccccccccccc\n"
4657 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4658 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00004659
4660 // Assignments in conditional expressions. Apparently not uncommon :-(.
4661 verifyFormat("return a != b\n"
4662 " // comment\n"
4663 " ? a = b\n"
4664 " : a = b;");
4665 verifyFormat("return a != b\n"
4666 " // comment\n"
4667 " ? a = a != b\n"
4668 " // comment\n"
4669 " ? a = b\n"
4670 " : a\n"
4671 " : a;\n");
4672 verifyFormat("return a != b\n"
4673 " // comment\n"
4674 " ? a\n"
4675 " : a = a != b\n"
4676 " // comment\n"
4677 " ? a = b\n"
4678 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00004679}
4680
Daniel Jasper165b29e2013-11-08 00:57:11 +00004681TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4682 FormatStyle Style = getLLVMStyle();
4683 Style.BreakBeforeTernaryOperators = false;
4684 Style.ColumnLimit = 70;
4685 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004686 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
4687 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4688 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004689 Style);
4690 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00004691 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
4692 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4693 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00004694 Style);
4695 verifyFormat(
4696 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4697 " aaaaaaaaaaaaa);",
4698 Style);
4699 verifyFormat(
4700 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4701 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4702 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4703 " aaaaaaaaaaaaa);",
4704 Style);
4705 verifyFormat(
4706 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4707 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4708 " aaaaaaaaaaaaa);",
4709 Style);
4710 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4711 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4712 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4713 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4714 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4715 Style);
4716 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4717 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4718 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4719 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4720 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4721 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4722 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4723 Style);
4724 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4725 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4726 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4727 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4728 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4729 Style);
4730 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4731 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4732 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4733 Style);
4734 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00004735 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00004736 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4737 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4738 Style);
4739 verifyFormat(
4740 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4741 " aaaaaaaaaaaaaaa :\n"
4742 " aaaaaaaaaaaaaaa;",
4743 Style);
4744 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4745 " aaaaaaaaa ?\n"
4746 " b :\n"
4747 " c);",
4748 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00004749 verifyFormat("unsigned Indent =\n"
4750 " format(TheLine.First,\n"
4751 " IndentForLevel[TheLine.Level] >= 0 ?\n"
4752 " IndentForLevel[TheLine.Level] :\n"
4753 " TheLine * 2,\n"
4754 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
4755 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004756 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4757 " aaaaaaaaaaaaaaa :\n"
4758 " bbbbbbbbbbbbbbb ? //\n"
4759 " ccccccccccccccc :\n"
4760 " ddddddddddddddd;",
4761 Style);
4762 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4763 " aaaaaaaaaaaaaaa :\n"
4764 " (bbbbbbbbbbbbbbb ? //\n"
4765 " ccccccccccccccc :\n"
4766 " ddddddddddddddd);",
4767 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00004768 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4769 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4770 " ccccccccccccccccccccccccccc;",
4771 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00004772 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4773 " aaaaa :\n"
4774 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
4775 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00004776}
4777
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004778TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4779 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4780 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4781 verifyFormat("bool a = true, b = false;");
4782
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004783 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004784 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004785 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00004786 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004787 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00004788 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00004789 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00004790 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00004791 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4792 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4793 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4794 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4795 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4796 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004797
Daniel Jasperbea1ab42015-03-01 18:55:26 +00004798 FormatStyle Style = getGoogleStyle();
4799 Style.PointerAlignment = FormatStyle::PAS_Left;
4800 Style.DerivePointerAlignment = false;
4801 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4802 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4803 " *b = bbbbbbbbbbbbbbbbbbb;",
4804 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004805 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4806 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4807 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00004808 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00004809 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00004810}
4811
Nico Weber4a5030c2013-01-12 01:28:06 +00004812TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4813 verifyFormat("arr[foo ? bar : baz];");
4814 verifyFormat("f()[foo ? bar : baz];");
4815 verifyFormat("(a + b)[foo ? bar : baz];");
4816 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4817}
4818
Daniel Jasperf7935112012-12-03 18:12:45 +00004819TEST_F(FormatTest, AlignsStringLiterals) {
4820 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4821 " \"short literal\");");
4822 verifyFormat(
4823 "looooooooooooooooooooooooongFunction(\n"
4824 " \"short literal\"\n"
4825 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004826 verifyFormat("someFunction(\"Always break between multi-line\"\n"
4827 " \" string literals\",\n"
4828 " and, other, parameters);");
Manuel Klimek02f640a2013-02-20 15:25:48 +00004829 EXPECT_EQ("fun + \"1243\" /* comment */\n"
4830 " \"5678\";",
4831 format("fun + \"1243\" /* comment */\n"
4832 " \"5678\";",
4833 getLLVMStyleWithColumns(28)));
4834 EXPECT_EQ(
4835 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4836 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4837 " \"aaaaaaaaaaaaaaaa\";",
4838 format("aaaaaa ="
4839 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4840 "aaaaaaaaaaaaaaaaaaaaa\" "
4841 "\"aaaaaaaaaaaaaaaa\";"));
Manuel Klimek0c915712013-02-20 15:32:58 +00004842 verifyFormat("a = a + \"a\"\n"
4843 " \"a\"\n"
4844 " \"a\";");
Daniel Jasper7dd22c51b2013-05-16 04:26:02 +00004845 verifyFormat("f(\"a\", \"b\"\n"
4846 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00004847
4848 verifyFormat(
4849 "#define LL_FORMAT \"ll\"\n"
4850 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4851 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00004852
4853 verifyFormat("#define A(X) \\\n"
4854 " \"aaaaa\" #X \"bbbbbb\" \\\n"
4855 " \"ccccc\"",
4856 getLLVMStyleWithColumns(23));
4857 verifyFormat("#define A \"def\"\n"
4858 "f(\"abc\" A \"ghi\"\n"
4859 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004860
4861 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00004862 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00004863 verifyFormat("#define A(X) \\\n"
4864 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4865 " L\"ccccc\"",
4866 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00004867
4868 verifyFormat("f(@\"a\"\n"
4869 " @\"b\");");
4870 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00004871 " @\"b\"\n"
4872 " @\"c\";");
4873 verifyFormat("NSString s = @\"a\"\n"
4874 " \"b\"\n"
4875 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00004876}
4877
Zachary Turner448592e2015-12-18 22:20:15 +00004878TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004879 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00004880 // No declarations or definitions should be moved to own line.
4881 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4882 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004883 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004884 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004885 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004886 "int f() { return 1; }\n"
4887 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004888 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00004889
4890 // All declarations and definitions should have the return type moved to its
4891 // own
4892 // line.
4893 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4894 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004895 " int\n"
4896 " f() {\n"
4897 " return 1;\n"
4898 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004899 " int\n"
4900 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004901 "};\n"
4902 "int\n"
4903 "f() {\n"
4904 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00004905 "}\n"
4906 "int\n"
4907 "g();\n",
4908 Style);
4909
4910 // Top-level definitions, and no kinds of declarations should have the
4911 // return type moved to its own line.
4912 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4913 verifyFormat("class B {\n"
4914 " int f() { return 1; }\n"
4915 " int g();\n"
4916 "};\n"
4917 "int\n"
4918 "f() {\n"
4919 " return 1;\n"
4920 "}\n"
4921 "int g();\n",
4922 Style);
4923
4924 // Top-level definitions and declarations should have the return type moved
4925 // to its own line.
4926 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4927 verifyFormat("class C {\n"
4928 " int f() { return 1; }\n"
4929 " int g();\n"
4930 "};\n"
4931 "int\n"
4932 "f() {\n"
4933 " return 1;\n"
4934 "}\n"
4935 "int\n"
4936 "g();\n",
4937 Style);
4938
4939 // All definitions should have the return type moved to its own line, but no
4940 // kinds of declarations.
4941 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4942 verifyFormat("class D {\n"
4943 " int\n"
4944 " f() {\n"
4945 " return 1;\n"
4946 " }\n"
4947 " int g();\n"
4948 "};\n"
4949 "int\n"
4950 "f() {\n"
4951 " return 1;\n"
4952 "}\n"
4953 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004954 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004955 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004956 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00004957 " return \"\";\n"
4958 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004959 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004960 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00004961 verifyFormat("template <class T>\n"
4962 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004963 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004964 " return NULL;\n"
4965 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004966 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004967 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00004968 verifyFormat("class C {\n"
4969 " int\n"
4970 " operator+() {\n"
4971 " return 1;\n"
4972 " }\n"
4973 " int\n"
4974 " operator()() {\n"
4975 " return 1;\n"
4976 " }\n"
4977 "};\n",
4978 Style);
4979 verifyFormat("void\n"
4980 "A::operator()() {}\n"
4981 "void\n"
4982 "A::operator>>() {}\n"
4983 "void\n"
4984 "A::operator+() {}\n",
4985 Style);
4986 verifyFormat("void *operator new(std::size_t s);", // No break here.
4987 Style);
4988 verifyFormat("void *\n"
4989 "operator new(std::size_t s) {}",
4990 Style);
4991 verifyFormat("void *\n"
4992 "operator delete[](void *ptr) {}",
4993 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00004994 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00004995 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00004996 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00004997 "{\n"
4998 " return \"\";\n"
4999 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005000 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005001 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005002 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005003 "T *\n" // Problem here: no line break
5004 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005005 "{\n"
5006 " return NULL;\n"
5007 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005008 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005009 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005010}
5011
Alexander Kornienko58611712013-07-04 12:02:44 +00005012TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5013 FormatStyle NoBreak = getLLVMStyle();
5014 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5015 FormatStyle Break = getLLVMStyle();
5016 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005017 verifyFormat("aaaa = \"bbbb\"\n"
5018 " \"cccc\";",
5019 NoBreak);
5020 verifyFormat("aaaa =\n"
5021 " \"bbbb\"\n"
5022 " \"cccc\";",
5023 Break);
5024 verifyFormat("aaaa(\"bbbb\"\n"
5025 " \"cccc\");",
5026 NoBreak);
5027 verifyFormat("aaaa(\n"
5028 " \"bbbb\"\n"
5029 " \"cccc\");",
5030 Break);
5031 verifyFormat("aaaa(qqq, \"bbbb\"\n"
5032 " \"cccc\");",
5033 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005034 verifyFormat("aaaa(qqq,\n"
5035 " \"bbbb\"\n"
5036 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005037 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005038 verifyFormat("aaaa(qqq,\n"
5039 " L\"bbbb\"\n"
5040 " L\"cccc\");",
5041 Break);
5042 verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5043 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005044 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005045 verifyFormat("string s = someFunction(\n"
5046 " \"abc\"\n"
5047 " \"abc\");",
5048 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005049
Daniel Jasper3251fff2014-06-10 06:27:23 +00005050 // As we break before unary operators, breaking right after them is bad.
5051 verifyFormat("string foo = abc ? \"x\"\n"
5052 " \"blah blah blah blah blah blah\"\n"
5053 " : \"y\";",
5054 Break);
5055
Daniel Jasperc834c702013-07-17 15:38:19 +00005056 // Don't break if there is no column gain.
5057 verifyFormat("f(\"aaaa\"\n"
5058 " \"bbbb\");",
5059 Break);
5060
5061 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005062 EXPECT_EQ("x = \"a\\\n"
5063 "b\\\n"
5064 "c\";",
5065 format("x = \"a\\\n"
5066 "b\\\n"
5067 "c\";",
5068 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005069 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005070 " \"a\\\n"
5071 "b\\\n"
5072 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005073 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005074 "b\\\n"
5075 "c\";",
5076 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005077
5078 // Exempt ObjC strings for now.
5079 EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005080 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005081 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005082 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005083 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005084
5085 Break.ColumnLimit = 0;
5086 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005087}
5088
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005089TEST_F(FormatTest, AlignsPipes) {
5090 verifyFormat(
5091 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5092 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5093 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5094 verifyFormat(
5095 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5096 " << aaaaaaaaaaaaaaaaaaaa;");
5097 verifyFormat(
5098 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5099 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5100 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005101 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5102 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5103 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005104 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5105 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5106 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5107 verifyFormat(
5108 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5109 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5110 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005111 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5112 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5113 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5114 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005115 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5116 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005117 verifyFormat(
5118 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5119 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005120
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005121 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5122 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005123 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5124 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5125 " aaaaaaaaaaaaaaaaaaaaa)\n"
5126 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005127 verifyFormat("LOG_IF(aaa == //\n"
5128 " bbb)\n"
5129 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005130
Daniel Jasper467ddb12013-08-12 12:58:05 +00005131 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005132 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5133 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005134 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5135 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5136 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005137 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5138 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005139 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5140 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5141 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5142 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5143 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5144 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5145 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005146
Daniel Jasperc238c872013-04-02 14:33:13 +00005147 verifyFormat(
5148 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5149 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005150
5151 // Incomplete string literal.
5152 EXPECT_EQ("llvm::errs() << \"\n"
5153 " << a;",
5154 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005155
5156 verifyFormat("void f() {\n"
5157 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5158 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5159 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005160
5161 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005162 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5163 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5164 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005165
5166 // Handle '\n'.
5167 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5168 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5169 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5170 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5171 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5172 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5173 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005174}
5175
Daniel Jasper7209bb92016-12-13 11:16:42 +00005176TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5177 verifyFormat("return out << \"somepacket = {\\n\"\n"
5178 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5179 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5180 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5181 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5182 " << \"}\";");
5183
5184 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5185 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5186 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5187 verifyFormat(
5188 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5189 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5190 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5191 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5192 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5193 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5194 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5195 verifyFormat(
5196 "void f() {\n"
5197 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5198 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5199 "}");
5200
5201 // Breaking before the first "<<" is generally not desirable.
5202 verifyFormat(
5203 "llvm::errs()\n"
5204 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5205 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5206 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5207 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5208 getLLVMStyleWithColumns(70));
5209 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5210 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5211 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5212 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5213 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5214 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5215 getLLVMStyleWithColumns(70));
5216
5217 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5218 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5219 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5220 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5221 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5222 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005223 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5224 " (aaaa + aaaa);",
5225 getLLVMStyleWithColumns(40));
5226 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5227 " (aaaaaaa + aaaaa));",
5228 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005229 verifyFormat(
5230 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5231 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5232 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005233}
5234
Daniel Jasperf7935112012-12-03 18:12:45 +00005235TEST_F(FormatTest, UnderstandsEquals) {
5236 verifyFormat(
5237 "aaaaaaaaaaaaaaaaa =\n"
5238 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5239 verifyFormat(
5240 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005241 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005242 verifyFormat(
5243 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005244 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005245 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005246 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5247 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005248
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005249 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5250 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005251}
5252
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005253TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005254 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5255 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005256
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005257 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5258 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005259
5260 verifyFormat(
5261 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5262 " Parameter2);");
5263
5264 verifyFormat(
5265 "ShortObject->shortFunction(\n"
5266 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5267 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5268
5269 verifyFormat("loooooooooooooongFunction(\n"
5270 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5271
5272 verifyFormat(
5273 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5274 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5275
Daniel Jasper687af3b2013-02-14 14:26:07 +00005276 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5277 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005278 verifyFormat("void f() {\n"
5279 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5280 " .Times(2)\n"
5281 " .WillRepeatedly(Return(SomeValue));\n"
5282 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005283 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5284 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005285 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005286 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5287 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005288 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005289 verifyFormat("void f() {\n"
5290 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5291 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5292 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005293 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5294 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5295 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5296 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5297 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005298 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5299 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5300 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5301 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5302 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005303
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005304 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005305 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005306 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005307 verifyFormat(
5308 "aaaaaaaaaaa->aaaaaaaaa(\n"
5309 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5310 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005311
5312 verifyFormat(
5313 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5314 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005315 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5316 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5317 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5318 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005319
Daniel Jasper9b334242013-03-15 14:57:30 +00005320 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005321 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5322 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005323
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005324 FormatStyle NoBinPacking = getLLVMStyle();
5325 NoBinPacking.BinPackParameters = false;
5326 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5327 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5328 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5329 " aaaaaaaaaaaaaaaaaaa,\n"
5330 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5331 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005332
5333 // If there is a subsequent call, change to hanging indentation.
5334 verifyFormat(
5335 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5336 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5337 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5338 verifyFormat(
5339 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5340 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005341 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5342 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5343 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5344 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5345 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5346 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005347}
5348
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005349TEST_F(FormatTest, WrapsTemplateDeclarations) {
5350 verifyFormat("template <typename T>\n"
5351 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005352 verifyFormat("template <typename T>\n"
5353 "// T should be one of {A, B}.\n"
5354 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005355 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005356 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005357 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005358 verifyFormat("template <typename T>\n"
5359 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5360 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005361 verifyFormat(
5362 "template <typename T>\n"
5363 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5364 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005365 verifyFormat(
5366 "template <typename T>\n"
5367 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5368 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5369 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005370 verifyFormat("template <typename T>\n"
5371 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005372 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005373 verifyFormat(
5374 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5375 " typename T4 = char>\n"
5376 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005377 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5378 " template <typename> class cccccccccccccccccccccc,\n"
5379 " typename ddddddddddddd>\n"
5380 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005381 verifyFormat(
5382 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5383 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005384
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005385 verifyFormat("void f() {\n"
5386 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5387 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5388 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005389
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005390 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005391 verifyFormat("template <typename T> void f();");
5392 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005393 verifyFormat(
5394 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5395 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5396 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5397 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5398 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5399 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5400 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5401 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005402 EXPECT_EQ("static_cast<A< //\n"
5403 " B> *>(\n"
5404 "\n"
5405 " );",
5406 format("static_cast<A<//\n"
5407 " B>*>(\n"
5408 "\n"
5409 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005410 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5411 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005412
5413 FormatStyle AlwaysBreak = getLLVMStyle();
5414 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5415 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5416 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5417 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5418 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5419 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5420 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5421 verifyFormat("template <template <typename> class Fooooooo,\n"
5422 " template <typename> class Baaaaaaar>\n"
5423 "struct C {};",
5424 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005425 verifyFormat("template <typename T> // T can be A, B or C.\n"
5426 "struct C {};",
5427 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005428 verifyFormat("template <enum E> class A {\n"
5429 "public:\n"
5430 " E *f();\n"
5431 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005432}
5433
Daniel Jasper45797022013-01-25 10:57:27 +00005434TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5435 verifyFormat(
5436 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5437 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5438 verifyFormat(
5439 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5440 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5441 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5442
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005443 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005444 verifyFormat(
5445 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5446 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005447 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005448
Daniel Jasper45797022013-01-25 10:57:27 +00005449 verifyFormat(
5450 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005451 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005452
5453 // Breaking at nested name specifiers is generally not desirable.
5454 verifyFormat(
5455 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5456 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005457
5458 verifyFormat(
5459 "aaaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5460 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5461 " aaaaaaaaaaaaaaaaaaaaa);",
5462 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005463
5464 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5465 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5466 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005467}
5468
Daniel Jasperf7935112012-12-03 18:12:45 +00005469TEST_F(FormatTest, UnderstandsTemplateParameters) {
5470 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005471 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005472 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5473 verifyFormat("bool x = a < 1 || 2 > a;");
5474 verifyFormat("bool x = 5 < f<int>();");
5475 verifyFormat("bool x = f<int>() > 5;");
5476 verifyFormat("bool x = 5 < a<int>::x;");
5477 verifyFormat("bool x = a < 4 ? a > 2 : false;");
5478 verifyFormat("bool x = f() ? a < 2 : a > 2;");
5479
5480 verifyGoogleFormat("A<A<int>> a;");
5481 verifyGoogleFormat("A<A<A<int>>> a;");
5482 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005483 verifyGoogleFormat("A<A<int> > a;");
5484 verifyGoogleFormat("A<A<A<int> > > a;");
5485 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005486 verifyGoogleFormat("A<::A<int>> a;");
5487 verifyGoogleFormat("A<::A> a;");
5488 verifyGoogleFormat("A< ::A> a;");
5489 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005490 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5491 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00005492 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5493 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00005494 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5495 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00005496
Nico Weber7533b4d2014-09-24 17:17:32 +00005497 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5498
Daniel Jasperf7935112012-12-03 18:12:45 +00005499 verifyFormat("test >> a >> b;");
5500 verifyFormat("test << a >> b;");
5501
5502 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005503 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00005504 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00005505 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5506 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00005507 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00005508 verifyFormat("f(a.operator()<A>());");
5509 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5510 " .template operator()<A>());",
5511 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00005512
5513 // Not template parameters.
5514 verifyFormat("return a < b && c > d;");
5515 verifyFormat("void f() {\n"
5516 " while (a < b && c > d) {\n"
5517 " }\n"
5518 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00005519 verifyFormat("template <typename... Types>\n"
5520 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00005521
5522 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5523 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5524 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00005525 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00005526 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00005527 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00005528}
5529
Malcolm Parsons6af3f142016-11-03 16:57:30 +00005530TEST_F(FormatTest, BitshiftOperatorWidth) {
5531 EXPECT_EQ("int a = 1 << 2; /* foo\n"
5532 " bar */",
5533 format("int a=1<<2; /* foo\n"
5534 " bar */"));
5535
5536 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5537 " bar */",
5538 format("int b =256>>1 ; /* foo\n"
5539 " bar */"));
5540}
5541
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005542TEST_F(FormatTest, UnderstandsBinaryOperators) {
5543 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00005544 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00005545}
5546
5547TEST_F(FormatTest, UnderstandsPointersToMembers) {
5548 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005549 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00005550 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005551 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00005552 verifyFormat("void f() {\n"
5553 " (a->*f)();\n"
5554 " a->*x;\n"
5555 " (a.*f)();\n"
5556 " ((*a).*f)();\n"
5557 " a.*x;\n"
5558 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00005559 verifyFormat("void f() {\n"
5560 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5561 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5562 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00005563 verifyFormat(
5564 "(aaaaaaaaaa->*bbbbbbb)(\n"
5565 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005566 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005567 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00005568 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00005569}
5570
Daniel Jasper8dd40472012-12-21 09:41:31 +00005571TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00005572 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00005573 verifyFormat("f(-1, -2, -3);");
5574 verifyFormat("a[-1] = 5;");
5575 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005576 verifyFormat("if (i == -1) {\n}");
5577 verifyFormat("if (i != -1) {\n}");
5578 verifyFormat("if (i > -1) {\n}");
5579 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00005580 verifyFormat("++(a->f());");
5581 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00005582 verifyFormat("(a->f())++;");
5583 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005584 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00005585
5586 verifyFormat("a-- > b;");
5587 verifyFormat("b ? -a : c;");
5588 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005589 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00005590 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00005591 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00005592
5593 verifyFormat("return -1;");
5594 verifyFormat("switch (a) {\n"
5595 "case -1:\n"
5596 " break;\n"
5597 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00005598 verifyFormat("#define X -1");
5599 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00005600
Chandler Carruthf8b72662014-03-02 12:37:31 +00005601 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5602 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00005603
5604 verifyFormat("int a = /* confusing comment */ -1;");
5605 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5606 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005607}
5608
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005609TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00005610 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00005611 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00005612 "}");
5613 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00005614 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00005615 verifyFormat("*aaa = aaaaaaa( // break\n"
5616 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00005617}
5618
Daniel Jasper8863ada2013-08-26 08:10:17 +00005619TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00005620 verifyFormat("bool operator<();");
5621 verifyFormat("bool operator>();");
5622 verifyFormat("bool operator=();");
5623 verifyFormat("bool operator==();");
5624 verifyFormat("bool operator!=();");
5625 verifyFormat("int operator+();");
5626 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00005627 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005628 verifyFormat("bool operator();");
5629 verifyFormat("bool operator()();");
5630 verifyFormat("bool operator[]();");
5631 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005632 verifyFormat("operator int();");
5633 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005634 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005635 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00005636 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00005637 verifyFormat("void *operator new(std::size_t size);");
5638 verifyFormat("void *operator new[](std::size_t size);");
5639 verifyFormat("void operator delete(void *ptr);");
5640 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00005641 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5642 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00005643 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00005644 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005645
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005646 verifyFormat(
5647 "ostream &operator<<(ostream &OutputStream,\n"
5648 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00005649 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5650 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5651 " return left.group < right.group;\n"
5652 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00005653 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00005654 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00005655
Daniel Jasper35d2dc72013-02-11 08:01:18 +00005656 verifyGoogleFormat("operator void*();");
5657 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00005658 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00005659
5660 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00005661 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5662 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00005663}
5664
Daniel Jasper1c220482015-02-25 10:30:06 +00005665TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00005666 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5667 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5668 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5669 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5670 verifyFormat("Deleted &operator=(const Deleted &) &;");
5671 verifyFormat("Deleted &operator=(const Deleted &) &&;");
5672 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5673 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5674 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5675 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5676 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00005677 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00005678 verifyFormat("template <typename T>\n"
5679 "void F(T) && = delete;",
5680 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00005681
Daniel Jasperaf642c62015-08-25 13:40:51 +00005682 FormatStyle AlignLeft = getLLVMStyle();
5683 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00005684 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00005685 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5686 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5687 AlignLeft);
5688 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5689 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00005690 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5691 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5692 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5693 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00005694 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00005695
5696 FormatStyle Spaces = getLLVMStyle();
5697 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005698 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5699 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5700 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5701 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005702
5703 Spaces.SpacesInCStyleCastParentheses = false;
5704 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00005705 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5706 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5707 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5708 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00005709}
5710
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005711TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00005712 verifyFormat("void f() {\n"
5713 " A *a = new A;\n"
5714 " A *a = new (placement) A;\n"
5715 " delete a;\n"
5716 " delete (A *)a;\n"
5717 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00005718 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5719 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00005720 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5721 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5722 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00005723 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00005724}
5725
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005726TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005727 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005728 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005729 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005730 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005731 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005732 verifyIndependentOfContext("int a = b * 10;");
5733 verifyIndependentOfContext("int a = 10 * b;");
5734 verifyIndependentOfContext("int a = b * c;");
5735 verifyIndependentOfContext("int a += b * c;");
5736 verifyIndependentOfContext("int a -= b * c;");
5737 verifyIndependentOfContext("int a *= b * c;");
5738 verifyIndependentOfContext("int a /= b * c;");
5739 verifyIndependentOfContext("int a = *b;");
5740 verifyIndependentOfContext("int a = *b * c;");
5741 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00005742 verifyIndependentOfContext("int a = b * (10);");
5743 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005744 verifyIndependentOfContext("return 10 * b;");
5745 verifyIndependentOfContext("return *b * *c;");
5746 verifyIndependentOfContext("return a & ~b;");
5747 verifyIndependentOfContext("f(b ? *c : *d);");
5748 verifyIndependentOfContext("int a = b ? *c : *d;");
5749 verifyIndependentOfContext("*b = a;");
5750 verifyIndependentOfContext("a * ~b;");
5751 verifyIndependentOfContext("a * !b;");
5752 verifyIndependentOfContext("a * +b;");
5753 verifyIndependentOfContext("a * -b;");
5754 verifyIndependentOfContext("a * ++b;");
5755 verifyIndependentOfContext("a * --b;");
5756 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00005757 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005758 verifyIndependentOfContext("f() * b;");
5759 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00005760 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005761 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00005762 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005763 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00005764 verifyIndependentOfContext("return sizeof(int **);");
5765 verifyIndependentOfContext("return sizeof(int ******);");
5766 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00005767 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005768 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00005769 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00005770 verifyGoogleFormat("return sizeof(int**);");
5771 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5772 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00005773 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00005774 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00005775 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00005776 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00005777 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00005778 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00005779 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00005780 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00005781 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00005782 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00005783 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00005784 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00005785 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00005786 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00005787 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00005788 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00005789 verifyFormat("void f(const MyOverride &override);");
5790 verifyFormat("void f(const MyFinal &final);");
5791 verifyIndependentOfContext("bool a = f() && override.f();");
5792 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00005793
Daniel Jasper5b49f472013-01-23 12:10:53 +00005794 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00005795
Daniel Jasper5b49f472013-01-23 12:10:53 +00005796 verifyIndependentOfContext("A<int *> a;");
5797 verifyIndependentOfContext("A<int **> a;");
5798 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00005799 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005800 verifyIndependentOfContext(
5801 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005802 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00005803 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00005804 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00005805 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00005806 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00005807
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00005808 verifyFormat(
5809 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5810 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5811
Daniel Jasper1f5d6372016-06-13 14:45:12 +00005812 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00005813 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00005814 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005815 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00005816 verifyGoogleFormat("A<int*> a;");
5817 verifyGoogleFormat("A<int**> a;");
5818 verifyGoogleFormat("A<int*, int*> a;");
5819 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00005820 verifyGoogleFormat("f(b ? *c : *d);");
5821 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00005822 verifyGoogleFormat("Type* t = **x;");
5823 verifyGoogleFormat("Type* t = *++*x;");
5824 verifyGoogleFormat("*++*x;");
5825 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5826 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00005827 verifyGoogleFormat(
5828 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00005829 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00005830 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5831 verifyGoogleFormat("template <typename T>\n"
5832 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00005833
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005834 FormatStyle Left = getLLVMStyle();
5835 Left.PointerAlignment = FormatStyle::PAS_Left;
5836 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00005837 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00005838 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00005839
Daniel Jasper5b49f472013-01-23 12:10:53 +00005840 verifyIndependentOfContext("a = *(x + y);");
5841 verifyIndependentOfContext("a = &(x + y);");
5842 verifyIndependentOfContext("*(x + y).call();");
5843 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005844 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00005845
Daniel Jasper5b49f472013-01-23 12:10:53 +00005846 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00005847 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00005848 "int *MyValues = {\n"
5849 " *A, // Operator detection might be confused by the '{'\n"
5850 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00005851 "};");
Nico Weber80a82762013-01-17 17:17:19 +00005852
Daniel Jasper5b49f472013-01-23 12:10:53 +00005853 verifyIndependentOfContext("if (int *a = &b)");
5854 verifyIndependentOfContext("if (int &a = *b)");
5855 verifyIndependentOfContext("if (a & b[i])");
5856 verifyIndependentOfContext("if (a::b::c::d & b[i])");
5857 verifyIndependentOfContext("if (*b[i])");
5858 verifyIndependentOfContext("if (int *a = (&b))");
5859 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00005860 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00005861 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00005862 verifyFormat("void f() {\n"
5863 " for (const int &v : Values) {\n"
5864 " }\n"
5865 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00005866 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5867 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00005868 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00005869
Daniel Jaspera98da3d2013-11-07 19:56:07 +00005870 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005871 verifyFormat("#define MACRO \\\n"
5872 " int *i = a * b; \\\n"
5873 " void f(a *b);",
5874 getLLVMStyleWithColumns(19));
5875
Daniel Jasper97b89482013-03-13 07:49:51 +00005876 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00005877 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005878 verifyIndependentOfContext("T **t = new T *;");
5879 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00005880 verifyGoogleFormat("A = new SomeType*[Length]();");
5881 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00005882 verifyGoogleFormat("T** t = new T*;");
5883 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00005884
Daniel Jasper990ff972013-05-07 14:17:18 +00005885 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005886 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00005887 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00005888 verifyFormat("STATIC_ASSERT((a & b) == 0);");
5889 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005890 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00005891 "typename t::if<x && y>::type f() {}");
5892 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00005893 verifyFormat("vector<int *> v;");
5894 verifyFormat("vector<int *const> v;");
5895 verifyFormat("vector<int *const **const *> v;");
5896 verifyFormat("vector<int *volatile> v;");
5897 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005898 verifyFormat("foo<b && false>();");
5899 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00005900 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00005901 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005902 "template <class T,\n"
5903 " class = typename std::enable_if<\n"
5904 " std::is_integral<T>::value &&\n"
5905 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005906 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005907 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00005908 verifyFormat(
5909 "template <class T,\n"
5910 " class = typename ::std::enable_if<\n"
5911 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
5912 "void F();",
5913 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005914
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005915 verifyIndependentOfContext("MACRO(int *i);");
5916 verifyIndependentOfContext("MACRO(auto *a);");
5917 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00005918 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00005919 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00005920 // FIXME: Is there a way to make this work?
5921 // verifyIndependentOfContext("MACRO(A *a);");
5922
Daniel Jasper32ccb032014-06-23 07:36:18 +00005923 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00005924 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00005925
Daniel Jasper866468a2014-04-14 13:15:29 +00005926 EXPECT_EQ("#define OP(x) \\\n"
5927 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5928 " return s << a.DebugString(); \\\n"
5929 " }",
5930 format("#define OP(x) \\\n"
5931 " ostream &operator<<(ostream &s, const A &a) { \\\n"
5932 " return s << a.DebugString(); \\\n"
5933 " }",
5934 getLLVMStyleWithColumns(50)));
5935
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00005936 // FIXME: We cannot handle this case yet; we might be able to figure out that
5937 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00005938 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00005939
5940 FormatStyle PointerMiddle = getLLVMStyle();
5941 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
5942 verifyFormat("delete *x;", PointerMiddle);
5943 verifyFormat("int * x;", PointerMiddle);
5944 verifyFormat("template <int * y> f() {}", PointerMiddle);
5945 verifyFormat("int * f(int * a) {}", PointerMiddle);
5946 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
5947 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
5948 verifyFormat("A<int *> a;", PointerMiddle);
5949 verifyFormat("A<int **> a;", PointerMiddle);
5950 verifyFormat("A<int *, int *> a;", PointerMiddle);
5951 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00005952 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5953 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00005954 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005955
5956 // Member function reference qualifiers aren't binary operators.
5957 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005958 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005959 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005960 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00005961 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00005962 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005963}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00005964
Daniel Jasperee6d6502013-07-17 20:25:02 +00005965TEST_F(FormatTest, UnderstandsAttributes) {
5966 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00005967 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5968 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005969 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005970 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00005971 verifyFormat("__attribute__((nodebug)) void\n"
5972 "foo() {}\n",
5973 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00005974}
5975
Daniel Jasper10cd5812013-05-06 06:35:44 +00005976TEST_F(FormatTest, UnderstandsEllipsis) {
5977 verifyFormat("int printf(const char *fmt, ...);");
5978 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005979 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5980
5981 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00005982 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00005983 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00005984}
5985
Daniel Jasper8eb371b2013-03-01 17:13:29 +00005986TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
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 Jasper7fce3ab2013-02-06 14:22:40 +00005994 EXPECT_EQ("int* a;\n"
5995 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005996 "int* a;",
5997 format("int* a;\n"
5998 "int* a;\n"
5999 "int *a;",
6000 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006001 EXPECT_EQ("int *a;\n"
6002 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006003 "int *a;",
6004 format("int *a;\n"
6005 "int * a;\n"
6006 "int * a;",
6007 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006008 EXPECT_EQ("auto x = [] {\n"
6009 " int *a;\n"
6010 " int *a;\n"
6011 " int *a;\n"
6012 "};",
6013 format("auto x=[]{int *a;\n"
6014 "int * a;\n"
6015 "int * a;};",
6016 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006017}
6018
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006019TEST_F(FormatTest, UnderstandsRvalueReferences) {
6020 verifyFormat("int f(int &&a) {}");
6021 verifyFormat("int f(int a, char &&b) {}");
6022 verifyFormat("void f() { int &&a = b; }");
6023 verifyGoogleFormat("int f(int a, char&& b) {}");
6024 verifyGoogleFormat("void f() { int&& a = b; }");
6025
Daniel Jasper1eff9082013-05-27 16:36:33 +00006026 verifyIndependentOfContext("A<int &&> a;");
6027 verifyIndependentOfContext("A<int &&, int &&> a;");
6028 verifyGoogleFormat("A<int&&> a;");
6029 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006030
6031 // Not rvalue references:
6032 verifyFormat("template <bool B, bool C> class A {\n"
6033 " static_assert(B && C, \"Something is wrong\");\n"
6034 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006035 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6036 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006037 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006038}
6039
Manuel Klimekc1237a82013-01-23 14:08:21 +00006040TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6041 verifyFormat("void f() {\n"
6042 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006043 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006044 "}",
6045 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006046}
6047
Daniel Jasperef906a92013-01-13 08:01:36 +00006048TEST_F(FormatTest, FormatsCasts) {
6049 verifyFormat("Type *A = static_cast<Type *>(P);");
6050 verifyFormat("Type *A = (Type *)P;");
6051 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6052 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006053 verifyFormat("int a = (int)2.0f;");
6054 verifyFormat("x[(int32)y];");
6055 verifyFormat("x = (int32)y;");
6056 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6057 verifyFormat("int a = (int)*b;");
6058 verifyFormat("int a = (int)2.0f;");
6059 verifyFormat("int a = (int)~0;");
6060 verifyFormat("int a = (int)++a;");
6061 verifyFormat("int a = (int)sizeof(int);");
6062 verifyFormat("int a = (int)+2;");
6063 verifyFormat("my_int a = (my_int)2.0f;");
6064 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006065 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006066 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006067 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006068 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006069 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006070
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006071 verifyFormat("void f() { my_int a = (my_int)*b; }");
6072 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6073 verifyFormat("my_int a = (my_int)~0;");
6074 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006075 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006076 verifyFormat("my_int a = (my_int)1;");
6077 verifyFormat("my_int a = (my_int *)1;");
6078 verifyFormat("my_int a = (const my_int)-1;");
6079 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006080 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006081 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006082 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006083 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006084
6085 // FIXME: single value wrapped with paren will be treated as cast.
6086 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006087
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006088 verifyFormat("{ (void)F; }");
6089
Daniel Jasper998cabc2013-07-18 14:46:07 +00006090 // Don't break after a cast's
6091 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6092 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6093 " bbbbbbbbbbbbbbbbbbbbbb);");
6094
Daniel Jasperef906a92013-01-13 08:01:36 +00006095 // These are not casts.
6096 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006097 verifyFormat("f(foo)->b;");
6098 verifyFormat("f(foo).b;");
6099 verifyFormat("f(foo)(b);");
6100 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006101 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006102 verifyFormat("(*funptr)(foo)[4];");
6103 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006104 verifyFormat("void f(int *);");
6105 verifyFormat("void f(int *) = 0;");
6106 verifyFormat("void f(SmallVector<int>) {}");
6107 verifyFormat("void f(SmallVector<int>);");
6108 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006109 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006110 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006111 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006112 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6113 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006114 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006115
Daniel Jasperba0bda92013-02-23 08:07:18 +00006116 // These are not casts, but at some point were confused with casts.
6117 verifyFormat("virtual void foo(int *) override;");
6118 verifyFormat("virtual void foo(char &) const;");
6119 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006120 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006121 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006122 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006123 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006124
6125 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6126 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006127 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006128 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006129 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6130 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6131 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006132}
6133
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006134TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006135 verifyFormat("A<bool()> a;");
6136 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006137 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006138 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006139 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006140 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006141 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006142 verifyFormat("template <class CallbackClass>\n"
6143 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006144
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006145 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6146 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006147 verifyGoogleFormat(
6148 "template <class CallbackClass>\n"
6149 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006150
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006151 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006152 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006153 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006154 verifyFormat("some_var = function(*some_pointer_var)[0];");
6155 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006156 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006157 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006158}
6159
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006160TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6161 verifyFormat("A (*foo_)[6];");
6162 verifyFormat("vector<int> (*foo_)[6];");
6163}
6164
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006165TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6166 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6167 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6168 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6169 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006170 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6171 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006172
6173 // Different ways of ()-initializiation.
6174 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6175 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6176 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6177 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6178 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6179 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006180 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6181 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006182}
6183
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006184TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006185 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006186 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006187 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006188 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006189 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006190 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006191 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6192 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006193 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6194 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006195 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6196 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006197 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6198 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006199 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6200 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006201 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6202 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6203 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6204 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006205 FormatStyle Indented = getLLVMStyle();
6206 Indented.IndentWrappedFunctionNames = true;
6207 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6208 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6209 Indented);
6210 verifyFormat(
6211 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6212 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6213 Indented);
6214 verifyFormat(
6215 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6216 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6217 Indented);
6218 verifyFormat(
6219 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6220 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6221 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006222
6223 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006224 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6225 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6226 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006227
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006228 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006229 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006230 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006231 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6232 " SourceLocation L, IdentifierIn *II,\n"
6233 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006234 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006235 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006236 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006237 " const SomeType<string, SomeOtherTemplateParameter>\n"
6238 " &ReallyReallyLongParameterName,\n"
6239 " const SomeType<string, SomeOtherTemplateParameter>\n"
6240 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006241 verifyFormat("template <typename A>\n"
6242 "SomeLoooooooooooooooooooooongType<\n"
6243 " typename some_namespace::SomeOtherType<A>::Type>\n"
6244 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006245
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006246 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006247 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6248 " aaaaaaaaaaaaaaaaaaaaaaa;");
6249 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006250 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6251 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006252 verifyGoogleFormat(
6253 "some_namespace::LongReturnType\n"
6254 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006255 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006256
6257 verifyGoogleFormat("template <typename T>\n"
6258 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006259 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006260 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6261 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006262
6263 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006264 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6265 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006266 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6267 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6268 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6269 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6270 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6271 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6272 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006273}
6274
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006275TEST_F(FormatTest, FormatsArrays) {
6276 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6277 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006278 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6279 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006280 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6281 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006282 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6283 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6284 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6285 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6286 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6287 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6288 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6289 verifyFormat(
6290 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6291 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6292 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006293 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6294 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006295
6296 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6297 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006298 verifyFormat(
6299 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6300 " .aaaaaaa[0]\n"
6301 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006302 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006303
6304 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006305
6306 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6307 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006308}
6309
Daniel Jaspere9de2602012-12-06 09:56:08 +00006310TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6311 verifyFormat("(a)->b();");
6312 verifyFormat("--a;");
6313}
6314
Daniel Jasper8b529712012-12-04 13:02:32 +00006315TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006316 verifyFormat("#include <string>\n"
6317 "#include <a/b/c.h>\n"
6318 "#include \"a/b/string\"\n"
6319 "#include \"string.h\"\n"
6320 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006321 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006322 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006323 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006324 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006325 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006326 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
6327 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006328 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6329 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006330
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006331 verifyFormat("#import <string>");
6332 verifyFormat("#import <a/b/c.h>");
6333 verifyFormat("#import \"a/b/string\"");
6334 verifyFormat("#import \"string.h\"");
6335 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006336 verifyFormat("#if __has_include(<strstream>)\n"
6337 "#include <strstream>\n"
6338 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006339
Daniel Jasper343643b2014-08-13 08:29:18 +00006340 verifyFormat("#define MY_IMPORT <a/b>");
6341
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006342 // Protocol buffer definition or missing "#".
6343 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6344 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006345
6346 FormatStyle Style = getLLVMStyle();
6347 Style.AlwaysBreakBeforeMultilineStrings = true;
6348 Style.ColumnLimit = 0;
6349 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006350
6351 // But 'import' might also be a regular C++ namespace.
6352 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6353 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006354}
6355
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006356//===----------------------------------------------------------------------===//
6357// Error recovery tests.
6358//===----------------------------------------------------------------------===//
6359
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006360TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006361 FormatStyle NoBinPacking = getLLVMStyle();
6362 NoBinPacking.BinPackParameters = false;
6363 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6364 " double *min_x,\n"
6365 " double *max_x,\n"
6366 " double *min_y,\n"
6367 " double *max_y,\n"
6368 " double *min_z,\n"
6369 " double *max_z, ) {}",
6370 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006371}
6372
Daniel Jasper83a54d22013-01-10 09:26:47 +00006373TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006374 verifyFormat("void f() { return; }\n42");
6375 verifyFormat("void f() {\n"
6376 " if (0)\n"
6377 " return;\n"
6378 "}\n"
6379 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006380 verifyFormat("void f() { return }\n42");
6381 verifyFormat("void f() {\n"
6382 " if (0)\n"
6383 " return\n"
6384 "}\n"
6385 "42");
6386}
6387
6388TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6389 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6390 EXPECT_EQ("void f() {\n"
6391 " if (a)\n"
6392 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006393 "}",
6394 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006395 EXPECT_EQ("namespace N {\n"
6396 "void f()\n"
6397 "}",
6398 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006399 EXPECT_EQ("namespace N {\n"
6400 "void f() {}\n"
6401 "void g()\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006402 "}",
6403 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006404}
6405
Daniel Jasper2df93312013-01-09 10:16:05 +00006406TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6407 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006408 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006409 " b;",
6410 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006411 verifyFormat("function(\n"
6412 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006413 " LoooooooooooongArgument);\n",
6414 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006415}
6416
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006417TEST_F(FormatTest, IncorrectAccessSpecifier) {
6418 verifyFormat("public:");
6419 verifyFormat("class A {\n"
6420 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006421 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006422 "};");
6423 verifyFormat("public\n"
6424 "int qwerty;");
6425 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006426 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006427 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006428 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006429 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006430 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006431}
Daniel Jasperf7935112012-12-03 18:12:45 +00006432
Daniel Jasper291f9362013-03-20 15:58:10 +00006433TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6434 verifyFormat("{");
6435 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006436 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006437}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006438
6439TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006440 verifyFormat("do {\n}");
6441 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006442 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006443 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006444 "wheeee(fun);");
6445 verifyFormat("do {\n"
6446 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006447 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006448}
6449
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006450TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006451 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006452 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006453 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006454 verifyFormat("while {\n foo;\n foo();\n}");
6455 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006456}
6457
Daniel Jasperc0880a92013-01-04 18:52:56 +00006458TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006459 verifyIncompleteFormat("namespace {\n"
6460 "class Foo { Foo (\n"
6461 "};\n"
6462 "} // comment");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006463}
6464
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006465TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006466 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006467 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
6468 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006469 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006470
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006471 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00006472 " {\n"
6473 " breakme(\n"
6474 " qwe);\n"
6475 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006476 format("{\n"
6477 " {\n"
6478 " breakme(qwe);\n"
6479 "}\n",
6480 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00006481}
6482
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006483TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006484 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006485 " avariable,\n"
6486 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006487 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00006488}
6489
Manuel Klimek762dd182013-01-21 10:07:49 +00006490TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006491 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00006492}
6493
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006494TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006495 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00006496 verifyFormat("vector<int> x{\n"
6497 " 1, 2, 3, 4,\n"
6498 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006499 verifyFormat("vector<T> x{{}, {}, {}, {}};");
6500 verifyFormat("f({1, 2});");
6501 verifyFormat("auto v = Foo{-1};");
6502 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6503 verifyFormat("Class::Class : member{1, 2, 3} {}");
6504 verifyFormat("new vector<int>{1, 2, 3};");
6505 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00006506 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006507 verifyFormat("return {arg1, arg2};");
6508 verifyFormat("return {arg1, SomeType{parameter}};");
6509 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6510 verifyFormat("new T{arg1, arg2};");
6511 verifyFormat("f(MyMap[{composite, key}]);");
6512 verifyFormat("class Class {\n"
6513 " T member = {arg1, arg2};\n"
6514 "};");
6515 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00006516 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6517 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00006518
Daniel Jasper438059e2014-05-22 12:11:13 +00006519 verifyFormat("int foo(int i) { return fo1{}(i); }");
6520 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006521 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00006522 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00006523 verifyFormat("Node n{1, Node{1000}, //\n"
6524 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00006525 verifyFormat("Aaaa aaaaaaa{\n"
6526 " {\n"
6527 " aaaa,\n"
6528 " },\n"
6529 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00006530 verifyFormat("class C : public D {\n"
6531 " SomeClass SC{2};\n"
6532 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00006533 verifyFormat("class C : public A {\n"
6534 " class D : public B {\n"
6535 " void f() { int i{2}; }\n"
6536 " };\n"
6537 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00006538 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00006539
Daniel Jaspere4ada022016-12-13 10:05:03 +00006540 // Cases where distinguising braced lists and blocks is hard.
6541 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6542 verifyFormat("void f() {\n"
6543 " return; // comment\n"
6544 "}\n"
6545 "SomeType t;");
6546 verifyFormat("void f() {\n"
6547 " if (a) {\n"
6548 " f();\n"
6549 " }\n"
6550 "}\n"
6551 "SomeType t;");
6552
Daniel Jasper08434342015-05-26 07:26:26 +00006553 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006554 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00006555 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006556 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6557 " bbbbb,\n"
6558 " ccccc,\n"
6559 " ddddd,\n"
6560 " eeeee,\n"
6561 " ffffff,\n"
6562 " ggggg,\n"
6563 " hhhhhh,\n"
6564 " iiiiii,\n"
6565 " jjjjjj,\n"
6566 " kkkkkk};",
6567 NoBinPacking);
6568 verifyFormat("const Aaaaaa aaaaa = {\n"
6569 " aaaaa,\n"
6570 " bbbbb,\n"
6571 " ccccc,\n"
6572 " ddddd,\n"
6573 " eeeee,\n"
6574 " ffffff,\n"
6575 " ggggg,\n"
6576 " hhhhhh,\n"
6577 " iiiiii,\n"
6578 " jjjjjj,\n"
6579 " kkkkkk,\n"
6580 "};",
6581 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00006582 verifyFormat(
6583 "const Aaaaaa aaaaa = {\n"
6584 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
6585 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
6586 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6587 "};",
6588 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00006589
Chandler Carruthf8b72662014-03-02 12:37:31 +00006590 // FIXME: The alignment of these trailing comments might be bad. Then again,
6591 // this might be utterly useless in real code.
6592 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00006593 " : some_value{ //\n"
6594 " aaaaaaa, //\n"
6595 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00006596
Chandler Carruthf8b72662014-03-02 12:37:31 +00006597 // In braced lists, the first comment is always assumed to belong to the
6598 // first element. Thus, it can be moved to the next or previous line as
6599 // appropriate.
6600 EXPECT_EQ("function({// First element:\n"
6601 " 1,\n"
6602 " // Second element:\n"
6603 " 2});",
6604 format("function({\n"
6605 " // First element:\n"
6606 " 1,\n"
6607 " // Second element:\n"
6608 " 2});"));
6609 EXPECT_EQ("std::vector<int> MyNumbers{\n"
6610 " // First element:\n"
6611 " 1,\n"
6612 " // Second element:\n"
6613 " 2};",
6614 format("std::vector<int> MyNumbers{// First element:\n"
6615 " 1,\n"
6616 " // Second element:\n"
6617 " 2};",
6618 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00006619 // A trailing comma should still lead to an enforced line break.
6620 EXPECT_EQ("vector<int> SomeVector = {\n"
6621 " // aaa\n"
6622 " 1, 2,\n"
6623 "};",
6624 format("vector<int> SomeVector = { // aaa\n"
6625 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00006626
Chandler Carruthf8b72662014-03-02 12:37:31 +00006627 FormatStyle ExtraSpaces = getLLVMStyle();
6628 ExtraSpaces.Cpp11BracedListStyle = false;
6629 ExtraSpaces.ColumnLimit = 75;
6630 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6631 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6632 verifyFormat("f({ 1, 2 });", ExtraSpaces);
6633 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6634 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6635 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6636 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6637 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6638 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6639 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6640 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6641 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6642 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6643 verifyFormat("class Class {\n"
6644 " T member = { arg1, arg2 };\n"
6645 "};",
6646 ExtraSpaces);
6647 verifyFormat(
6648 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6649 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6650 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6651 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6652 ExtraSpaces);
6653 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00006654 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006655 ExtraSpaces);
6656 verifyFormat(
6657 "someFunction(OtherParam,\n"
6658 " BracedList{ // comment 1 (Forcing interesting break)\n"
6659 " param1, param2,\n"
6660 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00006661 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00006662 ExtraSpaces);
6663 verifyFormat(
6664 "std::this_thread::sleep_for(\n"
6665 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6666 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00006667 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00006668 " aaaaaaa,\n"
6669 " aaaaaaaaaa,\n"
6670 " aaaaa,\n"
6671 " aaaaaaaaaaaaaaa,\n"
6672 " aaa,\n"
6673 " aaaaaaaaaa,\n"
6674 " a,\n"
6675 " aaaaaaaaaaaaaaaaaaaaa,\n"
6676 " aaaaaaaaaaaa,\n"
6677 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6678 " aaaaaaa,\n"
6679 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006680 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00006681}
6682
Daniel Jasper33b909c2013-10-25 14:29:37 +00006683TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00006684 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6685 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6686 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6687 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6688 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6689 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006690 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006691 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00006692 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006693 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6694 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006695 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00006696 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6697 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6698 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
6699 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6700 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6701 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
6702 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006703 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006704 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6705 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00006706 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6707 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6708 " // Separating comment.\n"
6709 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6710 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6711 " // Leading comment\n"
6712 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6713 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006714 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6715 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006716 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00006717 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6718 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006719 getLLVMStyleWithColumns(38));
6720 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006721 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6722 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006723 verifyFormat(
6724 "static unsigned SomeValues[10][3] = {\n"
6725 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
6726 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6727 verifyFormat("static auto fields = new vector<string>{\n"
6728 " \"aaaaaaaaaaaaa\",\n"
6729 " \"aaaaaaaaaaaaa\",\n"
6730 " \"aaaaaaaaaaaa\",\n"
6731 " \"aaaaaaaaaaaaaa\",\n"
6732 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6733 " \"aaaaaaaaaaaa\",\n"
6734 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6735 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00006736 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6737 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6738 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6739 " 3, cccccccccccccccccccccc};",
6740 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00006741
6742 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00006743 verifyFormat("vector<int> x = {\n"
6744 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
6745 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00006746 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00006747 verifyFormat("vector<int> x = {\n"
6748 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00006749 "};",
6750 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00006751 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6752 " 1, 1, 1, 1,\n"
6753 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00006754 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006755
Daniel Jasper60c27072015-05-13 08:16:00 +00006756 // Trailing comment in the first line.
6757 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
6758 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
6759 " 111111111, 222222222, 3333333333, 444444444, //\n"
6760 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00006761 // Trailing comment in the last line.
6762 verifyFormat("int aaaaa[] = {\n"
6763 " 1, 2, 3, // comment\n"
6764 " 4, 5, 6 // comment\n"
6765 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00006766
Daniel Jaspere4c16c72015-05-08 13:51:14 +00006767 // With nested lists, we should either format one item per line or all nested
6768 // lists one on line.
6769 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006770 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6771 " {aaaaaaaaaaaaaaaaaaa},\n"
6772 " {aaaaaaaaaaaaaaaaaaaaa},\n"
6773 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00006774 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00006775 verifyFormat(
6776 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00006777 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6778 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6779 " {aaa, aaa},\n"
6780 " {aaa, aaa},\n"
6781 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6782 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6783 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00006784
6785 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006786 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
6787 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00006788
6789 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00006790
Daniel Jaspereb65e912015-12-21 18:31:15 +00006791 // No braced initializer here.
6792 verifyFormat("void f() {\n"
6793 " struct Dummy {};\n"
6794 " f(v);\n"
6795 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00006796
6797 // Long lists should be formatted in columns even if they are nested.
6798 verifyFormat(
6799 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6800 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6801 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6802 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6803 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6804 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00006805
6806 // Allow "single-column" layout even if that violates the column limit. There
6807 // isn't going to be a better way.
6808 verifyFormat("std::vector<int> a = {\n"
6809 " aaaaaaaa,\n"
6810 " aaaaaaaa,\n"
6811 " aaaaaaaa,\n"
6812 " aaaaaaaa,\n"
6813 " aaaaaaaaaa,\n"
6814 " aaaaaaaa,\n"
6815 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
6816 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00006817 verifyFormat("vector<int> aaaa = {\n"
6818 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6819 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6820 " aaaaaa.aaaaaaa,\n"
6821 " aaaaaa.aaaaaaa,\n"
6822 " aaaaaa.aaaaaaa,\n"
6823 " aaaaaa.aaaaaaa,\n"
6824 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00006825
6826 // Don't create hanging lists.
6827 verifyFormat("someFunction(Param,\n"
6828 " {List1, List2,\n"
6829 " List3});",
6830 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00006831 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
6832 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00006833}
6834
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006835TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006836 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00006837 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006838
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006839 verifyFormat("void f() { return 42; }");
6840 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006841 " return 42;\n"
6842 "}",
6843 DoNotMerge);
6844 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006845 " // Comment\n"
6846 "}");
6847 verifyFormat("{\n"
6848 "#error {\n"
6849 " int a;\n"
6850 "}");
6851 verifyFormat("{\n"
6852 " int a;\n"
6853 "#error {\n"
6854 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00006855 verifyFormat("void f() {} // comment");
6856 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00006857 verifyFormat("void f() {\n"
6858 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00006859 DoNotMerge);
6860 verifyFormat("void f() {\n"
6861 " int a;\n"
6862 "} // comment",
6863 DoNotMerge);
6864 verifyFormat("void f() {\n"
6865 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00006866 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006867
6868 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
6869 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
6870
6871 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
6872 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00006873 verifyFormat("class C {\n"
6874 " C()\n"
6875 " : iiiiiiii(nullptr),\n"
6876 " kkkkkkk(nullptr),\n"
6877 " mmmmmmm(nullptr),\n"
6878 " nnnnnnn(nullptr) {}\n"
6879 "};",
6880 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00006881
6882 FormatStyle NoColumnLimit = getLLVMStyle();
6883 NoColumnLimit.ColumnLimit = 0;
6884 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
6885 EXPECT_EQ("class C {\n"
6886 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00006887 "};",
6888 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00006889 EXPECT_EQ("A()\n"
6890 " : b(0) {\n"
6891 "}",
6892 format("A()\n:b(0)\n{\n}", NoColumnLimit));
6893
6894 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00006895 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
6896 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00006897 EXPECT_EQ("A()\n"
6898 " : b(0) {\n"
6899 "}",
6900 format("A():b(0){}", DoNotMergeNoColumnLimit));
6901 EXPECT_EQ("A()\n"
6902 " : b(0) {\n"
6903 "}",
6904 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00006905
6906 verifyFormat("#define A \\\n"
6907 " void f() { \\\n"
6908 " int i; \\\n"
6909 " }",
6910 getLLVMStyleWithColumns(20));
6911 verifyFormat("#define A \\\n"
6912 " void f() { int i; }",
6913 getLLVMStyleWithColumns(21));
6914 verifyFormat("#define A \\\n"
6915 " void f() { \\\n"
6916 " int i; \\\n"
6917 " } \\\n"
6918 " int j;",
6919 getLLVMStyleWithColumns(22));
6920 verifyFormat("#define A \\\n"
6921 " void f() { int i; } \\\n"
6922 " int j;",
6923 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006924}
6925
Daniel Jasperd74cf402014-04-08 12:46:38 +00006926TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
6927 FormatStyle MergeInlineOnly = getLLVMStyle();
6928 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6929 verifyFormat("class C {\n"
6930 " int f() { return 42; }\n"
6931 "};",
6932 MergeInlineOnly);
6933 verifyFormat("int f() {\n"
6934 " return 42;\n"
6935 "}",
6936 MergeInlineOnly);
6937}
6938
Manuel Klimeke01bab52013-01-15 13:38:33 +00006939TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
6940 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00006941 verifyFormat("struct foo a = {bar};\nint n;");
6942 verifyFormat("class foo a = {bar};\nint n;");
6943 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006944
6945 // Elaborate types inside function definitions.
6946 verifyFormat("struct foo f() {}\nint n;");
6947 verifyFormat("class foo f() {}\nint n;");
6948 verifyFormat("union foo f() {}\nint n;");
6949
6950 // Templates.
6951 verifyFormat("template <class X> void f() {}\nint n;");
6952 verifyFormat("template <struct X> void f() {}\nint n;");
6953 verifyFormat("template <union X> void f() {}\nint n;");
6954
6955 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006956 verifyFormat("struct {\n} n;");
6957 verifyFormat(
6958 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006959 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006960 verifyFormat("class MACRO Z {\n} n;");
6961 verifyFormat("class MACRO(X) Z {\n} n;");
6962 verifyFormat("class __attribute__(X) Z {\n} n;");
6963 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00006964 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00006965 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00006966 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6967 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00006968
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006969 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006970 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00006971
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006972 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00006973 verifyFormat(
6974 "template <typename F>\n"
6975 "Matcher(const Matcher<F> &Other,\n"
6976 " typename enable_if_c<is_base_of<F, T>::value &&\n"
6977 " !is_same<F, T>::value>::type * = 0)\n"
6978 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6979
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006980 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006981 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00006982 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006983
6984 // FIXME:
6985 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006986 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00006987
Manuel Klimeke01bab52013-01-15 13:38:33 +00006988 // Elaborate types where incorrectly parsing the structural element would
6989 // break the indent.
6990 verifyFormat("if (true)\n"
6991 " class X x;\n"
6992 "else\n"
6993 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00006994
6995 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00006996 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00006997}
6998
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006999TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007000 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7001 format("#error Leave all white!!!!! space* alone!\n"));
7002 EXPECT_EQ(
7003 "#warning Leave all white!!!!! space* alone!\n",
7004 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007005 EXPECT_EQ("#error 1", format(" # error 1"));
7006 EXPECT_EQ("#warning 1", format(" # warning 1"));
7007}
7008
Daniel Jasper4431aa92013-04-23 13:54:04 +00007009TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007010 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007011 verifyFormat("#if (AAAA && BBBB)");
7012 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007013 // FIXME: Come up with a better indentation for #elif.
7014 verifyFormat(
7015 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7016 " defined(BBBBBBBB)\n"
7017 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7018 " defined(BBBBBBBB)\n"
7019 "#endif",
7020 getLLVMStyleWithColumns(65));
7021}
7022
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007023TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7024 FormatStyle AllowsMergedIf = getGoogleStyle();
7025 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7026 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7027 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007028 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7029 EXPECT_EQ("if (true) return 42;",
7030 format("if (true)\nreturn 42;", AllowsMergedIf));
7031 FormatStyle ShortMergedIf = AllowsMergedIf;
7032 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007033 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007034 " if (true) return 42;",
7035 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007036 verifyFormat("#define A \\\n"
7037 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007038 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007039 "#define B",
7040 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007041 verifyFormat("#define A \\\n"
7042 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007043 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007044 "g();",
7045 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007046 verifyFormat("{\n"
7047 "#ifdef A\n"
7048 " // Comment\n"
7049 " if (true) continue;\n"
7050 "#endif\n"
7051 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007052 " if (true) continue;\n"
7053 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007054 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007055 ShortMergedIf.ColumnLimit = 29;
7056 verifyFormat("#define A \\\n"
7057 " if (aaaaaaaaaa) return 1; \\\n"
7058 " return 2;",
7059 ShortMergedIf);
7060 ShortMergedIf.ColumnLimit = 28;
7061 verifyFormat("#define A \\\n"
7062 " if (aaaaaaaaaa) \\\n"
7063 " return 1; \\\n"
7064 " return 2;",
7065 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007066}
7067
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007068TEST_F(FormatTest, BlockCommentsInControlLoops) {
7069 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7070 " f();\n"
7071 "}");
7072 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7073 " f();\n"
7074 "} /* another comment */ else /* comment #3 */ {\n"
7075 " g();\n"
7076 "}");
7077 verifyFormat("while (0) /* a comment in a strange place */ {\n"
7078 " f();\n"
7079 "}");
7080 verifyFormat("for (;;) /* a comment in a strange place */ {\n"
7081 " f();\n"
7082 "}");
7083 verifyFormat("do /* a comment in a strange place */ {\n"
7084 " f();\n"
7085 "} /* another comment */ while (0);");
7086}
7087
7088TEST_F(FormatTest, BlockComments) {
7089 EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
7090 format("/* *//* */ /* */\n/* *//* */ /* */"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007091 EXPECT_EQ("/* */ a /* */ b;", format(" /* */ a/* */ b;"));
Daniel Jaspera49393f2013-08-28 09:07:32 +00007092 EXPECT_EQ("#define A /*123*/ \\\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007093 " b\n"
7094 "/* */\n"
7095 "someCall(\n"
7096 " parameter);",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00007097 format("#define A /*123*/ b\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007098 "/* */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007099 "someCall(parameter);",
7100 getLLVMStyleWithColumns(15)));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007101
7102 EXPECT_EQ("#define A\n"
7103 "/* */ someCall(\n"
7104 " parameter);",
7105 format("#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007106 "/* */someCall(parameter);",
7107 getLLVMStyleWithColumns(15)));
Daniel Jasper51fb2b22013-05-30 06:40:07 +00007108 EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007109 EXPECT_EQ("/*\n"
7110 "*\n"
7111 " * aaaaaa\n"
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00007112 " * aaaaaa\n"
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007113 "*/",
7114 format("/*\n"
7115 "*\n"
7116 " * aaaaaa aaaaaa\n"
7117 "*/",
7118 getLLVMStyleWithColumns(10)));
Daniel Jasperce257f22013-05-30 17:27:48 +00007119 EXPECT_EQ("/*\n"
7120 "**\n"
7121 "* aaaaaa\n"
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007122 "*aaaaaa\n"
Daniel Jasperce257f22013-05-30 17:27:48 +00007123 "*/",
7124 format("/*\n"
7125 "**\n"
7126 "* aaaaaa aaaaaa\n"
7127 "*/",
7128 getLLVMStyleWithColumns(10)));
Daniel Jasperacadc8e2016-06-08 09:45:08 +00007129 EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7130 " /* line 1\n"
7131 " bbbbbbbbbbbb */\n"
7132 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7133 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7134 " /* line 1\n"
7135 " bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7136 getLLVMStyleWithColumns(50)));
Daniel Jasper1f140982013-02-04 07:32:14 +00007137
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007138 FormatStyle NoBinPacking = getLLVMStyle();
7139 NoBinPacking.BinPackParameters = false;
Daniel Jasper1f140982013-02-04 07:32:14 +00007140 EXPECT_EQ("someFunction(1, /* comment 1 */\n"
7141 " 2, /* comment 2 */\n"
7142 " 3, /* comment 3 */\n"
Daniel Jasper14e40ec2013-02-04 08:34:57 +00007143 " aaaa,\n"
7144 " bbbb);",
Daniel Jasper1f140982013-02-04 07:32:14 +00007145 format("someFunction (1, /* comment 1 */\n"
7146 " 2, /* comment 2 */ \n"
7147 " 3, /* comment 3 */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007148 "aaaa, bbbb );",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007149 NoBinPacking));
Daniel Jasper38396592013-02-06 15:23:09 +00007150 verifyFormat(
7151 "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7152 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7153 EXPECT_EQ(
7154 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7155 " aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7156 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
7157 format(
7158 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7159 " aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7160 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
Daniel Jasper94f0e132013-02-06 20:07:35 +00007161 EXPECT_EQ(
7162 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7163 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7164 "int cccccccccccccccccccccccccccccc; /* comment */\n",
7165 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7166 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7167 "int cccccccccccccccccccccccccccccc; /* comment */\n"));
Daniel Jasper022612d2013-07-01 09:34:09 +00007168
7169 verifyFormat("void f(int * /* unused */) {}");
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007170
7171 EXPECT_EQ("/*\n"
7172 " **\n"
7173 " */",
7174 format("/*\n"
7175 " **\n"
7176 " */"));
7177 EXPECT_EQ("/*\n"
7178 " *q\n"
7179 " */",
7180 format("/*\n"
7181 " *q\n"
7182 " */"));
7183 EXPECT_EQ("/*\n"
7184 " * q\n"
7185 " */",
7186 format("/*\n"
7187 " * q\n"
7188 " */"));
7189 EXPECT_EQ("/*\n"
7190 " **/",
7191 format("/*\n"
7192 " **/"));
7193 EXPECT_EQ("/*\n"
7194 " ***/",
7195 format("/*\n"
7196 " ***/"));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007197}
7198
Manuel Klimek82b836a2013-02-06 16:40:56 +00007199TEST_F(FormatTest, BlockCommentsInMacros) {
7200 EXPECT_EQ("#define A \\\n"
7201 " { \\\n"
7202 " /* one line */ \\\n"
7203 " someCall();",
7204 format("#define A { \\\n"
7205 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007206 " someCall();",
7207 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007208 EXPECT_EQ("#define A \\\n"
7209 " { \\\n"
7210 " /* previous */ \\\n"
7211 " /* one line */ \\\n"
7212 " someCall();",
7213 format("#define A { \\\n"
7214 " /* previous */ \\\n"
7215 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007216 " someCall();",
7217 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007218}
7219
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007220TEST_F(FormatTest, BlockCommentsAtEndOfLine) {
7221 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007222 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007223 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007224 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007225 "};",
7226 getLLVMStyleWithColumns(15)));
7227 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007228 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007229 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007230 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007231 "};",
7232 getLLVMStyleWithColumns(15)));
7233
7234 // FIXME: The formatting is still wrong here.
7235 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007236 " 1111 /* a\n"
7237 " */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007238 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007239 format("a = {1111 /* a */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007240 "};",
7241 getLLVMStyleWithColumns(15)));
7242}
7243
Manuel Klimek82b836a2013-02-06 16:40:56 +00007244TEST_F(FormatTest, IndentLineCommentsInStartOfBlockAtEndOfFile) {
Manuel Klimek82b836a2013-02-06 16:40:56 +00007245 verifyFormat("{\n"
Marianne Mailhot-Sarrasin03137c62016-04-14 14:56:49 +00007246 " // a\n"
7247 " // b");
Manuel Klimek82b836a2013-02-06 16:40:56 +00007248}
7249
Manuel Klimekd33516e2013-01-23 10:09:28 +00007250TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007251 verifyFormat("void f(int *a);");
7252 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007253 verifyFormat("class A {\n void f(int *a);\n};");
7254 verifyFormat("class A {\n int *a;\n};");
7255 verifyFormat("namespace a {\n"
7256 "namespace b {\n"
7257 "class A {\n"
7258 " void f() {}\n"
7259 " int *a;\n"
7260 "};\n"
7261 "}\n"
7262 "}");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007263}
7264
Manuel Klimekd33516e2013-01-23 10:09:28 +00007265TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7266 verifyFormat("while");
7267 verifyFormat("operator");
7268}
7269
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007270TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7271 // This code would be painfully slow to format if we didn't skip it.
7272 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
7273 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7274 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7275 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7276 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7277 "A(1, 1)\n"
7278 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7279 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7280 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7281 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7282 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7283 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7284 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7285 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7286 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7287 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7288 // Deeply nested part is untouched, rest is formatted.
7289 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7290 format(std::string("int i;\n") + Code + "int j;\n",
7291 getLLVMStyle(), IC_ExpectIncomplete));
7292}
7293
Nico Weber7e6a7a12013-01-08 17:56:31 +00007294//===----------------------------------------------------------------------===//
7295// Objective-C tests.
7296//===----------------------------------------------------------------------===//
7297
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007298TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7299 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7300 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7301 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007302 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007303 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7304 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7305 format("-(NSInteger)Method3:(id)anObject;"));
7306 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7307 format("-(NSInteger)Method4:(id)anObject;"));
7308 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7309 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7310 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7311 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007312 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7313 "forAllCells:(BOOL)flag;",
7314 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7315 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007316
7317 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007318 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7319 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007320 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7321 " inRange:(NSRange)range\n"
7322 " outRange:(NSRange)out_range\n"
7323 " outRange1:(NSRange)out_range1\n"
7324 " outRange2:(NSRange)out_range2\n"
7325 " outRange3:(NSRange)out_range3\n"
7326 " outRange4:(NSRange)out_range4\n"
7327 " outRange5:(NSRange)out_range5\n"
7328 " outRange6:(NSRange)out_range6\n"
7329 " outRange7:(NSRange)out_range7\n"
7330 " outRange8:(NSRange)out_range8\n"
7331 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007332
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007333 // When the function name has to be wrapped.
7334 FormatStyle Style = getLLVMStyle();
7335 Style.IndentWrappedFunctionNames = false;
7336 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7337 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7338 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7339 "}",
7340 Style);
7341 Style.IndentWrappedFunctionNames = true;
7342 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7343 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7344 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7345 "}",
7346 Style);
7347
Nico Weberd6f962f2013-01-10 20:18:33 +00007348 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007349 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007350 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7351 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007352 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007353
Daniel Jasper37194282013-05-28 08:33:00 +00007354 verifyFormat("- (int (*)())foo:(int (*)())f;");
7355 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007356
7357 // If there's no return type (very rare in practice!), LLVM and Google style
7358 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007359 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007360 verifyFormat("- foo:(int)f;");
7361 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007362}
7363
Nico Weber0588b502013-02-07 00:19:29 +00007364
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007365TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007366 EXPECT_EQ("\"some text \"\n"
7367 "\"other\";",
7368 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007369 EXPECT_EQ("\"some text \"\n"
7370 "\"other\";",
7371 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007372 EXPECT_EQ(
7373 "#define A \\\n"
7374 " \"some \" \\\n"
7375 " \"text \" \\\n"
7376 " \"other\";",
7377 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7378 EXPECT_EQ(
7379 "#define A \\\n"
7380 " \"so \" \\\n"
7381 " \"text \" \\\n"
7382 " \"other\";",
7383 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7384
7385 EXPECT_EQ("\"some text\"",
7386 format("\"some text\"", getLLVMStyleWithColumns(1)));
7387 EXPECT_EQ("\"some text\"",
7388 format("\"some text\"", getLLVMStyleWithColumns(11)));
7389 EXPECT_EQ("\"some \"\n"
7390 "\"text\"",
7391 format("\"some text\"", getLLVMStyleWithColumns(10)));
7392 EXPECT_EQ("\"some \"\n"
7393 "\"text\"",
7394 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007395 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007396 "\" tex\"\n"
7397 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007398 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007399 EXPECT_EQ("\"some\"\n"
7400 "\" tex\"\n"
7401 "\" and\"",
7402 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7403 EXPECT_EQ("\"some\"\n"
7404 "\"/tex\"\n"
7405 "\"/and\"",
7406 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007407
7408 EXPECT_EQ("variable =\n"
7409 " \"long string \"\n"
7410 " \"literal\";",
7411 format("variable = \"long string literal\";",
7412 getLLVMStyleWithColumns(20)));
7413
7414 EXPECT_EQ("variable = f(\n"
7415 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007416 " \"literal\",\n"
7417 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007418 " loooooooooooooooooooong);",
7419 format("variable = f(\"long string literal\", short, "
7420 "loooooooooooooooooooong);",
7421 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007422
Daniel Jaspera44991332015-04-29 13:06:49 +00007423 EXPECT_EQ(
7424 "f(g(\"long string \"\n"
7425 " \"literal\"),\n"
7426 " b);",
7427 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007428 EXPECT_EQ("f(g(\"long string \"\n"
7429 " \"literal\",\n"
7430 " a),\n"
7431 " b);",
7432 format("f(g(\"long string literal\", a), b);",
7433 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007434 EXPECT_EQ(
7435 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00007436 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007437 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7438 EXPECT_EQ("f(\"one two three four five six \"\n"
7439 " \"seven\".split(\n"
7440 " really_looooong_variable));",
7441 format("f(\"one two three four five six seven\"."
7442 "split(really_looooong_variable));",
7443 getLLVMStyleWithColumns(33)));
7444
7445 EXPECT_EQ("f(\"some \"\n"
7446 " \"text\",\n"
7447 " other);",
7448 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00007449
7450 // Only break as a last resort.
7451 verifyFormat(
7452 "aaaaaaaaaaaaaaaaaaaa(\n"
7453 " aaaaaaaaaaaaaaaaaaaa,\n"
7454 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00007455
Daniel Jaspera44991332015-04-29 13:06:49 +00007456 EXPECT_EQ("\"splitmea\"\n"
7457 "\"trandomp\"\n"
7458 "\"oint\"",
7459 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00007460
Daniel Jaspera44991332015-04-29 13:06:49 +00007461 EXPECT_EQ("\"split/\"\n"
7462 "\"pathat/\"\n"
7463 "\"slashes\"",
7464 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007465
Daniel Jaspera44991332015-04-29 13:06:49 +00007466 EXPECT_EQ("\"split/\"\n"
7467 "\"pathat/\"\n"
7468 "\"slashes\"",
7469 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00007470 EXPECT_EQ("\"split at \"\n"
7471 "\"spaces/at/\"\n"
7472 "\"slashes.at.any$\"\n"
7473 "\"non-alphanumeric%\"\n"
7474 "\"1111111111characte\"\n"
7475 "\"rs\"",
7476 format("\"split at "
7477 "spaces/at/"
7478 "slashes.at."
7479 "any$non-"
7480 "alphanumeric%"
7481 "1111111111characte"
7482 "rs\"",
7483 getLLVMStyleWithColumns(20)));
7484
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007485 // Verify that splitting the strings understands
7486 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00007487 EXPECT_EQ(
7488 "aaaaaaaaaaaa(\n"
7489 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
7490 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
7491 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
7492 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7493 "aaaaaaaaaaaaaaaaaaaaaa\");",
7494 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00007495 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7496 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
7497 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
7498 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7499 "aaaaaaaaaaaaaaaaaaaaaa\";",
7500 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00007501 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7502 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7503 format("llvm::outs() << "
7504 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
7505 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00007506 EXPECT_EQ("ffff(\n"
7507 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7508 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7509 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
7510 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7511 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00007512
Daniel Jaspere1a7b762016-02-01 11:21:02 +00007513 FormatStyle Style = getLLVMStyleWithColumns(12);
7514 Style.BreakStringLiterals = false;
7515 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
7516
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007517 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
7518 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00007519 EXPECT_EQ("#define A \\\n"
7520 " \"some \" \\\n"
7521 " \"text \" \\\n"
7522 " \"other\";",
7523 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007524}
7525
Manuel Klimek9e321992015-07-28 15:50:24 +00007526TEST_F(FormatTest, FullyRemoveEmptyLines) {
7527 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
7528 NoEmptyLines.MaxEmptyLinesToKeep = 0;
7529 EXPECT_EQ("int i = a(b());",
7530 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
7531}
7532
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007533TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
7534 EXPECT_EQ(
7535 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7536 "(\n"
7537 " \"x\t\");",
7538 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7539 "aaaaaaa("
7540 "\"x\t\");"));
7541}
7542
Daniel Jasper174b0122014-01-09 14:18:12 +00007543TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00007544 EXPECT_EQ(
7545 "u8\"utf8 string \"\n"
7546 "u8\"literal\";",
7547 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
7548 EXPECT_EQ(
7549 "u\"utf16 string \"\n"
7550 "u\"literal\";",
7551 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
7552 EXPECT_EQ(
7553 "U\"utf32 string \"\n"
7554 "U\"literal\";",
7555 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
7556 EXPECT_EQ("L\"wide string \"\n"
7557 "L\"literal\";",
7558 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00007559 EXPECT_EQ("@\"NSString \"\n"
7560 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00007561 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00007562
7563 // This input makes clang-format try to split the incomplete unicode escape
7564 // sequence, which used to lead to a crasher.
7565 verifyNoCrash(
7566 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7567 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007568}
7569
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00007570TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
7571 FormatStyle Style = getGoogleStyleWithColumns(15);
7572 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
7573 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
7574 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
7575 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
7576 EXPECT_EQ("u8R\"x(raw literal)x\";",
7577 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007578}
7579
7580TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
7581 FormatStyle Style = getLLVMStyleWithColumns(20);
7582 EXPECT_EQ(
7583 "_T(\"aaaaaaaaaaaaaa\")\n"
7584 "_T(\"aaaaaaaaaaaaaa\")\n"
7585 "_T(\"aaaaaaaaaaaa\")",
7586 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
7587 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
7588 " _T(\"aaaaaa\"),\n"
7589 " z);",
7590 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
7591
7592 // FIXME: Handle embedded spaces in one iteration.
7593 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
7594 // "_T(\"aaaaaaaaaaaaa\")\n"
7595 // "_T(\"aaaaaaaaaaaaa\")\n"
7596 // "_T(\"a\")",
7597 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7598 // getLLVMStyleWithColumns(20)));
7599 EXPECT_EQ(
7600 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7601 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00007602 EXPECT_EQ("f(\n"
7603 "#if !TEST\n"
7604 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7605 "#endif\n"
7606 " );",
7607 format("f(\n"
7608 "#if !TEST\n"
7609 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7610 "#endif\n"
7611 ");"));
7612 EXPECT_EQ("f(\n"
7613 "\n"
7614 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
7615 format("f(\n"
7616 "\n"
7617 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00007618}
7619
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007620TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007621 EXPECT_EQ(
7622 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7623 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7624 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7625 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7626 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7627 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
7628}
7629
7630TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
7631 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007632 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007633 EXPECT_EQ("fffffffffff(g(R\"x(\n"
7634 "multiline raw string literal xxxxxxxxxxxxxx\n"
7635 ")x\",\n"
7636 " a),\n"
7637 " b);",
7638 format("fffffffffff(g(R\"x(\n"
7639 "multiline raw string literal xxxxxxxxxxxxxx\n"
7640 ")x\", a), b);",
7641 getGoogleStyleWithColumns(20)));
7642 EXPECT_EQ("fffffffffff(\n"
7643 " g(R\"x(qqq\n"
7644 "multiline raw string literal xxxxxxxxxxxxxx\n"
7645 ")x\",\n"
7646 " a),\n"
7647 " b);",
7648 format("fffffffffff(g(R\"x(qqq\n"
7649 "multiline raw string literal xxxxxxxxxxxxxx\n"
7650 ")x\", a), b);",
7651 getGoogleStyleWithColumns(20)));
7652
7653 EXPECT_EQ("fffffffffff(R\"x(\n"
7654 "multiline raw string literal xxxxxxxxxxxxxx\n"
7655 ")x\");",
7656 format("fffffffffff(R\"x(\n"
7657 "multiline raw string literal xxxxxxxxxxxxxx\n"
7658 ")x\");",
7659 getGoogleStyleWithColumns(20)));
7660 EXPECT_EQ("fffffffffff(R\"x(\n"
7661 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007662 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007663 format("fffffffffff(R\"x(\n"
7664 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00007665 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00007666 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00007667 EXPECT_EQ("fffffffffff(\n"
7668 " R\"x(\n"
7669 "multiline raw string literal xxxxxxxxxxxxxx\n"
7670 ")x\" +\n"
7671 " bbbbbb);",
7672 format("fffffffffff(\n"
7673 " R\"x(\n"
7674 "multiline raw string literal xxxxxxxxxxxxxx\n"
7675 ")x\" + bbbbbb);",
7676 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00007677}
7678
Alexander Kornienkobe633902013-06-14 11:46:10 +00007679TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00007680 verifyFormat("string a = \"unterminated;");
7681 EXPECT_EQ("function(\"unterminated,\n"
7682 " OtherParameter);",
7683 format("function( \"unterminated,\n"
7684 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00007685}
7686
7687TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007688 FormatStyle Style = getLLVMStyle();
7689 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00007690 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007691 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00007692}
7693
Daniel Jaspera44991332015-04-29 13:06:49 +00007694TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00007695
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007696TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
7697 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
7698 " \"ddeeefff\");",
7699 format("someFunction(\"aaabbbcccdddeeefff\");",
7700 getLLVMStyleWithColumns(25)));
7701 EXPECT_EQ("someFunction1234567890(\n"
7702 " \"aaabbbcccdddeeefff\");",
7703 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7704 getLLVMStyleWithColumns(26)));
7705 EXPECT_EQ("someFunction1234567890(\n"
7706 " \"aaabbbcccdddeeeff\"\n"
7707 " \"f\");",
7708 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7709 getLLVMStyleWithColumns(25)));
7710 EXPECT_EQ("someFunction1234567890(\n"
7711 " \"aaabbbcccdddeeeff\"\n"
7712 " \"f\");",
7713 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7714 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00007715 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
7716 " \"ddde \"\n"
7717 " \"efff\");",
7718 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007719 getLLVMStyleWithColumns(25)));
7720 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
7721 " \"ddeeefff\");",
7722 format("someFunction(\"aaabbbccc ddeeefff\");",
7723 getLLVMStyleWithColumns(25)));
7724 EXPECT_EQ("someFunction1234567890(\n"
7725 " \"aaabb \"\n"
7726 " \"cccdddeeefff\");",
7727 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
7728 getLLVMStyleWithColumns(25)));
7729 EXPECT_EQ("#define A \\\n"
7730 " string s = \\\n"
7731 " \"123456789\" \\\n"
7732 " \"0\"; \\\n"
7733 " int i;",
7734 format("#define A string s = \"1234567890\"; int i;",
7735 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00007736 // FIXME: Put additional penalties on breaking at non-whitespace locations.
7737 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
7738 " \"dddeeeff\"\n"
7739 " \"f\");",
7740 format("someFunction(\"aaabbbcc dddeeefff\");",
7741 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00007742}
7743
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007744TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00007745 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
7746 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007747 EXPECT_EQ("\"test\"\n"
7748 "\"\\n\"",
7749 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
7750 EXPECT_EQ("\"tes\\\\\"\n"
7751 "\"n\"",
7752 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
7753 EXPECT_EQ("\"\\\\\\\\\"\n"
7754 "\"\\n\"",
7755 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00007756 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007757 EXPECT_EQ("\"\\uff01\"\n"
7758 "\"test\"",
7759 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
7760 EXPECT_EQ("\"\\Uff01ff02\"",
7761 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
7762 EXPECT_EQ("\"\\x000000000001\"\n"
7763 "\"next\"",
7764 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
7765 EXPECT_EQ("\"\\x000000000001next\"",
7766 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
7767 EXPECT_EQ("\"\\x000000000001\"",
7768 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
7769 EXPECT_EQ("\"test\"\n"
7770 "\"\\000000\"\n"
7771 "\"000001\"",
7772 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
7773 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007774 "\"00000000\"\n"
7775 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007776 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00007777}
7778
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00007779TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
7780 verifyFormat("void f() {\n"
7781 " return g() {}\n"
7782 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007783 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00007784 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00007785 "}");
7786}
7787
Manuel Klimek421147e2014-01-24 09:25:23 +00007788TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
7789 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00007790 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00007791}
7792
Manuel Klimek13b97d82013-05-13 08:42:42 +00007793TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
7794 verifyFormat("class X {\n"
7795 " void f() {\n"
7796 " }\n"
7797 "};",
7798 getLLVMStyleWithColumns(12));
7799}
7800
7801TEST_F(FormatTest, ConfigurableIndentWidth) {
7802 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
7803 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00007804 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00007805 verifyFormat("void f() {\n"
7806 " someFunction();\n"
7807 " if (true) {\n"
7808 " f();\n"
7809 " }\n"
7810 "}",
7811 EightIndent);
7812 verifyFormat("class X {\n"
7813 " void f() {\n"
7814 " }\n"
7815 "};",
7816 EightIndent);
7817 verifyFormat("int x[] = {\n"
7818 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007819 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00007820 EightIndent);
7821}
7822
Alexander Kornienko34a87e82013-06-22 01:35:36 +00007823TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00007824 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00007825 "f();",
7826 getLLVMStyleWithColumns(8));
7827}
7828
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007829TEST_F(FormatTest, ConfigurableUseOfTab) {
7830 FormatStyle Tab = getLLVMStyleWithColumns(42);
7831 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007832 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007833 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00007834
7835 EXPECT_EQ("if (aaaaaaaa && // q\n"
7836 " bb)\t\t// w\n"
7837 "\t;",
7838 format("if (aaaaaaaa &&// q\n"
7839 "bb)// w\n"
7840 ";",
7841 Tab));
7842 EXPECT_EQ("if (aaa && bbb) // w\n"
7843 "\t;",
7844 format("if(aaa&&bbb)// w\n"
7845 ";",
7846 Tab));
7847
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00007848 verifyFormat("class X {\n"
7849 "\tvoid f() {\n"
7850 "\t\tsomeFunction(parameter1,\n"
7851 "\t\t\t parameter2);\n"
7852 "\t}\n"
7853 "};",
7854 Tab);
7855 verifyFormat("#define A \\\n"
7856 "\tvoid f() { \\\n"
7857 "\t\tsomeFunction( \\\n"
7858 "\t\t parameter1, \\\n"
7859 "\t\t parameter2); \\\n"
7860 "\t}",
7861 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00007862
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00007863 Tab.TabWidth = 4;
7864 Tab.IndentWidth = 8;
7865 verifyFormat("class TabWidth4Indent8 {\n"
7866 "\t\tvoid f() {\n"
7867 "\t\t\t\tsomeFunction(parameter1,\n"
7868 "\t\t\t\t\t\t\t parameter2);\n"
7869 "\t\t}\n"
7870 "};",
7871 Tab);
7872
7873 Tab.TabWidth = 4;
7874 Tab.IndentWidth = 4;
7875 verifyFormat("class TabWidth4Indent4 {\n"
7876 "\tvoid f() {\n"
7877 "\t\tsomeFunction(parameter1,\n"
7878 "\t\t\t\t\t parameter2);\n"
7879 "\t}\n"
7880 "};",
7881 Tab);
7882
7883 Tab.TabWidth = 8;
7884 Tab.IndentWidth = 4;
7885 verifyFormat("class TabWidth8Indent4 {\n"
7886 " void f() {\n"
7887 "\tsomeFunction(parameter1,\n"
7888 "\t\t parameter2);\n"
7889 " }\n"
7890 "};",
7891 Tab);
7892
Alexander Kornienko39856b72013-09-10 09:38:25 +00007893 Tab.TabWidth = 8;
7894 Tab.IndentWidth = 8;
7895 EXPECT_EQ("/*\n"
7896 "\t a\t\tcomment\n"
7897 "\t in multiple lines\n"
7898 " */",
7899 format(" /*\t \t \n"
7900 " \t \t a\t\tcomment\t \t\n"
7901 " \t \t in multiple lines\t\n"
7902 " \t */",
7903 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00007904
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007905 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00007906 verifyFormat("{\n"
7907 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7908 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7909 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7910 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7911 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
7912 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00007913 "};",
7914 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00007915 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00007916 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00007917 "\ta2,\n"
7918 "\ta3\n"
7919 "};",
7920 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007921 EXPECT_EQ("if (aaaaaaaa && // q\n"
7922 " bb) // w\n"
7923 "\t;",
7924 format("if (aaaaaaaa &&// q\n"
7925 "bb)// w\n"
7926 ";",
7927 Tab));
7928 verifyFormat("class X {\n"
7929 "\tvoid f() {\n"
7930 "\t\tsomeFunction(parameter1,\n"
7931 "\t\t parameter2);\n"
7932 "\t}\n"
7933 "};",
7934 Tab);
7935 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00007936 "\tQ(\n"
7937 "\t {\n"
7938 "\t\t int a;\n"
7939 "\t\t someFunction(aaaaaaaa,\n"
7940 "\t\t bbbbbbb);\n"
7941 "\t },\n"
7942 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00007943 "}",
7944 Tab);
7945 EXPECT_EQ("{\n"
7946 "\t/* aaaa\n"
7947 "\t bbbb */\n"
7948 "}",
7949 format("{\n"
7950 "/* aaaa\n"
7951 " bbbb */\n"
7952 "}",
7953 Tab));
7954 EXPECT_EQ("{\n"
7955 "\t/*\n"
7956 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7957 "\t bbbbbbbbbbbbb\n"
7958 "\t*/\n"
7959 "}",
7960 format("{\n"
7961 "/*\n"
7962 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7963 "*/\n"
7964 "}",
7965 Tab));
7966 EXPECT_EQ("{\n"
7967 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7968 "\t// bbbbbbbbbbbbb\n"
7969 "}",
7970 format("{\n"
7971 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7972 "}",
7973 Tab));
7974 EXPECT_EQ("{\n"
7975 "\t/*\n"
7976 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7977 "\t bbbbbbbbbbbbb\n"
7978 "\t*/\n"
7979 "}",
7980 format("{\n"
7981 "\t/*\n"
7982 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7983 "\t*/\n"
7984 "}",
7985 Tab));
7986 EXPECT_EQ("{\n"
7987 "\t/*\n"
7988 "\n"
7989 "\t*/\n"
7990 "}",
7991 format("{\n"
7992 "\t/*\n"
7993 "\n"
7994 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00007995 "}",
7996 Tab));
7997 EXPECT_EQ("{\n"
7998 "\t/*\n"
7999 " asdf\n"
8000 "\t*/\n"
8001 "}",
8002 format("{\n"
8003 "\t/*\n"
8004 " asdf\n"
8005 "\t*/\n"
8006 "}",
8007 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008008
8009 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008010 EXPECT_EQ("/*\n"
8011 " a\t\tcomment\n"
8012 " in multiple lines\n"
8013 " */",
8014 format(" /*\t \t \n"
8015 " \t \t a\t\tcomment\t \t\n"
8016 " \t \t in multiple lines\t\n"
8017 " \t */",
8018 Tab));
8019 EXPECT_EQ("/* some\n"
8020 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008021 format(" \t \t /* some\n"
8022 " \t \t comment */",
8023 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008024 EXPECT_EQ("int a; /* some\n"
8025 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008026 format(" \t \t int a; /* some\n"
8027 " \t \t comment */",
8028 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008029
Alexander Kornienko39856b72013-09-10 09:38:25 +00008030 EXPECT_EQ("int a; /* some\n"
8031 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008032 format(" \t \t int\ta; /* some\n"
8033 " \t \t comment */",
8034 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008035 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8036 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008037 format(" \t \t f(\"\t\t\"); /* some\n"
8038 " \t \t comment */",
8039 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008040 EXPECT_EQ("{\n"
8041 " /*\n"
8042 " * Comment\n"
8043 " */\n"
8044 " int i;\n"
8045 "}",
8046 format("{\n"
8047 "\t/*\n"
8048 "\t * Comment\n"
8049 "\t */\n"
8050 "\t int i;\n"
8051 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008052
8053 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8054 Tab.TabWidth = 8;
8055 Tab.IndentWidth = 8;
8056 EXPECT_EQ("if (aaaaaaaa && // q\n"
8057 " bb) // w\n"
8058 "\t;",
8059 format("if (aaaaaaaa &&// q\n"
8060 "bb)// w\n"
8061 ";",
8062 Tab));
8063 EXPECT_EQ("if (aaa && bbb) // w\n"
8064 "\t;",
8065 format("if(aaa&&bbb)// w\n"
8066 ";",
8067 Tab));
8068 verifyFormat("class X {\n"
8069 "\tvoid f() {\n"
8070 "\t\tsomeFunction(parameter1,\n"
8071 "\t\t\t parameter2);\n"
8072 "\t}\n"
8073 "};",
8074 Tab);
8075 verifyFormat("#define A \\\n"
8076 "\tvoid f() { \\\n"
8077 "\t\tsomeFunction( \\\n"
8078 "\t\t parameter1, \\\n"
8079 "\t\t parameter2); \\\n"
8080 "\t}",
8081 Tab);
8082 Tab.TabWidth = 4;
8083 Tab.IndentWidth = 8;
8084 verifyFormat("class TabWidth4Indent8 {\n"
8085 "\t\tvoid f() {\n"
8086 "\t\t\t\tsomeFunction(parameter1,\n"
8087 "\t\t\t\t\t\t\t parameter2);\n"
8088 "\t\t}\n"
8089 "};",
8090 Tab);
8091 Tab.TabWidth = 4;
8092 Tab.IndentWidth = 4;
8093 verifyFormat("class TabWidth4Indent4 {\n"
8094 "\tvoid f() {\n"
8095 "\t\tsomeFunction(parameter1,\n"
8096 "\t\t\t\t\t parameter2);\n"
8097 "\t}\n"
8098 "};",
8099 Tab);
8100 Tab.TabWidth = 8;
8101 Tab.IndentWidth = 4;
8102 verifyFormat("class TabWidth8Indent4 {\n"
8103 " void f() {\n"
8104 "\tsomeFunction(parameter1,\n"
8105 "\t\t parameter2);\n"
8106 " }\n"
8107 "};",
8108 Tab);
8109 Tab.TabWidth = 8;
8110 Tab.IndentWidth = 8;
8111 EXPECT_EQ("/*\n"
8112 "\t a\t\tcomment\n"
8113 "\t in multiple lines\n"
8114 " */",
8115 format(" /*\t \t \n"
8116 " \t \t a\t\tcomment\t \t\n"
8117 " \t \t in multiple lines\t\n"
8118 " \t */",
8119 Tab));
8120 verifyFormat("{\n"
8121 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8122 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8123 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8124 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8125 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8126 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8127 "};",
8128 Tab);
8129 verifyFormat("enum AA {\n"
8130 "\ta1, // Force multiple lines\n"
8131 "\ta2,\n"
8132 "\ta3\n"
8133 "};",
8134 Tab);
8135 EXPECT_EQ("if (aaaaaaaa && // q\n"
8136 " bb) // w\n"
8137 "\t;",
8138 format("if (aaaaaaaa &&// q\n"
8139 "bb)// w\n"
8140 ";",
8141 Tab));
8142 verifyFormat("class X {\n"
8143 "\tvoid f() {\n"
8144 "\t\tsomeFunction(parameter1,\n"
8145 "\t\t\t parameter2);\n"
8146 "\t}\n"
8147 "};",
8148 Tab);
8149 verifyFormat("{\n"
8150 "\tQ(\n"
8151 "\t {\n"
8152 "\t\t int a;\n"
8153 "\t\t someFunction(aaaaaaaa,\n"
8154 "\t\t\t\t bbbbbbb);\n"
8155 "\t },\n"
8156 "\t p);\n"
8157 "}",
8158 Tab);
8159 EXPECT_EQ("{\n"
8160 "\t/* aaaa\n"
8161 "\t bbbb */\n"
8162 "}",
8163 format("{\n"
8164 "/* aaaa\n"
8165 " bbbb */\n"
8166 "}",
8167 Tab));
8168 EXPECT_EQ("{\n"
8169 "\t/*\n"
8170 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8171 "\t bbbbbbbbbbbbb\n"
8172 "\t*/\n"
8173 "}",
8174 format("{\n"
8175 "/*\n"
8176 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8177 "*/\n"
8178 "}",
8179 Tab));
8180 EXPECT_EQ("{\n"
8181 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8182 "\t// bbbbbbbbbbbbb\n"
8183 "}",
8184 format("{\n"
8185 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8186 "}",
8187 Tab));
8188 EXPECT_EQ("{\n"
8189 "\t/*\n"
8190 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8191 "\t bbbbbbbbbbbbb\n"
8192 "\t*/\n"
8193 "}",
8194 format("{\n"
8195 "\t/*\n"
8196 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8197 "\t*/\n"
8198 "}",
8199 Tab));
8200 EXPECT_EQ("{\n"
8201 "\t/*\n"
8202 "\n"
8203 "\t*/\n"
8204 "}",
8205 format("{\n"
8206 "\t/*\n"
8207 "\n"
8208 "\t*/\n"
8209 "}",
8210 Tab));
8211 EXPECT_EQ("{\n"
8212 "\t/*\n"
8213 " asdf\n"
8214 "\t*/\n"
8215 "}",
8216 format("{\n"
8217 "\t/*\n"
8218 " asdf\n"
8219 "\t*/\n"
8220 "}",
8221 Tab));
8222 EXPECT_EQ("/*\n"
8223 "\t a\t\tcomment\n"
8224 "\t in multiple lines\n"
8225 " */",
8226 format(" /*\t \t \n"
8227 " \t \t a\t\tcomment\t \t\n"
8228 " \t \t in multiple lines\t\n"
8229 " \t */",
8230 Tab));
8231 EXPECT_EQ("/* some\n"
8232 " comment */",
8233 format(" \t \t /* some\n"
8234 " \t \t comment */",
8235 Tab));
8236 EXPECT_EQ("int a; /* some\n"
8237 " comment */",
8238 format(" \t \t int a; /* some\n"
8239 " \t \t comment */",
8240 Tab));
8241 EXPECT_EQ("int a; /* some\n"
8242 "comment */",
8243 format(" \t \t int\ta; /* some\n"
8244 " \t \t comment */",
8245 Tab));
8246 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8247 " comment */",
8248 format(" \t \t f(\"\t\t\"); /* some\n"
8249 " \t \t comment */",
8250 Tab));
8251 EXPECT_EQ("{\n"
8252 " /*\n"
8253 " * Comment\n"
8254 " */\n"
8255 " int i;\n"
8256 "}",
8257 format("{\n"
8258 "\t/*\n"
8259 "\t * Comment\n"
8260 "\t */\n"
8261 "\t int i;\n"
8262 "}"));
8263 Tab.AlignConsecutiveAssignments = true;
8264 Tab.AlignConsecutiveDeclarations = true;
8265 Tab.TabWidth = 4;
8266 Tab.IndentWidth = 4;
8267 verifyFormat("class Assign {\n"
8268 "\tvoid f() {\n"
8269 "\t\tint x = 123;\n"
8270 "\t\tint random = 4;\n"
8271 "\t\tstd::string alphabet =\n"
8272 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8273 "\t}\n"
8274 "};",
8275 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008276}
8277
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008278TEST_F(FormatTest, CalculatesOriginalColumn) {
8279 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8280 "q\"; /* some\n"
8281 " comment */",
8282 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8283 "q\"; /* some\n"
8284 " comment */",
8285 getLLVMStyle()));
8286 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8287 "/* some\n"
8288 " comment */",
8289 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8290 " /* some\n"
8291 " comment */",
8292 getLLVMStyle()));
8293 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8294 "qqq\n"
8295 "/* some\n"
8296 " comment */",
8297 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8298 "qqq\n"
8299 " /* some\n"
8300 " comment */",
8301 getLLVMStyle()));
8302 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8303 "wwww; /* some\n"
8304 " comment */",
8305 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8306 "wwww; /* some\n"
8307 " comment */",
8308 getLLVMStyle()));
8309}
8310
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008311TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008312 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008313 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008314
8315 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008316 " continue;",
8317 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008318 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008319 " continue;",
8320 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008321 verifyFormat("if(true)\n"
8322 " f();\n"
8323 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008324 " f();",
8325 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008326 verifyFormat("do {\n"
8327 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008328 "} while(something());",
8329 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008330 verifyFormat("switch(x) {\n"
8331 "default:\n"
8332 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008333 "}",
8334 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008335 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008336 verifyFormat("size_t x = sizeof(x);", NoSpace);
8337 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8338 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8339 verifyFormat("alignas(128) char a[128];", NoSpace);
8340 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8341 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8342 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008343 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008344 verifyFormat("T A::operator()();", NoSpace);
8345 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008346
8347 FormatStyle Space = getLLVMStyle();
8348 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8349
8350 verifyFormat("int f ();", Space);
8351 verifyFormat("void f (int a, T b) {\n"
8352 " while (true)\n"
8353 " continue;\n"
8354 "}",
8355 Space);
8356 verifyFormat("if (true)\n"
8357 " f ();\n"
8358 "else if (true)\n"
8359 " f ();",
8360 Space);
8361 verifyFormat("do {\n"
8362 " do_something ();\n"
8363 "} while (something ());",
8364 Space);
8365 verifyFormat("switch (x) {\n"
8366 "default:\n"
8367 " break;\n"
8368 "}",
8369 Space);
8370 verifyFormat("A::A () : a (1) {}", Space);
8371 verifyFormat("void f () __attribute__ ((asdf));", Space);
8372 verifyFormat("*(&a + 1);\n"
8373 "&((&a)[1]);\n"
8374 "a[(b + c) * d];\n"
8375 "(((a + 1) * 2) + 3) * 4;",
8376 Space);
8377 verifyFormat("#define A(x) x", Space);
8378 verifyFormat("#define A (x) x", Space);
8379 verifyFormat("#if defined(x)\n"
8380 "#endif",
8381 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008382 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008383 verifyFormat("size_t x = sizeof (x);", Space);
8384 verifyFormat("auto f (int x) -> decltype (x);", Space);
8385 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8386 verifyFormat("alignas (128) char a[128];", Space);
8387 verifyFormat("size_t x = alignof (MyType);", Space);
8388 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8389 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008390 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008391 verifyFormat("T A::operator() ();", Space);
8392 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008393}
8394
8395TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8396 FormatStyle Spaces = getLLVMStyle();
8397
8398 Spaces.SpacesInParentheses = true;
8399 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008400 verifyFormat("call();", Spaces);
8401 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008402 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8403 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008404 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008405 " continue;",
8406 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008407 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008408 " continue;",
8409 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008410 verifyFormat("if ( true )\n"
8411 " f();\n"
8412 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008413 " f();",
8414 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008415 verifyFormat("do {\n"
8416 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008417 "} while ( something() );",
8418 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008419 verifyFormat("switch ( x ) {\n"
8420 "default:\n"
8421 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008422 "}",
8423 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008424
8425 Spaces.SpacesInParentheses = false;
8426 Spaces.SpacesInCStyleCastParentheses = true;
8427 verifyFormat("Type *A = ( Type * )P;", Spaces);
8428 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8429 verifyFormat("x = ( int32 )y;", Spaces);
8430 verifyFormat("int a = ( int )(2.0f);", Spaces);
8431 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8432 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8433 verifyFormat("#define x (( int )-1)", Spaces);
8434
Daniel Jasper92e09822015-03-18 12:59:19 +00008435 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008436 Spaces.SpacesInParentheses = false;
8437 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008438 Spaces.SpacesInCStyleCastParentheses = true;
8439 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008440 verifyFormat("call( );", Spaces);
8441 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008442 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008443 " continue;",
8444 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008445 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008446 " continue;",
8447 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008448 verifyFormat("if (true)\n"
8449 " f( );\n"
8450 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008451 " f( );",
8452 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008453 verifyFormat("do {\n"
8454 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008455 "} while (something( ));",
8456 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008457 verifyFormat("switch (x) {\n"
8458 "default:\n"
8459 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008460 "}",
8461 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008462
Daniel Jasper92e09822015-03-18 12:59:19 +00008463 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008464 Spaces.SpaceAfterCStyleCast = true;
8465 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008466 verifyFormat("call( );", Spaces);
8467 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008468 verifyFormat("while (( bool ) 1)\n"
8469 " continue;",
8470 Spaces);
8471 verifyFormat("for (;;)\n"
8472 " continue;",
8473 Spaces);
8474 verifyFormat("if (true)\n"
8475 " f( );\n"
8476 "else if (true)\n"
8477 " f( );",
8478 Spaces);
8479 verifyFormat("do {\n"
8480 " do_something(( int ) i);\n"
8481 "} while (something( ));",
8482 Spaces);
8483 verifyFormat("switch (x) {\n"
8484 "default:\n"
8485 " break;\n"
8486 "}",
8487 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008488
8489 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008490 Spaces.SpacesInCStyleCastParentheses = false;
8491 Spaces.SpaceAfterCStyleCast = true;
8492 verifyFormat("while ((bool) 1)\n"
8493 " continue;",
8494 Spaces);
8495 verifyFormat("do {\n"
8496 " do_something((int) i);\n"
8497 "} while (something( ));",
8498 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008499}
8500
Daniel Jasperad981f82014-08-26 11:41:14 +00008501TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8502 verifyFormat("int a[5];");
8503 verifyFormat("a[3] += 42;");
8504
8505 FormatStyle Spaces = getLLVMStyle();
8506 Spaces.SpacesInSquareBrackets = true;
8507 // Lambdas unchanged.
8508 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8509 verifyFormat("return [i, args...] {};", Spaces);
8510
8511 // Not lambdas.
8512 verifyFormat("int a[ 5 ];", Spaces);
8513 verifyFormat("a[ 3 ] += 42;", Spaces);
8514 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
8515 verifyFormat("double &operator[](int i) { return 0; }\n"
8516 "int i;",
8517 Spaces);
8518 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
8519 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
8520 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
8521}
8522
Daniel Jasperd94bff32013-09-25 15:15:02 +00008523TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
8524 verifyFormat("int a = 5;");
8525 verifyFormat("a += 42;");
8526 verifyFormat("a or_eq 8;");
8527
8528 FormatStyle Spaces = getLLVMStyle();
8529 Spaces.SpaceBeforeAssignmentOperators = false;
8530 verifyFormat("int a= 5;", Spaces);
8531 verifyFormat("a+= 42;", Spaces);
8532 verifyFormat("a or_eq 8;", Spaces);
8533}
8534
Daniel Jaspera44991332015-04-29 13:06:49 +00008535TEST_F(FormatTest, AlignConsecutiveAssignments) {
8536 FormatStyle Alignment = getLLVMStyle();
8537 Alignment.AlignConsecutiveAssignments = false;
8538 verifyFormat("int a = 5;\n"
8539 "int oneTwoThree = 123;",
8540 Alignment);
8541 verifyFormat("int a = 5;\n"
8542 "int oneTwoThree = 123;",
8543 Alignment);
8544
8545 Alignment.AlignConsecutiveAssignments = true;
8546 verifyFormat("int a = 5;\n"
8547 "int oneTwoThree = 123;",
8548 Alignment);
8549 verifyFormat("int a = method();\n"
8550 "int oneTwoThree = 133;",
8551 Alignment);
8552 verifyFormat("a &= 5;\n"
8553 "bcd *= 5;\n"
8554 "ghtyf += 5;\n"
8555 "dvfvdb -= 5;\n"
8556 "a /= 5;\n"
8557 "vdsvsv %= 5;\n"
8558 "sfdbddfbdfbb ^= 5;\n"
8559 "dvsdsv |= 5;\n"
8560 "int dsvvdvsdvvv = 123;",
8561 Alignment);
8562 verifyFormat("int i = 1, j = 10;\n"
8563 "something = 2000;",
8564 Alignment);
8565 verifyFormat("something = 2000;\n"
8566 "int i = 1, j = 10;\n",
8567 Alignment);
8568 verifyFormat("something = 2000;\n"
8569 "another = 911;\n"
8570 "int i = 1, j = 10;\n"
8571 "oneMore = 1;\n"
8572 "i = 2;",
8573 Alignment);
8574 verifyFormat("int a = 5;\n"
8575 "int one = 1;\n"
8576 "method();\n"
8577 "int oneTwoThree = 123;\n"
8578 "int oneTwo = 12;",
8579 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00008580 verifyFormat("int oneTwoThree = 123;\n"
8581 "int oneTwo = 12;\n"
8582 "method();\n",
8583 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008584 verifyFormat("int oneTwoThree = 123; // comment\n"
8585 "int oneTwo = 12; // comment",
8586 Alignment);
8587 EXPECT_EQ("int a = 5;\n"
8588 "\n"
8589 "int oneTwoThree = 123;",
8590 format("int a = 5;\n"
8591 "\n"
8592 "int oneTwoThree= 123;",
8593 Alignment));
8594 EXPECT_EQ("int a = 5;\n"
8595 "int one = 1;\n"
8596 "\n"
8597 "int oneTwoThree = 123;",
8598 format("int a = 5;\n"
8599 "int one = 1;\n"
8600 "\n"
8601 "int oneTwoThree = 123;",
8602 Alignment));
8603 EXPECT_EQ("int a = 5;\n"
8604 "int one = 1;\n"
8605 "\n"
8606 "int oneTwoThree = 123;\n"
8607 "int oneTwo = 12;",
8608 format("int a = 5;\n"
8609 "int one = 1;\n"
8610 "\n"
8611 "int oneTwoThree = 123;\n"
8612 "int oneTwo = 12;",
8613 Alignment));
8614 Alignment.AlignEscapedNewlinesLeft = true;
8615 verifyFormat("#define A \\\n"
8616 " int aaaa = 12; \\\n"
8617 " int b = 23; \\\n"
8618 " int ccc = 234; \\\n"
8619 " int dddddddddd = 2345;",
8620 Alignment);
8621 Alignment.AlignEscapedNewlinesLeft = false;
8622 verifyFormat("#define A "
8623 " \\\n"
8624 " int aaaa = 12; "
8625 " \\\n"
8626 " int b = 23; "
8627 " \\\n"
8628 " int ccc = 234; "
8629 " \\\n"
8630 " int dddddddddd = 2345;",
8631 Alignment);
8632 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8633 "k = 4, int l = 5,\n"
8634 " int m = 6) {\n"
8635 " int j = 10;\n"
8636 " otherThing = 1;\n"
8637 "}",
8638 Alignment);
8639 verifyFormat("void SomeFunction(int parameter = 0) {\n"
8640 " int i = 1;\n"
8641 " int j = 2;\n"
8642 " int big = 10000;\n"
8643 "}",
8644 Alignment);
8645 verifyFormat("class C {\n"
8646 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00008647 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008648 " virtual void f() = 0;\n"
8649 "};",
8650 Alignment);
8651 verifyFormat("int i = 1;\n"
8652 "if (SomeType t = getSomething()) {\n"
8653 "}\n"
8654 "int j = 2;\n"
8655 "int big = 10000;",
8656 Alignment);
8657 verifyFormat("int j = 7;\n"
8658 "for (int k = 0; k < N; ++k) {\n"
8659 "}\n"
8660 "int j = 2;\n"
8661 "int big = 10000;\n"
8662 "}",
8663 Alignment);
8664 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8665 verifyFormat("int i = 1;\n"
8666 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8667 " = someLooooooooooooooooongFunction();\n"
8668 "int j = 2;",
8669 Alignment);
8670 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8671 verifyFormat("int i = 1;\n"
8672 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8673 " someLooooooooooooooooongFunction();\n"
8674 "int j = 2;",
8675 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00008676
8677 verifyFormat("auto lambda = []() {\n"
8678 " auto i = 0;\n"
8679 " return 0;\n"
8680 "};\n"
8681 "int i = 0;\n"
8682 "auto v = type{\n"
8683 " i = 1, //\n"
8684 " (i = 2), //\n"
8685 " i = 3 //\n"
8686 "};",
8687 Alignment);
8688
Daniel Jaspera44991332015-04-29 13:06:49 +00008689 // FIXME: Should align all three assignments
8690 verifyFormat(
8691 "int i = 1;\n"
8692 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
8693 " loooooooooooooooooooooongParameterB);\n"
8694 "int j = 2;",
8695 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00008696
8697 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
8698 " typename B = very_long_type_name_1,\n"
8699 " typename T_2 = very_long_type_name_2>\n"
8700 "auto foo() {}\n",
8701 Alignment);
8702 verifyFormat("int a, b = 1;\n"
8703 "int c = 2;\n"
8704 "int dd = 3;\n",
8705 Alignment);
8706 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8707 "float b[1][] = {{3.f}};\n",
8708 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00008709}
8710
Daniel Jaspere12597c2015-10-01 10:06:54 +00008711TEST_F(FormatTest, AlignConsecutiveDeclarations) {
8712 FormatStyle Alignment = getLLVMStyle();
8713 Alignment.AlignConsecutiveDeclarations = false;
8714 verifyFormat("float const a = 5;\n"
8715 "int oneTwoThree = 123;",
8716 Alignment);
8717 verifyFormat("int a = 5;\n"
8718 "float const oneTwoThree = 123;",
8719 Alignment);
8720
8721 Alignment.AlignConsecutiveDeclarations = true;
8722 verifyFormat("float const a = 5;\n"
8723 "int oneTwoThree = 123;",
8724 Alignment);
8725 verifyFormat("int a = method();\n"
8726 "float const oneTwoThree = 133;",
8727 Alignment);
8728 verifyFormat("int i = 1, j = 10;\n"
8729 "something = 2000;",
8730 Alignment);
8731 verifyFormat("something = 2000;\n"
8732 "int i = 1, j = 10;\n",
8733 Alignment);
8734 verifyFormat("float something = 2000;\n"
8735 "double another = 911;\n"
8736 "int i = 1, j = 10;\n"
8737 "const int *oneMore = 1;\n"
8738 "unsigned i = 2;",
8739 Alignment);
8740 verifyFormat("float a = 5;\n"
8741 "int one = 1;\n"
8742 "method();\n"
8743 "const double oneTwoThree = 123;\n"
8744 "const unsigned int oneTwo = 12;",
8745 Alignment);
8746 verifyFormat("int oneTwoThree{0}; // comment\n"
8747 "unsigned oneTwo; // comment",
8748 Alignment);
8749 EXPECT_EQ("float const a = 5;\n"
8750 "\n"
8751 "int oneTwoThree = 123;",
8752 format("float const a = 5;\n"
8753 "\n"
8754 "int oneTwoThree= 123;",
8755 Alignment));
8756 EXPECT_EQ("float a = 5;\n"
8757 "int one = 1;\n"
8758 "\n"
8759 "unsigned oneTwoThree = 123;",
8760 format("float a = 5;\n"
8761 "int one = 1;\n"
8762 "\n"
8763 "unsigned oneTwoThree = 123;",
8764 Alignment));
8765 EXPECT_EQ("float a = 5;\n"
8766 "int one = 1;\n"
8767 "\n"
8768 "unsigned oneTwoThree = 123;\n"
8769 "int oneTwo = 12;",
8770 format("float a = 5;\n"
8771 "int one = 1;\n"
8772 "\n"
8773 "unsigned oneTwoThree = 123;\n"
8774 "int oneTwo = 12;",
8775 Alignment));
8776 Alignment.AlignConsecutiveAssignments = true;
8777 verifyFormat("float something = 2000;\n"
8778 "double another = 911;\n"
8779 "int i = 1, j = 10;\n"
8780 "const int *oneMore = 1;\n"
8781 "unsigned i = 2;",
8782 Alignment);
8783 verifyFormat("int oneTwoThree = {0}; // comment\n"
8784 "unsigned oneTwo = 0; // comment",
8785 Alignment);
8786 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
8787 " int const i = 1;\n"
8788 " int * j = 2;\n"
8789 " int big = 10000;\n"
8790 "\n"
8791 " unsigned oneTwoThree = 123;\n"
8792 " int oneTwo = 12;\n"
8793 " method();\n"
8794 " float k = 2;\n"
8795 " int ll = 10000;\n"
8796 "}",
8797 format("void SomeFunction(int parameter= 0) {\n"
8798 " int const i= 1;\n"
8799 " int *j=2;\n"
8800 " int big = 10000;\n"
8801 "\n"
8802 "unsigned oneTwoThree =123;\n"
8803 "int oneTwo = 12;\n"
8804 " method();\n"
8805 "float k= 2;\n"
8806 "int ll=10000;\n"
8807 "}",
8808 Alignment));
8809 Alignment.AlignConsecutiveAssignments = false;
8810 Alignment.AlignEscapedNewlinesLeft = true;
8811 verifyFormat("#define A \\\n"
8812 " int aaaa = 12; \\\n"
8813 " float b = 23; \\\n"
8814 " const int ccc = 234; \\\n"
8815 " unsigned dddddddddd = 2345;",
8816 Alignment);
8817 Alignment.AlignEscapedNewlinesLeft = false;
8818 Alignment.ColumnLimit = 30;
8819 verifyFormat("#define A \\\n"
8820 " int aaaa = 12; \\\n"
8821 " float b = 23; \\\n"
8822 " const int ccc = 234; \\\n"
8823 " int dddddddddd = 2345;",
8824 Alignment);
8825 Alignment.ColumnLimit = 80;
8826 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8827 "k = 4, int l = 5,\n"
8828 " int m = 6) {\n"
8829 " const int j = 10;\n"
8830 " otherThing = 1;\n"
8831 "}",
8832 Alignment);
8833 verifyFormat("void SomeFunction(int parameter = 0) {\n"
8834 " int const i = 1;\n"
8835 " int * j = 2;\n"
8836 " int big = 10000;\n"
8837 "}",
8838 Alignment);
8839 verifyFormat("class C {\n"
8840 "public:\n"
8841 " int i = 1;\n"
8842 " virtual void f() = 0;\n"
8843 "};",
8844 Alignment);
8845 verifyFormat("float i = 1;\n"
8846 "if (SomeType t = getSomething()) {\n"
8847 "}\n"
8848 "const unsigned j = 2;\n"
8849 "int big = 10000;",
8850 Alignment);
8851 verifyFormat("float j = 7;\n"
8852 "for (int k = 0; k < N; ++k) {\n"
8853 "}\n"
8854 "unsigned j = 2;\n"
8855 "int big = 10000;\n"
8856 "}",
8857 Alignment);
8858 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8859 verifyFormat("float i = 1;\n"
8860 "LooooooooooongType loooooooooooooooooooooongVariable\n"
8861 " = someLooooooooooooooooongFunction();\n"
8862 "int j = 2;",
8863 Alignment);
8864 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8865 verifyFormat("int i = 1;\n"
8866 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8867 " someLooooooooooooooooongFunction();\n"
8868 "int j = 2;",
8869 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00008870
8871 Alignment.AlignConsecutiveAssignments = true;
8872 verifyFormat("auto lambda = []() {\n"
8873 " auto ii = 0;\n"
8874 " float j = 0;\n"
8875 " return 0;\n"
8876 "};\n"
8877 "int i = 0;\n"
8878 "float i2 = 0;\n"
8879 "auto v = type{\n"
8880 " i = 1, //\n"
8881 " (i = 2), //\n"
8882 " i = 3 //\n"
8883 "};",
8884 Alignment);
8885 Alignment.AlignConsecutiveAssignments = false;
8886
Daniel Jaspere12597c2015-10-01 10:06:54 +00008887 // FIXME: Should align all three declarations
8888 verifyFormat(
8889 "int i = 1;\n"
8890 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
8891 " loooooooooooooooooooooongParameterB);\n"
8892 "int j = 2;",
8893 Alignment);
8894
8895 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
8896 // We expect declarations and assignments to align, as long as it doesn't
8897 // exceed the column limit, starting a new alignemnt sequence whenever it
8898 // happens.
8899 Alignment.AlignConsecutiveAssignments = true;
8900 Alignment.ColumnLimit = 30;
8901 verifyFormat("float ii = 1;\n"
8902 "unsigned j = 2;\n"
8903 "int someVerylongVariable = 1;\n"
8904 "AnotherLongType ll = 123456;\n"
8905 "VeryVeryLongType k = 2;\n"
8906 "int myvar = 1;",
8907 Alignment);
8908 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00008909 Alignment.AlignConsecutiveAssignments = false;
8910
8911 verifyFormat(
8912 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
8913 " typename LongType, typename B>\n"
8914 "auto foo() {}\n",
8915 Alignment);
8916 verifyFormat("float a, b = 1;\n"
8917 "int c = 2;\n"
8918 "int dd = 3;\n",
8919 Alignment);
8920 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8921 "float b[1][] = {{3.f}};\n",
8922 Alignment);
8923 Alignment.AlignConsecutiveAssignments = true;
8924 verifyFormat("float a, b = 1;\n"
8925 "int c = 2;\n"
8926 "int dd = 3;\n",
8927 Alignment);
8928 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
8929 "float b[1][] = {{3.f}};\n",
8930 Alignment);
8931 Alignment.AlignConsecutiveAssignments = false;
8932
8933 Alignment.ColumnLimit = 30;
8934 Alignment.BinPackParameters = false;
8935 verifyFormat("void foo(float a,\n"
8936 " float b,\n"
8937 " int c,\n"
8938 " uint32_t *d) {\n"
8939 " int * e = 0;\n"
8940 " float f = 0;\n"
8941 " double g = 0;\n"
8942 "}\n"
8943 "void bar(ino_t a,\n"
8944 " int b,\n"
8945 " uint32_t *c,\n"
8946 " bool d) {}\n",
8947 Alignment);
8948 Alignment.BinPackParameters = true;
8949 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00008950}
8951
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008952TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008953 FormatStyle LinuxBraceStyle = getLLVMStyle();
8954 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008955 verifyFormat("namespace a\n"
8956 "{\n"
8957 "class A\n"
8958 "{\n"
8959 " void f()\n"
8960 " {\n"
8961 " if (true) {\n"
8962 " a();\n"
8963 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00008964 " } else {\n"
8965 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008966 " }\n"
8967 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00008968 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00008969 "};\n"
8970 "struct B {\n"
8971 " int x;\n"
8972 "};\n"
8973 "}\n",
8974 LinuxBraceStyle);
8975 verifyFormat("enum X {\n"
8976 " Y = 0,\n"
8977 "}\n",
8978 LinuxBraceStyle);
8979 verifyFormat("struct S {\n"
8980 " int Type;\n"
8981 " union {\n"
8982 " int x;\n"
8983 " double y;\n"
8984 " } Value;\n"
8985 " class C\n"
8986 " {\n"
8987 " MyFavoriteType Value;\n"
8988 " } Class;\n"
8989 "}\n",
8990 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00008991}
8992
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00008993TEST_F(FormatTest, MozillaBraceBreaking) {
8994 FormatStyle MozillaBraceStyle = getLLVMStyle();
8995 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
8996 verifyFormat("namespace a {\n"
8997 "class A\n"
8998 "{\n"
8999 " void f()\n"
9000 " {\n"
9001 " if (true) {\n"
9002 " a();\n"
9003 " b();\n"
9004 " }\n"
9005 " }\n"
9006 " void g() { return; }\n"
9007 "};\n"
9008 "enum E\n"
9009 "{\n"
9010 " A,\n"
9011 " // foo\n"
9012 " B,\n"
9013 " C\n"
9014 "};\n"
9015 "struct B\n"
9016 "{\n"
9017 " int x;\n"
9018 "};\n"
9019 "}\n",
9020 MozillaBraceStyle);
9021 verifyFormat("struct S\n"
9022 "{\n"
9023 " int Type;\n"
9024 " union\n"
9025 " {\n"
9026 " int x;\n"
9027 " double y;\n"
9028 " } Value;\n"
9029 " class C\n"
9030 " {\n"
9031 " MyFavoriteType Value;\n"
9032 " } Class;\n"
9033 "}\n",
9034 MozillaBraceStyle);
9035}
9036
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009037TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009038 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9039 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009040 verifyFormat("namespace a {\n"
9041 "class A {\n"
9042 " void f()\n"
9043 " {\n"
9044 " if (true) {\n"
9045 " a();\n"
9046 " b();\n"
9047 " }\n"
9048 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009049 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009050 "};\n"
9051 "struct B {\n"
9052 " int x;\n"
9053 "};\n"
9054 "}\n",
9055 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009056
Daniel Jasperd9670872014-08-05 12:06:20 +00009057 verifyFormat("void foo()\n"
9058 "{\n"
9059 " if (a) {\n"
9060 " a();\n"
9061 " }\n"
9062 " else {\n"
9063 " b();\n"
9064 " }\n"
9065 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009066 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009067
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009068 verifyFormat("#ifdef _DEBUG\n"
9069 "int foo(int i = 0)\n"
9070 "#else\n"
9071 "int foo(int i = 5)\n"
9072 "#endif\n"
9073 "{\n"
9074 " return i;\n"
9075 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009076 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009077
9078 verifyFormat("void foo() {}\n"
9079 "void bar()\n"
9080 "#ifdef _DEBUG\n"
9081 "{\n"
9082 " foo();\n"
9083 "}\n"
9084 "#else\n"
9085 "{\n"
9086 "}\n"
9087 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009088 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009089
9090 verifyFormat("void foobar() { int i = 5; }\n"
9091 "#ifdef _DEBUG\n"
9092 "void bar() {}\n"
9093 "#else\n"
9094 "void bar() { foobar(); }\n"
9095 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009096 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009097}
9098
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009099TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009100 FormatStyle AllmanBraceStyle = getLLVMStyle();
9101 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009102 verifyFormat("namespace a\n"
9103 "{\n"
9104 "class A\n"
9105 "{\n"
9106 " void f()\n"
9107 " {\n"
9108 " if (true)\n"
9109 " {\n"
9110 " a();\n"
9111 " b();\n"
9112 " }\n"
9113 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009114 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009115 "};\n"
9116 "struct B\n"
9117 "{\n"
9118 " int x;\n"
9119 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009120 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009121 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009122
9123 verifyFormat("void f()\n"
9124 "{\n"
9125 " if (true)\n"
9126 " {\n"
9127 " a();\n"
9128 " }\n"
9129 " else if (false)\n"
9130 " {\n"
9131 " b();\n"
9132 " }\n"
9133 " else\n"
9134 " {\n"
9135 " c();\n"
9136 " }\n"
9137 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009138 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009139
9140 verifyFormat("void f()\n"
9141 "{\n"
9142 " for (int i = 0; i < 10; ++i)\n"
9143 " {\n"
9144 " a();\n"
9145 " }\n"
9146 " while (false)\n"
9147 " {\n"
9148 " b();\n"
9149 " }\n"
9150 " do\n"
9151 " {\n"
9152 " c();\n"
9153 " } while (false)\n"
9154 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009155 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009156
9157 verifyFormat("void f(int a)\n"
9158 "{\n"
9159 " switch (a)\n"
9160 " {\n"
9161 " case 0:\n"
9162 " break;\n"
9163 " case 1:\n"
9164 " {\n"
9165 " break;\n"
9166 " }\n"
9167 " case 2:\n"
9168 " {\n"
9169 " }\n"
9170 " break;\n"
9171 " default:\n"
9172 " break;\n"
9173 " }\n"
9174 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009175 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009176
9177 verifyFormat("enum X\n"
9178 "{\n"
9179 " Y = 0,\n"
9180 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009181 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009182 verifyFormat("enum X\n"
9183 "{\n"
9184 " Y = 0\n"
9185 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009186 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009187
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009188 verifyFormat("@interface BSApplicationController ()\n"
9189 "{\n"
9190 "@private\n"
9191 " id _extraIvar;\n"
9192 "}\n"
9193 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009194 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009195
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009196 verifyFormat("#ifdef _DEBUG\n"
9197 "int foo(int i = 0)\n"
9198 "#else\n"
9199 "int foo(int i = 5)\n"
9200 "#endif\n"
9201 "{\n"
9202 " return i;\n"
9203 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009204 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009205
9206 verifyFormat("void foo() {}\n"
9207 "void bar()\n"
9208 "#ifdef _DEBUG\n"
9209 "{\n"
9210 " foo();\n"
9211 "}\n"
9212 "#else\n"
9213 "{\n"
9214 "}\n"
9215 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009216 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009217
9218 verifyFormat("void foobar() { int i = 5; }\n"
9219 "#ifdef _DEBUG\n"
9220 "void bar() {}\n"
9221 "#else\n"
9222 "void bar() { foobar(); }\n"
9223 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009224 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009225
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009226 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009227 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009228 " // ...\n"
9229 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009230 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009231 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009232 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009233 " // ...\n"
9234 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009235 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009236 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009237 // .. or dict literals.
9238 verifyFormat("void f()\n"
9239 "{\n"
9240 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
9241 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009242 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009243 verifyFormat("int f()\n"
9244 "{ // comment\n"
9245 " return 42;\n"
9246 "}",
9247 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009248
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009249 AllmanBraceStyle.ColumnLimit = 19;
9250 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9251 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009252 verifyFormat("void f()\n"
9253 "{\n"
9254 " int i;\n"
9255 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009256 AllmanBraceStyle);
9257 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009258
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009259 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009260 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9261 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9262 verifyFormat("void f(bool b)\n"
9263 "{\n"
9264 " if (b)\n"
9265 " {\n"
9266 " return;\n"
9267 " }\n"
9268 "}\n",
9269 BreakBeforeBraceShortIfs);
9270 verifyFormat("void f(bool b)\n"
9271 "{\n"
9272 " if (b) return;\n"
9273 "}\n",
9274 BreakBeforeBraceShortIfs);
9275 verifyFormat("void f(bool b)\n"
9276 "{\n"
9277 " while (b)\n"
9278 " {\n"
9279 " return;\n"
9280 " }\n"
9281 "}\n",
9282 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009283}
9284
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009285TEST_F(FormatTest, GNUBraceBreaking) {
9286 FormatStyle GNUBraceStyle = getLLVMStyle();
9287 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9288 verifyFormat("namespace a\n"
9289 "{\n"
9290 "class A\n"
9291 "{\n"
9292 " void f()\n"
9293 " {\n"
9294 " int a;\n"
9295 " {\n"
9296 " int b;\n"
9297 " }\n"
9298 " if (true)\n"
9299 " {\n"
9300 " a();\n"
9301 " b();\n"
9302 " }\n"
9303 " }\n"
9304 " void g() { return; }\n"
9305 "}\n"
9306 "}",
9307 GNUBraceStyle);
9308
9309 verifyFormat("void f()\n"
9310 "{\n"
9311 " if (true)\n"
9312 " {\n"
9313 " a();\n"
9314 " }\n"
9315 " else if (false)\n"
9316 " {\n"
9317 " b();\n"
9318 " }\n"
9319 " else\n"
9320 " {\n"
9321 " c();\n"
9322 " }\n"
9323 "}\n",
9324 GNUBraceStyle);
9325
9326 verifyFormat("void f()\n"
9327 "{\n"
9328 " for (int i = 0; i < 10; ++i)\n"
9329 " {\n"
9330 " a();\n"
9331 " }\n"
9332 " while (false)\n"
9333 " {\n"
9334 " b();\n"
9335 " }\n"
9336 " do\n"
9337 " {\n"
9338 " c();\n"
9339 " }\n"
9340 " while (false);\n"
9341 "}\n",
9342 GNUBraceStyle);
9343
9344 verifyFormat("void f(int a)\n"
9345 "{\n"
9346 " switch (a)\n"
9347 " {\n"
9348 " case 0:\n"
9349 " break;\n"
9350 " case 1:\n"
9351 " {\n"
9352 " break;\n"
9353 " }\n"
9354 " case 2:\n"
9355 " {\n"
9356 " }\n"
9357 " break;\n"
9358 " default:\n"
9359 " break;\n"
9360 " }\n"
9361 "}\n",
9362 GNUBraceStyle);
9363
9364 verifyFormat("enum X\n"
9365 "{\n"
9366 " Y = 0,\n"
9367 "}\n",
9368 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009369
9370 verifyFormat("@interface BSApplicationController ()\n"
9371 "{\n"
9372 "@private\n"
9373 " id _extraIvar;\n"
9374 "}\n"
9375 "@end\n",
9376 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009377
9378 verifyFormat("#ifdef _DEBUG\n"
9379 "int foo(int i = 0)\n"
9380 "#else\n"
9381 "int foo(int i = 5)\n"
9382 "#endif\n"
9383 "{\n"
9384 " return i;\n"
9385 "}",
9386 GNUBraceStyle);
9387
9388 verifyFormat("void foo() {}\n"
9389 "void bar()\n"
9390 "#ifdef _DEBUG\n"
9391 "{\n"
9392 " foo();\n"
9393 "}\n"
9394 "#else\n"
9395 "{\n"
9396 "}\n"
9397 "#endif",
9398 GNUBraceStyle);
9399
9400 verifyFormat("void foobar() { int i = 5; }\n"
9401 "#ifdef _DEBUG\n"
9402 "void bar() {}\n"
9403 "#else\n"
9404 "void bar() { foobar(); }\n"
9405 "#endif",
9406 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009407}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009408
9409TEST_F(FormatTest, WebKitBraceBreaking) {
9410 FormatStyle WebKitBraceStyle = getLLVMStyle();
9411 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
9412 verifyFormat("namespace a {\n"
9413 "class A {\n"
9414 " void f()\n"
9415 " {\n"
9416 " if (true) {\n"
9417 " a();\n"
9418 " b();\n"
9419 " }\n"
9420 " }\n"
9421 " void g() { return; }\n"
9422 "};\n"
9423 "enum E {\n"
9424 " A,\n"
9425 " // foo\n"
9426 " B,\n"
9427 " C\n"
9428 "};\n"
9429 "struct B {\n"
9430 " int x;\n"
9431 "};\n"
9432 "}\n",
9433 WebKitBraceStyle);
9434 verifyFormat("struct S {\n"
9435 " int Type;\n"
9436 " union {\n"
9437 " int x;\n"
9438 " double y;\n"
9439 " } Value;\n"
9440 " class C {\n"
9441 " MyFavoriteType Value;\n"
9442 " } Class;\n"
9443 "};\n",
9444 WebKitBraceStyle);
9445}
9446
Manuel Klimekd5735502013-08-12 03:51:17 +00009447TEST_F(FormatTest, CatchExceptionReferenceBinding) {
9448 verifyFormat("void f() {\n"
9449 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00009450 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00009451 " }\n"
9452 "}\n",
9453 getLLVMStyle());
9454}
9455
Daniel Jasper9613c812013-08-07 16:29:23 +00009456TEST_F(FormatTest, UnderstandsPragmas) {
9457 verifyFormat("#pragma omp reduction(| : var)");
9458 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00009459
9460 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
9461 "(including parentheses).",
9462 format("#pragma mark Any non-hyphenated or hyphenated string "
9463 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +00009464}
9465
Daniel Jasperee4a8a12015-04-22 09:45:42 +00009466TEST_F(FormatTest, UnderstandPragmaOption) {
9467 verifyFormat("#pragma option -C -A");
9468
9469 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
9470}
9471
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009472#define EXPECT_ALL_STYLES_EQUAL(Styles) \
9473 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +00009474 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
9475 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +00009476
9477TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009478 SmallVector<FormatStyle, 3> Styles;
9479 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009480
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009481 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009482 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
9483 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
9484 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009485
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009486 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009487 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
9488 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
9489 EXPECT_ALL_STYLES_EQUAL(Styles);
9490
Nico Weber514ecc82014-02-02 20:50:45 +00009491 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009492 EXPECT_TRUE(
9493 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
9494 EXPECT_TRUE(
9495 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
9496 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009497
Nico Weber514ecc82014-02-02 20:50:45 +00009498 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009499 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
9500 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
9501 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009502
9503 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009504 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
9505 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
9506 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009507
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009508 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009509 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
9510 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
9511 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +00009512
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +00009513 Styles[0] = getGNUStyle();
9514 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
9515 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
9516 EXPECT_ALL_STYLES_EQUAL(Styles);
9517
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009518 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
9519}
9520
9521TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
9522 SmallVector<FormatStyle, 8> Styles;
9523 Styles.resize(2);
9524
9525 Styles[0] = getGoogleStyle();
9526 Styles[1] = getLLVMStyle();
9527 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9528 EXPECT_ALL_STYLES_EQUAL(Styles);
9529
9530 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +00009531 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009532 Styles[1] = getLLVMStyle();
9533 Styles[1].Language = FormatStyle::LK_JavaScript;
9534 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9535
9536 Styles[2] = getLLVMStyle();
9537 Styles[2].Language = FormatStyle::LK_JavaScript;
9538 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
9539 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009540 &Styles[2])
9541 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009542
9543 Styles[3] = getLLVMStyle();
9544 Styles[3].Language = FormatStyle::LK_JavaScript;
9545 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
9546 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009547 &Styles[3])
9548 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009549
9550 Styles[4] = getLLVMStyle();
9551 Styles[4].Language = FormatStyle::LK_JavaScript;
9552 EXPECT_EQ(0, parseConfiguration("---\n"
9553 "BasedOnStyle: LLVM\n"
9554 "IndentWidth: 123\n"
9555 "---\n"
9556 "BasedOnStyle: Google\n"
9557 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009558 &Styles[4])
9559 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009560 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009561}
9562
Daniel Jasper91881d92014-09-29 08:07:46 +00009563#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +00009564 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +00009565 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +00009566 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +00009567 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +00009568 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009569
Daniel Jasper91881d92014-09-29 08:07:46 +00009570#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
9571
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009572#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
9573 Style.STRUCT.FIELD = false; \
9574 EXPECT_EQ(0, \
9575 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
9576 .value()); \
9577 EXPECT_TRUE(Style.STRUCT.FIELD); \
9578 EXPECT_EQ(0, \
9579 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
9580 .value()); \
9581 EXPECT_FALSE(Style.STRUCT.FIELD);
9582
9583#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
9584 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
9585
Daniel Jasper00853002014-09-16 16:22:30 +00009586#define CHECK_PARSE(TEXT, FIELD, VALUE) \
9587 EXPECT_NE(VALUE, Style.FIELD); \
9588 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
9589 EXPECT_EQ(VALUE, Style.FIELD)
9590
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009591TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009592 FormatStyle Style = {};
9593 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009594 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +00009595 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +00009596 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +00009597 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +00009598 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009599 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +00009600 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +00009601 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009602 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +00009603 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00009604 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +00009605 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00009606 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00009607 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +00009608 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00009609 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +00009610 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009611 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +00009612 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +00009613 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +00009614 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009615 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00009616 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +00009617 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +00009618 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009619 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +00009620 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +00009621 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +00009622 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009623 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +00009624 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +00009625 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009626 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +00009627 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009628 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009629 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +00009630 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +00009631 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009632
9633 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
9634 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
9635 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
9636 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
9637 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
9638 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
9639 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
9640 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
9641 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
9642 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
9643 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009644}
Alexander Kornienkod6538332013-05-07 15:32:14 +00009645
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009646#undef CHECK_PARSE_BOOL
9647
Alexander Kornienkoc6221a52014-08-14 13:07:35 +00009648TEST_F(FormatTest, ParsesConfiguration) {
9649 FormatStyle Style = {};
9650 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009651 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +00009652 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
9653 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +00009654 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009655 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
9656 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +00009657 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
9658 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009659 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
9660 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
9661 PenaltyReturnTypeOnItsOwnLine, 1234u);
9662 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
9663 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +00009664 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +00009665 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00009666 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +00009667
Daniel Jasper553d4872014-06-17 12:40:34 +00009668 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +00009669 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
9670 FormatStyle::PAS_Left);
9671 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
9672 FormatStyle::PAS_Right);
9673 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
9674 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +00009675 // For backward compatibility:
9676 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
9677 FormatStyle::PAS_Left);
9678 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
9679 FormatStyle::PAS_Right);
9680 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
9681 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +00009682
Alexander Kornienkod6538332013-05-07 15:32:14 +00009683 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +00009684 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
9685 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +00009686 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
9687 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
9688 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
9689
Daniel Jasperac043c92014-09-15 11:11:00 +00009690 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +00009691 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
9692 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +00009693 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
9694 FormatStyle::BOS_None);
9695 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
9696 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00009697 // For backward compatibility:
9698 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
9699 FormatStyle::BOS_None);
9700 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
9701 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +00009702
Daniel Jasper6501f7e2015-10-27 12:38:37 +00009703 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9704 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
9705 FormatStyle::BAS_Align);
9706 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
9707 FormatStyle::BAS_DontAlign);
9708 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
9709 FormatStyle::BAS_AlwaysBreak);
9710 // For backward compatibility:
9711 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
9712 FormatStyle::BAS_DontAlign);
9713 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
9714 FormatStyle::BAS_Align);
9715
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009716 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009717 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
9718 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
9719 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00009720 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
9721 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +00009722 // For backward compatibility:
9723 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
9724 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00009725
Daniel Jasperd74cf402014-04-08 12:46:38 +00009726 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +00009727 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
9728 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
9729 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
9730 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +00009731 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
9732 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +00009733 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
9734 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +00009735 // For backward compatibility:
9736 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
9737 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
9738 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
9739 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +00009740
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00009741 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
9742 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
9743 FormatStyle::SBPO_Never);
9744 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
9745 FormatStyle::SBPO_Always);
9746 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
9747 FormatStyle::SBPO_ControlStatements);
9748 // For backward compatibility:
9749 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
9750 FormatStyle::SBPO_Never);
9751 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
9752 FormatStyle::SBPO_ControlStatements);
9753
Alexander Kornienkod6538332013-05-07 15:32:14 +00009754 Style.ColumnLimit = 123;
9755 FormatStyle BaseStyle = getLLVMStyle();
9756 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
9757 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
9758
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009759 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
9760 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
9761 FormatStyle::BS_Attach);
9762 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
9763 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009764 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
9765 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009766 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
9767 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009768 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
9769 FormatStyle::BS_Allman);
9770 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +00009771 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
9772 FormatStyle::BS_WebKit);
9773 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
9774 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009775
Zachary Turner448592e2015-12-18 22:20:15 +00009776 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
9777 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
9778 FormatStyle::RTBS_None);
9779 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
9780 FormatStyle::RTBS_All);
9781 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +00009782 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +00009783 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
9784 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
9785 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
9786 AlwaysBreakAfterReturnType,
9787 FormatStyle::RTBS_TopLevelDefinitions);
9788
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00009789 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
9790 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
9791 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
9792 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
9793 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
9794 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
9795 AlwaysBreakAfterDefinitionReturnType,
9796 FormatStyle::DRTBS_TopLevel);
9797
Daniel Jasper65ee3472013-07-31 23:16:02 +00009798 Style.NamespaceIndentation = FormatStyle::NI_All;
9799 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
9800 FormatStyle::NI_None);
9801 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
9802 FormatStyle::NI_Inner);
9803 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
9804 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +00009805
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00009806 // FIXME: This is required because parsing a configuration simply overwrites
9807 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +00009808 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +00009809 std::vector<std::string> BoostForeach;
9810 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00009811 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +00009812 std::vector<std::string> BoostAndQForeach;
9813 BoostAndQForeach.push_back("BOOST_FOREACH");
9814 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +00009815 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
9816 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +00009817
9818 Style.IncludeCategories.clear();
9819 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
9820 {".*", 1}};
9821 CHECK_PARSE("IncludeCategories:\n"
9822 " - Regex: abc/.*\n"
9823 " Priority: 2\n"
9824 " - Regex: .*\n"
9825 " Priority: 1",
9826 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +00009827 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009828}
9829
9830TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
9831 FormatStyle Style = {};
9832 Style.Language = FormatStyle::LK_Cpp;
9833 CHECK_PARSE("Language: Cpp\n"
9834 "IndentWidth: 12",
9835 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +00009836 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
9837 "IndentWidth: 34",
9838 &Style),
9839 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009840 EXPECT_EQ(12u, Style.IndentWidth);
9841 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
9842 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
9843
9844 Style.Language = FormatStyle::LK_JavaScript;
9845 CHECK_PARSE("Language: JavaScript\n"
9846 "IndentWidth: 12",
9847 IndentWidth, 12u);
9848 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +00009849 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
9850 "IndentWidth: 34",
9851 &Style),
9852 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009853 EXPECT_EQ(23u, Style.IndentWidth);
9854 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
9855 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
9856
9857 CHECK_PARSE("BasedOnStyle: LLVM\n"
9858 "IndentWidth: 67",
9859 IndentWidth, 67u);
9860
9861 CHECK_PARSE("---\n"
9862 "Language: JavaScript\n"
9863 "IndentWidth: 12\n"
9864 "---\n"
9865 "Language: Cpp\n"
9866 "IndentWidth: 34\n"
9867 "...\n",
9868 IndentWidth, 12u);
9869
9870 Style.Language = FormatStyle::LK_Cpp;
9871 CHECK_PARSE("---\n"
9872 "Language: JavaScript\n"
9873 "IndentWidth: 12\n"
9874 "---\n"
9875 "Language: Cpp\n"
9876 "IndentWidth: 34\n"
9877 "...\n",
9878 IndentWidth, 34u);
9879 CHECK_PARSE("---\n"
9880 "IndentWidth: 78\n"
9881 "---\n"
9882 "Language: JavaScript\n"
9883 "IndentWidth: 56\n"
9884 "...\n",
9885 IndentWidth, 78u);
9886
9887 Style.ColumnLimit = 123;
9888 Style.IndentWidth = 234;
9889 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
9890 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +00009891 EXPECT_FALSE(parseConfiguration("---\n"
9892 "IndentWidth: 456\n"
9893 "BreakBeforeBraces: Allman\n"
9894 "---\n"
9895 "Language: JavaScript\n"
9896 "IndentWidth: 111\n"
9897 "TabWidth: 111\n"
9898 "---\n"
9899 "Language: Cpp\n"
9900 "BreakBeforeBraces: Stroustrup\n"
9901 "TabWidth: 789\n"
9902 "...\n",
9903 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009904 EXPECT_EQ(123u, Style.ColumnLimit);
9905 EXPECT_EQ(456u, Style.IndentWidth);
9906 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
9907 EXPECT_EQ(789u, Style.TabWidth);
9908
Rafael Espindola1f243172014-06-12 11:35:17 +00009909 EXPECT_EQ(parseConfiguration("---\n"
9910 "Language: JavaScript\n"
9911 "IndentWidth: 56\n"
9912 "---\n"
9913 "IndentWidth: 78\n"
9914 "...\n",
9915 &Style),
9916 ParseError::Error);
9917 EXPECT_EQ(parseConfiguration("---\n"
9918 "Language: JavaScript\n"
9919 "IndentWidth: 56\n"
9920 "---\n"
9921 "Language: JavaScript\n"
9922 "IndentWidth: 78\n"
9923 "...\n",
9924 &Style),
9925 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009926
9927 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
9928}
Daniel Jasper65ee3472013-07-31 23:16:02 +00009929
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009930#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009931
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009932TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
9933 FormatStyle Style = {};
9934 Style.Language = FormatStyle::LK_JavaScript;
9935 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009936 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00009937 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009938
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009939 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +00009940 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009941 "BasedOnStyle: Google\n"
9942 "---\n"
9943 "Language: JavaScript\n"
9944 "IndentWidth: 76\n"
9945 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00009946 &Style)
9947 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +00009948 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +00009949 EXPECT_EQ(76u, Style.IndentWidth);
9950 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
9951}
9952
Alexander Kornienkod6538332013-05-07 15:32:14 +00009953TEST_F(FormatTest, ConfigurationRoundTripTest) {
9954 FormatStyle Style = getLLVMStyle();
9955 std::string YAML = configurationAsText(Style);
9956 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +00009957 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +00009958 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
9959 EXPECT_EQ(Style, ParsedStyle);
9960}
9961
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009962TEST_F(FormatTest, WorksFor8bitEncodings) {
9963 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
9964 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
9965 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
9966 "\"\xef\xee\xf0\xf3...\"",
9967 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
9968 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
9969 "\xef\xee\xf0\xf3...\"",
9970 getLLVMStyleWithColumns(12)));
9971}
9972
Alexander Kornienko393e3082013-11-13 14:04:17 +00009973TEST_F(FormatTest, HandlesUTF8BOM) {
9974 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
9975 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
9976 format("\xef\xbb\xbf#include <iostream>"));
9977 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
9978 format("\xef\xbb\xbf\n#include <iostream>"));
9979}
9980
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +00009981// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
9982#if !defined(_MSC_VER)
9983
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009984TEST_F(FormatTest, CountsUTF8CharactersProperly) {
9985 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
9986 getLLVMStyleWithColumns(35));
9987 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009988 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009989 verifyFormat("// Однажды в студёную зимнюю пору...",
9990 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +00009991 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009992 verifyFormat("/* Однажды в студёную зимнюю пору... */",
9993 getLLVMStyleWithColumns(39));
9994 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00009995 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +00009996}
9997
9998TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +00009999 // Non-printable characters' width is currently considered to be the length in
10000 // bytes in UTF8. The characters can be displayed in very different manner
10001 // (zero-width, single width with a substitution glyph, expanded to their code
10002 // (e.g. "<8d>"), so there's no single correct way to handle them.
10003 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010004 "\"\xc2\x8d\";",
10005 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010006 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010007 "\"\xc2\x8d\";",
10008 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010009 EXPECT_EQ("\"Однажды, в \"\n"
10010 "\"студёную \"\n"
10011 "\"зимнюю \"\n"
10012 "\"пору,\"",
10013 format("\"Однажды, в студёную зимнюю пору,\"",
10014 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010015 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010016 "\"一 二 三 \"\n"
10017 "\"四 五六 \"\n"
10018 "\"七 八 九 \"\n"
10019 "\"十\"",
10020 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010021 EXPECT_EQ("\"一\t二 \"\n"
10022 "\"\t三 \"\n"
10023 "\"四 五\t六 \"\n"
10024 "\"\t七 \"\n"
10025 "\"八九十\tqq\"",
10026 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10027 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010028
10029 // UTF8 character in an escape sequence.
10030 EXPECT_EQ("\"aaaaaa\"\n"
10031 "\"\\\xC2\x8D\"",
10032 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010033}
10034
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010035TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10036 EXPECT_EQ("const char *sssss =\n"
10037 " \"一二三四五六七八\\\n"
10038 " 九 十\";",
10039 format("const char *sssss = \"一二三四五六七八\\\n"
10040 " 九 十\";",
10041 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010042}
10043
10044TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010045 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10046 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010047 EXPECT_EQ("// Я из лесу\n"
10048 "// вышел; был\n"
10049 "// сильный\n"
10050 "// мороз.",
10051 format("// Я из лесу вышел; был сильный мороз.",
10052 getLLVMStyleWithColumns(13)));
10053 EXPECT_EQ("// 一二三\n"
10054 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010055 "// 八 九\n"
10056 "// 十",
10057 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010058}
10059
10060TEST_F(FormatTest, SplitsUTF8BlockComments) {
10061 EXPECT_EQ("/* Гляжу,\n"
10062 " * поднимается\n"
10063 " * медленно в\n"
10064 " * гору\n"
10065 " * Лошадка,\n"
10066 " * везущая\n"
10067 " * хворосту\n"
10068 " * воз. */",
10069 format("/* Гляжу, поднимается медленно в гору\n"
10070 " * Лошадка, везущая хворосту воз. */",
10071 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010072 EXPECT_EQ(
10073 "/* 一二三\n"
10074 " * 四五六七\n"
10075 " * 八 九\n"
10076 " * 十 */",
10077 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010078 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10079 " * 𝕓𝕪𝕥𝕖\n"
10080 " * 𝖀𝕿𝕱-𝟠 */",
10081 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010082}
10083
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010084#endif // _MSC_VER
10085
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010086TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10087 FormatStyle Style = getLLVMStyle();
10088
10089 Style.ConstructorInitializerIndentWidth = 4;
10090 verifyFormat(
10091 "SomeClass::Constructor()\n"
10092 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10093 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10094 Style);
10095
10096 Style.ConstructorInitializerIndentWidth = 2;
10097 verifyFormat(
10098 "SomeClass::Constructor()\n"
10099 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10100 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10101 Style);
10102
10103 Style.ConstructorInitializerIndentWidth = 0;
10104 verifyFormat(
10105 "SomeClass::Constructor()\n"
10106 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10107 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10108 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010109 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10110 verifyFormat(
10111 "SomeLongTemplateVariableName<\n"
10112 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10113 Style);
10114 verifyFormat(
10115 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10116 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10117 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010118}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010119
Daniel Jasper00853002014-09-16 16:22:30 +000010120TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10121 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010122 Style.BreakConstructorInitializersBeforeComma = true;
10123 Style.ConstructorInitializerIndentWidth = 4;
10124 verifyFormat("SomeClass::Constructor()\n"
10125 " : a(a)\n"
10126 " , b(b)\n"
10127 " , c(c) {}",
10128 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010129 verifyFormat("SomeClass::Constructor()\n"
10130 " : a(a) {}",
10131 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010132
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010133 Style.ColumnLimit = 0;
10134 verifyFormat("SomeClass::Constructor()\n"
10135 " : a(a) {}",
10136 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010137 verifyFormat("SomeClass::Constructor() noexcept\n"
10138 " : a(a) {}",
10139 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010140 verifyFormat("SomeClass::Constructor()\n"
10141 " : a(a)\n"
10142 " , b(b)\n"
10143 " , c(c) {}",
10144 Style);
10145 verifyFormat("SomeClass::Constructor()\n"
10146 " : a(a) {\n"
10147 " foo();\n"
10148 " bar();\n"
10149 "}",
10150 Style);
10151
Daniel Jasperd74cf402014-04-08 12:46:38 +000010152 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010153 verifyFormat("SomeClass::Constructor()\n"
10154 " : a(a)\n"
10155 " , b(b)\n"
10156 " , c(c) {\n}",
10157 Style);
10158 verifyFormat("SomeClass::Constructor()\n"
10159 " : a(a) {\n}",
10160 Style);
10161
10162 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010163 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010164 Style.ConstructorInitializerIndentWidth = 2;
10165 verifyFormat("SomeClass::Constructor()\n"
10166 " : a(a)\n"
10167 " , b(b)\n"
10168 " , c(c) {}",
10169 Style);
10170
10171 Style.ConstructorInitializerIndentWidth = 0;
10172 verifyFormat("SomeClass::Constructor()\n"
10173 ": a(a)\n"
10174 ", b(b)\n"
10175 ", c(c) {}",
10176 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010177
10178 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10179 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010180 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10181 verifyFormat(
10182 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10183 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010184 verifyFormat(
10185 "SomeClass::Constructor()\n"
10186 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10187 Style);
10188 Style.ConstructorInitializerIndentWidth = 4;
10189 Style.ColumnLimit = 60;
10190 verifyFormat("SomeClass::Constructor()\n"
10191 " : aaaaaaaa(aaaaaaaa)\n"
10192 " , aaaaaaaa(aaaaaaaa)\n"
10193 " , aaaaaaaa(aaaaaaaa) {}",
10194 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010195}
10196
Daniel Jasper38efc132014-10-21 07:51:54 +000010197TEST_F(FormatTest, Destructors) {
10198 verifyFormat("void F(int &i) { i.~int(); }");
10199 verifyFormat("void F(int &i) { i->~int(); }");
10200}
10201
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010202TEST_F(FormatTest, FormatsWithWebKitStyle) {
10203 FormatStyle Style = getWebKitStyle();
10204
10205 // Don't indent in outer namespaces.
10206 verifyFormat("namespace outer {\n"
10207 "int i;\n"
10208 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010209 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010210 "} // namespace inner\n"
10211 "} // namespace outer\n"
10212 "namespace other_outer {\n"
10213 "int i;\n"
10214 "}",
10215 Style);
10216
10217 // Don't indent case labels.
10218 verifyFormat("switch (variable) {\n"
10219 "case 1:\n"
10220 "case 2:\n"
10221 " doSomething();\n"
10222 " break;\n"
10223 "default:\n"
10224 " ++variable;\n"
10225 "}",
10226 Style);
10227
10228 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010229 EXPECT_EQ("void f()\n"
10230 "{\n"
10231 " if (aaaaaaaaaaaaaaaa\n"
10232 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10233 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10234 " return;\n"
10235 "}",
10236 format("void f() {\n"
10237 "if (aaaaaaaaaaaaaaaa\n"
10238 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10239 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10240 "return;\n"
10241 "}",
10242 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010243
Daniel Jasper35995672014-04-29 14:05:20 +000010244 // Allow functions on a single line.
10245 verifyFormat("void f() { return; }", Style);
10246
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010247 // Constructor initializers are formatted one per line with the "," on the
10248 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010249 verifyFormat("Constructor()\n"
10250 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10251 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010252 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010253 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10254 "{\n"
10255 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010256 Style);
10257 verifyFormat("SomeClass::Constructor()\n"
10258 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010259 "{\n"
10260 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010261 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010262 EXPECT_EQ("SomeClass::Constructor()\n"
10263 " : a(a)\n"
10264 "{\n"
10265 "}",
10266 format("SomeClass::Constructor():a(a){}", Style));
10267 verifyFormat("SomeClass::Constructor()\n"
10268 " : a(a)\n"
10269 " , b(b)\n"
10270 " , c(c)\n"
10271 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010272 "}",
10273 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010274 verifyFormat("SomeClass::Constructor()\n"
10275 " : a(a)\n"
10276 "{\n"
10277 " foo();\n"
10278 " bar();\n"
10279 "}",
10280 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010281
Daniel Jasper65ee3472013-07-31 23:16:02 +000010282 // Access specifiers should be aligned left.
10283 verifyFormat("class C {\n"
10284 "public:\n"
10285 " int i;\n"
10286 "};",
10287 Style);
10288
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010289 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010290 verifyFormat("int a; // Do not\n"
10291 "double b; // align comments.",
10292 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010293
Daniel Jasper3219e432014-12-02 13:24:51 +000010294 // Do not align operands.
10295 EXPECT_EQ("ASSERT(aaaa\n"
10296 " || bbbb);",
10297 format("ASSERT ( aaaa\n||bbbb);", Style));
10298
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010299 // Accept input's line breaks.
10300 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10301 " || bbbbbbbbbbbbbbb) {\n"
10302 " i++;\n"
10303 "}",
10304 format("if (aaaaaaaaaaaaaaa\n"
10305 "|| bbbbbbbbbbbbbbb) { i++; }",
10306 Style));
10307 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10308 " i++;\n"
10309 "}",
10310 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010311
10312 // Don't automatically break all macro definitions (llvm.org/PR17842).
10313 verifyFormat("#define aNumber 10", Style);
10314 // However, generally keep the line breaks that the user authored.
10315 EXPECT_EQ("#define aNumber \\\n"
10316 " 10",
10317 format("#define aNumber \\\n"
10318 " 10",
10319 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010320
10321 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010322 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10323 " copyItems:YES];",
10324 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10325 "copyItems:YES];",
10326 Style));
10327 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10328 " copyItems:YES];",
10329 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10330 " copyItems:YES];",
10331 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010332 // FIXME: This does not seem right, there should be more indentation before
10333 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010334 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010335 " @\"a\",\n"
10336 " @\"a\"\n"
10337 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010338 " copyItems:YES];",
10339 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10340 " @\"a\",\n"
10341 " @\"a\"\n"
10342 " ]\n"
10343 " copyItems:YES];",
10344 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010345 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010346 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10347 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010348 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10349 " copyItems:YES];",
10350 Style));
10351
10352 verifyFormat("[self.a b:c c:d];", Style);
10353 EXPECT_EQ("[self.a b:c\n"
10354 " c:d];",
10355 format("[self.a b:c\n"
10356 "c:d];",
10357 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010358}
10359
Manuel Klimekffdeb592013-09-03 15:10:01 +000010360TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010361 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10362 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10363 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10364 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10365 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010366 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010367 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010368 verifyFormat("void f() {\n"
10369 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10370 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010371 verifyFormat("void f() {\n"
10372 " other(x.begin(), //\n"
10373 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000010374 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010375 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000010376 verifyFormat("SomeFunction([]() { // A cool function...\n"
10377 " return 43;\n"
10378 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000010379 EXPECT_EQ("SomeFunction([]() {\n"
10380 "#define A a\n"
10381 " return 43;\n"
10382 "});",
10383 format("SomeFunction([](){\n"
10384 "#define A a\n"
10385 "return 43;\n"
10386 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000010387 verifyFormat("void f() {\n"
10388 " SomeFunction([](decltype(x), A *a) {});\n"
10389 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010390 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10391 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000010392 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10393 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
10394 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000010395 verifyFormat("Constructor()\n"
10396 " : Field([] { // comment\n"
10397 " int i;\n"
10398 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000010399 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
10400 " return some_parameter.size();\n"
10401 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000010402 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
10403 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000010404 verifyFormat("int i = aaaaaa ? 1 //\n"
10405 " : [] {\n"
10406 " return 2; //\n"
10407 " }();");
10408 verifyFormat("llvm::errs() << \"number of twos is \"\n"
10409 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
10410 " return x == 2; // force break\n"
10411 " });");
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000010412 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n"
10413 " int iiiiiiiiiiii) {\n"
10414 " return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n"
10415 "});",
10416 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000010417 verifyFormat("SomeFunction({[&] {\n"
10418 " // comment\n"
10419 " },\n"
10420 " [&] {\n"
10421 " // comment\n"
10422 " }});");
10423 verifyFormat("SomeFunction({[&] {\n"
10424 " // comment\n"
10425 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000010426 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
10427 " [&]() { return true; },\n"
10428 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010429
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010430 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000010431 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000010432 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000010433 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
10434 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010435 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000010436 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010437 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
10438 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000010439 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010440 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
10441 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010442 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010443 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000010444 verifyFormat(
10445 "aaaaaaaaaaaaaaaaaaaaaa(\n"
10446 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
10447 " return aaaaaaaaaaaaaaaaa;\n"
10448 " });",
10449 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000010450 verifyFormat("[]() //\n"
10451 " -> int {\n"
10452 " return 1; //\n"
10453 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010454
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010455 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000010456 verifyFormat("SomeFunction(\n"
10457 " []() {\n"
10458 " int i = 42;\n"
10459 " return i;\n"
10460 " },\n"
10461 " []() {\n"
10462 " int j = 43;\n"
10463 " return j;\n"
10464 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010465
Daniel Jasperda18fd82014-06-10 06:39:03 +000010466 // More complex introducers.
10467 verifyFormat("return [i, args...] {};");
10468
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010469 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000010470 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000010471 verifyFormat("double &operator[](int i) { return 0; }\n"
10472 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000010473 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000010474 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000010475 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000010476
10477 // Other corner cases.
10478 verifyFormat("void f() {\n"
10479 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
10480 " );\n"
10481 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000010482
10483 // Lambdas created through weird macros.
10484 verifyFormat("void f() {\n"
10485 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000010486 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000010487 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000010488
10489 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
10490 " doo_dah();\n"
10491 " doo_dah();\n"
10492 " })) {\n"
10493 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000010494 verifyFormat("auto lambda = []() {\n"
10495 " int a = 2\n"
10496 "#if A\n"
10497 " + 2\n"
10498 "#endif\n"
10499 " ;\n"
10500 "};");
Manuel Klimekffdeb592013-09-03 15:10:01 +000010501}
10502
Manuel Klimek516e0542013-09-04 13:25:30 +000010503TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000010504 FormatStyle ShortBlocks = getLLVMStyle();
10505 ShortBlocks.AllowShortBlocksOnASingleLine = true;
10506 verifyFormat("int (^Block)(int, int);", ShortBlocks);
10507 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
10508 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
10509 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
10510 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
10511 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000010512
Daniel Jasper76284682014-10-22 09:12:44 +000010513 verifyFormat("foo(^{ bar(); });", ShortBlocks);
10514 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
10515 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000010516
Daniel Jasper76284682014-10-22 09:12:44 +000010517 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010518 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010519 "}];");
10520 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010521 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010522 "}]};");
10523 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010524 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010525 "}];");
10526 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010527 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010528 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000010529 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010530 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010531 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000010532 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010533 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010534
10535 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010536 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010537 "}];",
10538 getLLVMStyleWithColumns(60));
10539 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010540 " NSString *path = [self sessionFilePath];\n"
10541 " if (path) {\n"
10542 " // ...\n"
10543 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010544 "});");
10545 verifyFormat("[[SessionService sharedService]\n"
10546 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010547 " if (window) {\n"
10548 " [self windowDidLoad:window];\n"
10549 " } else {\n"
10550 " [self errorLoadingWindow];\n"
10551 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010552 " }];");
10553 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010554 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010555 "};\n",
10556 getLLVMStyleWithColumns(40));
10557 verifyFormat("[[SessionService sharedService]\n"
10558 " loadWindowWithCompletionBlock: //\n"
10559 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010560 " if (window) {\n"
10561 " [self windowDidLoad:window];\n"
10562 " } else {\n"
10563 " [self errorLoadingWindow];\n"
10564 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010565 " }];",
10566 getLLVMStyleWithColumns(60));
10567 verifyFormat("[myObject doSomethingWith:arg1\n"
10568 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010569 " // ...\n"
10570 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010571 " }\n"
10572 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010573 " // ...\n"
10574 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000010575 " }\n"
10576 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010577 " // ...\n"
10578 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000010579 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000010580 verifyFormat("[myObject doSomethingWith:arg1\n"
10581 " firstBlock:-1\n"
10582 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010583 " // ...\n"
10584 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000010585 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010586
10587 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010588 " @autoreleasepool {\n"
10589 " if (a) {\n"
10590 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010591 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000010592 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000010593 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000010594 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000010595 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
10596 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000010597
10598 FormatStyle FourIndent = getLLVMStyle();
10599 FourIndent.ObjCBlockIndentWidth = 4;
10600 verifyFormat("[operation setCompletionBlock:^{\n"
10601 " [self onOperationDone];\n"
10602 "}];",
10603 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000010604}
10605
Daniel Jasper289afc02015-04-23 09:23:17 +000010606TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
10607 FormatStyle ZeroColumn = getLLVMStyle();
10608 ZeroColumn.ColumnLimit = 0;
10609
10610 verifyFormat("[[SessionService sharedService] "
10611 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10612 " if (window) {\n"
10613 " [self windowDidLoad:window];\n"
10614 " } else {\n"
10615 " [self errorLoadingWindow];\n"
10616 " }\n"
10617 "}];",
10618 ZeroColumn);
10619 EXPECT_EQ("[[SessionService sharedService]\n"
10620 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10621 " if (window) {\n"
10622 " [self windowDidLoad:window];\n"
10623 " } else {\n"
10624 " [self errorLoadingWindow];\n"
10625 " }\n"
10626 " }];",
10627 format("[[SessionService sharedService]\n"
10628 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10629 " if (window) {\n"
10630 " [self windowDidLoad:window];\n"
10631 " } else {\n"
10632 " [self errorLoadingWindow];\n"
10633 " }\n"
10634 "}];",
10635 ZeroColumn));
10636 verifyFormat("[myObject doSomethingWith:arg1\n"
10637 " firstBlock:^(Foo *a) {\n"
10638 " // ...\n"
10639 " int i;\n"
10640 " }\n"
10641 " secondBlock:^(Bar *b) {\n"
10642 " // ...\n"
10643 " int i;\n"
10644 " }\n"
10645 " thirdBlock:^Foo(Bar *b) {\n"
10646 " // ...\n"
10647 " int i;\n"
10648 " }];",
10649 ZeroColumn);
10650 verifyFormat("f(^{\n"
10651 " @autoreleasepool {\n"
10652 " if (a) {\n"
10653 " g();\n"
10654 " }\n"
10655 " }\n"
10656 "});",
10657 ZeroColumn);
10658 verifyFormat("void (^largeBlock)(void) = ^{\n"
10659 " // ...\n"
10660 "};",
10661 ZeroColumn);
10662
10663 ZeroColumn.AllowShortBlocksOnASingleLine = true;
10664 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010665 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000010666 ZeroColumn.AllowShortBlocksOnASingleLine = false;
10667 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
10668 " int i;\n"
10669 "};",
10670 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
10671}
10672
Alexander Kornienko9e649af2013-09-11 12:25:57 +000010673TEST_F(FormatTest, SupportsCRLF) {
10674 EXPECT_EQ("int a;\r\n"
10675 "int b;\r\n"
10676 "int c;\r\n",
10677 format("int a;\r\n"
10678 " int b;\r\n"
10679 " int c;\r\n",
10680 getLLVMStyle()));
10681 EXPECT_EQ("int a;\r\n"
10682 "int b;\r\n"
10683 "int c;\r\n",
10684 format("int a;\r\n"
10685 " int b;\n"
10686 " int c;\r\n",
10687 getLLVMStyle()));
10688 EXPECT_EQ("int a;\n"
10689 "int b;\n"
10690 "int c;\n",
10691 format("int a;\r\n"
10692 " int b;\n"
10693 " int c;\n",
10694 getLLVMStyle()));
10695 EXPECT_EQ("\"aaaaaaa \"\r\n"
10696 "\"bbbbbbb\";\r\n",
10697 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
10698 EXPECT_EQ("#define A \\\r\n"
10699 " b; \\\r\n"
10700 " c; \\\r\n"
10701 " d;\r\n",
10702 format("#define A \\\r\n"
10703 " b; \\\r\n"
10704 " c; d; \r\n",
10705 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000010706
10707 EXPECT_EQ("/*\r\n"
10708 "multi line block comments\r\n"
10709 "should not introduce\r\n"
10710 "an extra carriage return\r\n"
10711 "*/\r\n",
10712 format("/*\r\n"
10713 "multi line block comments\r\n"
10714 "should not introduce\r\n"
10715 "an extra carriage return\r\n"
10716 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000010717}
10718
Manuel Klimekb212f3b2013-10-12 22:46:56 +000010719TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
10720 verifyFormat("MY_CLASS(C) {\n"
10721 " int i;\n"
10722 " int j;\n"
10723 "};");
10724}
10725
Daniel Jasper6633ab82013-10-18 10:38:14 +000010726TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
10727 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
10728 TwoIndent.ContinuationIndentWidth = 2;
10729
10730 EXPECT_EQ("int i =\n"
10731 " longFunction(\n"
10732 " arg);",
10733 format("int i = longFunction(arg);", TwoIndent));
10734
10735 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
10736 SixIndent.ContinuationIndentWidth = 6;
10737
10738 EXPECT_EQ("int i =\n"
10739 " longFunction(\n"
10740 " arg);",
10741 format("int i = longFunction(arg);", SixIndent));
10742}
10743
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010744TEST_F(FormatTest, SpacesInAngles) {
10745 FormatStyle Spaces = getLLVMStyle();
10746 Spaces.SpacesInAngles = true;
10747
10748 verifyFormat("static_cast< int >(arg);", Spaces);
10749 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
10750 verifyFormat("f< int, float >();", Spaces);
10751 verifyFormat("template <> g() {}", Spaces);
10752 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000010753 verifyFormat("std::function< void(int, int) > fct;", Spaces);
10754 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
10755 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010756
10757 Spaces.Standard = FormatStyle::LS_Cpp03;
10758 Spaces.SpacesInAngles = true;
10759 verifyFormat("A< A< int > >();", Spaces);
10760
10761 Spaces.SpacesInAngles = false;
10762 verifyFormat("A<A<int> >();", Spaces);
10763
10764 Spaces.Standard = FormatStyle::LS_Cpp11;
10765 Spaces.SpacesInAngles = true;
10766 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000010767
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010768 Spaces.SpacesInAngles = false;
10769 verifyFormat("A<A<int>>();", Spaces);
10770}
10771
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010772TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
10773 FormatStyle Style = getLLVMStyle();
10774 Style.SpaceAfterTemplateKeyword = false;
10775 verifyFormat("template<int> void foo();", Style);
10776}
10777
Jacques Pienaarfc275112015-02-18 23:48:37 +000010778TEST_F(FormatTest, TripleAngleBrackets) {
10779 verifyFormat("f<<<1, 1>>>();");
10780 verifyFormat("f<<<1, 1, 1, s>>>();");
10781 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000010782 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010783 verifyFormat("f<param><<<1, 1>>>();");
10784 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000010785 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010786 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10787 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000010788 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
10789 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000010790}
10791
10792TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000010793 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000010794 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000010795 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10796 "aaallvm::outs() <<");
10797 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10798 "aaaallvm::outs()\n <<");
10799}
10800
Manuel Klimek819788d2014-03-18 11:22:45 +000010801TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
10802 std::string code = "#if A\n"
10803 "#if B\n"
10804 "a.\n"
10805 "#endif\n"
10806 " a = 1;\n"
10807 "#else\n"
10808 "#endif\n"
10809 "#if C\n"
10810 "#else\n"
10811 "#endif\n";
10812 EXPECT_EQ(code, format(code));
10813}
10814
Manuel Klimek68b03042014-04-14 09:14:11 +000010815TEST_F(FormatTest, HandleConflictMarkers) {
10816 // Git/SVN conflict markers.
10817 EXPECT_EQ("int a;\n"
10818 "void f() {\n"
10819 " callme(some(parameter1,\n"
10820 "<<<<<<< text by the vcs\n"
10821 " parameter2),\n"
10822 "||||||| text by the vcs\n"
10823 " parameter2),\n"
10824 " parameter3,\n"
10825 "======= text by the vcs\n"
10826 " parameter2, parameter3),\n"
10827 ">>>>>>> text by the vcs\n"
10828 " otherparameter);\n",
10829 format("int a;\n"
10830 "void f() {\n"
10831 " callme(some(parameter1,\n"
10832 "<<<<<<< text by the vcs\n"
10833 " parameter2),\n"
10834 "||||||| text by the vcs\n"
10835 " parameter2),\n"
10836 " parameter3,\n"
10837 "======= text by the vcs\n"
10838 " parameter2,\n"
10839 " parameter3),\n"
10840 ">>>>>>> text by the vcs\n"
10841 " otherparameter);\n"));
10842
10843 // Perforce markers.
10844 EXPECT_EQ("void f() {\n"
10845 " function(\n"
10846 ">>>> text by the vcs\n"
10847 " parameter,\n"
10848 "==== text by the vcs\n"
10849 " parameter,\n"
10850 "==== text by the vcs\n"
10851 " parameter,\n"
10852 "<<<< text by the vcs\n"
10853 " parameter);\n",
10854 format("void f() {\n"
10855 " function(\n"
10856 ">>>> text by the vcs\n"
10857 " parameter,\n"
10858 "==== text by the vcs\n"
10859 " parameter,\n"
10860 "==== text by the vcs\n"
10861 " parameter,\n"
10862 "<<<< text by the vcs\n"
10863 " parameter);\n"));
10864
10865 EXPECT_EQ("<<<<<<<\n"
10866 "|||||||\n"
10867 "=======\n"
10868 ">>>>>>>",
10869 format("<<<<<<<\n"
10870 "|||||||\n"
10871 "=======\n"
10872 ">>>>>>>"));
10873
10874 EXPECT_EQ("<<<<<<<\n"
10875 "|||||||\n"
10876 "int i;\n"
10877 "=======\n"
10878 ">>>>>>>",
10879 format("<<<<<<<\n"
10880 "|||||||\n"
10881 "int i;\n"
10882 "=======\n"
10883 ">>>>>>>"));
10884
10885 // FIXME: Handle parsing of macros around conflict markers correctly:
10886 EXPECT_EQ("#define Macro \\\n"
10887 "<<<<<<<\n"
10888 "Something \\\n"
10889 "|||||||\n"
10890 "Else \\\n"
10891 "=======\n"
10892 "Other \\\n"
10893 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000010894 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000010895 format("#define Macro \\\n"
10896 "<<<<<<<\n"
10897 " Something \\\n"
10898 "|||||||\n"
10899 " Else \\\n"
10900 "=======\n"
10901 " Other \\\n"
10902 ">>>>>>>\n"
10903 " End\n"
10904 "int i;\n"));
10905}
10906
Daniel Jasper471894432014-08-06 13:40:26 +000010907TEST_F(FormatTest, DisableRegions) {
10908 EXPECT_EQ("int i;\n"
10909 "// clang-format off\n"
10910 " int j;\n"
10911 "// clang-format on\n"
10912 "int k;",
10913 format(" int i;\n"
10914 " // clang-format off\n"
10915 " int j;\n"
10916 " // clang-format on\n"
10917 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000010918 EXPECT_EQ("int i;\n"
10919 "/* clang-format off */\n"
10920 " int j;\n"
10921 "/* clang-format on */\n"
10922 "int k;",
10923 format(" int i;\n"
10924 " /* clang-format off */\n"
10925 " int j;\n"
10926 " /* clang-format on */\n"
10927 " int k;"));
Daniel Jasper471894432014-08-06 13:40:26 +000010928}
10929
Manuel Klimekf0c95b32015-06-11 10:14:13 +000010930TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
10931 format("? ) =");
10932 verifyNoCrash("#define a\\\n /**/}");
10933}
Manuel Klimek5f594f82014-08-13 14:00:41 +000010934
Daniel Jasper498f5582015-12-25 08:53:31 +000010935TEST_F(FormatTest, FormatsTableGenCode) {
10936 FormatStyle Style = getLLVMStyle();
10937 Style.Language = FormatStyle::LK_TableGen;
10938 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
10939}
10940
Nico Weberb2673a12016-11-10 21:49:25 +000010941TEST_F(FormatTest, ArrayOfTemplates) {
10942 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
10943 format("auto a = new unique_ptr<int > [ 10];"));
10944
10945 FormatStyle Spaces = getLLVMStyle();
10946 Spaces.SpacesInSquareBrackets = true;
10947 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
10948 format("auto a = new unique_ptr<int > [10];", Spaces));
10949}
10950
10951TEST_F(FormatTest, ArrayAsTemplateType) {
10952 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
10953 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
10954
10955 FormatStyle Spaces = getLLVMStyle();
10956 Spaces.SpacesInSquareBrackets = true;
10957 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
10958 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
10959}
10960
Eric Liu547d8792016-03-24 13:22:42 +000010961TEST(FormatStyle, GetStyleOfFile) {
10962 vfs::InMemoryFileSystem FS;
10963 // Test 1: format file in the same directory.
10964 ASSERT_TRUE(
10965 FS.addFile("/a/.clang-format", 0,
10966 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
10967 ASSERT_TRUE(
10968 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010969 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Eric Liu547d8792016-03-24 13:22:42 +000010970 ASSERT_EQ(Style1, getLLVMStyle());
10971
10972 // Test 2: fallback to default.
10973 ASSERT_TRUE(
10974 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010975 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Eric Liu547d8792016-03-24 13:22:42 +000010976 ASSERT_EQ(Style2, getMozillaStyle());
10977
10978 // Test 3: format file in parent directory.
10979 ASSERT_TRUE(
10980 FS.addFile("/c/.clang-format", 0,
10981 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
10982 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
10983 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000010984 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Eric Liu547d8792016-03-24 13:22:42 +000010985 ASSERT_EQ(Style3, getGoogleStyle());
10986}
10987
Manuel Klimekb12e5a52016-03-01 12:37:30 +000010988TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
10989 // Column limit is 20.
10990 std::string Code = "Type *a =\n"
10991 " new Type();\n"
10992 "g(iiiii, 0, jjjjj,\n"
10993 " 0, kkkkk, 0, mm);\n"
10994 "int bad = format ;";
10995 std::string Expected = "auto a = new Type();\n"
10996 "g(iiiii, nullptr,\n"
10997 " jjjjj, nullptr,\n"
10998 " kkkkk, nullptr,\n"
10999 " mm);\n"
11000 "int bad = format ;";
11001 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011002 tooling::Replacements Replaces = toReplacements(
11003 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11004 "auto "),
11005 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11006 "nullptr"),
11007 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11008 "nullptr"),
11009 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11010 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011011
11012 format::FormatStyle Style = format::getLLVMStyle();
11013 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011014 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11015 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11016 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11017 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11018 EXPECT_TRUE(static_cast<bool>(Result));
11019 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011020}
11021
Eric Liubaf58c22016-05-18 13:43:48 +000011022TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11023 std::string Code = "#include \"a.h\"\n"
11024 "#include \"c.h\"\n"
11025 "\n"
11026 "int main() {\n"
11027 " return 0;\n"
11028 "}";
11029 std::string Expected = "#include \"a.h\"\n"
11030 "#include \"b.h\"\n"
11031 "#include \"c.h\"\n"
11032 "\n"
11033 "int main() {\n"
11034 " return 0;\n"
11035 "}";
11036 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011037 tooling::Replacements Replaces = toReplacements(
11038 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11039 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011040
11041 format::FormatStyle Style = format::getLLVMStyle();
11042 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011043 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11044 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11045 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11046 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11047 EXPECT_TRUE(static_cast<bool>(Result));
11048 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011049}
11050
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011051TEST_F(FormatTest, AllignTrailingComments) {
11052 EXPECT_EQ("#define MACRO(V) \\\n"
11053 " V(Rt2) /* one more char */ \\\n"
11054 " V(Rs) /* than here */ \\\n"
11055 "/* comment 3 */\n",
11056 format("#define MACRO(V)\\\n"
11057 "V(Rt2) /* one more char */ \\\n"
11058 "V(Rs) /* than here */ \\\n"
11059 "/* comment 3 */ \\\n",
11060 getLLVMStyleWithColumns(40)));
11061}
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011062} // end namespace
11063} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011064} // end namespace clang