blob: 4d4b64b20b31927120668b18764cd634895c2c6f [file] [log] [blame]
Daniel Jasperf7935112012-12-03 18:12:45 +00001//===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Chandler Carruth320d9662012-12-04 09:45:34 +000010#include "clang/Format/Format.h"
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011
Eric Liu40ef2fb2016-08-01 10:16:37 +000012#include "../Tooling/ReplacementTest.h"
Manuel Klimekb12e5a52016-03-01 12:37:30 +000013#include "FormatTestUtils.h"
14
15#include "clang/Frontend/TextDiagnosticPrinter.h"
Chandler Carruth4b417452013-01-19 08:09:44 +000016#include "llvm/Support/Debug.h"
Eric Liu547d8792016-03-24 13:22:42 +000017#include "llvm/Support/MemoryBuffer.h"
Chandler Carruth4b417452013-01-19 08:09:44 +000018#include "gtest/gtest.h"
Manuel Klimek24998102013-01-16 14:55:28 +000019
Chandler Carruth10346662014-04-22 03:17:02 +000020#define DEBUG_TYPE "format-test"
21
Eric Liu40ef2fb2016-08-01 10:16:37 +000022using clang::tooling::ReplacementTest;
23using clang::tooling::toReplacements;
24
Daniel Jasperf7935112012-12-03 18:12:45 +000025namespace clang {
26namespace format {
Daniel Jasperd246a5a2015-06-15 15:25:11 +000027namespace {
Daniel Jasperf7935112012-12-03 18:12:45 +000028
Daniel Jaspera44991332015-04-29 13:06:49 +000029FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); }
Nico Weber514ecc82014-02-02 20:50:45 +000030
Daniel Jasperf7935112012-12-03 18:12:45 +000031class FormatTest : public ::testing::Test {
32protected:
Manuel Klimekec5c3db2015-05-07 12:26:30 +000033 enum IncompleteCheck {
34 IC_ExpectComplete,
35 IC_ExpectIncomplete,
36 IC_DoNotCheck
37 };
38
Daniel Jasperd246a5a2015-06-15 15:25:11 +000039 std::string format(llvm::StringRef Code,
40 const FormatStyle &Style = getLLVMStyle(),
Manuel Klimekec5c3db2015-05-07 12:26:30 +000041 IncompleteCheck CheckIncomplete = IC_ExpectComplete) {
Manuel Klimek24998102013-01-16 14:55:28 +000042 DEBUG(llvm::errs() << "---\n");
Manuel Klimek71814b42013-10-11 21:25:45 +000043 DEBUG(llvm::errs() << Code << "\n\n");
Daniel Jasperd246a5a2015-06-15 15:25:11 +000044 std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
Manuel Klimekec5c3db2015-05-07 12:26:30 +000045 bool IncompleteFormat = false;
46 tooling::Replacements Replaces =
47 reformat(Style, Code, Ranges, "<stdin>", &IncompleteFormat);
48 if (CheckIncomplete != IC_DoNotCheck) {
49 bool ExpectedIncompleteFormat = CheckIncomplete == IC_ExpectIncomplete;
50 EXPECT_EQ(ExpectedIncompleteFormat, IncompleteFormat) << Code << "\n\n";
51 }
Daniel Jasperec04c0d2013-05-16 10:40:07 +000052 ReplacementCount = Replaces.size();
Eric Liu4f8d9942016-07-11 13:53:12 +000053 auto Result = applyAllReplacements(Code, Replaces);
54 EXPECT_TRUE(static_cast<bool>(Result));
55 DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
56 return *Result;
Daniel Jasperf7935112012-12-03 18:12:45 +000057 }
58
Manuel Klimekb69e3c62013-01-02 18:33:23 +000059 FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
60 FormatStyle Style = getLLVMStyle();
61 Style.ColumnLimit = ColumnLimit;
62 return Style;
63 }
64
Daniel Jasper1b750ed2013-01-14 16:24:39 +000065 FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
66 FormatStyle Style = getGoogleStyle();
67 Style.ColumnLimit = ColumnLimit;
68 return Style;
69 }
70
Manuel Klimekb69e3c62013-01-02 18:33:23 +000071 void verifyFormat(llvm::StringRef Code,
72 const FormatStyle &Style = getLLVMStyle()) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000073 EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
Daniel Jasperf7935112012-12-03 18:12:45 +000074 }
75
Manuel Klimekec5c3db2015-05-07 12:26:30 +000076 void verifyIncompleteFormat(llvm::StringRef Code,
77 const FormatStyle &Style = getLLVMStyle()) {
78 EXPECT_EQ(Code.str(),
79 format(test::messUp(Code), Style, IC_ExpectIncomplete));
80 }
81
Daniel Jasperf7935112012-12-03 18:12:45 +000082 void verifyGoogleFormat(llvm::StringRef Code) {
Manuel Klimekb69e3c62013-01-02 18:33:23 +000083 verifyFormat(Code, getGoogleStyle());
Daniel Jasperf7935112012-12-03 18:12:45 +000084 }
Daniel Jasper5b49f472013-01-23 12:10:53 +000085
86 void verifyIndependentOfContext(llvm::StringRef text) {
87 verifyFormat(text);
88 verifyFormat(llvm::Twine("void f() { " + text + " }").str());
89 }
Daniel Jasper7b038a22013-01-30 09:46:12 +000090
Daniel Jasper675b4f82015-01-19 10:51:23 +000091 /// \brief Verify that clang-format does not crash on the given input.
92 void verifyNoCrash(llvm::StringRef Code,
93 const FormatStyle &Style = getLLVMStyle()) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +000094 format(Code, Style, IC_DoNotCheck);
Daniel Jasper675b4f82015-01-19 10:51:23 +000095 }
96
Daniel Jasper7b038a22013-01-30 09:46:12 +000097 int ReplacementCount;
Daniel Jasperf7935112012-12-03 18:12:45 +000098};
99
Manuel Klimek52b15152013-01-09 15:25:02 +0000100TEST_F(FormatTest, MessUp) {
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +0000101 EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
102 EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
103 EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
104 EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
105 EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
Manuel Klimek52b15152013-01-09 15:25:02 +0000106}
107
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000108//===----------------------------------------------------------------------===//
109// Basic function tests.
110//===----------------------------------------------------------------------===//
111
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +0000112TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000113 EXPECT_EQ(";", format(";"));
114}
115
116TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
117 EXPECT_EQ("int i;", format(" int i;"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +0000118 EXPECT_EQ("\nint i;", format(" \n\t \v \f int i;"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000119 EXPECT_EQ("int i;\nint j;", format(" int i; int j;"));
120 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;"));
121}
122
123TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
124 EXPECT_EQ("int i;", format("int\ni;"));
125}
126
127TEST_F(FormatTest, FormatsNestedBlockStatements) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000128 EXPECT_EQ("{\n {\n {}\n }\n}", format("{{{}}}"));
Daniel Jasperf7935112012-12-03 18:12:45 +0000129}
130
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000131TEST_F(FormatTest, FormatsNestedCall) {
132 verifyFormat("Method(f1, f2(f3));");
133 verifyFormat("Method(f1(f2, f3()));");
Daniel Jasper48cb3b92013-01-13 08:19:51 +0000134 verifyFormat("Method(f1(f2, (f3())));");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000135}
136
Daniel Jasper14556742013-02-07 21:08:36 +0000137TEST_F(FormatTest, NestedNameSpecifiers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +0000138 verifyFormat("vector<::Type> v;");
Daniel Jasper14556742013-02-07 21:08:36 +0000139 verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
Daniel Jasper11be8ac2013-08-28 07:07:07 +0000140 verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
Daniel Jasperf322eb52014-10-23 20:22:22 +0000141 verifyFormat("bool a = 2 < ::SomeFunction();");
Daniel Jasper736c14f2013-01-16 07:19:28 +0000142}
143
Daniel Jasper7b038a22013-01-30 09:46:12 +0000144TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
145 EXPECT_EQ("if (a) {\n"
146 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000147 "}",
148 format("if(a){f();}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000149 EXPECT_EQ(4, ReplacementCount);
150 EXPECT_EQ("if (a) {\n"
151 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000152 "}",
153 format("if (a) {\n"
154 " f();\n"
155 "}"));
Daniel Jasper7b038a22013-01-30 09:46:12 +0000156 EXPECT_EQ(0, ReplacementCount);
Daniel Jasperd6e61882015-06-17 12:23:15 +0000157 EXPECT_EQ("/*\r\n"
158 "\r\n"
159 "*/\r\n",
160 format("/*\r\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +0000161 "\r\n"
162 "*/\r\n"));
Daniel Jasperd6e61882015-06-17 12:23:15 +0000163 EXPECT_EQ(0, ReplacementCount);
Daniel Jasper7b038a22013-01-30 09:46:12 +0000164}
165
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000166TEST_F(FormatTest, RemovesEmptyLines) {
167 EXPECT_EQ("class C {\n"
168 " int i;\n"
169 "};",
170 format("class C {\n"
171 " int i;\n"
172 "\n"
173 "};"));
174
Nico Weber34272652014-11-13 16:25:37 +0000175 // Don't remove empty lines at the start of namespaces or extern "C" blocks.
Daniel Jasper01b35482014-03-21 13:03:33 +0000176 EXPECT_EQ("namespace N {\n"
177 "\n"
178 "int i;\n"
179 "}",
180 format("namespace N {\n"
181 "\n"
182 "int i;\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000183 "}",
184 getGoogleStyle()));
Nico Weber34272652014-11-13 16:25:37 +0000185 EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
186 "\n"
187 "int i;\n"
188 "}",
189 format("extern /**/ \"C\" /**/ {\n"
190 "\n"
191 "int i;\n"
192 "}",
193 getGoogleStyle()));
194
195 // ...but do keep inlining and removing empty lines for non-block extern "C"
196 // functions.
197 verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
198 EXPECT_EQ("extern \"C\" int f() {\n"
199 " int i = 42;\n"
200 " return i;\n"
201 "}",
202 format("extern \"C\" int f() {\n"
203 "\n"
204 " int i = 42;\n"
205 " return i;\n"
206 "}",
207 getGoogleStyle()));
Daniel Jasper01b35482014-03-21 13:03:33 +0000208
Daniel Jasper11164bd2014-03-21 12:58:53 +0000209 // Remove empty lines at the beginning and end of blocks.
210 EXPECT_EQ("void f() {\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000211 "\n"
212 " if (a) {\n"
213 "\n"
214 " f();\n"
215 " }\n"
216 "}",
217 format("void f() {\n"
218 "\n"
219 " if (a) {\n"
220 "\n"
221 " f();\n"
222 "\n"
223 " }\n"
224 "\n"
225 "}",
226 getLLVMStyle()));
227 EXPECT_EQ("void f() {\n"
Daniel Jasper11164bd2014-03-21 12:58:53 +0000228 " if (a) {\n"
229 " f();\n"
230 " }\n"
231 "}",
232 format("void f() {\n"
233 "\n"
234 " if (a) {\n"
235 "\n"
236 " f();\n"
237 "\n"
238 " }\n"
239 "\n"
Daniel Jaspera26fc5c2014-03-21 13:43:14 +0000240 "}",
241 getGoogleStyle()));
Daniel Jasper11164bd2014-03-21 12:58:53 +0000242
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000243 // Don't remove empty lines in more complex control statements.
244 EXPECT_EQ("void f() {\n"
245 " if (a) {\n"
246 " f();\n"
247 "\n"
248 " } else if (b) {\n"
249 " f();\n"
250 " }\n"
251 "}",
252 format("void f() {\n"
253 " if (a) {\n"
254 " f();\n"
255 "\n"
256 " } else if (b) {\n"
257 " f();\n"
258 "\n"
259 " }\n"
260 "\n"
261 "}"));
262
263 // FIXME: This is slightly inconsistent.
264 EXPECT_EQ("namespace {\n"
265 "int i;\n"
266 "}",
267 format("namespace {\n"
268 "int i;\n"
269 "\n"
270 "}"));
271 EXPECT_EQ("namespace {\n"
272 "int i;\n"
273 "\n"
274 "} // namespace",
275 format("namespace {\n"
276 "int i;\n"
277 "\n"
278 "} // namespace"));
Cameron Desrochers1991e5d2016-11-15 15:07:07 +0000279
280 FormatStyle Style = getLLVMStyle();
281 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
282 Style.MaxEmptyLinesToKeep = 2;
283 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
284 Style.BraceWrapping.AfterClass = true;
285 Style.BraceWrapping.AfterFunction = true;
286 Style.KeepEmptyLinesAtTheStartOfBlocks = false;
287
288 EXPECT_EQ("class Foo\n"
289 "{\n"
290 " Foo() {}\n"
291 "\n"
292 " void funk() {}\n"
293 "};",
294 format("class Foo\n"
295 "{\n"
296 " Foo()\n"
297 " {\n"
298 " }\n"
299 "\n"
300 " void funk() {}\n"
301 "};",
302 Style));
Daniel Jasper1027c6e2013-06-03 16:16:41 +0000303}
304
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000305TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
Daniel Jaspera44991332015-04-29 13:06:49 +0000306 verifyFormat("x = (a) and (b);");
307 verifyFormat("x = (a) or (b);");
308 verifyFormat("x = (a) bitand (b);");
309 verifyFormat("x = (a) bitor (b);");
310 verifyFormat("x = (a) not_eq (b);");
311 verifyFormat("x = (a) and_eq (b);");
312 verifyFormat("x = (a) or_eq (b);");
313 verifyFormat("x = (a) xor (b);");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +0000314}
315
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000316//===----------------------------------------------------------------------===//
317// Tests for control statements.
318//===----------------------------------------------------------------------===//
319
Daniel Jaspercdd06622013-05-14 10:31:09 +0000320TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000321 verifyFormat("if (true)\n f();\ng();");
322 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000323 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();");
Daniel Jasperced17f82013-01-16 15:44:34 +0000324
Daniel Jasper3a685df2013-05-16 12:12:21 +0000325 FormatStyle AllowsMergedIf = getLLVMStyle();
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000326 AllowsMergedIf.AlignEscapedNewlinesLeft = true;
Daniel Jasperced17f82013-01-16 15:44:34 +0000327 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
328 verifyFormat("if (a)\n"
329 " // comment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000330 " f();",
331 AllowsMergedIf);
Daniel Jasper40609472016-04-06 15:02:46 +0000332 verifyFormat("{\n"
333 " if (a)\n"
334 " label:\n"
335 " f();\n"
336 "}",
337 AllowsMergedIf);
Daniel Jasper2cce7b72016-04-06 16:41:39 +0000338 verifyFormat("#define A \\\n"
339 " if (a) \\\n"
340 " label: \\\n"
341 " f()",
342 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000343 verifyFormat("if (a)\n"
344 " ;",
345 AllowsMergedIf);
346 verifyFormat("if (a)\n"
347 " if (b) return;",
348 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000349
Daniel Jasper3a685df2013-05-16 12:12:21 +0000350 verifyFormat("if (a) // Can't merge this\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000351 " f();\n",
352 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000353 verifyFormat("if (a) /* still don't merge */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000354 " f();",
355 AllowsMergedIf);
Daniel Jasper3a685df2013-05-16 12:12:21 +0000356 verifyFormat("if (a) { // Never merge this\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000357 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000358 "}",
359 AllowsMergedIf);
Daniel Jaspereb65e912015-12-21 18:31:15 +0000360 verifyFormat("if (a) { /* Never merge this */\n"
Daniel Jasperced17f82013-01-16 15:44:34 +0000361 " f();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000362 "}",
363 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000364
365 AllowsMergedIf.ColumnLimit = 14;
366 verifyFormat("if (a) return;", AllowsMergedIf);
Daniel Jasper3e9218e2013-01-14 16:02:06 +0000367 verifyFormat("if (aaaaaaaaa)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000368 " return;",
369 AllowsMergedIf);
Daniel Jasperced17f82013-01-16 15:44:34 +0000370
371 AllowsMergedIf.ColumnLimit = 13;
372 verifyFormat("if (a)\n return;", AllowsMergedIf);
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000373}
374
Daniel Jasper3a685df2013-05-16 12:12:21 +0000375TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
376 FormatStyle AllowsMergedLoops = getLLVMStyle();
377 AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
378 verifyFormat("while (true) continue;", AllowsMergedLoops);
379 verifyFormat("for (;;) continue;", AllowsMergedLoops);
380 verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
381 verifyFormat("while (true)\n"
382 " ;",
383 AllowsMergedLoops);
384 verifyFormat("for (;;)\n"
385 " ;",
386 AllowsMergedLoops);
387 verifyFormat("for (;;)\n"
388 " for (;;) continue;",
389 AllowsMergedLoops);
390 verifyFormat("for (;;) // Can't merge this\n"
391 " continue;",
392 AllowsMergedLoops);
393 verifyFormat("for (;;) /* still don't merge */\n"
394 " continue;",
395 AllowsMergedLoops);
396}
397
Daniel Jasper17605d32014-05-14 09:33:35 +0000398TEST_F(FormatTest, FormatShortBracedStatements) {
399 FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
400 AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
401
402 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
403 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
404
405 verifyFormat("if (true) {}", AllowSimpleBracedStatements);
406 verifyFormat("while (true) {}", AllowSimpleBracedStatements);
407 verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
408 verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
409 verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
410 verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
411 verifyFormat("if (true) { //\n"
412 " f();\n"
413 "}",
414 AllowSimpleBracedStatements);
415 verifyFormat("if (true) {\n"
416 " f();\n"
417 " f();\n"
418 "}",
419 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000420 verifyFormat("if (true) {\n"
421 " f();\n"
422 "} else {\n"
423 " f();\n"
424 "}",
425 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000426
Daniel Jasperbd630732014-05-22 13:25:26 +0000427 verifyFormat("template <int> struct A2 {\n"
428 " struct B {};\n"
429 "};",
430 AllowSimpleBracedStatements);
431
Daniel Jasper17605d32014-05-14 09:33:35 +0000432 AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
433 verifyFormat("if (true) {\n"
434 " f();\n"
435 "}",
436 AllowSimpleBracedStatements);
Daniel Jaspere9f53572015-04-30 09:24:17 +0000437 verifyFormat("if (true) {\n"
438 " f();\n"
439 "} else {\n"
440 " f();\n"
441 "}",
442 AllowSimpleBracedStatements);
Daniel Jasper17605d32014-05-14 09:33:35 +0000443
444 AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
445 verifyFormat("while (true) {\n"
446 " f();\n"
447 "}",
448 AllowSimpleBracedStatements);
449 verifyFormat("for (;;) {\n"
450 " f();\n"
451 "}",
452 AllowSimpleBracedStatements);
453}
454
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000455TEST_F(FormatTest, ParseIfElse) {
456 verifyFormat("if (true)\n"
457 " if (true)\n"
458 " if (true)\n"
459 " f();\n"
460 " else\n"
461 " g();\n"
462 " else\n"
463 " h();\n"
464 "else\n"
465 " i();");
466 verifyFormat("if (true)\n"
467 " if (true)\n"
468 " if (true) {\n"
Daniel Jasper1b750ed2013-01-14 16:24:39 +0000469 " if (true)\n"
470 " f();\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000471 " } else {\n"
472 " g();\n"
473 " }\n"
474 " else\n"
475 " h();\n"
476 "else {\n"
477 " i();\n"
478 "}");
Daniel Jasper88f92222013-09-17 08:28:05 +0000479 verifyFormat("void f() {\n"
480 " if (a) {\n"
481 " } else {\n"
482 " }\n"
483 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000484}
485
486TEST_F(FormatTest, ElseIf) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000487 verifyFormat("if (a) {\n} else if (b) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000488 verifyFormat("if (a)\n"
489 " f();\n"
490 "else if (b)\n"
491 " g();\n"
492 "else\n"
493 " h();");
Daniel Jasper16fc7542013-10-30 14:04:10 +0000494 verifyFormat("if (a) {\n"
495 " f();\n"
496 "}\n"
497 "// or else ..\n"
498 "else {\n"
499 " g()\n"
500 "}");
Daniel Jasper8acf8222014-05-07 09:23:05 +0000501
502 verifyFormat("if (a) {\n"
503 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
504 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
505 "}");
Daniel Jaspera42de762015-02-26 09:49:08 +0000506 verifyFormat("if (a) {\n"
507 "} else if (\n"
508 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
509 "}",
510 getLLVMStyleWithColumns(62));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000511}
512
Daniel Jasperf7935112012-12-03 18:12:45 +0000513TEST_F(FormatTest, FormatsForLoop) {
514 verifyFormat(
515 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000516 " ++VeryVeryLongLoopVariable)\n"
517 " ;");
518 verifyFormat("for (;;)\n"
519 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000520 verifyFormat("for (;;) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000521 verifyFormat("for (;;) {\n"
522 " f();\n"
523 "}");
Daniel Jasper72463d32013-05-03 14:50:50 +0000524 verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000525
526 verifyFormat(
527 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
528 " E = UnwrappedLines.end();\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000529 " I != E; ++I) {\n}");
Daniel Jasperfbde69e2012-12-21 14:37:20 +0000530
531 verifyFormat(
532 "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000533 " ++IIIII) {\n}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000534 verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
535 " aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000536 " aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
Daniel Jasper37905f72013-02-21 15:00:29 +0000537 verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
538 " I = FD->getDeclsInPrototypeScope().begin(),\n"
539 " E = FD->getDeclsInPrototypeScope().end();\n"
540 " I != E; ++I) {\n}");
Daniel Jasperd6e09e82015-05-19 11:51:39 +0000541 verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
542 " I = Container.begin(),\n"
543 " E = Container.end();\n"
544 " I != E; ++I) {\n}",
545 getLLVMStyleWithColumns(76));
Daniel Jasper48c62f92013-01-28 17:30:17 +0000546
Daniel Jasper48c62f92013-01-28 17:30:17 +0000547 verifyFormat(
548 "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
549 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000550 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
551 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
Daniel Jasper48c62f92013-01-28 17:30:17 +0000552 " ++aaaaaaaaaaa) {\n}");
Daniel Jasper98f8ae32015-03-06 10:57:12 +0000553 verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
554 " bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
555 " ++i) {\n}");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000556 verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
557 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
558 "}");
Daniel Jaspera628c982013-04-03 13:36:17 +0000559 verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
560 " aaaaaaaaaa);\n"
561 " iter; ++iter) {\n"
562 "}");
Daniel Jasper3bacc4d2015-07-07 16:09:39 +0000563 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
564 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
565 " aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
566 " ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
Daniel Jasperf7f13c02013-02-04 07:30:30 +0000567
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000568 FormatStyle NoBinPacking = getLLVMStyle();
569 NoBinPacking.BinPackParameters = false;
570 verifyFormat("for (int aaaaaaaaaaa = 1;\n"
571 " aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
572 " aaaaaaaaaaaaaaaa,\n"
573 " aaaaaaaaaaaaaaaa,\n"
574 " aaaaaaaaaaaaaaaa);\n"
575 " aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
576 "}",
577 NoBinPacking);
578 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +0000579 "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
580 " E = UnwrappedLines.end();\n"
581 " I != E;\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +0000582 " ++I) {\n}",
583 NoBinPacking);
Daniel Jasperf7935112012-12-03 18:12:45 +0000584}
585
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000586TEST_F(FormatTest, RangeBasedForLoops) {
587 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
588 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
589 verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
590 " aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
Daniel Jasper16b35622013-02-26 13:18:08 +0000591 verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
592 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasper9cc3e972014-02-07 10:09:46 +0000593 verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
594 " aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
Daniel Jasper0b41cbb2013-01-28 13:21:16 +0000595}
596
Daniel Jaspere1e43192014-04-01 12:55:11 +0000597TEST_F(FormatTest, ForEachLoops) {
598 verifyFormat("void f() {\n"
599 " foreach (Item *item, itemlist) {}\n"
600 " Q_FOREACH (Item *item, itemlist) {}\n"
601 " BOOST_FOREACH (Item *item, itemlist) {}\n"
602 " UNKNOWN_FORACH(Item * item, itemlist) {}\n"
603 "}");
Daniel Jasper229628b2015-06-11 08:38:19 +0000604
605 // As function-like macros.
606 verifyFormat("#define foreach(x, y)\n"
607 "#define Q_FOREACH(x, y)\n"
608 "#define BOOST_FOREACH(x, y)\n"
609 "#define UNKNOWN_FOREACH(x, y)\n");
610
611 // Not as function-like macros.
612 verifyFormat("#define foreach (x, y)\n"
613 "#define Q_FOREACH (x, y)\n"
614 "#define BOOST_FOREACH (x, y)\n"
615 "#define UNKNOWN_FOREACH (x, y)\n");
Daniel Jaspere1e43192014-04-01 12:55:11 +0000616}
617
Daniel Jasperf7935112012-12-03 18:12:45 +0000618TEST_F(FormatTest, FormatsWhileLoop) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000619 verifyFormat("while (true) {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000620 verifyFormat("while (true)\n"
621 " f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +0000622 verifyFormat("while () {\n}");
Alexander Kornienko37d6c942012-12-05 15:06:06 +0000623 verifyFormat("while () {\n"
624 " f();\n"
625 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000626}
627
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000628TEST_F(FormatTest, FormatsDoWhile) {
629 verifyFormat("do {\n"
630 " do_something();\n"
631 "} while (something());");
632 verifyFormat("do\n"
633 " do_something();\n"
634 "while (something());");
Daniel Jasperf7935112012-12-03 18:12:45 +0000635}
636
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000637TEST_F(FormatTest, FormatsSwitchStatement) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000638 verifyFormat("switch (x) {\n"
639 "case 1:\n"
640 " f();\n"
641 " break;\n"
642 "case kFoo:\n"
643 "case ns::kBar:\n"
644 "case kBaz:\n"
645 " break;\n"
646 "default:\n"
647 " g();\n"
648 " break;\n"
649 "}");
650 verifyFormat("switch (x) {\n"
651 "case 1: {\n"
652 " f();\n"
653 " break;\n"
654 "}\n"
Daniel Jasper922349c2014-04-04 06:46:23 +0000655 "case 2: {\n"
656 " break;\n"
657 "}\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000658 "}");
Nico Webera5510af2013-01-18 05:50:57 +0000659 verifyFormat("switch (x) {\n"
660 "case 1: {\n"
661 " f();\n"
662 " {\n"
663 " g();\n"
664 " h();\n"
665 " }\n"
666 " break;\n"
667 "}\n"
668 "}");
669 verifyFormat("switch (x) {\n"
670 "case 1: {\n"
671 " f();\n"
672 " if (foo) {\n"
673 " g();\n"
674 " h();\n"
675 " }\n"
676 " break;\n"
677 "}\n"
678 "}");
679 verifyFormat("switch (x) {\n"
680 "case 1: {\n"
681 " f();\n"
682 " g();\n"
683 "} break;\n"
684 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000685 verifyFormat("switch (test)\n"
686 " ;");
Daniel Jasper18104652013-03-12 12:26:55 +0000687 verifyFormat("switch (x) {\n"
688 "default: {\n"
689 " // Do nothing.\n"
Manuel Klimek1a18c402013-04-12 14:13:36 +0000690 "}\n"
Daniel Jasper18104652013-03-12 12:26:55 +0000691 "}");
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000692 verifyFormat("switch (x) {\n"
Daniel Jasperb67cc422013-04-09 17:46:55 +0000693 "// comment\n"
Daniel Jasper0f8ed9e2013-03-13 15:53:12 +0000694 "// if 1, do f()\n"
695 "case 1:\n"
696 " f();\n"
697 "}");
Daniel Jasper2bd32ca2013-03-19 18:33:58 +0000698 verifyFormat("switch (x) {\n"
699 "case 1:\n"
700 " // Do amazing stuff\n"
701 " {\n"
702 " f();\n"
703 " g();\n"
704 " }\n"
705 " break;\n"
706 "}");
Daniel Jaspera1275122013-03-20 10:23:53 +0000707 verifyFormat("#define A \\\n"
708 " switch (x) { \\\n"
709 " case a: \\\n"
710 " foo = b; \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +0000711 " }",
712 getLLVMStyleWithColumns(20));
Daniel Jasper72407622013-09-02 08:26:29 +0000713 verifyFormat("#define OPERATION_CASE(name) \\\n"
714 " case OP_name: \\\n"
715 " return operations::Operation##name\n",
716 getLLVMStyleWithColumns(40));
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000717 verifyFormat("switch (x) {\n"
718 "case 1:;\n"
719 "default:;\n"
720 " int i;\n"
721 "}");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000722
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000723 verifyGoogleFormat("switch (x) {\n"
724 " case 1:\n"
725 " f();\n"
726 " break;\n"
727 " case kFoo:\n"
728 " case ns::kBar:\n"
729 " case kBaz:\n"
730 " break;\n"
731 " default:\n"
732 " g();\n"
733 " break;\n"
734 "}");
735 verifyGoogleFormat("switch (x) {\n"
736 " case 1: {\n"
737 " f();\n"
738 " break;\n"
739 " }\n"
740 "}");
741 verifyGoogleFormat("switch (test)\n"
Daniel Jasper516d7972013-07-25 11:31:57 +0000742 " ;");
743
744 verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
745 " case OP_name: \\\n"
746 " return operations::Operation##name\n");
747 verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
748 " // Get the correction operation class.\n"
749 " switch (OpCode) {\n"
750 " CASE(Add);\n"
751 " CASE(Subtract);\n"
752 " default:\n"
753 " return operations::Unknown;\n"
754 " }\n"
755 "#undef OPERATION_CASE\n"
756 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +0000757 verifyFormat("DEBUG({\n"
758 " switch (x) {\n"
759 " case A:\n"
760 " f();\n"
761 " break;\n"
762 " // On B:\n"
763 " case B:\n"
764 " g();\n"
765 " break;\n"
766 " }\n"
767 "});");
Daniel Jasper031e2402014-04-28 07:48:36 +0000768 verifyFormat("switch (a) {\n"
769 "case (b):\n"
770 " return;\n"
771 "}");
Daniel Jasperd39312ec2014-05-28 10:09:11 +0000772
773 verifyFormat("switch (a) {\n"
774 "case some_namespace::\n"
775 " some_constant:\n"
776 " return;\n"
777 "}",
778 getLLVMStyleWithColumns(34));
Daniel Jasperf7935112012-12-03 18:12:45 +0000779}
780
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000781TEST_F(FormatTest, CaseRanges) {
782 verifyFormat("switch (x) {\n"
783 "case 'A' ... 'Z':\n"
784 "case 1 ... 5:\n"
Daniel Jaspere2fab132016-05-19 06:19:17 +0000785 "case a ... b:\n"
Daniel Jasper2d0cd492013-10-20 16:56:16 +0000786 " break;\n"
787 "}");
788}
789
Daniel Jasperb87899b2014-09-10 13:11:45 +0000790TEST_F(FormatTest, ShortCaseLabels) {
791 FormatStyle Style = getLLVMStyle();
792 Style.AllowShortCaseLabelsOnASingleLine = true;
793 verifyFormat("switch (a) {\n"
794 "case 1: x = 1; break;\n"
795 "case 2: return;\n"
796 "case 3:\n"
797 "case 4:\n"
798 "case 5: return;\n"
Daniel Jasperd081e882014-11-21 12:36:25 +0000799 "case 6: // comment\n"
800 " return;\n"
801 "case 7:\n"
802 " // comment\n"
803 " return;\n"
Daniel Jasper368369b2015-09-21 09:50:01 +0000804 "case 8:\n"
805 " x = 8; // comment\n"
806 " break;\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000807 "default: y = 1; break;\n"
808 "}",
809 Style);
810 verifyFormat("switch (a) {\n"
Daniel Jasper79f226e2014-11-23 21:45:03 +0000811 "#if FOO\n"
812 "case 0: return 0;\n"
813 "#endif\n"
814 "}",
815 Style);
816 verifyFormat("switch (a) {\n"
Daniel Jasperb87899b2014-09-10 13:11:45 +0000817 "case 1: {\n"
818 "}\n"
819 "case 2: {\n"
820 " return;\n"
821 "}\n"
822 "case 3: {\n"
823 " x = 1;\n"
824 " return;\n"
825 "}\n"
826 "case 4:\n"
827 " if (x)\n"
828 " return;\n"
829 "}",
830 Style);
831 Style.ColumnLimit = 21;
832 verifyFormat("switch (a) {\n"
833 "case 1: x = 1; break;\n"
834 "case 2: return;\n"
835 "case 3:\n"
836 "case 4:\n"
837 "case 5: return;\n"
838 "default:\n"
839 " y = 1;\n"
840 " break;\n"
841 "}",
842 Style);
843}
844
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000845TEST_F(FormatTest, FormatsLabels) {
Daniel Jasperf7935112012-12-03 18:12:45 +0000846 verifyFormat("void f() {\n"
847 " some_code();\n"
848 "test_label:\n"
849 " some_other_code();\n"
850 " {\n"
851 " some_more_code();\n"
852 " another_label:\n"
853 " some_more_code();\n"
854 " }\n"
855 "}");
Daniel Jasper676e5162015-04-07 14:36:33 +0000856 verifyFormat("{\n"
857 " some_code();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +0000858 "test_label:\n"
Daniel Jasper676e5162015-04-07 14:36:33 +0000859 " some_other_code();\n"
860 "}");
Daniel Jasper1fe0d5c2015-05-06 15:19:47 +0000861 verifyFormat("{\n"
862 " some_code();\n"
863 "test_label:;\n"
864 " int i = 0;\n"
865 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +0000866}
867
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000868//===----------------------------------------------------------------------===//
869// Tests for comments.
870//===----------------------------------------------------------------------===//
871
872TEST_F(FormatTest, UnderstandsSingleLineComments) {
Daniel Jasper55213652013-03-22 10:01:29 +0000873 verifyFormat("//* */");
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000874 verifyFormat("// line 1\n"
875 "// line 2\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +0000876 "void f() {}\n");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000877
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000878 verifyFormat("void f() {\n"
879 " // Doesn't do anything\n"
880 "}");
Daniel Jasper185de242013-07-11 13:48:16 +0000881 verifyFormat("SomeObject\n"
882 " // Calling someFunction on SomeObject\n"
883 " .someFunction();");
Daniel Jaspera0407742014-02-11 10:08:11 +0000884 verifyFormat("auto result = SomeObject\n"
885 " // Calling someFunction on SomeObject\n"
886 " .someFunction();");
Daniel Jasperaa701fa2013-01-18 08:44:07 +0000887 verifyFormat("void f(int i, // some comment (probably for i)\n"
888 " int j, // some comment (probably for j)\n"
Daniel Jasper942ee722013-01-13 16:10:20 +0000889 " int k); // some comment (probably for k)");
890 verifyFormat("void f(int i,\n"
891 " // some comment (probably for j)\n"
892 " int j,\n"
893 " // some comment (probably for k)\n"
894 " int k);");
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000895
Daniel Jasperaa701fa2013-01-18 08:44:07 +0000896 verifyFormat("int i // This is a fancy variable\n"
897 " = 5; // with nicely aligned comment.");
898
899 verifyFormat("// Leading comment.\n"
900 "int a; // Trailing comment.");
901 verifyFormat("int a; // Trailing comment\n"
902 " // on 2\n"
903 " // or 3 lines.\n"
904 "int b;");
905 verifyFormat("int a; // Trailing comment\n"
906 "\n"
907 "// Leading comment.\n"
908 "int b;");
909 verifyFormat("int a; // Comment.\n"
910 " // More details.\n"
911 "int bbbb; // Another comment.");
912 verifyFormat(
913 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
914 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // comment\n"
915 "int cccccccccccccccccccccccccccccc; // comment\n"
916 "int ddd; // looooooooooooooooooooooooong comment\n"
917 "int aaaaaaaaaaaaaaaaaaaaaaa; // comment\n"
918 "int bbbbbbbbbbbbbbbbbbbbb; // comment\n"
919 "int ccccccccccccccccccc; // comment");
920
Daniel Jasper997b08c2013-01-18 09:19:33 +0000921 verifyFormat("#include \"a\" // comment\n"
922 "#include \"a/b/c\" // comment");
923 verifyFormat("#include <a> // comment\n"
924 "#include <a/b/c> // comment");
Daniel Jasper98857842013-10-30 13:54:53 +0000925 EXPECT_EQ("#include \"a\" // comment\n"
Manuel Klimek5c24cca2013-05-23 10:56:37 +0000926 "#include \"a/b/c\" // comment",
927 format("#include \\\n"
928 " \"a\" // comment\n"
929 "#include \"a/b/c\" // comment"));
Alexander Kornienko578fdd82012-12-06 18:03:27 +0000930
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000931 verifyFormat("enum E {\n"
932 " // comment\n"
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000933 " VAL_A, // comment\n"
Daniel Jasper3f69a1b2012-12-18 19:56:56 +0000934 " VAL_B\n"
935 "};");
Daniel Jaspere25509f2012-12-17 11:29:41 +0000936
937 verifyFormat(
938 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000939 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; // Trailing comment");
Daniel Jasperd8bb2db2013-01-09 09:33:39 +0000940 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
941 " // Comment inside a statement.\n"
942 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper4281c5a2014-10-07 14:45:34 +0000943 verifyFormat("SomeFunction(a,\n"
944 " // comment\n"
945 " b + x);");
946 verifyFormat("SomeFunction(a, a,\n"
947 " // comment\n"
948 " b + x);");
Daniel Jasper38396592013-02-06 15:23:09 +0000949 verifyFormat(
950 "bool aaaaaaaaaaaaa = // comment\n"
951 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
952 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Manuel Klimekc74d2922013-01-07 08:54:53 +0000953
Daniel Jasper525264c2013-02-13 19:25:54 +0000954 verifyFormat("int aaaa; // aaaaa\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +0000955 "int aa; // aaaaaaa",
956 getLLVMStyleWithColumns(20));
Daniel Jasper525264c2013-02-13 19:25:54 +0000957
Daniel Jasper304a9862013-01-21 22:49:20 +0000958 EXPECT_EQ("void f() { // This does something ..\n"
959 "}\n"
960 "int a; // This is unrelated",
961 format("void f() { // This does something ..\n"
962 " }\n"
963 "int a; // This is unrelated"));
Daniel Jasper251b3c92013-07-01 11:22:57 +0000964 EXPECT_EQ("class C {\n"
965 " void f() { // This does something ..\n"
966 " } // awesome..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +0000967 "\n"
Daniel Jasper251b3c92013-07-01 11:22:57 +0000968 " int a; // This is unrelated\n"
969 "};",
970 format("class C{void f() { // This does something ..\n"
Daniel Jasper304a9862013-01-21 22:49:20 +0000971 " } // awesome..\n"
972 " \n"
Daniel Jasper251b3c92013-07-01 11:22:57 +0000973 "int a; // This is unrelated\n"
974 "};"));
Daniel Jasper304a9862013-01-21 22:49:20 +0000975
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000976 EXPECT_EQ("int i; // single line trailing comment",
Manuel Klimekc74d2922013-01-07 08:54:53 +0000977 format("int i;\\\n// single line trailing comment"));
Daniel Jasper5ad1e192013-01-07 11:09:06 +0000978
979 verifyGoogleFormat("int a; // Trailing comment.");
Daniel Jasperddaa9be2013-01-29 19:41:55 +0000980
981 verifyFormat("someFunction(anotherFunction( // Force break.\n"
982 " parameter));");
Daniel Jaspera885dbe2013-02-05 09:34:14 +0000983
984 verifyGoogleFormat("#endif // HEADER_GUARD");
Daniel Jasperf79f9352013-02-06 22:04:05 +0000985
986 verifyFormat("const char *test[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +0000987 " // A\n"
988 " \"aaaa\",\n"
989 " // B\n"
990 " \"aaaaa\"};");
Daniel Jaspereef30492013-02-11 12:36:37 +0000991 verifyGoogleFormat(
992 "aaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +0000993 " aaaaaaaaaaaaaaaaaaaaaa); // 81_cols_with_this_comment");
Alexander Kornienkob1be9d62013-04-03 12:38:53 +0000994 EXPECT_EQ("D(a, {\n"
995 " // test\n"
996 " int a;\n"
997 "});",
998 format("D(a, {\n"
999 "// test\n"
1000 "int a;\n"
1001 "});"));
Manuel Klimekc5730802013-05-23 11:42:52 +00001002
1003 EXPECT_EQ("lineWith(); // comment\n"
1004 "// at start\n"
1005 "otherLine();",
1006 format("lineWith(); // comment\n"
1007 "// at start\n"
1008 "otherLine();"));
1009 EXPECT_EQ("lineWith(); // comment\n"
Daniel Jasperbb37a2f2016-02-01 11:20:55 +00001010 "/*\n"
1011 " * at start */\n"
1012 "otherLine();",
1013 format("lineWith(); // comment\n"
1014 "/*\n"
1015 " * at start */\n"
1016 "otherLine();"));
1017 EXPECT_EQ("lineWith(); // comment\n"
Manuel Klimekc5730802013-05-23 11:42:52 +00001018 " // at start\n"
1019 "otherLine();",
1020 format("lineWith(); // comment\n"
1021 " // at start\n"
1022 "otherLine();"));
Manuel Klimekb27375f2013-05-23 19:54:43 +00001023
1024 EXPECT_EQ("lineWith(); // comment\n"
1025 "// at start\n"
1026 "otherLine(); // comment",
1027 format("lineWith(); // comment\n"
1028 "// at start\n"
1029 "otherLine(); // comment"));
Manuel Klimek75ef31f2013-05-23 20:46:07 +00001030 EXPECT_EQ("lineWith();\n"
1031 "// at start\n"
1032 "otherLine(); // comment",
1033 format("lineWith();\n"
1034 " // at start\n"
1035 "otherLine(); // comment"));
1036 EXPECT_EQ("// first\n"
1037 "// at start\n"
1038 "otherLine(); // comment",
1039 format("// first\n"
1040 " // at start\n"
1041 "otherLine(); // comment"));
1042 EXPECT_EQ("f();\n"
1043 "// first\n"
1044 "// at start\n"
1045 "otherLine(); // comment",
1046 format("f();\n"
1047 "// first\n"
1048 " // at start\n"
1049 "otherLine(); // comment"));
Daniel Jasper0e93cdb2013-11-08 23:31:14 +00001050 verifyFormat("f(); // comment\n"
1051 "// first\n"
1052 "// at start\n"
1053 "otherLine();");
1054 EXPECT_EQ("f(); // comment\n"
1055 "// first\n"
1056 "// at start\n"
1057 "otherLine();",
1058 format("f(); // comment\n"
1059 "// first\n"
1060 " // at start\n"
1061 "otherLine();"));
1062 EXPECT_EQ("f(); // comment\n"
1063 " // first\n"
1064 "// at start\n"
1065 "otherLine();",
1066 format("f(); // comment\n"
1067 " // first\n"
1068 "// at start\n"
1069 "otherLine();"));
Daniel Jasper49532102015-01-07 14:00:11 +00001070 EXPECT_EQ("void f() {\n"
1071 " lineWith(); // comment\n"
1072 " // at start\n"
1073 "}",
1074 format("void f() {\n"
1075 " lineWith(); // comment\n"
1076 " // at start\n"
1077 "}"));
Benjamin Kramerdab50462016-01-11 16:27:16 +00001078 EXPECT_EQ("int xy; // a\n"
1079 "int z; // b",
1080 format("int xy; // a\n"
1081 "int z; //b"));
1082 EXPECT_EQ("int xy; // a\n"
1083 "int z; // bb",
1084 format("int xy; // a\n"
1085 "int z; //bb",
1086 getLLVMStyleWithColumns(12)));
Daniel Jasper66935022014-04-27 10:03:19 +00001087
Daniel Jaspera44991332015-04-29 13:06:49 +00001088 verifyFormat("#define A \\\n"
1089 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1090 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1091 getLLVMStyleWithColumns(60));
Daniel Jasper66935022014-04-27 10:03:19 +00001092 verifyFormat(
1093 "#define A \\\n"
1094 " int i; /* iiiiiiiiiiiiiiiiiiiii */ \\\n"
1095 " int jjjjjjjjjjjjjjjjjjjjjjjj; /* */",
1096 getLLVMStyleWithColumns(61));
Daniel Jasper8acf8222014-05-07 09:23:05 +00001097
1098 verifyFormat("if ( // This is some comment\n"
1099 " x + 3) {\n"
1100 "}");
1101 EXPECT_EQ("if ( // This is some comment\n"
1102 " // spanning two lines\n"
1103 " x + 3) {\n"
1104 "}",
1105 format("if( // This is some comment\n"
1106 " // spanning two lines\n"
1107 " x + 3) {\n"
1108 "}"));
Daniel Jasper9b79efb2015-01-19 11:49:32 +00001109
1110 verifyNoCrash("/\\\n/");
1111 verifyNoCrash("/\\\n* */");
Daniel Jasper62c78f52015-05-06 08:58:57 +00001112 // The 0-character somehow makes the lexer return a proper comment.
1113 verifyNoCrash(StringRef("/*\\\0\n/", 6));
Daniel Jaspere25509f2012-12-17 11:29:41 +00001114}
1115
Daniel Jasper14e58e52014-03-21 11:58:45 +00001116TEST_F(FormatTest, KeepsParameterWithTrailingCommentsOnTheirOwnLine) {
1117 EXPECT_EQ("SomeFunction(a,\n"
1118 " b, // comment\n"
1119 " c);",
1120 format("SomeFunction(a,\n"
1121 " b, // comment\n"
1122 " c);"));
Daniel Jasper28df0a32014-03-21 12:15:40 +00001123 EXPECT_EQ("SomeFunction(a, b,\n"
1124 " // comment\n"
1125 " c);",
1126 format("SomeFunction(a,\n"
1127 " b,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001128 " // comment\n"
Daniel Jasper28df0a32014-03-21 12:15:40 +00001129 " c);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001130 EXPECT_EQ("SomeFunction(a, b, // comment (unclear relation)\n"
1131 " c);",
1132 format("SomeFunction(a, b, // comment (unclear relation)\n"
1133 " c);"));
1134 EXPECT_EQ("SomeFunction(a, // comment\n"
1135 " b,\n"
1136 " c); // comment",
1137 format("SomeFunction(a, // comment\n"
1138 " b,\n"
1139 " c); // comment"));
Daniel Jasper35e41222016-11-29 09:40:01 +00001140 EXPECT_EQ("aaaaaaaaaa(aaaa(aaaa,\n"
1141 " aaaa), //\n"
1142 " aaaa, bbbbb);",
1143 format("aaaaaaaaaa(aaaa(aaaa,\n"
1144 "aaaa), //\n"
1145 "aaaa, bbbbb);"));
Daniel Jasper14e58e52014-03-21 11:58:45 +00001146}
1147
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001148TEST_F(FormatTest, RemovesTrailingWhitespaceOfComments) {
1149 EXPECT_EQ("// comment", format("// comment "));
1150 EXPECT_EQ("int aaaaaaa, bbbbbbb; // comment",
1151 format("int aaaaaaa, bbbbbbb; // comment ",
1152 getLLVMStyleWithColumns(33)));
Alexander Kornienko9ab4a772013-09-06 17:24:54 +00001153 EXPECT_EQ("// comment\\\n", format("// comment\\\n \t \v \f "));
1154 EXPECT_EQ("// comment \\\n", format("// comment \\\n \t \v \f "));
Daniel Jasper3324cbe2013-03-01 16:45:59 +00001155}
1156
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001157TEST_F(FormatTest, UnderstandsBlockComments) {
Nico Weber8084cff2013-06-26 00:15:19 +00001158 verifyFormat("f(/*noSpaceAfterParameterNamingComment=*/true);");
Daniel Jasper2b2c9672016-05-08 18:14:01 +00001159 verifyFormat("void f() { g(/*aaa=*/x, /*bbb=*/!y, /*c=*/::c); }");
Daniel Jasper38c82402013-11-29 09:27:43 +00001160 EXPECT_EQ("f(aaaaaaaaaaaaaaaaaaaaaaaaa, /* Trailing comment for aa... */\n"
1161 " bbbbbbbbbbbbbbbbbbbbbbbbb);",
1162 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \\\n"
1163 "/* Trailing comment for aa... */\n"
1164 " bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001165 EXPECT_EQ(
1166 "f(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1167 " /* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);",
1168 format("f(aaaaaaaaaaaaaaaaaaaaaaaaa , \n"
1169 "/* Leading comment for bb... */ bbbbbbbbbbbbbbbbbbbbbbbbb);"));
Daniel Jasper61a40782013-06-06 16:08:57 +00001170 EXPECT_EQ(
1171 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1172 " aaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001173 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001174 "}",
1175 format("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
1176 " aaaaaaaaaaaaaaaaaa ,\n"
Daniel Jasperee7539a2013-07-08 14:25:23 +00001177 " aaaaaaaaaaaaaaaaaa) { /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/\n"
Daniel Jasper61a40782013-06-06 16:08:57 +00001178 "}"));
Daniel Jasper99302ed2016-05-27 08:59:34 +00001179 verifyFormat("f(/* aaaaaaaaaaaaaaaaaa = */\n"
1180 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperddaa9be2013-01-29 19:41:55 +00001181
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00001182 FormatStyle NoBinPacking = getLLVMStyle();
1183 NoBinPacking.BinPackParameters = false;
1184 verifyFormat("aaaaaaaa(/* parameter 1 */ aaaaaa,\n"
1185 " /* parameter 2 */ aaaaaa,\n"
1186 " /* parameter 3 */ aaaaaa,\n"
1187 " /* parameter 4 */ aaaaaa);",
1188 NoBinPacking);
Daniel Jasper03b1bc72014-03-28 15:06:01 +00001189
1190 // Aligning block comments in macros.
1191 verifyGoogleFormat("#define A \\\n"
1192 " int i; /*a*/ \\\n"
1193 " int jjj; /*b*/");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001194}
1195
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001196TEST_F(FormatTest, AlignsBlockComments) {
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001197 EXPECT_EQ("/*\n"
1198 " * Really multi-line\n"
1199 " * comment.\n"
1200 " */\n"
1201 "void f() {}",
1202 format(" /*\n"
1203 " * Really multi-line\n"
1204 " * comment.\n"
1205 " */\n"
1206 " void f() {}"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001207 EXPECT_EQ("class C {\n"
1208 " /*\n"
1209 " * Another multi-line\n"
1210 " * comment.\n"
1211 " */\n"
1212 " void f() {}\n"
1213 "};",
1214 format("class C {\n"
1215 "/*\n"
1216 " * Another multi-line\n"
1217 " * comment.\n"
1218 " */\n"
1219 "void f() {}\n"
1220 "};"));
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001221 EXPECT_EQ("/*\n"
1222 " 1. This is a comment with non-trivial formatting.\n"
1223 " 1.1. We have to indent/outdent all lines equally\n"
1224 " 1.1.1. to keep the formatting.\n"
1225 " */",
1226 format(" /*\n"
1227 " 1. This is a comment with non-trivial formatting.\n"
1228 " 1.1. We have to indent/outdent all lines equally\n"
1229 " 1.1.1. to keep the formatting.\n"
1230 " */"));
1231 EXPECT_EQ("/*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001232 "Don't try to outdent if there's not enough indentation.\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001233 "*/",
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001234 format(" /*\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +00001235 " Don't try to outdent if there's not enough indentation.\n"
Alexander Kornienko79d6c722013-03-15 13:42:02 +00001236 " */"));
Manuel Klimek281dcbe2013-05-28 08:55:01 +00001237
1238 EXPECT_EQ("int i; /* Comment with empty...\n"
1239 " *\n"
1240 " * line. */",
1241 format("int i; /* Comment with empty...\n"
1242 " *\n"
1243 " * line. */"));
Alexander Kornienko67d9c8c2014-04-17 16:12:46 +00001244 EXPECT_EQ("int foobar = 0; /* comment */\n"
1245 "int bar = 0; /* multiline\n"
1246 " comment 1 */\n"
1247 "int baz = 0; /* multiline\n"
1248 " comment 2 */\n"
1249 "int bzz = 0; /* multiline\n"
1250 " comment 3 */",
1251 format("int foobar = 0; /* comment */\n"
1252 "int bar = 0; /* multiline\n"
1253 " comment 1 */\n"
1254 "int baz = 0; /* multiline\n"
1255 " comment 2 */\n"
1256 "int bzz = 0; /* multiline\n"
1257 " comment 3 */"));
1258 EXPECT_EQ("int foobar = 0; /* comment */\n"
1259 "int bar = 0; /* multiline\n"
1260 " comment */\n"
1261 "int baz = 0; /* multiline\n"
1262 "comment */",
1263 format("int foobar = 0; /* comment */\n"
1264 "int bar = 0; /* multiline\n"
1265 "comment */\n"
1266 "int baz = 0; /* multiline\n"
1267 "comment */"));
Alexander Kornienkodd8ed852013-03-14 16:10:54 +00001268}
1269
Daniel Jaspera0a50392015-12-01 13:28:53 +00001270TEST_F(FormatTest, CommentReflowingCanBeTurnedOff) {
1271 FormatStyle Style = getLLVMStyleWithColumns(20);
1272 Style.ReflowComments = false;
1273 verifyFormat("// aaaaaaaaa aaaaaaaaaa aaaaaaaaaa", Style);
1274 verifyFormat("/* aaaaaaaaa aaaaaaaaaa aaaaaaaaaa */", Style);
1275}
1276
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001277TEST_F(FormatTest, CorrectlyHandlesLengthOfBlockComments) {
1278 EXPECT_EQ("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1279 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */",
1280 format("double *x; /* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
1281 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa */"));
Alexander Kornienkoaa620e12013-07-01 13:42:42 +00001282 EXPECT_EQ(
1283 "void ffffffffffff(\n"
1284 " int aaaaaaaa, int bbbbbbbb,\n"
1285 " int cccccccccccc) { /*\n"
1286 " aaaaaaaaaa\n"
1287 " aaaaaaaaaaaaa\n"
1288 " bbbbbbbbbbbbbb\n"
1289 " bbbbbbbbbb\n"
1290 " */\n"
1291 "}",
1292 format("void ffffffffffff(int aaaaaaaa, int bbbbbbbb, int cccccccccccc)\n"
1293 "{ /*\n"
1294 " aaaaaaaaaa aaaaaaaaaaaaa\n"
1295 " bbbbbbbbbbbbbb bbbbbbbbbb\n"
1296 " */\n"
1297 "}",
1298 getLLVMStyleWithColumns(40)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001299}
1300
Alexander Kornienko94042342013-07-16 23:47:22 +00001301TEST_F(FormatTest, DontBreakNonTrailingBlockComments) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00001302 EXPECT_EQ("void ffffffffff(\n"
1303 " int aaaaa /* test */);",
Alexander Kornienko94042342013-07-16 23:47:22 +00001304 format("void ffffffffff(int aaaaa /* test */);",
1305 getLLVMStyleWithColumns(35)));
1306}
1307
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001308TEST_F(FormatTest, SplitsLongCxxComments) {
1309 EXPECT_EQ("// A comment that\n"
1310 "// doesn't fit on\n"
1311 "// one line",
1312 format("// A comment that doesn't fit on one line",
1313 getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001314 EXPECT_EQ("/// A comment that\n"
1315 "/// doesn't fit on\n"
1316 "/// one line",
1317 format("/// A comment that doesn't fit on one line",
1318 getLLVMStyleWithColumns(20)));
1319 EXPECT_EQ("//! A comment that\n"
1320 "//! doesn't fit on\n"
1321 "//! one line",
1322 format("//! A comment that doesn't fit on one line",
1323 getLLVMStyleWithColumns(20)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00001324 EXPECT_EQ("// a b c d\n"
1325 "// e f g\n"
1326 "// h i j k",
Daniel Jaspera44991332015-04-29 13:06:49 +00001327 format("// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
1328 EXPECT_EQ(
1329 "// a b c d\n"
1330 "// e f g\n"
1331 "// h i j k",
1332 format("\\\n// a b c d e f g h i j k", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001333 EXPECT_EQ("if (true) // A comment that\n"
1334 " // doesn't fit on\n"
1335 " // one line",
1336 format("if (true) // A comment that doesn't fit on one line ",
1337 getLLVMStyleWithColumns(30)));
1338 EXPECT_EQ("// Don't_touch_leading_whitespace",
1339 format("// Don't_touch_leading_whitespace",
1340 getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001341 EXPECT_EQ("// Add leading\n"
1342 "// whitespace",
1343 format("//Add leading whitespace", getLLVMStyleWithColumns(20)));
Daniel Jasperdee894f2015-06-09 13:16:54 +00001344 EXPECT_EQ("/// Add leading\n"
1345 "/// whitespace",
1346 format("///Add leading whitespace", getLLVMStyleWithColumns(20)));
1347 EXPECT_EQ("//! Add leading\n"
1348 "//! whitespace",
1349 format("//!Add leading whitespace", getLLVMStyleWithColumns(20)));
Alexander Kornienko555efc32013-06-11 16:01:49 +00001350 EXPECT_EQ("// whitespace", format("//whitespace", getLLVMStyle()));
1351 EXPECT_EQ("// Even if it makes the line exceed the column\n"
1352 "// limit",
1353 format("//Even if it makes the line exceed the column limit",
1354 getLLVMStyleWithColumns(51)));
1355 EXPECT_EQ("//--But not here", format("//--But not here", getLLVMStyle()));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001356
1357 EXPECT_EQ("// aa bb cc dd",
1358 format("// aa bb cc dd ",
1359 getLLVMStyleWithColumns(15)));
1360
Alexander Kornienkoefd98382013-03-28 18:40:55 +00001361 EXPECT_EQ("// A comment before\n"
1362 "// a macro\n"
1363 "// definition\n"
1364 "#define a b",
1365 format("// A comment before a macro definition\n"
1366 "#define a b",
1367 getLLVMStyleWithColumns(20)));
Daniel Jaspere068ac72014-10-27 17:13:59 +00001368 EXPECT_EQ("void ffffff(\n"
1369 " int aaaaaaaaa, // wwww\n"
1370 " int bbbbbbbbbb, // xxxxxxx\n"
1371 " // yyyyyyyyyy\n"
1372 " int c, int d, int e) {}",
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001373 format("void ffffff(\n"
1374 " int aaaaaaaaa, // wwww\n"
Daniel Jasper19a541e2013-12-19 16:45:34 +00001375 " int bbbbbbbbbb, // xxxxxxx yyyyyyyyyy\n"
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00001376 " int c, int d, int e) {}",
1377 getLLVMStyleWithColumns(40)));
Alexander Kornienkob93062e2013-06-20 13:58:37 +00001378 EXPECT_EQ("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1379 format("//\t aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1380 getLLVMStyleWithColumns(20)));
Alexander Kornienko3abbb8a2013-11-12 17:30:49 +00001381 EXPECT_EQ(
1382 "#define XXX // a b c d\n"
1383 " // e f g h",
1384 format("#define XXX // a b c d e f g h", getLLVMStyleWithColumns(22)));
1385 EXPECT_EQ(
1386 "#define XXX // q w e r\n"
1387 " // t y u i",
1388 format("#define XXX //q w e r t y u i", getLLVMStyleWithColumns(22)));
Krasimir Georgieve518e0b2017-01-30 21:00:01 +00001389 EXPECT_EQ("{\n"
1390 " //\n"
1391 " //\\\n"
1392 " // long 1 2 3 4\n"
1393 " // 5\n"
1394 "}",
1395 format("{\n"
1396 " //\n"
1397 " //\\\n"
1398 " // long 1 2 3 4 5\n"
1399 "}",
1400 getLLVMStyleWithColumns(20)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001401}
Manuel Klimek9043c742013-05-27 15:23:34 +00001402
Alexander Kornienko4504f932014-03-10 13:14:56 +00001403TEST_F(FormatTest, PreservesHangingIndentInCxxComments) {
1404 EXPECT_EQ("// A comment\n"
1405 "// that doesn't\n"
1406 "// fit on one\n"
1407 "// line",
1408 format("// A comment that doesn't fit on one line",
1409 getLLVMStyleWithColumns(20)));
1410 EXPECT_EQ("/// A comment\n"
1411 "/// that doesn't\n"
1412 "/// fit on one\n"
1413 "/// line",
1414 format("/// A comment that doesn't fit on one line",
1415 getLLVMStyleWithColumns(20)));
1416}
1417
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001418TEST_F(FormatTest, DontSplitLineCommentsWithEscapedNewlines) {
1419 EXPECT_EQ("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1420 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1421 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
1422 format("// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1423 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
1424 "// aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
1425 EXPECT_EQ("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1426 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1427 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1428 format("int a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1429 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1430 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1431 getLLVMStyleWithColumns(50)));
1432 // FIXME: One day we might want to implement adjustment of leading whitespace
1433 // of the consecutive lines in this kind of comment:
Daniel Jasper4355e7f2014-07-09 07:50:33 +00001434 EXPECT_EQ("double\n"
1435 " a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1436 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1437 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
1438 format("double a; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1439 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\\\n"
1440 " // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
Alexander Kornienko657c67b2013-07-16 21:06:13 +00001441 getLLVMStyleWithColumns(49)));
1442}
1443
Alexander Kornienkoce9161a2014-01-02 15:13:14 +00001444TEST_F(FormatTest, DontSplitLineCommentsWithPragmas) {
1445 FormatStyle Pragmas = getLLVMStyleWithColumns(30);
1446 Pragmas.CommentPragmas = "^ IWYU pragma:";
1447 EXPECT_EQ(
1448 "// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb",
1449 format("// IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb", Pragmas));
1450 EXPECT_EQ(
1451 "/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */",
1452 format("/* IWYU pragma: aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb */", Pragmas));
1453}
1454
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001455TEST_F(FormatTest, PriorityOfCommentBreaking) {
Daniel Jasper2739af32013-08-28 10:03:58 +00001456 EXPECT_EQ("if (xxx ==\n"
1457 " yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001458 " zzz)\n"
1459 " q();",
1460 format("if (xxx == yyy && // aaaaaaaaaaaa bbbbbbbbb\n"
1461 " zzz) q();",
1462 getLLVMStyleWithColumns(40)));
1463 EXPECT_EQ("if (xxxxxxxxxx ==\n"
1464 " yyy && // aaaaaa bbbbbbbb cccc\n"
1465 " zzz)\n"
1466 " q();",
1467 format("if (xxxxxxxxxx == yyy && // aaaaaa bbbbbbbb cccc\n"
1468 " zzz) q();",
1469 getLLVMStyleWithColumns(40)));
1470 EXPECT_EQ("if (xxxxxxxxxx &&\n"
1471 " yyy || // aaaaaa bbbbbbbb cccc\n"
1472 " zzz)\n"
1473 " q();",
1474 format("if (xxxxxxxxxx && yyy || // aaaaaa bbbbbbbb cccc\n"
1475 " zzz) q();",
1476 getLLVMStyleWithColumns(40)));
Daniel Jasper19a541e2013-12-19 16:45:34 +00001477 EXPECT_EQ("fffffffff(\n"
1478 " &xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1479 " zzz);",
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001480 format("fffffffff(&xxx, // aaaaaaaaaaaa bbbbbbbbbbb\n"
1481 " zzz);",
1482 getLLVMStyleWithColumns(40)));
Manuel Klimek9043c742013-05-27 15:23:34 +00001483}
1484
1485TEST_F(FormatTest, MultiLineCommentsInDefines) {
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001486 EXPECT_EQ("#define A(x) /* \\\n"
1487 " a comment \\\n"
1488 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001489 " f();",
1490 format("#define A(x) /* \\\n"
1491 " a comment \\\n"
1492 " inside */ \\\n"
1493 " f();",
1494 getLLVMStyleWithColumns(17)));
Alexander Kornienkoa3555e22013-06-19 19:50:11 +00001495 EXPECT_EQ("#define A( \\\n"
1496 " x) /* \\\n"
1497 " a comment \\\n"
1498 " inside */ \\\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001499 " f();",
1500 format("#define A( \\\n"
1501 " x) /* \\\n"
1502 " a comment \\\n"
1503 " inside */ \\\n"
1504 " f();",
1505 getLLVMStyleWithColumns(17)));
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001506}
1507
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001508TEST_F(FormatTest, ParsesCommentsAdjacentToPPDirectives) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001509 EXPECT_EQ("namespace {}\n// Test\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001510 format("namespace {}\n // Test\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001511 EXPECT_EQ("namespace {}\n/* Test */\n#define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001512 format("namespace {}\n /* Test */\n#define A"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00001513 EXPECT_EQ("namespace {}\n/* Test */ #define A",
Alexander Kornienkob5dad752013-04-02 13:04:06 +00001514 format("namespace {}\n /* Test */ #define A"));
1515}
1516
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001517TEST_F(FormatTest, SplitsLongLinesInComments) {
1518 EXPECT_EQ("/* This is a long\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001519 " * comment that\n"
1520 " * doesn't\n"
1521 " * fit on one line.\n"
1522 " */",
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001523 format("/* "
1524 "This is a long "
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001525 "comment that "
1526 "doesn't "
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001527 "fit on one line. */",
1528 getLLVMStyleWithColumns(20)));
Daniel Jaspera44991332015-04-29 13:06:49 +00001529 EXPECT_EQ(
1530 "/* a b c d\n"
1531 " * e f g\n"
1532 " * h i j k\n"
1533 " */",
1534 format("/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
1535 EXPECT_EQ(
1536 "/* a b c d\n"
1537 " * e f g\n"
1538 " * h i j k\n"
1539 " */",
1540 format("\\\n/* a b c d e f g h i j k */", getLLVMStyleWithColumns(10)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001541 EXPECT_EQ("/*\n"
1542 "This is a long\n"
1543 "comment that doesn't\n"
1544 "fit on one line.\n"
1545 "*/",
1546 format("/*\n"
1547 "This is a long "
1548 "comment that doesn't "
1549 "fit on one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001550 "*/",
1551 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001552 EXPECT_EQ("/*\n"
1553 " * This is a long\n"
1554 " * comment that\n"
1555 " * doesn't fit on\n"
1556 " * one line.\n"
1557 " */",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001558 format("/* \n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001559 " * This is a long "
1560 " comment that "
1561 " doesn't fit on "
1562 " one line. \n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001563 " */",
1564 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001565 EXPECT_EQ("/*\n"
1566 " * This_is_a_comment_with_words_that_dont_fit_on_one_line\n"
1567 " * so_it_should_be_broken\n"
1568 " * wherever_a_space_occurs\n"
1569 " */",
1570 format("/*\n"
1571 " * This_is_a_comment_with_words_that_dont_fit_on_one_line "
1572 " so_it_should_be_broken "
1573 " wherever_a_space_occurs \n"
1574 " */",
1575 getLLVMStyleWithColumns(20)));
1576 EXPECT_EQ("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001577 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001578 " */",
1579 format("/*\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00001580 " * This_comment_can_not_be_broken_into_lines\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001581 " */",
1582 getLLVMStyleWithColumns(20)));
1583 EXPECT_EQ("{\n"
1584 " /*\n"
1585 " This is another\n"
1586 " long comment that\n"
1587 " doesn't fit on one\n"
1588 " line 1234567890\n"
1589 " */\n"
1590 "}",
1591 format("{\n"
1592 "/*\n"
1593 "This is another "
1594 " long comment that "
1595 " doesn't fit on one"
1596 " line 1234567890\n"
1597 "*/\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001598 "}",
1599 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001600 EXPECT_EQ("{\n"
1601 " /*\n"
1602 " * This i s\n"
1603 " * another comment\n"
1604 " * t hat doesn' t\n"
1605 " * fit on one l i\n"
1606 " * n e\n"
1607 " */\n"
1608 "}",
1609 format("{\n"
1610 "/*\n"
1611 " * This i s"
1612 " another comment"
1613 " t hat doesn' t"
1614 " fit on one l i"
1615 " n e\n"
1616 " */\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001617 "}",
1618 getLLVMStyleWithColumns(20)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001619 EXPECT_EQ("/*\n"
1620 " * This is a long\n"
1621 " * comment that\n"
1622 " * doesn't fit on\n"
1623 " * one line\n"
1624 " */",
1625 format(" /*\n"
1626 " * This is a long comment that doesn't fit on one line\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00001627 " */",
1628 getLLVMStyleWithColumns(20)));
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001629 EXPECT_EQ("{\n"
1630 " if (something) /* This is a\n"
Manuel Klimek9043c742013-05-27 15:23:34 +00001631 " long\n"
1632 " comment */\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001633 " ;\n"
1634 "}",
1635 format("{\n"
1636 " if (something) /* This is a long comment */\n"
1637 " ;\n"
1638 "}",
1639 getLLVMStyleWithColumns(30)));
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001640
1641 EXPECT_EQ("/* A comment before\n"
1642 " * a macro\n"
1643 " * definition */\n"
1644 "#define a b",
1645 format("/* A comment before a macro definition */\n"
1646 "#define a b",
1647 getLLVMStyleWithColumns(20)));
1648
1649 EXPECT_EQ("/* some comment\n"
1650 " * a comment\n"
1651 "* that we break\n"
1652 " * another comment\n"
1653 "* we have to break\n"
1654 "* a left comment\n"
1655 " */",
1656 format(" /* some comment\n"
1657 " * a comment that we break\n"
1658 " * another comment we have to break\n"
1659 "* a left comment\n"
1660 " */",
1661 getLLVMStyleWithColumns(20)));
1662
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00001663 EXPECT_EQ("/**\n"
1664 " * multiline block\n"
1665 " * comment\n"
1666 " *\n"
1667 " */",
1668 format("/**\n"
1669 " * multiline block comment\n"
1670 " *\n"
1671 " */",
1672 getLLVMStyleWithColumns(20)));
1673
Alexander Kornienkodd7ece52013-06-07 16:02:52 +00001674 EXPECT_EQ("/*\n"
1675 "\n"
1676 "\n"
1677 " */\n",
1678 format(" /* \n"
1679 " \n"
1680 " \n"
1681 " */\n"));
Alexander Kornienko875395f2013-11-12 17:50:13 +00001682
1683 EXPECT_EQ("/* a a */",
1684 format("/* a a */", getLLVMStyleWithColumns(15)));
1685 EXPECT_EQ("/* a a bc */",
1686 format("/* a a bc */", getLLVMStyleWithColumns(15)));
1687 EXPECT_EQ("/* aaa aaa\n"
1688 " * aaaaa */",
1689 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
1690 EXPECT_EQ("/* aaa aaa\n"
1691 " * aaaaa */",
1692 format("/* aaa aaa aaaaa */", getLLVMStyleWithColumns(15)));
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001693}
1694
1695TEST_F(FormatTest, SplitsLongLinesInCommentsInPreprocessor) {
1696 EXPECT_EQ("#define X \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001697 " /* \\\n"
1698 " Test \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001699 " Macro comment \\\n"
1700 " with a long \\\n"
1701 " line \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001702 " */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001703 " A + B",
1704 format("#define X \\\n"
1705 " /*\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001706 " Test\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001707 " Macro comment with a long line\n"
1708 " */ \\\n"
1709 " A + B",
1710 getLLVMStyleWithColumns(20)));
1711 EXPECT_EQ("#define X \\\n"
1712 " /* Macro comment \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001713 " with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001714 " line */ \\\n"
Alexander Kornienko547a9f522013-03-21 12:28:10 +00001715 " A + B",
1716 format("#define X \\\n"
1717 " /* Macro comment with a long\n"
1718 " line */ \\\n"
1719 " A + B",
1720 getLLVMStyleWithColumns(20)));
1721 EXPECT_EQ("#define X \\\n"
1722 " /* Macro comment \\\n"
1723 " * with a long \\\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00001724 " * line */ \\\n"
Alexander Kornienkoafcef332013-03-19 17:41:36 +00001725 " A + B",
1726 format("#define X \\\n"
1727 " /* Macro comment with a long line */ \\\n"
1728 " A + B",
1729 getLLVMStyleWithColumns(20)));
1730}
1731
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001732TEST_F(FormatTest, CommentsInStaticInitializers) {
1733 EXPECT_EQ(
Chandler Carruthf8b72662014-03-02 12:37:31 +00001734 "static SomeType type = {aaaaaaaaaaaaaaaaaaaa, /* comment */\n"
1735 " aaaaaaaaaaaaaaaaaaaa /* comment */,\n"
1736 " /* comment */ aaaaaaaaaaaaaaaaaaaa,\n"
1737 " aaaaaaaaaaaaaaaaaaaa, // comment\n"
1738 " aaaaaaaaaaaaaaaaaaaa};",
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001739 format("static SomeType type = { aaaaaaaaaaaaaaaaaaaa , /* comment */\n"
1740 " aaaaaaaaaaaaaaaaaaaa /* comment */ ,\n"
1741 " /* comment */ aaaaaaaaaaaaaaaaaaaa ,\n"
1742 " aaaaaaaaaaaaaaaaaaaa , // comment\n"
1743 " aaaaaaaaaaaaaaaaaaaa };"));
Chandler Carruthf8b72662014-03-02 12:37:31 +00001744 verifyFormat("static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1745 " bbbbbbbbbbb, ccccccccccc};");
1746 verifyFormat("static SomeType type = {aaaaaaaaaaa,\n"
1747 " // comment for bb....\n"
1748 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001749 verifyGoogleFormat(
Daniel Jaspere5777d22013-05-23 10:15:45 +00001750 "static SomeType type = {aaaaaaaaaaa, // comment for aa...\n"
1751 " bbbbbbbbbbb, ccccccccccc};");
1752 verifyGoogleFormat("static SomeType type = {aaaaaaaaaaa,\n"
1753 " // comment for bb....\n"
1754 " bbbbbbbbbbb, ccccccccccc};");
Daniel Jasper11cb81c2013-01-17 12:53:34 +00001755
Chandler Carruthf8b72662014-03-02 12:37:31 +00001756 verifyFormat("S s = {{a, b, c}, // Group #1\n"
1757 " {d, e, f}, // Group #2\n"
1758 " {g, h, i}}; // Group #3");
1759 verifyFormat("S s = {{// Group #1\n"
1760 " a, b, c},\n"
1761 " {// Group #2\n"
1762 " d, e, f},\n"
1763 " {// Group #3\n"
1764 " g, h, i}};");
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001765
1766 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001767 " // Some comment\n"
1768 " a,\n"
Daniel Jasperdc7d5812013-02-20 12:56:39 +00001769 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001770 " // Comment after empty line\n"
1771 " b}",
Daniel Jasperfb5e2412013-02-26 13:10:34 +00001772 format("S s = {\n"
1773 " // Some comment\n"
1774 " a,\n"
1775 " \n"
1776 " // Comment after empty line\n"
1777 " b\n"
1778 "}"));
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001779 EXPECT_EQ("S s = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001780 " /* Some comment */\n"
1781 " a,\n"
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001782 "\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001783 " /* Comment after empty line */\n"
1784 " b}",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00001785 format("S s = {\n"
1786 " /* Some comment */\n"
1787 " a,\n"
1788 " \n"
1789 " /* Comment after empty line */\n"
1790 " b\n"
1791 "}"));
Daniel Jaspera400cab2013-02-28 15:04:12 +00001792 verifyFormat("const uint8_t aaaaaaaaaaaaaaaaaaaaaa[0] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00001793 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1794 " 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // comment\n"
1795 " 0x00, 0x00, 0x00, 0x00}; // comment\n");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00001796}
1797
Krasimir Georgiev84321612017-01-30 19:18:55 +00001798TEST_F(FormatTest, LineCommentsAfterRightBrace) {
1799 EXPECT_EQ("if (true) { // comment about branch\n"
1800 " // comment about f\n"
1801 " f();\n"
1802 "}",
1803 format("if (true) { // comment about branch\n"
1804 " // comment about f\n"
1805 " f();\n"
1806 "}",
1807 getLLVMStyleWithColumns(80)));
1808 EXPECT_EQ("if (1) { // if line 1\n"
1809 " // if line 2\n"
1810 " // if line 3\n"
1811 " // f line 1\n"
1812 " // f line 2\n"
1813 " f();\n"
1814 "} else { // else line 1\n"
1815 " // else line 2\n"
1816 " // else line 3\n"
1817 " // g line 1\n"
1818 " g();\n"
1819 "}",
1820 format("if (1) { // if line 1\n"
1821 " // if line 2\n"
1822 " // if line 3\n"
1823 " // f line 1\n"
1824 " // f line 2\n"
1825 " f();\n"
1826 "} else { // else line 1\n"
1827 " // else line 2\n"
1828 " // else line 3\n"
1829 " // g line 1\n"
1830 " g();\n"
1831 "}"));
1832 EXPECT_EQ("do { // line 1\n"
1833 " // line 2\n"
1834 " // line 3\n"
1835 " f();\n"
1836 "} while (true);",
1837 format("do { // line 1\n"
1838 " // line 2\n"
1839 " // line 3\n"
1840 " f();\n"
1841 "} while (true);",
1842 getLLVMStyleWithColumns(80)));
1843 EXPECT_EQ("while (a < b) { // line 1\n"
1844 " // line 2\n"
1845 " // line 3\n"
1846 " f();\n"
1847 "}",
1848 format("while (a < b) {// line 1\n"
1849 " // line 2\n"
1850 " // line 3\n"
1851 " f();\n"
1852 "}",
1853 getLLVMStyleWithColumns(80)));
1854}
1855
Krasimir Georgiev91834222017-01-25 13:58:58 +00001856TEST_F(FormatTest, ReflowsComments) {
1857 // Break a long line and reflow with the full next line.
1858 EXPECT_EQ("// long long long\n"
1859 "// long long",
1860 format("// long long long long\n"
1861 "// long",
1862 getLLVMStyleWithColumns(20)));
1863
1864 // Keep the trailing newline while reflowing.
1865 EXPECT_EQ("// long long long\n"
1866 "// long long\n",
1867 format("// long long long long\n"
1868 "// long\n",
1869 getLLVMStyleWithColumns(20)));
1870
1871 // Break a long line and reflow with a part of the next line.
1872 EXPECT_EQ("// long long long\n"
1873 "// long long\n"
1874 "// long_long",
1875 format("// long long long long\n"
1876 "// long long_long",
1877 getLLVMStyleWithColumns(20)));
1878
1879 // Break but do not reflow if the first word from the next line is too long.
1880 EXPECT_EQ("// long long long\n"
1881 "// long\n"
1882 "// long_long_long\n",
1883 format("// long long long long\n"
1884 "// long_long_long\n",
1885 getLLVMStyleWithColumns(20)));
1886
1887 // Don't break or reflow short lines.
1888 verifyFormat("// long\n"
1889 "// long long long lo\n"
1890 "// long long long lo\n"
1891 "// long",
1892 getLLVMStyleWithColumns(20));
1893
1894 // Keep prefixes and decorations while reflowing.
1895 EXPECT_EQ("/// long long long\n"
1896 "/// long long\n",
1897 format("/// long long long long\n"
1898 "/// long\n",
1899 getLLVMStyleWithColumns(20)));
1900 EXPECT_EQ("//! long long long\n"
1901 "//! long long\n",
1902 format("//! long long long long\n"
1903 "//! long\n",
1904 getLLVMStyleWithColumns(20)));
1905 EXPECT_EQ("/* long long long\n"
1906 " * long long */",
1907 format("/* long long long long\n"
1908 " * long */",
1909 getLLVMStyleWithColumns(20)));
1910
1911 // Don't bring leading whitespace up while reflowing.
1912 EXPECT_EQ("/* long long long\n"
1913 " * long long long\n"
1914 " */",
1915 format("/* long long long long\n"
1916 " * long long\n"
1917 " */",
1918 getLLVMStyleWithColumns(20)));
1919
1920 // Reflow the last line of a block comment with its trailing '*/'.
1921 EXPECT_EQ("/* long long long\n"
1922 " long long */",
1923 format("/* long long long long\n"
1924 " long */",
1925 getLLVMStyleWithColumns(20)));
1926
1927 // Reflow two short lines; keep the postfix of the last one.
1928 EXPECT_EQ("/* long long long\n"
1929 " * long long long */",
1930 format("/* long long long long\n"
1931 " * long\n"
1932 " * long */",
1933 getLLVMStyleWithColumns(20)));
1934
1935 // Put the postfix of the last short reflow line on a newline if it doesn't
1936 // fit.
1937 EXPECT_EQ("/* long long long\n"
1938 " * long long longg\n"
1939 " */",
1940 format("/* long long long long\n"
1941 " * long\n"
1942 " * longg */",
1943 getLLVMStyleWithColumns(20)));
1944
1945 // Break single line block comments that are first in the line with ' *'
1946 // decoration.
1947 EXPECT_EQ("/* long long long\n"
1948 " * long */",
1949 format("/* long long long long */", getLLVMStyleWithColumns(20)));
1950
1951 // Break single line block comment that are not first in the line with ' '
1952 // decoration.
1953 EXPECT_EQ("int i; /* long long\n"
1954 " long */",
1955 format("int i; /* long long long */", getLLVMStyleWithColumns(20)));
1956
1957 // Reflow a line that goes just over the column limit.
1958 EXPECT_EQ("// long long long\n"
1959 "// lon long",
1960 format("// long long long lon\n"
1961 "// long",
1962 getLLVMStyleWithColumns(20)));
1963
1964 // Stop reflowing if the next line has a different indentation than the
1965 // previous line.
1966 EXPECT_EQ("// long long long\n"
1967 "// long\n"
1968 "// long long\n"
1969 "// long",
1970 format("// long long long long\n"
1971 "// long long\n"
1972 "// long",
1973 getLLVMStyleWithColumns(20)));
1974
1975 // Reflow into the last part of a really long line that has been broken into
1976 // multiple lines.
1977 EXPECT_EQ("// long long long\n"
1978 "// long long long\n"
1979 "// long long long\n",
1980 format("// long long long long long long long long\n"
1981 "// long\n",
1982 getLLVMStyleWithColumns(20)));
1983
1984 // Break the first line, then reflow the beginning of the second and third
1985 // line up.
1986 EXPECT_EQ("// long long long\n"
1987 "// lon1 lon2 lon2\n"
1988 "// lon2 lon3 lon3",
1989 format("// long long long lon1\n"
1990 "// lon2 lon2 lon2\n"
1991 "// lon3 lon3",
1992 getLLVMStyleWithColumns(20)));
1993
1994 // Reflow the beginning of the second line, then break the rest.
1995 EXPECT_EQ("// long long long\n"
1996 "// lon1 lon2 lon2\n"
1997 "// lon2 lon2 lon2\n"
1998 "// lon3",
1999 format("// long long long lon1\n"
2000 "// lon2 lon2 lon2 lon2 lon2 lon3",
2001 getLLVMStyleWithColumns(20)));
2002
2003 // Shrink the first line, then reflow the second line up.
2004 EXPECT_EQ("// long long long", format("// long long\n"
2005 "// long",
2006 getLLVMStyleWithColumns(20)));
2007
2008 // Don't shrink leading whitespace.
2009 EXPECT_EQ("int i; /// a",
2010 format("int i; /// a", getLLVMStyleWithColumns(20)));
2011
2012 // Shrink trailing whitespace if there is no postfix and reflow.
2013 EXPECT_EQ("// long long long\n"
2014 "// long long",
2015 format("// long long long long \n"
2016 "// long",
2017 getLLVMStyleWithColumns(20)));
2018
2019 // Shrink trailing whitespace to a single one if there is postfix.
2020 EXPECT_EQ("/* long long long */",
2021 format("/* long long long */", getLLVMStyleWithColumns(20)));
2022
2023 // Break a block comment postfix if exceeding the line limit.
2024 EXPECT_EQ("/* long\n"
2025 " */",
2026 format("/* long */", getLLVMStyleWithColumns(20)));
2027
2028 // Reflow indented comments.
2029 EXPECT_EQ("{\n"
2030 " // long long long\n"
2031 " // long long\n"
2032 " int i; /* long lon\n"
2033 " g long\n"
2034 " */\n"
2035 "}",
2036 format("{\n"
2037 " // long long long long\n"
2038 " // long\n"
2039 " int i; /* long lon g\n"
2040 " long */\n"
2041 "}",
2042 getLLVMStyleWithColumns(20)));
2043
2044 // Don't realign trailing comments after reflow has happened.
2045 EXPECT_EQ("// long long long\n"
2046 "// long long\n"
2047 "long i; // long",
2048 format("// long long long long\n"
2049 "// long\n"
2050 "long i; // long",
2051 getLLVMStyleWithColumns(20)));
2052 EXPECT_EQ("// long long long\n"
2053 "// longng long long\n"
2054 "// long lo",
2055 format("// long long long longng\n"
2056 "// long long long\n"
2057 "// lo",
2058 getLLVMStyleWithColumns(20)));
2059
2060 // Reflow lines after a broken line.
2061 EXPECT_EQ("int a; // Trailing\n"
2062 " // comment on\n"
2063 " // 2 or 3\n"
2064 " // lines.\n",
2065 format("int a; // Trailing comment\n"
2066 " // on 2\n"
2067 " // or 3\n"
2068 " // lines.\n",
2069 getLLVMStyleWithColumns(20)));
2070 EXPECT_EQ("/// This long line\n"
2071 "/// gets reflown.\n",
2072 format("/// This long line gets\n"
2073 "/// reflown.\n",
2074 getLLVMStyleWithColumns(20)));
2075 EXPECT_EQ("//! This long line\n"
2076 "//! gets reflown.\n",
2077 format(" //! This long line gets\n"
2078 " //! reflown.\n",
2079 getLLVMStyleWithColumns(20)));
2080 EXPECT_EQ("/* This long line\n"
2081 " * gets reflown.\n"
2082 " */\n",
2083 format("/* This long line gets\n"
2084 " * reflown.\n"
2085 " */\n",
2086 getLLVMStyleWithColumns(20)));
2087
2088 // Reflow after indentation makes a line too long.
2089 EXPECT_EQ("{\n"
2090 " // long long long\n"
2091 " // lo long\n"
2092 "}\n",
2093 format("{\n"
2094 "// long long long lo\n"
2095 "// long\n"
2096 "}\n",
2097 getLLVMStyleWithColumns(20)));
2098
2099 // Break and reflow multiple lines.
2100 EXPECT_EQ("/*\n"
2101 " * Reflow the end of\n"
2102 " * line by 11 22 33\n"
2103 " * 4.\n"
2104 " */\n",
2105 format("/*\n"
2106 " * Reflow the end of line\n"
2107 " * by\n"
2108 " * 11\n"
2109 " * 22\n"
2110 " * 33\n"
2111 " * 4.\n"
2112 " */\n",
2113 getLLVMStyleWithColumns(20)));
2114 EXPECT_EQ("/// First line gets\n"
2115 "/// broken. Second\n"
2116 "/// line gets\n"
2117 "/// reflown and\n"
2118 "/// broken. Third\n"
2119 "/// gets reflown.\n",
2120 format("/// First line gets broken.\n"
2121 "/// Second line gets reflown and broken.\n"
2122 "/// Third gets reflown.\n",
2123 getLLVMStyleWithColumns(20)));
2124 EXPECT_EQ("int i; // first long\n"
2125 " // long snd\n"
2126 " // long.\n",
2127 format("int i; // first long long\n"
2128 " // snd long.\n",
2129 getLLVMStyleWithColumns(20)));
2130 EXPECT_EQ("{\n"
2131 " // first long line\n"
2132 " // line second\n"
2133 " // long line line\n"
2134 " // third long line\n"
2135 " // line\n"
2136 "}\n",
2137 format("{\n"
2138 " // first long line line\n"
2139 " // second long line line\n"
2140 " // third long line line\n"
2141 "}\n",
2142 getLLVMStyleWithColumns(20)));
2143 EXPECT_EQ("int i; /* first line\n"
2144 " * second\n"
2145 " * line third\n"
2146 " * line\n"
2147 " */",
2148 format("int i; /* first line\n"
2149 " * second line\n"
2150 " * third line\n"
2151 " */",
2152 getLLVMStyleWithColumns(20)));
2153
2154 // Reflow the last two lines of a section that starts with a line having
2155 // different indentation.
2156 EXPECT_EQ(
2157 "// long\n"
2158 "// long long long\n"
2159 "// long long",
2160 format("// long\n"
2161 "// long long long long\n"
2162 "// long",
2163 getLLVMStyleWithColumns(20)));
2164
2165 // Keep the block comment endling '*/' while reflowing.
2166 EXPECT_EQ("/* Long long long\n"
2167 " * line short */\n",
2168 format("/* Long long long line\n"
2169 " * short */\n",
2170 getLLVMStyleWithColumns(20)));
2171
2172 // Don't reflow between separate blocks of comments.
2173 EXPECT_EQ("/* First comment\n"
2174 " * block will */\n"
2175 "/* Snd\n"
2176 " */\n",
2177 format("/* First comment block\n"
2178 " * will */\n"
2179 "/* Snd\n"
2180 " */\n",
2181 getLLVMStyleWithColumns(20)));
2182
2183 // Don't reflow across blank comment lines.
2184 EXPECT_EQ("int i; // This long\n"
2185 " // line gets\n"
2186 " // broken.\n"
2187 " // \n"
2188 " // keep.\n",
2189 format("int i; // This long line gets broken.\n"
2190 " // \n"
2191 " // keep.\n",
2192 getLLVMStyleWithColumns(20)));
2193 EXPECT_EQ("{\n"
2194 " /// long long long\n"
2195 " /// long long\n"
2196 " ///\n"
2197 " /// long\n"
2198 "}",
2199 format("{\n"
2200 " /// long long long long\n"
2201 " /// long\n"
2202 " ///\n"
2203 " /// long\n"
2204 "}",
2205 getLLVMStyleWithColumns(20)));
2206 EXPECT_EQ("//! long long long\n"
2207 "//! long\n"
2208 "\n"
2209 "//! long",
2210 format("//! long long long long\n"
2211 "\n"
2212 "//! long",
2213 getLLVMStyleWithColumns(20)));
2214 EXPECT_EQ("/* long long long\n"
2215 " long\n"
2216 "\n"
2217 " long */",
2218 format("/* long long long long\n"
2219 "\n"
2220 " long */",
2221 getLLVMStyleWithColumns(20)));
2222 EXPECT_EQ("/* long long long\n"
2223 " * long\n"
2224 " *\n"
2225 " * long */",
2226 format("/* long long long long\n"
2227 " *\n"
2228 " * long */",
2229 getLLVMStyleWithColumns(20)));
2230
2231 // Don't reflow lines having content that is a single character.
2232 EXPECT_EQ("// long long long\n"
2233 "// long\n"
2234 "// l",
2235 format("// long long long long\n"
2236 "// l",
2237 getLLVMStyleWithColumns(20)));
2238
2239 // Don't reflow lines starting with two punctuation characters.
2240 EXPECT_EQ("// long long long\n"
2241 "// long\n"
2242 "// ... --- ...",
2243 format(
2244 "// long long long long\n"
2245 "// ... --- ...",
2246 getLLVMStyleWithColumns(20)));
2247 // Reflow lines that have a non-punctuation character among their first 2
2248 // characters.
2249 EXPECT_EQ("// long long long\n"
2250 "// long 'long'",
2251 format(
2252 "// long long long long\n"
2253 "// 'long'",
2254 getLLVMStyleWithColumns(20)));
2255
2256 // Don't reflow between separate blocks of comments.
2257 EXPECT_EQ("/* First comment\n"
2258 " * block will */\n"
2259 "/* Snd\n"
2260 " */\n",
2261 format("/* First comment block\n"
2262 " * will */\n"
2263 "/* Snd\n"
2264 " */\n",
2265 getLLVMStyleWithColumns(20)));
2266
2267 // Don't reflow lines having different indentation.
2268 EXPECT_EQ("// long long long\n"
2269 "// long\n"
2270 "// long",
2271 format("// long long long long\n"
2272 "// long",
2273 getLLVMStyleWithColumns(20)));
2274
2275 // Don't break or reflow after implicit string literals.
2276 verifyFormat("#include <t> // l l l\n"
2277 " // l",
2278 getLLVMStyleWithColumns(20));
2279
2280 // Don't break or reflow comments on import lines.
2281 EXPECT_EQ("#include \"t\" /* l l l\n"
2282 " * l */",
2283 format("#include \"t\" /* l l l\n"
2284 " * l */",
2285 getLLVMStyleWithColumns(20)));
2286
2287 // Don't reflow between different trailing comment sections.
2288 EXPECT_EQ("int i; // long long\n"
2289 " // long\n"
2290 "int j; // long long\n"
2291 " // long\n",
2292 format("int i; // long long long\n"
2293 "int j; // long long long\n",
2294 getLLVMStyleWithColumns(20)));
2295
2296 // Don't reflow if the first word on the next line is longer than the
2297 // available space at current line.
2298 EXPECT_EQ("int i; // trigger\n"
2299 " // reflow\n"
2300 " // longsec\n",
2301 format("int i; // trigger reflow\n"
2302 " // longsec\n",
2303 getLLVMStyleWithColumns(20)));
2304
2305 // Keep empty comment lines.
2306 EXPECT_EQ("/**/", format(" /**/", getLLVMStyleWithColumns(20)));
2307 EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
2308 EXPECT_EQ("/* */", format(" /* */", getLLVMStyleWithColumns(20)));
2309 EXPECT_EQ("//", format(" // ", getLLVMStyleWithColumns(20)));
2310 EXPECT_EQ("///", format(" /// ", getLLVMStyleWithColumns(20)));
2311}
2312
Alexander Kornienkof2e02122013-05-24 18:24:24 +00002313TEST_F(FormatTest, IgnoresIf0Contents) {
2314 EXPECT_EQ("#if 0\n"
2315 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
2316 "#endif\n"
2317 "void f() {}",
2318 format("#if 0\n"
2319 "}{)(&*(^%%#%@! fsadj f;ldjs ,:;| <<<>>>][)(][\n"
2320 "#endif\n"
2321 "void f( ) { }"));
2322 EXPECT_EQ("#if false\n"
2323 "void f( ) { }\n"
2324 "#endif\n"
2325 "void g() {}\n",
2326 format("#if false\n"
2327 "void f( ) { }\n"
2328 "#endif\n"
2329 "void g( ) { }\n"));
2330 EXPECT_EQ("enum E {\n"
2331 " One,\n"
2332 " Two,\n"
2333 "#if 0\n"
2334 "Three,\n"
2335 " Four,\n"
2336 "#endif\n"
2337 " Five\n"
2338 "};",
2339 format("enum E {\n"
2340 " One,Two,\n"
2341 "#if 0\n"
2342 "Three,\n"
2343 " Four,\n"
2344 "#endif\n"
2345 " Five};"));
2346 EXPECT_EQ("enum F {\n"
2347 " One,\n"
2348 "#if 1\n"
2349 " Two,\n"
2350 "#if 0\n"
2351 "Three,\n"
2352 " Four,\n"
2353 "#endif\n"
2354 " Five\n"
2355 "#endif\n"
2356 "};",
2357 format("enum F {\n"
2358 "One,\n"
2359 "#if 1\n"
2360 "Two,\n"
2361 "#if 0\n"
2362 "Three,\n"
2363 " Four,\n"
2364 "#endif\n"
2365 "Five\n"
2366 "#endif\n"
2367 "};"));
2368 EXPECT_EQ("enum G {\n"
2369 " One,\n"
2370 "#if 0\n"
2371 "Two,\n"
2372 "#else\n"
2373 " Three,\n"
2374 "#endif\n"
2375 " Four\n"
2376 "};",
2377 format("enum G {\n"
2378 "One,\n"
2379 "#if 0\n"
2380 "Two,\n"
2381 "#else\n"
2382 "Three,\n"
2383 "#endif\n"
2384 "Four\n"
2385 "};"));
2386 EXPECT_EQ("enum H {\n"
2387 " One,\n"
2388 "#if 0\n"
2389 "#ifdef Q\n"
2390 "Two,\n"
2391 "#else\n"
2392 "Three,\n"
2393 "#endif\n"
2394 "#endif\n"
2395 " Four\n"
2396 "};",
2397 format("enum H {\n"
2398 "One,\n"
2399 "#if 0\n"
2400 "#ifdef Q\n"
2401 "Two,\n"
2402 "#else\n"
2403 "Three,\n"
2404 "#endif\n"
2405 "#endif\n"
2406 "Four\n"
2407 "};"));
2408 EXPECT_EQ("enum I {\n"
2409 " One,\n"
2410 "#if /* test */ 0 || 1\n"
2411 "Two,\n"
2412 "Three,\n"
2413 "#endif\n"
2414 " Four\n"
2415 "};",
2416 format("enum I {\n"
2417 "One,\n"
2418 "#if /* test */ 0 || 1\n"
2419 "Two,\n"
2420 "Three,\n"
2421 "#endif\n"
2422 "Four\n"
2423 "};"));
2424 EXPECT_EQ("enum J {\n"
2425 " One,\n"
2426 "#if 0\n"
2427 "#if 0\n"
2428 "Two,\n"
2429 "#else\n"
2430 "Three,\n"
2431 "#endif\n"
2432 "Four,\n"
2433 "#endif\n"
2434 " Five\n"
2435 "};",
2436 format("enum J {\n"
2437 "One,\n"
2438 "#if 0\n"
2439 "#if 0\n"
2440 "Two,\n"
2441 "#else\n"
2442 "Three,\n"
2443 "#endif\n"
2444 "Four,\n"
2445 "#endif\n"
2446 "Five\n"
2447 "};"));
Alexander Kornienkof2e02122013-05-24 18:24:24 +00002448}
2449
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002450//===----------------------------------------------------------------------===//
2451// Tests for classes, namespaces, etc.
2452//===----------------------------------------------------------------------===//
2453
2454TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002455 verifyFormat("class A {};");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002456}
2457
2458TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
2459 verifyFormat("class A {\n"
2460 "public:\n"
Daniel Jasperc04baae2013-04-10 09:49:49 +00002461 "public: // comment\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002462 "protected:\n"
2463 "private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002464 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002465 "};");
2466 verifyGoogleFormat("class A {\n"
2467 " public:\n"
2468 " protected:\n"
2469 " private:\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00002470 " void f() {}\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002471 "};");
Daniel Jasper84c47a12013-11-23 17:53:41 +00002472 verifyFormat("class A {\n"
2473 "public slots:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002474 " void f1() {}\n"
Daniel Jasper1556b592013-11-29 08:51:56 +00002475 "public Q_SLOTS:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002476 " void f2() {}\n"
2477 "protected slots:\n"
2478 " void f3() {}\n"
2479 "protected Q_SLOTS:\n"
2480 " void f4() {}\n"
2481 "private slots:\n"
2482 " void f5() {}\n"
2483 "private Q_SLOTS:\n"
2484 " void f6() {}\n"
Daniel Jasper53395402015-04-07 15:04:40 +00002485 "signals:\n"
Daniel Jaspera00de632015-12-01 12:05:04 +00002486 " void g1();\n"
2487 "Q_SIGNALS:\n"
2488 " void g2();\n"
Daniel Jasper84c47a12013-11-23 17:53:41 +00002489 "};");
Daniel Jasperde0d1f32015-04-24 07:50:34 +00002490
2491 // Don't interpret 'signals' the wrong way.
2492 verifyFormat("signals.set();");
2493 verifyFormat("for (Signals signals : f()) {\n}");
Daniel Jasper03618142015-05-06 19:21:23 +00002494 verifyFormat("{\n"
2495 " signals.set(); // This needs indentation.\n"
2496 "}");
Daniel Jasper31343832016-07-27 10:13:24 +00002497 verifyFormat("void f() {\n"
2498 "label:\n"
2499 " signals.baz();\n"
2500 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002501}
2502
Alexander Kornienkofd433362013-03-27 17:08:02 +00002503TEST_F(FormatTest, SeparatesLogicalBlocks) {
2504 EXPECT_EQ("class A {\n"
2505 "public:\n"
2506 " void f();\n"
2507 "\n"
2508 "private:\n"
2509 " void g() {}\n"
2510 " // test\n"
2511 "protected:\n"
2512 " int h;\n"
2513 "};",
2514 format("class A {\n"
2515 "public:\n"
2516 "void f();\n"
2517 "private:\n"
2518 "void g() {}\n"
2519 "// test\n"
2520 "protected:\n"
2521 "int h;\n"
2522 "};"));
Daniel Jasper320997e2013-10-06 11:40:08 +00002523 EXPECT_EQ("class A {\n"
2524 "protected:\n"
2525 "public:\n"
2526 " void f();\n"
2527 "};",
2528 format("class A {\n"
2529 "protected:\n"
2530 "\n"
2531 "public:\n"
2532 "\n"
2533 " void f();\n"
2534 "};"));
Daniel Jasperac5c97e32015-03-09 08:13:55 +00002535
2536 // Even ensure proper spacing inside macros.
2537 EXPECT_EQ("#define B \\\n"
2538 " class A { \\\n"
2539 " protected: \\\n"
2540 " public: \\\n"
2541 " void f(); \\\n"
2542 " };",
2543 format("#define B \\\n"
2544 " class A { \\\n"
2545 " protected: \\\n"
2546 " \\\n"
2547 " public: \\\n"
2548 " \\\n"
2549 " void f(); \\\n"
2550 " };",
2551 getGoogleStyle()));
2552 // But don't remove empty lines after macros ending in access specifiers.
2553 EXPECT_EQ("#define A private:\n"
2554 "\n"
2555 "int i;",
2556 format("#define A private:\n"
2557 "\n"
2558 "int i;"));
Alexander Kornienkofd433362013-03-27 17:08:02 +00002559}
2560
Daniel Jasper83193602013-04-05 17:22:09 +00002561TEST_F(FormatTest, FormatsClasses) {
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002562 verifyFormat("class A : public B {};");
2563 verifyFormat("class A : public ::B {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002564
2565 verifyFormat(
2566 "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002567 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspera61aefb2013-05-06 06:45:09 +00002568 verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
2569 " : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002570 " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002571 verifyFormat(
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002572 "class A : public B, public C, public D, public E, public F {};");
Daniel Jaspereead02b2013-02-14 08:42:54 +00002573 verifyFormat("class AAAAAAAAAAAA : public B,\n"
2574 " public C,\n"
2575 " public D,\n"
2576 " public E,\n"
2577 " public F,\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002578 " public G {};");
Daniel Jasper83193602013-04-05 17:22:09 +00002579
2580 verifyFormat("class\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00002581 " ReallyReallyLongClassName {\n"
2582 " int i;\n"
2583 "};",
Daniel Jasper83193602013-04-05 17:22:09 +00002584 getLLVMStyleWithColumns(32));
Daniel Jasperf9a5e402013-10-08 16:24:07 +00002585 verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
2586 " aaaaaaaaaaaaaaaa> {};");
2587 verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
2588 " : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
2589 " aaaaaaaaaaaaaaaaaaaaaa> {};");
Daniel Jasper3a122c02014-02-14 18:22:40 +00002590 verifyFormat("template <class R, class C>\n"
2591 "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
2592 " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
Manuel Klimek45bf56c2014-07-31 07:19:30 +00002593 verifyFormat("class ::A::B {};");
Daniel Jasperf7935112012-12-03 18:12:45 +00002594}
2595
Manuel Klimek28cacc72013-01-07 18:10:23 +00002596TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00002597 verifyFormat("class A {\n} a, b;");
2598 verifyFormat("struct A {\n} a, b;");
2599 verifyFormat("union A {\n} a;");
Manuel Klimek28cacc72013-01-07 18:10:23 +00002600}
2601
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002602TEST_F(FormatTest, FormatsEnum) {
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002603 verifyFormat("enum {\n"
2604 " Zero,\n"
2605 " One = 1,\n"
2606 " Two = One + 1,\n"
2607 " Three = (One + Two),\n"
2608 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2609 " Five = (One, Two, Three, Four, 5)\n"
2610 "};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002611 verifyGoogleFormat("enum {\n"
2612 " Zero,\n"
2613 " One = 1,\n"
2614 " Two = One + 1,\n"
2615 " Three = (One + Two),\n"
2616 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2617 " Five = (One, Two, Three, Four, 5)\n"
2618 "};");
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002619 verifyFormat("enum Enum {};");
2620 verifyFormat("enum {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002621 verifyFormat("enum X E {} d;");
2622 verifyFormat("enum __attribute__((...)) E {} d;");
2623 verifyFormat("enum __declspec__((...)) E {} d;");
Daniel Jasper015ed022013-09-13 09:20:45 +00002624 verifyFormat("enum {\n"
2625 " Bar = Foo<int, int>::value\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002626 "};",
2627 getLLVMStyleWithColumns(30));
2628
2629 verifyFormat("enum ShortEnum { A, B, C };");
Daniel Jasper1a148b42014-01-05 13:23:23 +00002630 verifyGoogleFormat("enum ShortEnum { A, B, C };");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00002631
2632 EXPECT_EQ("enum KeepEmptyLines {\n"
2633 " ONE,\n"
2634 "\n"
2635 " TWO,\n"
2636 "\n"
2637 " THREE\n"
2638 "}",
2639 format("enum KeepEmptyLines {\n"
2640 " ONE,\n"
2641 "\n"
2642 " TWO,\n"
2643 "\n"
2644 "\n"
2645 " THREE\n"
2646 "}"));
Daniel Jasper90818052014-06-10 10:42:26 +00002647 verifyFormat("enum E { // comment\n"
2648 " ONE,\n"
2649 " TWO\n"
Daniel Jasper502fac32014-11-05 10:55:36 +00002650 "};\n"
2651 "int i;");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002652 // Not enums.
2653 verifyFormat("enum X f() {\n"
2654 " a();\n"
2655 " return 42;\n"
2656 "}");
Daniel Jasperb5a0b852015-06-19 08:17:32 +00002657 verifyFormat("enum X Type::f() {\n"
2658 " a();\n"
2659 " return 42;\n"
2660 "}");
Daniel Jasper47721ac2015-06-18 15:45:17 +00002661 verifyFormat("enum ::X f() {\n"
2662 " a();\n"
2663 " return 42;\n"
2664 "}");
2665 verifyFormat("enum ns::X f() {\n"
2666 " a();\n"
2667 " return 42;\n"
2668 "}");
Alexander Kornienkob7076a22012-12-04 14:46:19 +00002669}
2670
Daniel Jasperb7150872013-08-30 10:10:19 +00002671TEST_F(FormatTest, FormatsEnumsWithErrors) {
2672 verifyFormat("enum Type {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002673 " One = 0; // These semicolons should be commas.\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002674 " Two = 1;\n"
2675 "};");
2676 verifyFormat("namespace n {\n"
2677 "enum Type {\n"
2678 " One,\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002679 " Two, // missing };\n"
Daniel Jasperb7150872013-08-30 10:10:19 +00002680 " int i;\n"
2681 "}\n"
2682 "void g() {}");
2683}
2684
Daniel Jasper2b41a822013-08-20 12:42:50 +00002685TEST_F(FormatTest, FormatsEnumStruct) {
2686 verifyFormat("enum struct {\n"
2687 " Zero,\n"
2688 " One = 1,\n"
2689 " Two = One + 1,\n"
2690 " Three = (One + Two),\n"
2691 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2692 " Five = (One, Two, Three, Four, 5)\n"
2693 "};");
2694 verifyFormat("enum struct Enum {};");
2695 verifyFormat("enum struct {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002696 verifyFormat("enum struct X E {} d;");
2697 verifyFormat("enum struct __attribute__((...)) E {} d;");
2698 verifyFormat("enum struct __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002699 verifyFormat("enum struct X f() {\n a();\n return 42;\n}");
2700}
2701
2702TEST_F(FormatTest, FormatsEnumClass) {
2703 verifyFormat("enum class {\n"
2704 " Zero,\n"
2705 " One = 1,\n"
2706 " Two = One + 1,\n"
2707 " Three = (One + Two),\n"
2708 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
2709 " Five = (One, Two, Three, Four, 5)\n"
2710 "};");
2711 verifyFormat("enum class Enum {};");
2712 verifyFormat("enum class {};");
Daniel Jasper015ed022013-09-13 09:20:45 +00002713 verifyFormat("enum class X E {} d;");
2714 verifyFormat("enum class __attribute__((...)) E {} d;");
2715 verifyFormat("enum class __declspec__((...)) E {} d;");
Daniel Jasper2b41a822013-08-20 12:42:50 +00002716 verifyFormat("enum class X f() {\n a();\n return 42;\n}");
2717}
2718
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002719TEST_F(FormatTest, FormatsEnumTypes) {
2720 verifyFormat("enum X : int {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00002721 " A, // Force multiple lines.\n"
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002722 " B\n"
2723 "};");
Daniel Jasper96972812014-01-05 12:38:10 +00002724 verifyFormat("enum X : int { A, B };");
2725 verifyFormat("enum X : std::uint32_t { A, B };");
Manuel Klimek9a53c7f2013-09-05 15:34:55 +00002726}
2727
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002728TEST_F(FormatTest, FormatsNSEnums) {
2729 verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
2730 verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
2731 " // Information about someDecentlyLongValue.\n"
2732 " someDecentlyLongValue,\n"
2733 " // Information about anotherDecentlyLongValue.\n"
2734 " anotherDecentlyLongValue,\n"
2735 " // Information about aThirdDecentlyLongValue.\n"
2736 " aThirdDecentlyLongValue\n"
2737 "};");
Daniel Jasper31f6c542014-12-05 10:42:21 +00002738 verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
2739 " a = 1,\n"
2740 " b = 2,\n"
2741 " c = 3,\n"
2742 "};");
2743 verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
2744 " a = 1,\n"
2745 " b = 2,\n"
2746 " c = 3,\n"
2747 "};");
2748 verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
2749 " a = 1,\n"
2750 " b = 2,\n"
2751 " c = 3,\n"
2752 "};");
Daniel Jaspera88f80a2014-01-30 14:38:37 +00002753}
2754
Nico Weber7769a902013-01-14 05:49:49 +00002755TEST_F(FormatTest, FormatsBitfields) {
2756 verifyFormat("struct Bitfields {\n"
2757 " unsigned sClass : 8;\n"
2758 " unsigned ValueKind : 2;\n"
2759 "};");
Alexander Kornienko60d1b042013-10-10 13:36:20 +00002760 verifyFormat("struct A {\n"
2761 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
2762 " bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
2763 "};");
Daniel Jasper676e5162015-04-07 14:36:33 +00002764 verifyFormat("struct MyStruct {\n"
2765 " uchar data;\n"
2766 " uchar : 8;\n"
2767 " uchar : 8;\n"
2768 " uchar other;\n"
2769 "};");
Nico Weber7769a902013-01-14 05:49:49 +00002770}
2771
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002772TEST_F(FormatTest, FormatsNamespaces) {
2773 verifyFormat("namespace some_namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002774 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002775 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002776 "}");
2777 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002778 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002779 "void f() { f(); }\n"
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002780 "}");
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002781 verifyFormat("inline namespace X {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002782 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002783 "void f() { f(); }\n"
Dmitri Gribenko58d64e22012-12-30 21:27:25 +00002784 "}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002785 verifyFormat("using namespace some_namespace;\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002786 "class A {};\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00002787 "void f() { f(); }");
Manuel Klimek046b9302013-02-06 16:08:09 +00002788
2789 // This code is more common than we thought; if we
2790 // layout this correctly the semicolon will go into
Alp Tokerf6a24ce2013-12-05 16:25:25 +00002791 // its own line, which is undesirable.
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002792 verifyFormat("namespace {};");
Manuel Klimek046b9302013-02-06 16:08:09 +00002793 verifyFormat("namespace {\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00002794 "class A {};\n"
Manuel Klimek046b9302013-02-06 16:08:09 +00002795 "};");
Daniel Jasper251b3c92013-07-01 11:22:57 +00002796
2797 verifyFormat("namespace {\n"
2798 "int SomeVariable = 0; // comment\n"
2799 "} // namespace");
2800 EXPECT_EQ("#ifndef HEADER_GUARD\n"
2801 "#define HEADER_GUARD\n"
2802 "namespace my_namespace {\n"
2803 "int i;\n"
2804 "} // my_namespace\n"
2805 "#endif // HEADER_GUARD",
2806 format("#ifndef HEADER_GUARD\n"
2807 " #define HEADER_GUARD\n"
2808 " namespace my_namespace {\n"
2809 "int i;\n"
2810 "} // my_namespace\n"
2811 "#endif // HEADER_GUARD"));
Daniel Jasper65ee3472013-07-31 23:16:02 +00002812
Saleem Abdulrasool328085f2015-10-30 05:07:56 +00002813 EXPECT_EQ("namespace A::B {\n"
2814 "class C {};\n"
2815 "}",
2816 format("namespace A::B {\n"
2817 "class C {};\n"
2818 "}"));
2819
Daniel Jasper65ee3472013-07-31 23:16:02 +00002820 FormatStyle Style = getLLVMStyle();
2821 Style.NamespaceIndentation = FormatStyle::NI_All;
2822 EXPECT_EQ("namespace out {\n"
2823 " int i;\n"
2824 " namespace in {\n"
2825 " int i;\n"
2826 " } // namespace\n"
2827 "} // namespace",
2828 format("namespace out {\n"
2829 "int i;\n"
2830 "namespace in {\n"
2831 "int i;\n"
2832 "} // namespace\n"
2833 "} // namespace",
2834 Style));
2835
2836 Style.NamespaceIndentation = FormatStyle::NI_Inner;
2837 EXPECT_EQ("namespace out {\n"
2838 "int i;\n"
2839 "namespace in {\n"
2840 " int i;\n"
2841 "} // namespace\n"
2842 "} // namespace",
2843 format("namespace out {\n"
2844 "int i;\n"
2845 "namespace in {\n"
2846 "int i;\n"
2847 "} // namespace\n"
2848 "} // namespace",
2849 Style));
Alexander Kornienko578fdd82012-12-06 18:03:27 +00002850}
2851
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00002852TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
Manuel Klimekae610d12013-01-21 14:32:05 +00002853
Daniel Jasper40aacf42013-03-14 13:45:21 +00002854TEST_F(FormatTest, FormatsInlineASM) {
2855 verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
Daniel Jasperb23e20b2014-09-16 16:36:57 +00002856 verifyFormat("asm(\"nop\" ::: \"memory\");");
Daniel Jasper40aacf42013-03-14 13:45:21 +00002857 verifyFormat(
2858 "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2859 " \"cpuid\\n\\t\"\n"
2860 " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
Daniel Jasper5dad58e2013-05-15 07:51:51 +00002861 " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
Daniel Jasper40aacf42013-03-14 13:45:21 +00002862 " : \"a\"(value));");
Daniel Jasper8f463652014-08-26 23:15:12 +00002863 EXPECT_EQ(
2864 "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002865 " __asm {\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002866 " mov edx,[that] // vtable in edx\n"
2867 " mov eax,methodIndex\n"
2868 " call [edx][eax*4] // stdcall\n"
Daniel Jasper2337f282015-01-12 10:14:56 +00002869 " }\n"
Daniel Jasper8f463652014-08-26 23:15:12 +00002870 "}",
2871 format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2872 " __asm {\n"
2873 " mov edx,[that] // vtable in edx\n"
2874 " mov eax,methodIndex\n"
2875 " call [edx][eax*4] // stdcall\n"
2876 " }\n"
2877 "}"));
Daniel Jasperc6366072015-05-10 08:42:04 +00002878 EXPECT_EQ("_asm {\n"
2879 " xor eax, eax;\n"
2880 " cpuid;\n"
2881 "}",
2882 format("_asm {\n"
2883 " xor eax, eax;\n"
2884 " cpuid;\n"
2885 "}"));
Daniel Jasper2337f282015-01-12 10:14:56 +00002886 verifyFormat("void function() {\n"
2887 " // comment\n"
2888 " asm(\"\");\n"
2889 "}");
Daniel Jasper790d4f92015-05-11 11:59:46 +00002890 EXPECT_EQ("__asm {\n"
2891 "}\n"
2892 "int i;",
2893 format("__asm {\n"
2894 "}\n"
2895 "int i;"));
Daniel Jasper40aacf42013-03-14 13:45:21 +00002896}
2897
Nico Weberd5650bd2013-01-07 16:36:17 +00002898TEST_F(FormatTest, FormatTryCatch) {
2899 verifyFormat("try {\n"
2900 " throw a * b;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002901 "} catch (int a) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002902 " // Do nothing.\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002903 "} catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002904 " exit(42);\n"
2905 "}");
2906
2907 // Function-level try statements.
Daniel Jasper04a71a42014-05-08 11:58:24 +00002908 verifyFormat("int f() try { return 4; } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002909 " return 5;\n"
2910 "}");
2911 verifyFormat("class A {\n"
2912 " int a;\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00002913 " A() try : a(0) {\n"
2914 " } catch (...) {\n"
Nico Weberd5650bd2013-01-07 16:36:17 +00002915 " throw;\n"
2916 " }\n"
2917 "};\n");
Daniel Jasper2bd7a642015-01-19 10:50:51 +00002918
2919 // Incomplete try-catch blocks.
Manuel Klimekec5c3db2015-05-07 12:26:30 +00002920 verifyIncompleteFormat("try {} catch (");
Nico Weberd5650bd2013-01-07 16:36:17 +00002921}
2922
Nico Weberfac23712015-02-04 15:26:27 +00002923TEST_F(FormatTest, FormatSEHTryCatch) {
2924 verifyFormat("__try {\n"
2925 " int a = b * c;\n"
2926 "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2927 " // Do nothing.\n"
2928 "}");
2929
2930 verifyFormat("__try {\n"
2931 " int a = b * c;\n"
2932 "} __finally {\n"
2933 " // Do nothing.\n"
2934 "}");
2935
2936 verifyFormat("DEBUG({\n"
2937 " __try {\n"
2938 " } __finally {\n"
2939 " }\n"
2940 "});\n");
2941}
2942
Daniel Jasper04a71a42014-05-08 11:58:24 +00002943TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2944 verifyFormat("try {\n"
2945 " f();\n"
2946 "} catch {\n"
2947 " g();\n"
2948 "}");
2949 verifyFormat("try {\n"
2950 " f();\n"
2951 "} catch (A a) MACRO(x) {\n"
2952 " g();\n"
2953 "} catch (B b) MACRO(x) {\n"
2954 " g();\n"
2955 "}");
2956}
2957
2958TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2959 FormatStyle Style = getLLVMStyle();
Daniel Jasper55bbe662015-10-07 04:06:10 +00002960 for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2961 FormatStyle::BS_WebKit}) {
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00002962 Style.BreakBeforeBraces = BraceStyle;
2963 verifyFormat("try {\n"
2964 " // something\n"
2965 "} catch (...) {\n"
2966 " // something\n"
2967 "}",
2968 Style);
2969 }
Daniel Jasper04a71a42014-05-08 11:58:24 +00002970 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2971 verifyFormat("try {\n"
2972 " // something\n"
2973 "}\n"
2974 "catch (...) {\n"
2975 " // something\n"
2976 "}",
2977 Style);
Nico Weberfac23712015-02-04 15:26:27 +00002978 verifyFormat("__try {\n"
2979 " // something\n"
2980 "}\n"
2981 "__finally {\n"
2982 " // something\n"
2983 "}",
2984 Style);
Nico Weber33381f52015-02-07 01:57:32 +00002985 verifyFormat("@try {\n"
2986 " // something\n"
2987 "}\n"
2988 "@finally {\n"
2989 " // something\n"
2990 "}",
2991 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00002992 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2993 verifyFormat("try\n"
2994 "{\n"
2995 " // something\n"
2996 "}\n"
2997 "catch (...)\n"
2998 "{\n"
2999 " // something\n"
3000 "}",
3001 Style);
3002 Style.BreakBeforeBraces = FormatStyle::BS_GNU;
3003 verifyFormat("try\n"
3004 " {\n"
3005 " // something\n"
3006 " }\n"
3007 "catch (...)\n"
3008 " {\n"
3009 " // something\n"
3010 " }",
3011 Style);
Daniel Jasper55bbe662015-10-07 04:06:10 +00003012 Style.BreakBeforeBraces = FormatStyle::BS_Custom;
3013 Style.BraceWrapping.BeforeCatch = true;
3014 verifyFormat("try {\n"
3015 " // something\n"
3016 "}\n"
3017 "catch (...) {\n"
3018 " // something\n"
3019 "}",
3020 Style);
Daniel Jasper04a71a42014-05-08 11:58:24 +00003021}
3022
Daniel Jaspere25509f2012-12-17 11:29:41 +00003023TEST_F(FormatTest, StaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003024 verifyFormat("static SomeClass SC = {1, 'a'};");
Daniel Jaspere25509f2012-12-17 11:29:41 +00003025
Daniel Jaspera44991332015-04-29 13:06:49 +00003026 verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
3027 " 100000000, "
3028 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
Manuel Klimek0ddd57a2013-01-10 15:58:26 +00003029
Daniel Jasper473c62c2013-05-17 09:35:01 +00003030 // Here, everything other than the "}" would fit on a line.
3031 verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003032 " 10000000000000000000000000};");
Daniel Jaspera69ca9b2014-06-04 12:40:57 +00003033 EXPECT_EQ("S s = {a,\n"
3034 "\n"
3035 " b};",
3036 format("S s = {\n"
3037 " a,\n"
3038 "\n"
3039 " b\n"
3040 "};"));
Daniel Jasper473c62c2013-05-17 09:35:01 +00003041
3042 // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
3043 // line. However, the formatting looks a bit off and this probably doesn't
3044 // happen often in practice.
3045 verifyFormat("static int Variable[1] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003046 " {1000000000000000000000000000000000000}};",
Daniel Jasper473c62c2013-05-17 09:35:01 +00003047 getLLVMStyleWithColumns(40));
Daniel Jaspere25509f2012-12-17 11:29:41 +00003048}
3049
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003050TEST_F(FormatTest, DesignatedInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003051 verifyFormat("const struct A a = {.a = 1, .b = 2};");
3052 verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
3053 " .bbbbbbbbbb = 2,\n"
3054 " .cccccccccc = 3,\n"
3055 " .dddddddddd = 4,\n"
3056 " .eeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003057 verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003058 " .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
3059 " .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
3060 " .ccccccccccccccccccccccccccc = 3,\n"
3061 " .ddddddddddddddddddddddddddd = 4,\n"
3062 " .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
Daniel Jasperbca4bbe2013-05-28 11:30:49 +00003063
3064 verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
3065}
3066
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003067TEST_F(FormatTest, NestedStaticInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00003068 verifyFormat("static A x = {{{}}};\n");
3069 verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
3070 " {init1, init2, init3, init4}}};",
3071 getLLVMStyleWithColumns(50));
Daniel Jasper9278eb92013-01-16 14:59:02 +00003072
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003073 verifyFormat("somes Status::global_reps[3] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003074 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
3075 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
3076 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
3077 getLLVMStyleWithColumns(60));
Daniel Jaspere5777d22013-05-23 10:15:45 +00003078 verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00003079 " {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
3080 " {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
3081 " {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
Daniel Jaspera44991332015-04-29 13:06:49 +00003082 verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
3083 " {rect.fRight - rect.fLeft, rect.fBottom - "
3084 "rect.fTop}};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003085
Daniel Jasper8a8ce242013-01-31 14:59:26 +00003086 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00003087 "SomeArrayOfSomeType a = {\n"
3088 " {{1, 2, 3},\n"
3089 " {1, 2, 3},\n"
3090 " {111111111111111111111111111111, 222222222222222222222222222222,\n"
3091 " 333333333333333333333333333333},\n"
3092 " {1, 2, 3},\n"
3093 " {1, 2, 3}}};");
Daniel Jasper1ca05cc2013-02-03 18:07:15 +00003094 verifyFormat(
Daniel Jasper6ab54682013-07-16 18:22:10 +00003095 "SomeArrayOfSomeType a = {\n"
Daniel Jasper01603472014-01-09 13:42:56 +00003096 " {{1, 2, 3}},\n"
3097 " {{1, 2, 3}},\n"
Daniel Jasper6ab54682013-07-16 18:22:10 +00003098 " {{111111111111111111111111111111, 222222222222222222222222222222,\n"
3099 " 333333333333333333333333333333}},\n"
Daniel Jasper01603472014-01-09 13:42:56 +00003100 " {{1, 2, 3}},\n"
3101 " {{1, 2, 3}}};");
Daniel Jasper8a8ce242013-01-31 14:59:26 +00003102
Daniel Jaspera44991332015-04-29 13:06:49 +00003103 verifyFormat("struct {\n"
3104 " unsigned bit;\n"
3105 " const char *const name;\n"
3106 "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
3107 " {kOsWin, \"Windows\"},\n"
3108 " {kOsLinux, \"Linux\"},\n"
3109 " {kOsCrOS, \"Chrome OS\"}};");
3110 verifyFormat("struct {\n"
3111 " unsigned bit;\n"
3112 " const char *const name;\n"
3113 "} kBitsToOs[] = {\n"
3114 " {kOsMac, \"Mac\"},\n"
3115 " {kOsWin, \"Windows\"},\n"
3116 " {kOsLinux, \"Linux\"},\n"
3117 " {kOsCrOS, \"Chrome OS\"},\n"
3118 "};");
Manuel Klimeka54d1a92013-01-14 16:41:43 +00003119}
3120
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003121TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
3122 verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3123 " \\\n"
3124 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
3125}
3126
Daniel Jasperda16db32013-01-07 10:48:50 +00003127TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
Alexander Kornienko384b40b2013-10-11 21:43:05 +00003128 verifyFormat("virtual void write(ELFWriter *writerrr,\n"
3129 " OwningPtr<FileOutputBuffer> &buffer) = 0;");
Daniel Jaspercaf84fe2015-04-23 12:59:09 +00003130
3131 // Do break defaulted and deleted functions.
3132 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
3133 " default;",
3134 getLLVMStyleWithColumns(40));
3135 verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
3136 " delete;",
3137 getLLVMStyleWithColumns(40));
Alexander Kornienko384b40b2013-10-11 21:43:05 +00003138}
3139
3140TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
3141 verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
3142 getLLVMStyleWithColumns(40));
3143 verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
3144 getLLVMStyleWithColumns(40));
3145 EXPECT_EQ("#define Q \\\n"
3146 " \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\" \\\n"
3147 " \"aaaaaaaa.cpp\"",
3148 format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
3149 getLLVMStyleWithColumns(40)));
3150}
3151
3152TEST_F(FormatTest, UnderstandsLinePPDirective) {
3153 EXPECT_EQ("# 123 \"A string literal\"",
3154 format(" # 123 \"A string literal\""));
Daniel Jasperda16db32013-01-07 10:48:50 +00003155}
3156
Manuel Klimek591b5802013-01-31 15:58:48 +00003157TEST_F(FormatTest, LayoutUnknownPPDirective) {
Manuel Klimek591b5802013-01-31 15:58:48 +00003158 EXPECT_EQ("#;", format("#;"));
Manuel Klimek78725712013-01-07 10:03:37 +00003159 verifyFormat("#\n;\n;\n;");
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003160}
3161
3162TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
3163 EXPECT_EQ("#line 42 \"test\"\n",
3164 format("# \\\n line \\\n 42 \\\n \"test\"\n"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003165 EXPECT_EQ("#define A B\n", format("# \\\n define \\\n A \\\n B\n",
3166 getLLVMStyleWithColumns(12)));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003167}
3168
3169TEST_F(FormatTest, EndOfFileEndsPPDirective) {
3170 EXPECT_EQ("#line 42 \"test\"",
3171 format("# \\\n line \\\n 42 \\\n \"test\""));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003172 EXPECT_EQ("#define A B", format("# \\\n define \\\n A \\\n B"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003173}
3174
Daniel Jasper877615c2013-10-11 19:45:02 +00003175TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
3176 verifyFormat("#define A \\x20");
3177 verifyFormat("#define A \\ x20");
3178 EXPECT_EQ("#define A \\ x20", format("#define A \\ x20"));
3179 verifyFormat("#define A ''");
3180 verifyFormat("#define A ''qqq");
3181 verifyFormat("#define A `qqq");
3182 verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
Daniel Jasperda353cd2014-03-12 08:24:47 +00003183 EXPECT_EQ("const char *c = STRINGIFY(\n"
3184 "\\na : b);",
3185 format("const char * c = STRINGIFY(\n"
3186 "\\na : b);"));
Daniel Jasper30029c62015-02-05 11:05:31 +00003187
3188 verifyFormat("a\r\\");
3189 verifyFormat("a\v\\");
3190 verifyFormat("a\f\\");
Daniel Jasper877615c2013-10-11 19:45:02 +00003191}
3192
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003193TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003194 verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
3195 verifyFormat("#define A( \\\n BB)", getLLVMStyleWithColumns(12));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003196 verifyFormat("#define A( \\\n A, B)", getLLVMStyleWithColumns(12));
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003197 // FIXME: We never break before the macro name.
Daniel Jaspera49393f2013-08-28 09:07:32 +00003198 verifyFormat("#define AA( \\\n B)", getLLVMStyleWithColumns(12));
Daniel Jasper39825ea2013-01-14 15:40:57 +00003199
3200 verifyFormat("#define A A\n#define A A");
3201 verifyFormat("#define A(X) A\n#define A A");
3202
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003203 verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
3204 verifyFormat("#define Something \\\n Other", getLLVMStyleWithColumns(22));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003205}
3206
3207TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
Alexander Kornienkoefd98382013-03-28 18:40:55 +00003208 EXPECT_EQ("// somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003209 "#include \"a.h\"\n"
Daniel Jasperc22f5b42013-02-28 11:05:57 +00003210 "#define A( \\\n"
3211 " A, B)\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003212 "#include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00003213 "// somecomment\n",
Alexander Kornienkoefd98382013-03-28 18:40:55 +00003214 format(" // somecomment\n"
Manuel Klimek1abf7892013-01-04 23:34:14 +00003215 " #include \"a.h\"\n"
3216 "#define A(A,\\\n"
3217 " B)\n"
3218 " #include \"b.h\"\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00003219 " // somecomment\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003220 getLLVMStyleWithColumns(13)));
Manuel Klimekb69e3c62013-01-02 18:33:23 +00003221}
3222
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003223TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00003224
3225TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
3226 EXPECT_EQ("#define A \\\n"
3227 " c; \\\n"
3228 " e;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003229 "f;",
3230 format("#define A c; e;\n"
3231 "f;",
3232 getLLVMStyleWithColumns(14)));
Manuel Klimek1abf7892013-01-04 23:34:14 +00003233}
3234
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003235TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
Manuel Klimek1abf7892013-01-04 23:34:14 +00003236
Manuel Klimek1abf7892013-01-04 23:34:14 +00003237TEST_F(FormatTest, MacroDefinitionInsideStatement) {
Manuel Klimek52b15152013-01-09 15:25:02 +00003238 EXPECT_EQ("int x,\n"
3239 "#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003240 " y;",
3241 format("int x,\n#define A\ny;"));
Manuel Klimek1abf7892013-01-04 23:34:14 +00003242}
3243
Manuel Klimek09e07972013-01-05 21:34:55 +00003244TEST_F(FormatTest, HashInMacroDefinition) {
Alexander Kornienkod8d47fa2013-09-10 13:41:43 +00003245 EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
Manuel Klimek09e07972013-01-05 21:34:55 +00003246 verifyFormat("#define A \\\n b #c;", getLLVMStyleWithColumns(11));
Daniel Jaspera49393f2013-08-28 09:07:32 +00003247 verifyFormat("#define A \\\n"
3248 " { \\\n"
3249 " f(#c); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003250 " }",
3251 getLLVMStyleWithColumns(11));
Daniel Jasper4f397152013-01-08 16:17:54 +00003252
3253 verifyFormat("#define A(X) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003254 " void function##X()",
3255 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00003256
3257 verifyFormat("#define A(a, b, c) \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003258 " void a##b##c()",
3259 getLLVMStyleWithColumns(22));
Daniel Jasper4f397152013-01-08 16:17:54 +00003260
Daniel Jasper39825ea2013-01-14 15:40:57 +00003261 verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
Manuel Klimek09e07972013-01-05 21:34:55 +00003262}
3263
Manuel Klimekd053c5b2013-01-23 14:37:36 +00003264TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00003265 EXPECT_EQ("#define A (x)", format("#define A (x)"));
3266 EXPECT_EQ("#define A(x)", format("#define A(x)"));
Manuel Klimekd053c5b2013-01-23 14:37:36 +00003267}
3268
Manuel Klimek0c137952013-02-11 12:33:24 +00003269TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
3270 EXPECT_EQ("#define A b;", format("#define A \\\n"
3271 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003272 " b;",
3273 getLLVMStyleWithColumns(25)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003274 EXPECT_EQ("#define A \\\n"
3275 " \\\n"
3276 " a; \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003277 " b;",
3278 format("#define A \\\n"
3279 " \\\n"
3280 " a; \\\n"
3281 " b;",
3282 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003283 EXPECT_EQ("#define A \\\n"
3284 " a; \\\n"
3285 " \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003286 " b;",
3287 format("#define A \\\n"
3288 " a; \\\n"
3289 " \\\n"
3290 " b;",
3291 getLLVMStyleWithColumns(11)));
Manuel Klimek0c137952013-02-11 12:33:24 +00003292}
3293
Daniel Jasper00475962013-02-19 17:14:38 +00003294TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003295 verifyIncompleteFormat("#define A :");
Daniel Jasper00475962013-02-19 17:14:38 +00003296 verifyFormat("#define SOMECASES \\\n"
Daniel Jaspera1275122013-03-20 10:23:53 +00003297 " case 1: \\\n"
Daniel Jasper00475962013-02-19 17:14:38 +00003298 " case 2\n",
3299 getLLVMStyleWithColumns(20));
Daniel Jasper451544a2016-05-19 06:30:48 +00003300 verifyFormat("#define MACRO(a) \\\n"
3301 " if (a) \\\n"
3302 " f(); \\\n"
3303 " else \\\n"
3304 " g()",
3305 getLLVMStyleWithColumns(18));
Daniel Jasper00475962013-02-19 17:14:38 +00003306 verifyFormat("#define A template <typename T>");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003307 verifyIncompleteFormat("#define STR(x) #x\n"
3308 "f(STR(this_is_a_string_literal{));");
Daniel Jasper96df37a2013-08-28 09:17:37 +00003309 verifyFormat("#pragma omp threadprivate( \\\n"
3310 " y)), // expected-warning",
3311 getLLVMStyleWithColumns(28));
Daniel Jasperb1567c12015-01-19 10:50:08 +00003312 verifyFormat("#d, = };");
Daniel Jasper9d22bcc2015-01-19 10:51:05 +00003313 verifyFormat("#if \"a");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003314 verifyIncompleteFormat("({\n"
Manuel Klimek3d3ea842015-05-12 09:23:57 +00003315 "#define b \\\n"
3316 " } \\\n"
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003317 " a\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003318 "a",
3319 getLLVMStyleWithColumns(15));
Daniel Jasper9ecb0e92015-03-13 13:32:11 +00003320 verifyFormat("#define A \\\n"
3321 " { \\\n"
3322 " {\n"
3323 "#define B \\\n"
3324 " } \\\n"
3325 " }",
3326 getLLVMStyleWithColumns(15));
Daniel Jasperfd725c02015-01-21 17:35:29 +00003327 verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
Daniel Jasperd1debfc2015-01-21 18:04:02 +00003328 verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
Daniel Jasper04b979d2015-01-21 18:35:47 +00003329 verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
Daniel Jasperd1c13732015-01-23 19:37:25 +00003330 verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
Daniel Jasper00475962013-02-19 17:14:38 +00003331}
3332
Daniel Jasper40e19212013-05-29 13:16:10 +00003333TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
3334 verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
3335 EXPECT_EQ("class A : public QObject {\n"
3336 " Q_OBJECT\n"
3337 "\n"
3338 " A() {}\n"
3339 "};",
3340 format("class A : public QObject {\n"
3341 " Q_OBJECT\n"
3342 "\n"
3343 " A() {\n}\n"
3344 "} ;"));
Daniel Jaspere60cba12015-05-13 11:35:53 +00003345 EXPECT_EQ("MACRO\n"
3346 "/*static*/ int i;",
3347 format("MACRO\n"
3348 " /*static*/ int i;"));
Daniel Jasper41a0f782013-05-29 14:09:17 +00003349 EXPECT_EQ("SOME_MACRO\n"
3350 "namespace {\n"
3351 "void f();\n"
3352 "}",
3353 format("SOME_MACRO\n"
3354 " namespace {\n"
3355 "void f( );\n"
3356 "}"));
Daniel Jasper40e19212013-05-29 13:16:10 +00003357 // Only if the identifier contains at least 5 characters.
Daniel Jaspera44991332015-04-29 13:06:49 +00003358 EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
3359 EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
Daniel Jasper40e19212013-05-29 13:16:10 +00003360 // Only if everything is upper case.
3361 EXPECT_EQ("class A : public QObject {\n"
3362 " Q_Object A() {}\n"
3363 "};",
3364 format("class A : public QObject {\n"
3365 " Q_Object\n"
Daniel Jasper40e19212013-05-29 13:16:10 +00003366 " A() {\n}\n"
3367 "} ;"));
Daniel Jasper680b09b2014-11-05 10:48:04 +00003368
3369 // Only if the next line can actually start an unwrapped line.
3370 EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
3371 format("SOME_WEIRD_LOG_MACRO\n"
3372 "<< SomeThing;"));
Nico Weber23846262014-12-09 23:22:35 +00003373
3374 verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
Daniel Jaspera44991332015-04-29 13:06:49 +00003375 "(n, buffers))\n",
3376 getChromiumStyle(FormatStyle::LK_Cpp));
Daniel Jasper40e19212013-05-29 13:16:10 +00003377}
3378
Alexander Kornienkode644272013-04-08 22:16:06 +00003379TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
3380 EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3381 "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3382 "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003383 "class X {};\n"
Alexander Kornienkode644272013-04-08 22:16:06 +00003384 "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3385 "int *createScopDetectionPass() { return 0; }",
3386 format(" INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3387 " INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3388 " INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
3389 " class X {};\n"
3390 " INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3391 " int *createScopDetectionPass() { return 0; }"));
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003392 // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
3393 // braces, so that inner block is indented one level more.
3394 EXPECT_EQ("int q() {\n"
3395 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3396 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3397 " IPC_END_MESSAGE_MAP()\n"
3398 "}",
3399 format("int q() {\n"
3400 " IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3401 " IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3402 " IPC_END_MESSAGE_MAP()\n"
3403 "}"));
Daniel Jasper545c6522013-09-17 09:26:07 +00003404
Daniel Jasper352dae12014-01-03 11:50:46 +00003405 // Same inside macros.
3406 EXPECT_EQ("#define LIST(L) \\\n"
3407 " L(A) \\\n"
3408 " L(B) \\\n"
3409 " L(C)",
3410 format("#define LIST(L) \\\n"
3411 " L(A) \\\n"
3412 " L(B) \\\n"
3413 " L(C)",
3414 getGoogleStyle()));
3415
Daniel Jasper545c6522013-09-17 09:26:07 +00003416 // These must not be recognized as macros.
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003417 EXPECT_EQ("int q() {\n"
3418 " f(x);\n"
3419 " f(x) {}\n"
3420 " f(x)->g();\n"
3421 " f(x)->*g();\n"
3422 " f(x).g();\n"
3423 " f(x) = x;\n"
3424 " f(x) += x;\n"
3425 " f(x) -= x;\n"
3426 " f(x) *= x;\n"
3427 " f(x) /= x;\n"
3428 " f(x) %= x;\n"
3429 " f(x) &= x;\n"
3430 " f(x) |= x;\n"
3431 " f(x) ^= x;\n"
3432 " f(x) >>= x;\n"
3433 " f(x) <<= x;\n"
3434 " f(x)[y].z();\n"
3435 " LOG(INFO) << x;\n"
3436 " ifstream(x) >> x;\n"
3437 "}\n",
3438 format("int q() {\n"
3439 " f(x)\n;\n"
3440 " f(x)\n {}\n"
3441 " f(x)\n->g();\n"
3442 " f(x)\n->*g();\n"
3443 " f(x)\n.g();\n"
3444 " f(x)\n = x;\n"
3445 " f(x)\n += x;\n"
3446 " f(x)\n -= x;\n"
3447 " f(x)\n *= x;\n"
3448 " f(x)\n /= x;\n"
3449 " f(x)\n %= x;\n"
3450 " f(x)\n &= x;\n"
3451 " f(x)\n |= x;\n"
3452 " f(x)\n ^= x;\n"
3453 " f(x)\n >>= x;\n"
3454 " f(x)\n <<= x;\n"
3455 " f(x)\n[y].z();\n"
3456 " LOG(INFO)\n << x;\n"
3457 " ifstream(x)\n >> x;\n"
3458 "}\n"));
3459 EXPECT_EQ("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003460 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003461 " if (1) {\n"
3462 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003463 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003464 " while (1) {\n"
3465 " }\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003466 " F(x)\n"
3467 " G(x);\n"
3468 " F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003469 " try {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003470 " Q();\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003471 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003472 " }\n"
3473 "}\n",
3474 format("int q() {\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003475 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003476 "if (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003477 "F(x)\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003478 "while (1) {}\n"
Alexander Kornienkoce081262014-03-18 14:35:20 +00003479 "F(x)\n"
3480 "G(x);\n"
3481 "F(x)\n"
3482 "try { Q(); } catch (...) {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003483 "}\n"));
3484 EXPECT_EQ("class A {\n"
3485 " A() : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00003486 " A(int i) noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003487 " A(X x)\n" // FIXME: function-level try blocks are broken.
3488 " try : t(0) {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00003489 " } catch (...) {\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003490 " }\n"
3491 "};",
3492 format("class A {\n"
3493 " A()\n : t(0) {}\n"
Daniel Jasper5ebb2f32014-05-21 13:08:17 +00003494 " A(int i)\n noexcept() : {}\n"
Alexander Kornienkoa04e5e22013-04-09 16:15:19 +00003495 " A(X x)\n"
3496 " try : t(0) {} catch (...) {}\n"
3497 "};"));
Daniel Jaspera44991332015-04-29 13:06:49 +00003498 EXPECT_EQ("class SomeClass {\n"
3499 "public:\n"
3500 " SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3501 "};",
3502 format("class SomeClass {\n"
3503 "public:\n"
3504 " SomeClass()\n"
3505 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3506 "};"));
3507 EXPECT_EQ("class SomeClass {\n"
3508 "public:\n"
3509 " SomeClass()\n"
3510 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3511 "};",
3512 format("class SomeClass {\n"
3513 "public:\n"
3514 " SomeClass()\n"
3515 " EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3516 "};",
3517 getLLVMStyleWithColumns(40)));
Daniel Jasper7fa524b2015-11-20 15:26:50 +00003518
3519 verifyFormat("MACRO(>)");
Alexander Kornienkode644272013-04-08 22:16:06 +00003520}
3521
Manuel Klimek4fe43002013-05-22 12:51:29 +00003522TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
3523 verifyFormat("#define A \\\n"
3524 " f({ \\\n"
3525 " g(); \\\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00003526 " });",
3527 getLLVMStyleWithColumns(11));
Manuel Klimek4fe43002013-05-22 12:51:29 +00003528}
3529
Manuel Klimekef2cfb12013-01-05 22:14:16 +00003530TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
3531 EXPECT_EQ("{\n {\n#define A\n }\n}", format("{{\n#define A\n}}"));
3532}
3533
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003534TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003535 verifyFormat("{\n { a #c; }\n}");
Manuel Klimek52d0fd82013-01-05 22:56:06 +00003536}
3537
Manuel Klimek1058d982013-01-06 20:07:31 +00003538TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3539 EXPECT_EQ("#define A \\\n { \\\n {\nint i;",
3540 format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3541 EXPECT_EQ("#define A \\\n } \\\n }\nint i;",
3542 format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3543}
Manuel Klimek1abf7892013-01-04 23:34:14 +00003544
Daniel Jaspere2408e32015-05-06 11:16:43 +00003545TEST_F(FormatTest, EscapedNewlines) {
Daniel Jasper8d1832e2013-01-07 13:26:07 +00003546 EXPECT_EQ(
3547 "#define A \\\n int i; \\\n int j;",
3548 format("#define A \\\nint i;\\\n int j;", getLLVMStyleWithColumns(11)));
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00003549 EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
Alexander Kornienkoee4ca9b2013-06-07 17:45:07 +00003550 EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003551 EXPECT_EQ("/* \\ \\ \\\n*/", format("\\\n/* \\ \\ \\\n*/"));
Daniel Jaspere2408e32015-05-06 11:16:43 +00003552 EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
Alexander Kornienkobe633902013-06-14 11:46:10 +00003553}
3554
Alexander Kornienko00691cf2015-01-12 13:11:12 +00003555TEST_F(FormatTest, DontCrashOnBlockComments) {
3556 EXPECT_EQ(
3557 "int xxxxxxxxx; /* "
3558 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\n"
3559 "zzzzzz\n"
3560 "0*/",
3561 format("int xxxxxxxxx; /* "
3562 "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzz\n"
3563 "0*/"));
3564}
3565
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003566TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3567 verifyFormat("#define A \\\n"
3568 " int v( \\\n"
3569 " a); \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003570 " int i;",
3571 getLLVMStyleWithColumns(11));
Manuel Klimek38ba11e2013-01-07 09:24:17 +00003572}
3573
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003574TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
Manuel Klimek1abf7892013-01-04 23:34:14 +00003575 EXPECT_EQ(
3576 "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3577 " \\\n"
3578 " aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3579 "\n"
3580 "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3581 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3582 format(" #define ALooooooooooooooooooooooooooooooooooooooongMacro("
3583 "\\\n"
3584 "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3585 " \n"
3586 " AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3587 " aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
Manuel Klimeka71e5d82013-01-02 16:30:12 +00003588}
3589
Manuel Klimek52b15152013-01-09 15:25:02 +00003590TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3591 EXPECT_EQ("int\n"
3592 "#define A\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00003593 " a;",
Daniel Jasper4355e7f2014-07-09 07:50:33 +00003594 format("int\n#define A\na;"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003595 verifyFormat("functionCallTo(\n"
3596 " someOtherFunction(\n"
3597 " withSomeParameters, whichInSequence,\n"
3598 " areLongerThanALine(andAnotherCall,\n"
3599 "#define A B\n"
3600 " withMoreParamters,\n"
3601 " whichStronglyInfluenceTheLayout),\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00003602 " andMoreParameters),\n"
3603 " trailing);",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003604 getLLVMStyleWithColumns(69));
Daniel Jasperfb81b092013-09-17 09:52:48 +00003605 verifyFormat("Foo::Foo()\n"
3606 "#ifdef BAR\n"
3607 " : baz(0)\n"
3608 "#endif\n"
3609 "{\n"
3610 "}");
Manuel Klimek71814b42013-10-11 21:25:45 +00003611 verifyFormat("void f() {\n"
3612 " if (true)\n"
3613 "#ifdef A\n"
3614 " f(42);\n"
3615 " x();\n"
3616 "#else\n"
3617 " g();\n"
3618 " x();\n"
3619 "#endif\n"
3620 "}");
3621 verifyFormat("void f(param1, param2,\n"
3622 " param3,\n"
3623 "#ifdef A\n"
3624 " param4(param5,\n"
3625 "#ifdef A1\n"
3626 " param6,\n"
3627 "#ifdef A2\n"
3628 " param7),\n"
3629 "#else\n"
3630 " param8),\n"
3631 " param9,\n"
3632 "#endif\n"
3633 " param10,\n"
3634 "#endif\n"
3635 " param11)\n"
3636 "#else\n"
3637 " param12)\n"
3638 "#endif\n"
3639 "{\n"
3640 " x();\n"
3641 "}",
3642 getLLVMStyleWithColumns(28));
Daniel Jasper53bd1672013-10-12 13:32:56 +00003643 verifyFormat("#if 1\n"
3644 "int i;");
Daniel Jaspera44991332015-04-29 13:06:49 +00003645 verifyFormat("#if 1\n"
3646 "#endif\n"
3647 "#if 1\n"
3648 "#else\n"
3649 "#endif\n");
Daniel Jasper472da862013-10-24 15:23:11 +00003650 verifyFormat("DEBUG({\n"
3651 " return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3652 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3653 "});\n"
3654 "#if a\n"
3655 "#else\n"
3656 "#endif");
Daniel Jasper193cdd32015-01-19 10:52:16 +00003657
Manuel Klimekec5c3db2015-05-07 12:26:30 +00003658 verifyIncompleteFormat("void f(\n"
3659 "#if A\n"
3660 " );\n"
3661 "#else\n"
3662 "#endif");
Manuel Klimek52b15152013-01-09 15:25:02 +00003663}
3664
Manuel Klimek14bd9172014-01-29 08:49:02 +00003665TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3666 verifyFormat("#endif\n"
3667 "#if B");
3668}
3669
Manuel Klimek88033d72013-10-21 08:11:15 +00003670TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3671 FormatStyle SingleLine = getLLVMStyle();
3672 SingleLine.AllowShortIfStatementsOnASingleLine = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00003673 verifyFormat("#if 0\n"
3674 "#elif 1\n"
3675 "#endif\n"
3676 "void foo() {\n"
3677 " if (test) foo2();\n"
3678 "}",
3679 SingleLine);
Manuel Klimek88033d72013-10-21 08:11:15 +00003680}
3681
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003682TEST_F(FormatTest, LayoutBlockInsideParens) {
Daniel Jasperacf67e32015-04-07 08:20:35 +00003683 verifyFormat("functionCall({ int i; });");
3684 verifyFormat("functionCall({\n"
3685 " int i;\n"
3686 " int j;\n"
3687 "});");
Daniel Jasper100ffc62015-08-21 11:44:57 +00003688 verifyFormat("functionCall(\n"
3689 " {\n"
3690 " int i;\n"
3691 " int j;\n"
3692 " },\n"
3693 " aaaa, bbbb, cccc);");
Daniel Jasperacf67e32015-04-07 08:20:35 +00003694 verifyFormat("functionA(functionB({\n"
3695 " int i;\n"
3696 " int j;\n"
3697 " }),\n"
3698 " aaaa, bbbb, cccc);");
3699 verifyFormat("functionCall(\n"
3700 " {\n"
3701 " int i;\n"
3702 " int j;\n"
3703 " },\n"
3704 " aaaa, bbbb, // comment\n"
3705 " cccc);");
3706 verifyFormat("functionA(functionB({\n"
3707 " int i;\n"
3708 " int j;\n"
3709 " }),\n"
3710 " aaaa, bbbb, // comment\n"
3711 " cccc);");
3712 verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3713 verifyFormat("functionCall(aaaa, bbbb, {\n"
3714 " int i;\n"
3715 " int j;\n"
3716 "});");
Daniel Jasper393564f2013-05-31 14:56:29 +00003717 verifyFormat(
Daniel Jaspera44991332015-04-29 13:06:49 +00003718 "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
Daniel Jasper4b444492014-11-21 13:38:53 +00003719 " {\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003720 " int i; // break\n"
3721 " },\n"
Daniel Jasper393564f2013-05-31 14:56:29 +00003722 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3723 " ccccccccccccccccc));");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00003724 verifyFormat("DEBUG({\n"
3725 " if (a)\n"
3726 " f();\n"
3727 "});");
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003728}
3729
3730TEST_F(FormatTest, LayoutBlockInsideStatement) {
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00003731 EXPECT_EQ("SOME_MACRO { int i; }\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00003732 "int i;",
3733 format(" SOME_MACRO {int i;} int i;"));
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003734}
3735
3736TEST_F(FormatTest, LayoutNestedBlocks) {
3737 verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3738 " struct s {\n"
3739 " int i;\n"
3740 " };\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00003741 " s kBitsToOs[] = {{10}};\n"
Manuel Klimek8e07a1b2013-01-10 11:52:21 +00003742 " for (int i = 0; i < 10; ++i)\n"
3743 " return;\n"
3744 "}");
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003745 verifyFormat("call(parameter, {\n"
3746 " something();\n"
3747 " // Comment using all columns.\n"
3748 " somethingelse();\n"
3749 "});",
3750 getLLVMStyleWithColumns(40));
Daniel Jaspere40caf92013-11-29 08:46:20 +00003751 verifyFormat("DEBUG( //\n"
3752 " { f(); }, a);");
3753 verifyFormat("DEBUG( //\n"
3754 " {\n"
3755 " f(); //\n"
3756 " },\n"
3757 " a);");
3758
Daniel Jasper1c5d9df2013-09-06 07:54:20 +00003759 EXPECT_EQ("call(parameter, {\n"
3760 " something();\n"
3761 " // Comment too\n"
3762 " // looooooooooong.\n"
3763 " somethingElse();\n"
3764 "});",
3765 format("call(parameter, {\n"
3766 " something();\n"
3767 " // Comment too looooooooooong.\n"
3768 " somethingElse();\n"
3769 "});",
3770 getLLVMStyleWithColumns(29)));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003771 EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int i; });"));
Daniel Jasperdcd5da12013-10-20 17:28:32 +00003772 EXPECT_EQ("DEBUG({ // comment\n"
3773 " int i;\n"
3774 "});",
3775 format("DEBUG({ // comment\n"
3776 "int i;\n"
3777 "});"));
Daniel Jasper9b246e02013-09-08 14:07:57 +00003778 EXPECT_EQ("DEBUG({\n"
3779 " int i;\n"
3780 "\n"
3781 " // comment\n"
3782 " int j;\n"
3783 "});",
3784 format("DEBUG({\n"
3785 " int i;\n"
3786 "\n"
3787 " // comment\n"
3788 " int j;\n"
3789 "});"));
Daniel Jasperbbf5c1c2013-11-05 19:10:03 +00003790
3791 verifyFormat("DEBUG({\n"
3792 " if (a)\n"
3793 " return;\n"
3794 "});");
3795 verifyGoogleFormat("DEBUG({\n"
3796 " if (a) return;\n"
3797 "});");
3798 FormatStyle Style = getGoogleStyle();
3799 Style.ColumnLimit = 45;
Daniel Jasper100ffc62015-08-21 11:44:57 +00003800 verifyFormat("Debug(aaaaa,\n"
3801 " {\n"
3802 " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3803 " },\n"
3804 " a);",
Daniel Jasper4b444492014-11-21 13:38:53 +00003805 Style);
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003806
Daniel Jaspera87af7a2015-06-30 11:32:22 +00003807 verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3808
Daniel Jasper47b35ae2015-01-29 10:47:14 +00003809 verifyNoCrash("^{v^{a}}");
Daniel Jasper9c199562013-11-28 15:58:55 +00003810}
3811
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003812TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3813 EXPECT_EQ("#define MACRO() \\\n"
3814 " Debug(aaa, /* force line break */ \\\n"
3815 " { \\\n"
3816 " int i; \\\n"
3817 " int j; \\\n"
3818 " })",
3819 format("#define MACRO() Debug(aaa, /* force line break */ \\\n"
3820 " { int i; int j; })",
3821 getGoogleStyle()));
Daniel Jasper1a028222015-05-26 07:03:42 +00003822
3823 EXPECT_EQ("#define A \\\n"
3824 " [] { \\\n"
3825 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3826 " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3827 " }",
3828 format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3829 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3830 getGoogleStyle()));
Daniel Jasper5fc133e2015-05-12 10:16:02 +00003831}
3832
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003833TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3834 EXPECT_EQ("{}", format("{}"));
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00003835 verifyFormat("enum E {};");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00003836 verifyFormat("enum E {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00003837}
3838
Birunthan Mohanathasb001a0b2015-07-03 17:25:16 +00003839TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3840 FormatStyle Style = getLLVMStyle();
3841 Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3842 Style.MacroBlockEnd = "^[A-Z_]+_END$";
3843 verifyFormat("FOO_BEGIN\n"
3844 " FOO_ENTRY\n"
3845 "FOO_END", Style);
3846 verifyFormat("FOO_BEGIN\n"
3847 " NESTED_FOO_BEGIN\n"
3848 " NESTED_FOO_ENTRY\n"
3849 " NESTED_FOO_END\n"
3850 "FOO_END", Style);
3851 verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3852 " int x;\n"
3853 " x = 1;\n"
3854 "FOO_END(Baz)", Style);
3855}
3856
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003857//===----------------------------------------------------------------------===//
3858// Line break tests.
3859//===----------------------------------------------------------------------===//
3860
Daniel Jasperf79b0b12013-08-30 08:29:25 +00003861TEST_F(FormatTest, PreventConfusingIndents) {
Alexander Kornienko578fdd82012-12-06 18:03:27 +00003862 verifyFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00003863 "void f() {\n"
3864 " SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3865 " parameter, parameter, parameter)),\n"
3866 " SecondLongCall(parameter));\n"
3867 "}");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003868 verifyFormat(
3869 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3870 " aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3871 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3872 " aaaaaaaaaaaaaaaaaaaaaaaa);");
3873 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00003874 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3875 " [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3876 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3877 " [aaaaaaaaaaaaaaaaaaaaaaaa]];");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003878 verifyFormat(
3879 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3880 " aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3881 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3882 " aaaaaaaaaaaaaaaaaaaaaaaa>;");
Daniel Jasper240527c2017-01-16 13:13:15 +00003883 verifyFormat("int a = bbbb && ccc &&\n"
3884 " fffff(\n"
Daniel Jasper20b09ef2013-01-28 09:35:24 +00003885 "#define A Just forcing a new line\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00003886 " ddd);");
Daniel Jasper7b5773e92013-01-28 07:35:34 +00003887}
3888
Daniel Jasperd69fc772013-05-08 14:12:04 +00003889TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3890 verifyFormat(
3891 "bool aaaaaaa =\n"
3892 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3893 " bbbbbbbb();");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003894 verifyFormat(
3895 "bool aaaaaaa =\n"
3896 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3897 " bbbbbbbb();");
3898
Daniel Jasperd69fc772013-05-08 14:12:04 +00003899 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3900 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3901 " ccccccccc == ddddddddddd;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00003902 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3903 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3904 " ccccccccc == ddddddddddd;");
3905 verifyFormat(
3906 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3907 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3908 " ccccccccc == ddddddddddd;");
Daniel Jasperd69fc772013-05-08 14:12:04 +00003909
3910 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3911 " aaaaaa) &&\n"
3912 " bbbbbb && cccccc;");
Daniel Jasper9f82df22013-05-28 07:42:44 +00003913 verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3914 " aaaaaa) >>\n"
3915 " bbbbbb;");
Daniel Jasperf901a572015-12-07 19:50:48 +00003916 verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
Daniel Jasperd69fc772013-05-08 14:12:04 +00003917 " SourceMgr.getSpellingColumnNumber(\n"
3918 " TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3919 " 1);");
Daniel Jasper571f1af2013-05-14 20:39:56 +00003920
Daniel Jasper68d888c2013-06-03 08:42:05 +00003921 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3922 " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3923 " cccccc) {\n}");
Daniel Jasper3eb341c2014-11-11 23:04:51 +00003924 verifyFormat("b = a &&\n"
3925 " // Comment\n"
3926 " b.c && d;");
Daniel Jasper68d888c2013-06-03 08:42:05 +00003927
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003928 // If the LHS of a comparison is not a binary expression itself, the
3929 // additional linebreak confuses many people.
3930 verifyFormat(
3931 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3932 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3933 "}");
3934 verifyFormat(
3935 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3936 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3937 "}");
Daniel Jasper562ecd42013-09-06 08:08:14 +00003938 verifyFormat(
3939 "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3940 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3941 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003942 // Even explicit parentheses stress the precedence enough to make the
3943 // additional break unnecessary.
Daniel Jaspera44991332015-04-29 13:06:49 +00003944 verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3945 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3946 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003947 // This cases is borderline, but with the indentation it is still readable.
3948 verifyFormat(
3949 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3950 " aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3951 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3952 "}",
3953 getLLVMStyleWithColumns(75));
3954
3955 // If the LHS is a binary expression, we should still use the additional break
3956 // as otherwise the formatting hides the operator precedence.
Daniel Jaspera44991332015-04-29 13:06:49 +00003957 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3958 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3959 " 5) {\n"
3960 "}");
Daniel Jasper7ae41cd2013-07-03 10:34:47 +00003961
Daniel Jasper571f1af2013-05-14 20:39:56 +00003962 FormatStyle OnePerLine = getLLVMStyle();
3963 OnePerLine.BinPackParameters = false;
3964 verifyFormat(
3965 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3966 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3967 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3968 OnePerLine);
Daniel Jaspere61f9f92017-01-13 23:18:16 +00003969
3970 verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3971 " .aaa(aaaaaaaaaaaaa) *\n"
3972 " aaaaaaa +\n"
3973 " aaaaaaa;",
3974 getLLVMStyleWithColumns(40));
Daniel Jasperd69fc772013-05-08 14:12:04 +00003975}
3976
Daniel Jasper6bee6822013-04-08 20:33:42 +00003977TEST_F(FormatTest, ExpressionIndentation) {
3978 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3979 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3980 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3981 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3982 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3983 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3984 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3985 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3986 " ccccccccccccccccccccccccccccccccccccccccc;");
3987 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3988 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3989 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3990 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3991 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3992 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3993 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3994 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3995 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3996 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3997 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3998 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
Daniel Jasper6dcecb62013-06-06 09:11:58 +00003999 verifyFormat("if () {\n"
Daniel Jasper5c332652014-04-03 12:00:33 +00004000 "} else if (aaaaa &&\n"
4001 " bbbbb > // break\n"
4002 " ccccc) {\n"
Daniel Jasper6dcecb62013-06-06 09:11:58 +00004003 "}");
Alexander Kornienkoafaa8f52013-06-17 13:19:53 +00004004
4005 // Presence of a trailing comment used to change indentation of b.
4006 verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
4007 " b;\n"
4008 "return aaaaaaaaaaaaaaaaaaa +\n"
4009 " b; //",
4010 getLLVMStyleWithColumns(30));
Daniel Jasper6bee6822013-04-08 20:33:42 +00004011}
4012
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004013TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
4014 // Not sure what the best system is here. Like this, the LHS can be found
4015 // immediately above an operator (everything with the same or a higher
4016 // indent). The RHS is aligned right of the operator and so compasses
4017 // everything until something with the same indent as the operator is found.
4018 // FIXME: Is this a good system?
4019 FormatStyle Style = getLLVMStyle();
Daniel Jasperac043c92014-09-15 11:11:00 +00004020 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004021 verifyFormat(
4022 "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004023 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4024 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4025 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4026 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4027 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004028 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004029 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4030 " > ccccccccccccccccccccccccccccccccccccccccc;",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004031 Style);
4032 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004033 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4034 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004035 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4036 Style);
4037 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004038 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4039 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004040 " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4041 Style);
4042 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4043 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004044 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4045 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004046 Style);
4047 verifyFormat("if () {\n"
Daniel Jasperc0d606a2014-04-14 11:08:45 +00004048 "} else if (aaaaa\n"
4049 " && bbbbb // break\n"
Daniel Jasper8c6e9ef2014-12-02 09:46:56 +00004050 " > ccccc) {\n"
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004051 "}",
4052 Style);
Daniel Jasper119ff532014-11-14 12:31:14 +00004053 verifyFormat("return (a)\n"
4054 " // comment\n"
4055 " + b;",
4056 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004057 verifyFormat(
4058 "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4059 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4060 " + cc;",
4061 Style);
Daniel Jasper9e5ede02013-11-08 19:56:28 +00004062
Daniel Jaspere92bf6f2015-05-06 14:23:38 +00004063 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4064 " = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4065 Style);
4066
Daniel Jasper9e5ede02013-11-08 19:56:28 +00004067 // Forced by comments.
4068 verifyFormat(
4069 "unsigned ContentSize =\n"
4070 " sizeof(int16_t) // DWARF ARange version number\n"
4071 " + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4072 " + sizeof(int8_t) // Pointer Size (in bytes)\n"
4073 " + sizeof(int8_t); // Segment Size (in bytes)");
Daniel Jasper446d1cd2013-11-23 14:45:49 +00004074
4075 verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
4076 " == boost::fusion::at_c<1>(iiii).second;",
4077 Style);
Daniel Jasper0a1e5ac2014-05-13 08:01:47 +00004078
4079 Style.ColumnLimit = 60;
4080 verifyFormat("zzzzzzzzzz\n"
4081 " = bbbbbbbbbbbbbbbbb\n"
4082 " >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
4083 Style);
Daniel Jaspere33d4af2013-07-26 16:56:36 +00004084}
4085
Daniel Jasper3219e432014-12-02 13:24:51 +00004086TEST_F(FormatTest, NoOperandAlignment) {
4087 FormatStyle Style = getLLVMStyle();
4088 Style.AlignOperands = false;
4089 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
Daniel Jaspera44991332015-04-29 13:06:49 +00004090 verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4091 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4092 " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4093 " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4094 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4095 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4096 " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4097 " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4098 " > ccccccccccccccccccccccccccccccccccccccccc;",
4099 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004100
4101 verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4102 " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4103 " + cc;",
4104 Style);
4105 verifyFormat("int a = aa\n"
4106 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4107 " * cccccccccccccccccccccccccccccccccccc;",
4108 Style);
Daniel Jasperc0956632014-12-03 14:02:59 +00004109
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004110 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasperc0956632014-12-03 14:02:59 +00004111 verifyFormat("return (a > b\n"
4112 " // comment1\n"
4113 " // comment2\n"
4114 " || c);",
4115 Style);
Daniel Jasper3219e432014-12-02 13:24:51 +00004116}
4117
Daniel Jasperac043c92014-09-15 11:11:00 +00004118TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
4119 FormatStyle Style = getLLVMStyle();
4120 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4121 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4122 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper3219e432014-12-02 13:24:51 +00004123 " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4124 Style);
Daniel Jasperac043c92014-09-15 11:11:00 +00004125}
4126
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004127TEST_F(FormatTest, ConstructorInitializers) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00004128 verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004129 verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
4130 getLLVMStyleWithColumns(45));
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004131 verifyFormat("Constructor()\n"
4132 " : Inttializer(FitsOnTheLine) {}",
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004133 getLLVMStyleWithColumns(44));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004134 verifyFormat("Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004135 " : Inttializer(FitsOnTheLine) {}",
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004136 getLLVMStyleWithColumns(43));
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004137
Daniel Jasper7b259cd2015-08-27 11:59:31 +00004138 verifyFormat("template <typename T>\n"
4139 "Constructor() : Initializer(FitsOnTheLine) {}",
4140 getLLVMStyleWithColumns(45));
4141
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004142 verifyFormat(
4143 "SomeClass::Constructor()\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004144 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004145
4146 verifyFormat(
4147 "SomeClass::Constructor()\n"
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004148 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004149 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
Daniel Jasper2408a8c2013-01-11 11:37:55 +00004150 verifyFormat(
4151 "SomeClass::Constructor()\n"
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004152 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004153 " aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
Daniel Jasper7b259cd2015-08-27 11:59:31 +00004154 verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4155 " aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4156 " : aaaaaaaaaa(aaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004157
4158 verifyFormat("Constructor()\n"
4159 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4160 " aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4161 " aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004162 " aaaaaaaaaaaaaaaaaaaaaaa() {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004163
Daniel Jasper65585ed2013-01-28 13:31:35 +00004164 verifyFormat("Constructor()\n"
4165 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004166 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper65585ed2013-01-28 13:31:35 +00004167
Daniel Jasper62e68172013-02-25 15:59:54 +00004168 verifyFormat("Constructor(int Parameter = 0)\n"
4169 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4170 " aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
Daniel Jasper87f18f12013-09-06 21:46:41 +00004171 verifyFormat("Constructor()\n"
4172 " : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4173 "}",
4174 getLLVMStyleWithColumns(60));
Daniel Jasper4fcc8b92013-11-07 17:52:51 +00004175 verifyFormat("Constructor()\n"
4176 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4177 " aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
Daniel Jasper62e68172013-02-25 15:59:54 +00004178
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004179 // Here a line could be saved by splitting the second initializer onto two
Alp Tokerf6a24ce2013-12-05 16:25:25 +00004180 // lines, but that is not desirable.
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004181 verifyFormat("Constructor()\n"
4182 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4183 " aaaaaaaaaaa(aaaaaaaaaaa),\n"
4184 " aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004185
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004186 FormatStyle OnePerLine = getLLVMStyle();
4187 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper7bec87c2016-01-07 18:11:54 +00004188 OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004189 verifyFormat("SomeClass::Constructor()\n"
4190 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4191 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004192 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004193 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004194 verifyFormat("SomeClass::Constructor()\n"
4195 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4196 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004197 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004198 OnePerLine);
Daniel Jasper23e8e0c2013-02-15 16:49:44 +00004199 verifyFormat("MyClass::MyClass(int var)\n"
4200 " : some_var_(var), // 4 space indent\n"
4201 " some_other_var_(var + 1) { // lined up\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004202 "}",
4203 OnePerLine);
Daniel Jasperead41b62013-02-28 09:39:12 +00004204 verifyFormat("Constructor()\n"
4205 " : aaaaa(aaaaaa),\n"
4206 " aaaaa(aaaaaa),\n"
4207 " aaaaa(aaaaaa),\n"
4208 " aaaaa(aaaaaa),\n"
4209 " aaaaa(aaaaaa) {}",
4210 OnePerLine);
Daniel Jaspercc960fa2013-04-22 07:59:53 +00004211 verifyFormat("Constructor()\n"
4212 " : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4213 " aaaaaaaaaaaaaaaaaaaaaa) {}",
4214 OnePerLine);
Daniel Jasper7bec87c2016-01-07 18:11:54 +00004215 OnePerLine.BinPackParameters = false;
4216 verifyFormat(
4217 "Constructor()\n"
4218 " : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4219 " aaaaaaaaaaa().aaa(),\n"
4220 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4221 OnePerLine);
Daniel Jasperbd73bcf2015-10-27 13:42:08 +00004222 OnePerLine.ColumnLimit = 60;
4223 verifyFormat("Constructor()\n"
4224 " : aaaaaaaaaaaaaaaaaaaa(a),\n"
4225 " bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4226 OnePerLine);
Daniel Jasperf6c7c182014-01-13 14:10:04 +00004227
4228 EXPECT_EQ("Constructor()\n"
4229 " : // Comment forcing unwanted break.\n"
4230 " aaaa(aaaa) {}",
4231 format("Constructor() :\n"
4232 " // Comment forcing unwanted break.\n"
4233 " aaaa(aaaa) {}"));
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004234}
4235
4236TEST_F(FormatTest, MemoizationTests) {
4237 // This breaks if the memoization lookup does not take \c Indent and
4238 // \c LastSpace into account.
4239 verifyFormat(
4240 "extern CFRunLoopTimerRef\n"
4241 "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
4242 " CFTimeInterval interval, CFOptionFlags flags,\n"
4243 " CFIndex order, CFRunLoopTimerCallBack callout,\n"
Daniel Jasper8e357692013-05-06 08:27:33 +00004244 " CFRunLoopTimerContext *context) {}");
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004245
4246 // Deep nesting somewhat works around our memoization.
4247 verifyFormat(
4248 "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4249 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4250 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4251 " aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4252 " aaaaa())))))))))))))))))))))))))))))))))))))));",
4253 getLLVMStyleWithColumns(65));
Daniel Jaspercc3044c2013-05-13 09:19:24 +00004254 verifyFormat(
4255 "aaaaa(\n"
4256 " aaaaa,\n"
4257 " aaaaa(\n"
4258 " aaaaa,\n"
4259 " aaaaa(\n"
4260 " aaaaa,\n"
4261 " aaaaa(\n"
4262 " aaaaa,\n"
4263 " aaaaa(\n"
4264 " aaaaa,\n"
4265 " aaaaa(\n"
4266 " aaaaa,\n"
4267 " aaaaa(\n"
4268 " aaaaa,\n"
4269 " aaaaa(\n"
4270 " aaaaa,\n"
4271 " aaaaa(\n"
4272 " aaaaa,\n"
4273 " aaaaa(\n"
4274 " aaaaa,\n"
4275 " aaaaa(\n"
4276 " aaaaa,\n"
4277 " aaaaa(\n"
4278 " aaaaa,\n"
4279 " aaaaa))))))))))));",
4280 getLLVMStyleWithColumns(65));
Daniel Jasperf8114cf2013-05-22 05:27:42 +00004281 verifyFormat(
4282 "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"
4283 " a),\n"
4284 " a),\n"
4285 " a),\n"
4286 " a),\n"
4287 " a),\n"
4288 " a),\n"
4289 " a),\n"
4290 " a),\n"
4291 " a),\n"
4292 " a),\n"
4293 " a),\n"
4294 " a),\n"
4295 " a),\n"
4296 " a),\n"
4297 " a),\n"
4298 " a),\n"
4299 " a)",
4300 getLLVMStyleWithColumns(65));
Daniel Jasper7b7877a2013-01-12 07:36:22 +00004301
4302 // This test takes VERY long when memoization is broken.
Daniel Jaspere3c0e012013-04-25 13:31:51 +00004303 FormatStyle OnePerLine = getLLVMStyle();
4304 OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004305 OnePerLine.BinPackParameters = false;
Daniel Jasper9278eb92013-01-16 14:59:02 +00004306 std::string input = "Constructor()\n"
Daniel Jasper7a31af12013-01-25 15:43:32 +00004307 " : aaaa(a,\n";
Daniel Jasper9278eb92013-01-16 14:59:02 +00004308 for (unsigned i = 0, e = 80; i != e; ++i) {
4309 input += " a,\n";
4310 }
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004311 input += " a) {}";
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004312 verifyFormat(input, OnePerLine);
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00004313}
4314
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004315TEST_F(FormatTest, BreaksAsHighAsPossible) {
4316 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004317 "void f() {\n"
4318 " if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
4319 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
4320 " f();\n"
4321 "}");
Daniel Jasper70bc8742013-02-26 13:59:14 +00004322 verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004323 " Intervals[i - 1].getRange().getLast()) {\n}");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00004324}
4325
Daniel Jasper6728fc12013-04-11 14:29:13 +00004326TEST_F(FormatTest, BreaksFunctionDeclarations) {
4327 // Principially, we break function declarations in a certain order:
4328 // 1) break amongst arguments.
4329 verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
4330 " Cccccccccccccc cccccccccccccc);");
Daniel Jaspera44991332015-04-29 13:06:49 +00004331 verifyFormat("template <class TemplateIt>\n"
4332 "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
4333 " TemplateIt *stop) {}");
Daniel Jasper6728fc12013-04-11 14:29:13 +00004334
4335 // 2) break after return type.
Daniel Jasper8e357692013-05-06 08:27:33 +00004336 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004337 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004338 "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004339 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004340
4341 // 3) break after (.
4342 verifyFormat(
4343 "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00004344 " Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
4345 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004346
4347 // 4) break before after nested name specifiers.
4348 verifyFormat(
4349 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004350 "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
4351 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004352 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004353
4354 // However, there are exceptions, if a sufficient amount of lines can be
4355 // saved.
4356 // FIXME: The precise cut-offs wrt. the number of saved lines might need some
4357 // more adjusting.
4358 verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4359 " Cccccccccccccc cccccccccc,\n"
4360 " Cccccccccccccc cccccccccc,\n"
4361 " Cccccccccccccc cccccccccc,\n"
4362 " Cccccccccccccc cccccccccc);");
4363 verifyFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004364 "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00004365 "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4366 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4367 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
Manuel Klimek836c2862013-06-21 17:25:42 +00004368 getGoogleStyle());
Daniel Jasper6728fc12013-04-11 14:29:13 +00004369 verifyFormat(
4370 "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4371 " Cccccccccccccc cccccccccc,\n"
4372 " Cccccccccccccc cccccccccc,\n"
4373 " Cccccccccccccc cccccccccc,\n"
4374 " Cccccccccccccc cccccccccc,\n"
4375 " Cccccccccccccc cccccccccc,\n"
4376 " Cccccccccccccc cccccccccc);");
4377 verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4378 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4379 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4380 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4381 " Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
Daniel Jasper1b8e76f2013-04-15 22:36:37 +00004382
4383 // Break after multi-line parameters.
4384 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4385 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4386 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4387 " bbbb bbbb);");
Daniel Jasper6c0ee172014-11-14 13:14:45 +00004388 verifyFormat("void SomeLoooooooooooongFunction(\n"
4389 " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
4390 " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4391 " int bbbbbbbbbbbbb);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004392
4393 // Treat overloaded operators like other functions.
4394 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4395 "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
Daniel Jasperd215b8b2013-08-28 07:27:35 +00004396 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4397 "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
Alexander Kornienko86b2dfd2014-03-06 15:13:08 +00004398 verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4399 "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
4400 verifyGoogleFormat(
4401 "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
4402 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper6331da02013-07-09 07:43:55 +00004403 verifyGoogleFormat(
4404 "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
4405 " const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
Daniel Jasper126153a2013-12-27 06:39:56 +00004406 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4407 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4408 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
4409 "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
Daniel Jasperea79ea12014-08-15 05:00:39 +00004410 verifyGoogleFormat(
4411 "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
4412 "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4413 " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
Daniel Jasper88db7602016-02-11 06:43:01 +00004414 verifyGoogleFormat(
4415 "template <typename T>\n"
4416 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4417 "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
4418 " aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
Daniel Jasper11309812015-03-18 14:20:13 +00004419
4420 FormatStyle Style = getLLVMStyle();
4421 Style.PointerAlignment = FormatStyle::PAS_Left;
4422 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4423 " aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
4424 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00004425 verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
4426 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4427 Style);
Daniel Jasper6728fc12013-04-11 14:29:13 +00004428}
4429
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004430TEST_F(FormatTest, TrailingReturnType) {
4431 verifyFormat("auto foo() -> int;\n");
4432 verifyFormat("struct S {\n"
4433 " auto bar() const -> int;\n"
4434 "};");
4435 verifyFormat("template <size_t Order, typename T>\n"
4436 "auto load_img(const std::string &filename)\n"
4437 " -> alias::tensor<Order, T, mem::tag::cpu> {}");
Daniel Jasperda07a722014-10-17 14:37:40 +00004438 verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
4439 " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
Daniel Jasperb52c69e2014-10-22 09:01:12 +00004440 verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00004441 verifyFormat("template <typename T>\n"
4442 "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
4443 " -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
Daniel Jaspera3501d42013-07-11 14:33:06 +00004444
4445 // Not trailing return types.
4446 verifyFormat("void f() { auto a = b->c(); }");
Daniel Jasper6cdec7c2013-07-09 14:36:48 +00004447}
4448
Daniel Jasper5be31f72013-05-21 09:16:31 +00004449TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004450 // Avoid breaking before trailing 'const' or other trailing annotations, if
4451 // they are not function-like.
Daniel Jasper13c37b32013-05-22 08:28:26 +00004452 FormatStyle Style = getGoogleStyle();
4453 Style.ColumnLimit = 47;
Daniel Jaspere068ac72014-10-27 17:13:59 +00004454 verifyFormat("void someLongFunction(\n"
4455 " int someLoooooooooooooongParameter) const {\n}",
Daniel Jasper13c37b32013-05-22 08:28:26 +00004456 getLLVMStyleWithColumns(47));
Daniel Jasper13c37b32013-05-22 08:28:26 +00004457 verifyFormat("LoooooongReturnType\n"
4458 "someLoooooooongFunction() const {}",
4459 getLLVMStyleWithColumns(47));
4460 verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
4461 " const {}",
4462 Style);
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004463 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4464 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
4465 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4466 " aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
4467 verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4468 " aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
Daniel Jasper43e6a282013-12-16 15:01:54 +00004469 verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
4470 " aaaaaaaaaaa aaaaa) const override;");
4471 verifyGoogleFormat(
4472 "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4473 " const override;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004474
Daniel Jasper5550de62014-02-17 07:57:46 +00004475 // Even if the first parameter has to be wrapped.
4476 verifyFormat("void someLongFunction(\n"
4477 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004478 getLLVMStyleWithColumns(46));
Daniel Jasper5550de62014-02-17 07:57:46 +00004479 verifyFormat("void someLongFunction(\n"
4480 " int someLongParameter) const {}",
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004481 Style);
Daniel Jasper5550de62014-02-17 07:57:46 +00004482 verifyFormat("void someLongFunction(\n"
4483 " int someLongParameter) override {}",
4484 Style);
4485 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004486 " int someLongParameter) OVERRIDE {}",
4487 Style);
4488 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004489 " int someLongParameter) final {}",
4490 Style);
4491 verifyFormat("void someLongFunction(\n"
Daniel Jasperb48d3af2014-04-09 10:01:49 +00004492 " int someLongParameter) FINAL {}",
4493 Style);
4494 verifyFormat("void someLongFunction(\n"
Daniel Jasper5550de62014-02-17 07:57:46 +00004495 " int parameter) const override {}",
4496 Style);
4497
Daniel Jaspere3f907f2014-06-02 09:52:08 +00004498 Style.BreakBeforeBraces = FormatStyle::BS_Allman;
4499 verifyFormat("void someLongFunction(\n"
4500 " int someLongParameter) const\n"
4501 "{\n"
4502 "}",
4503 Style);
4504
Daniel Jasper5550de62014-02-17 07:57:46 +00004505 // Unless these are unknown annotations.
Daniel Jasperd8c36d02013-10-18 16:34:40 +00004506 verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
4507 " aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4508 " LONG_AND_UGLY_ANNOTATION;");
Daniel Jasper718bd362013-07-11 21:02:56 +00004509
4510 // Breaking before function-like trailing annotations is fine to keep them
4511 // close to their arguments.
Daniel Jasper5be31f72013-05-21 09:16:31 +00004512 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4513 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4514 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4515 " LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4516 verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4517 " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
Daniel Jasperf9a09062014-04-09 10:29:11 +00004518 verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4519 " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
Daniel Jasper8b76d602014-07-28 12:08:06 +00004520 verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004521
4522 verifyFormat(
4523 "void aaaaaaaaaaaaaaaaaa()\n"
4524 " __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4525 " aaaaaaaaaaaaaaaaaaaaaaaaa));");
4526 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4527 " __attribute__((unused));");
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004528 verifyGoogleFormat(
Manuel Klimek836c2862013-06-21 17:25:42 +00004529 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004530 " GUARDED_BY(aaaaaaaaaaaa);");
4531 verifyGoogleFormat(
Daniel Jasper40db06a2013-07-11 12:34:23 +00004532 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasper35ec2b22014-04-14 08:15:20 +00004533 " GUARDED_BY(aaaaaaaaaaaa);");
4534 verifyGoogleFormat(
4535 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4536 " aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper3ca283a2015-05-15 09:58:11 +00004537 verifyGoogleFormat(
4538 "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4539 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5be31f72013-05-21 09:16:31 +00004540}
4541
Daniel Jasperf090f032015-05-18 09:47:22 +00004542TEST_F(FormatTest, FunctionAnnotations) {
4543 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasper788ffd72015-08-24 15:10:01 +00004544 "int OldFunction(const string &parameter) {}");
4545 verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
Daniel Jasperf090f032015-05-18 09:47:22 +00004546 "string OldFunction(const string &parameter) {}");
4547 verifyFormat("template <typename T>\n"
4548 "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4549 "string OldFunction(const string &parameter) {}");
Daniel Jasper47bbda02015-05-18 13:47:23 +00004550
4551 // Not function annotations.
4552 verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4553 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
Daniel Jasper32739302015-05-27 04:55:47 +00004554 verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4555 " ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
Daniel Jasper19bc1d02016-04-06 13:58:09 +00004556 verifyFormat("MACRO(abc).function() // wrap\n"
4557 " << abc;");
4558 verifyFormat("MACRO(abc)->function() // wrap\n"
4559 " << abc;");
4560 verifyFormat("MACRO(abc)::function() // wrap\n"
4561 " << abc;");
Daniel Jasperf090f032015-05-18 09:47:22 +00004562}
4563
Daniel Jasperf7935112012-12-03 18:12:45 +00004564TEST_F(FormatTest, BreaksDesireably) {
4565 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4566 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004567 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
Daniel Jasper39e27382013-01-23 20:41:06 +00004568 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4569 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4570 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004571
4572 verifyFormat(
4573 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00004574 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
Daniel Jasperf7935112012-12-03 18:12:45 +00004575
4576 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4577 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4578 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper9b155472012-12-04 10:50:12 +00004579
4580 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004581 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4582 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4583 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
Daniel Jasper9b155472012-12-04 10:50:12 +00004584 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4585 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004586
4587 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4588 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4589
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004590 verifyFormat(
Alexander Kornienkoa5151272013-03-12 16:28:18 +00004591 "void f() {\n"
4592 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4593 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4594 "}");
Daniel Jasper7a31af12013-01-25 15:43:32 +00004595 verifyFormat(
4596 "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4597 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4598 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00004599 "aaaaaa(aaa,\n"
4600 " new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4601 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jaspera44991332015-04-29 13:06:49 +00004602 verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4603 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4604 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3d0c75c2013-01-02 14:40:02 +00004605
Daniel Jasper739b85f2015-06-29 10:42:59 +00004606 // Indent consistently independent of call expression and unary operator.
4607 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4608 " dddddddddddddddddddddddddddddd));");
4609 verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4610 " dddddddddddddddddddddddddddddd));");
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004611 verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00004612 " dddddddddddddddddddddddddddddd));");
4613
Daniel Jasperaa1c9202012-12-05 14:57:28 +00004614 // This test case breaks on an incorrect memoization, i.e. an optimization not
4615 // taking into account the StopAt value.
4616 verifyFormat(
4617 "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004618 " aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4619 " aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4620 " (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper6d822722012-12-24 16:43:00 +00004621
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004622 verifyFormat("{\n {\n {\n"
4623 " Annotation.SpaceRequiredBefore =\n"
4624 " Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4625 " Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4626 " }\n }\n}");
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00004627
4628 // Break on an outer level if there was a break on an inner level.
4629 EXPECT_EQ("f(g(h(a, // comment\n"
4630 " b, c),\n"
4631 " d, e),\n"
4632 " x, y);",
4633 format("f(g(h(a, // comment\n"
4634 " b, c), d, e), x, y);"));
Daniel Jasperee7539a2013-07-08 14:25:23 +00004635
4636 // Prefer breaking similar line breaks.
4637 verifyFormat(
4638 "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4639 " NSTrackingMouseEnteredAndExited |\n"
4640 " NSTrackingActiveAlways;");
Daniel Jasperf7935112012-12-03 18:12:45 +00004641}
4642
Daniel Jasper18210d72014-10-09 09:52:05 +00004643TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4644 FormatStyle NoBinPacking = getGoogleStyle();
4645 NoBinPacking.BinPackParameters = false;
4646 NoBinPacking.BinPackArguments = true;
4647 verifyFormat("void f() {\n"
4648 " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4649 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4650 "}",
4651 NoBinPacking);
4652 verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4653 " int aaaaaaaaaaaaaaaaaaaa,\n"
4654 " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4655 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004656
Daniel Jasper00693b082016-01-09 15:56:47 +00004657 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4658 verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4659 " vector<int> bbbbbbbbbbbbbbb);",
4660 NoBinPacking);
Daniel Jasper06ca0fc2016-01-11 11:01:05 +00004661 // FIXME: This behavior difference is probably not wanted. However, currently
4662 // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4663 // template arguments from BreakBeforeParameter being set because of the
4664 // one-per-line formatting.
4665 verifyFormat(
4666 "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4667 " aaaaaaaaaa> aaaaaaaaaa);",
4668 NoBinPacking);
4669 verifyFormat(
4670 "void fffffffffff(\n"
4671 " aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4672 " aaaaaaaaaa);");
Daniel Jasper18210d72014-10-09 09:52:05 +00004673}
4674
Daniel Jasper9278eb92013-01-16 14:59:02 +00004675TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
Daniel Jaspera628c982013-04-03 13:36:17 +00004676 FormatStyle NoBinPacking = getGoogleStyle();
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004677 NoBinPacking.BinPackParameters = false;
Daniel Jasper18210d72014-10-09 09:52:05 +00004678 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004679 verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4680 " aaaaaaaaaaaaaaaaaaaa,\n"
4681 " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4682 NoBinPacking);
4683 verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4684 " aaaaaaaaaaaaa,\n"
4685 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4686 NoBinPacking);
4687 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004688 "aaaaaaaa(aaaaaaaaaaaaa,\n"
4689 " aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4690 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4691 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004692 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4693 NoBinPacking);
4694 verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4695 " .aaaaaaaaaaaaaaaaaa();",
4696 NoBinPacking);
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004697 verifyFormat("void f() {\n"
4698 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4699 " aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4700 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004701 NoBinPacking);
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004702
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004703 verifyFormat(
Daniel Jaspere941b162013-01-23 10:08:28 +00004704 "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4705 " aaaaaaaaaaaa,\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004706 " aaaaaaaaaaaa);",
4707 NoBinPacking);
4708 verifyFormat(
Daniel Jasper9278eb92013-01-16 14:59:02 +00004709 "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4710 " ddddddddddddddddddddddddddddd),\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004711 " test);",
4712 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004713
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004714 verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4715 " aaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper253dad232015-11-23 15:55:45 +00004716 " aaaaaaaaaaaaaaaaaaaaaaa>\n"
4717 " aaaaaaaaaaaaaaaaaa;",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004718 NoBinPacking);
4719 verifyFormat("a(\"a\"\n"
4720 " \"a\",\n"
4721 " a);");
Daniel Jaspere941b162013-01-23 10:08:28 +00004722
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004723 NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
Daniel Jasperf7db4332013-01-29 16:03:49 +00004724 verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
Daniel Jaspere941b162013-01-23 10:08:28 +00004725 " aaaaaaaaa,\n"
Daniel Jasperf7db4332013-01-29 16:03:49 +00004726 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004727 NoBinPacking);
Daniel Jasper687af3b2013-02-14 14:26:07 +00004728 verifyFormat(
4729 "void f() {\n"
4730 " aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4731 " .aaaaaaa();\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00004732 "}",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00004733 NoBinPacking);
Daniel Jasper53e8d852013-05-22 08:55:55 +00004734 verifyFormat(
4735 "template <class SomeType, class SomeOtherType>\n"
4736 "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4737 NoBinPacking);
Daniel Jasper9278eb92013-01-16 14:59:02 +00004738}
4739
Daniel Jasperb10cbc42013-07-10 14:02:49 +00004740TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4741 FormatStyle Style = getLLVMStyleWithColumns(15);
4742 Style.ExperimentalAutoDetectBinPacking = true;
4743 EXPECT_EQ("aaa(aaaa,\n"
4744 " aaaa,\n"
4745 " aaaa);\n"
4746 "aaa(aaaa,\n"
4747 " aaaa,\n"
4748 " aaaa);",
4749 format("aaa(aaaa,\n" // one-per-line
4750 " aaaa,\n"
4751 " aaaa );\n"
4752 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4753 Style));
4754 EXPECT_EQ("aaa(aaaa, aaaa,\n"
4755 " aaaa);\n"
4756 "aaa(aaaa, aaaa,\n"
4757 " aaaa);",
4758 format("aaa(aaaa, aaaa,\n" // bin-packed
4759 " aaaa );\n"
4760 "aaa(aaaa, aaaa, aaaa);", // inconclusive
4761 Style));
4762}
4763
Daniel Jasper04468962013-01-18 10:56:38 +00004764TEST_F(FormatTest, FormatsBuilderPattern) {
Daniel Jaspera44991332015-04-29 13:06:49 +00004765 verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4766 " .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4767 " .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4768 " .StartsWith(\".init\", ORDER_INIT)\n"
4769 " .StartsWith(\".fini\", ORDER_FINI)\n"
4770 " .StartsWith(\".hash\", ORDER_HASH)\n"
4771 " .Default(ORDER_TEXT);\n");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00004772
Daniel Jaspereb50c672013-02-15 20:33:06 +00004773 verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004774 " aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004775 verifyFormat(
Daniel Jasper801cdb22016-01-05 13:03:59 +00004776 "aaaaaaa->aaaaaaa\n"
4777 " ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4778 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasper9ed9ade2013-02-18 13:24:21 +00004779 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004780 verifyFormat(
Daniel Jasperf901a572015-12-07 19:50:48 +00004781 "aaaaaaa->aaaaaaa\n"
4782 " ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4783 " ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4784 verifyFormat(
Daniel Jaspere53beb22013-02-18 13:52:06 +00004785 "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
Daniel Jasperf9a84b52013-03-01 16:48:32 +00004786 " aaaaaaaaaaaaaa);");
Daniel Jaspere53beb22013-02-18 13:52:06 +00004787 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004788 "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4789 " aaaaaa->aaaaaaaaaaaa()\n"
4790 " ->aaaaaaaaaaaaaaaa(\n"
Daniel Jasper9dedc7752015-04-07 06:41:24 +00004791 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004792 " ->aaaaaaaaaaaaaaaaa();");
Daniel Jasper33b909c2013-10-25 14:29:37 +00004793 verifyGoogleFormat(
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004794 "void f() {\n"
4795 " someo->Add((new util::filetools::Handler(dir))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004796 " ->OnEvent1(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004797 " this, &HandlerHolderClass::EventHandlerCBA))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004798 " ->OnEvent2(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004799 " this, &HandlerHolderClass::EventHandlerCBB))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004800 " ->OnEvent3(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004801 " this, &HandlerHolderClass::EventHandlerCBC))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004802 " ->OnEvent5(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004803 " this, &HandlerHolderClass::EventHandlerCBD))\n"
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004804 " ->OnEvent6(NewPermanentCallback(\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004805 " this, &HandlerHolderClass::EventHandlerCBE)));\n"
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00004806 "}");
Daniel Jasper4c6e0052013-08-27 14:24:43 +00004807
4808 verifyFormat(
4809 "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4810 verifyFormat("aaaaaaaaaaaaaaa()\n"
4811 " .aaaaaaaaaaaaaaa()\n"
4812 " .aaaaaaaaaaaaaaa()\n"
4813 " .aaaaaaaaaaaaaaa()\n"
4814 " .aaaaaaaaaaaaaaa();");
4815 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4816 " .aaaaaaaaaaaaaaa()\n"
4817 " .aaaaaaaaaaaaaaa()\n"
4818 " .aaaaaaaaaaaaaaa();");
4819 verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4820 " .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4821 " .aaaaaaaaaaaaaaa();");
Daniel Jasperf8151e92013-08-30 07:12:40 +00004822 verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4823 " ->aaaaaaaaaaaaaae(0)\n"
4824 " ->aaaaaaaaaaaaaaa();");
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004825
Daniel Jasper775954b2015-04-24 10:08:09 +00004826 // Don't linewrap after very short segments.
4827 verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4828 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4829 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4830 verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4831 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4832 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4833 verifyFormat("aaa()\n"
4834 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4835 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4836 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4837
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004838 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4839 " .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4840 " .has<bbbbbbbbbbbbbbbbbbbbb>();");
4841 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4842 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
Daniel Jasper85bde4c2014-01-13 13:42:08 +00004843 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
Daniel Jaspercc3114d2013-10-18 15:23:06 +00004844
Daniel Jaspera41aa532014-09-19 08:01:25 +00004845 // Prefer not to break after empty parentheses.
Daniel Jasper36c28ce2013-09-06 08:54:24 +00004846 verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4847 " First->LastNewlineOffset);");
Daniel Jasperf901a572015-12-07 19:50:48 +00004848
4849 // Prefer not to create "hanging" indents.
4850 verifyFormat(
4851 "return !soooooooooooooome_map\n"
4852 " .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4853 " .second;");
Daniel Jasper00492f92016-01-05 13:03:50 +00004854 verifyFormat(
4855 "return aaaaaaaaaaaaaaaa\n"
4856 " .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4857 " .aaaa(aaaaaaaaaaaaaa);");
4858 // No hanging indent here.
4859 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4860 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4861 verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4862 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper801cdb22016-01-05 13:03:59 +00004863 verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4864 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4865 getLLVMStyleWithColumns(60));
4866 verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4867 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4868 " .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4869 getLLVMStyleWithColumns(59));
Daniel Jasper411af722016-01-05 16:10:39 +00004870 verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4871 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4872 " .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper04468962013-01-18 10:56:38 +00004873}
4874
Daniel Jasperde5c2072012-12-24 00:13:23 +00004875TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4876 verifyFormat(
4877 "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004878 " bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004879 verifyFormat(
4880 "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4881 " bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4882
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004883 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004884 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004885 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4886 " ccccccccccccccccccccccccc) {\n}");
4887
Daniel Jasper8d1832e2013-01-07 13:26:07 +00004888 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004889 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004890 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4891 " ccccccccccccccccccccccccc) {\n}");
4892
Daniel Jasperde5c2072012-12-24 00:13:23 +00004893 verifyFormat(
4894 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00004895 " ccccccccccccccccccccccccc) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004896 verifyFormat(
4897 "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4898 " ccccccccccccccccccccccccc) {\n}");
4899
Daniel Jasper400adc62013-02-08 15:28:42 +00004900 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4901 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4902 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4903 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004904 verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4905 " bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4906 " cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4907 " dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4908
Daniel Jasper400adc62013-02-08 15:28:42 +00004909 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4910 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4911 " aaaaaaaaaaaaaaa != aa) {\n}");
Nikola Smiljanice08a91e2014-05-08 00:05:13 +00004912 verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4913 " aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4914 " aaaaaaaaaaaaaaa != aa) {\n}");
Daniel Jasperde5c2072012-12-24 00:13:23 +00004915}
4916
Daniel Jasper43b65482013-01-23 12:27:43 +00004917TEST_F(FormatTest, BreaksAfterAssignments) {
Daniel Jasper206df732013-01-07 13:08:40 +00004918 verifyFormat(
Daniel Jasper43b65482013-01-23 12:27:43 +00004919 "unsigned Cost =\n"
4920 " TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4921 " SI->getPointerAddressSpaceee());\n");
Daniel Jasper206df732013-01-07 13:08:40 +00004922 verifyFormat(
Daniel Jasper1565eb32013-01-23 15:55:19 +00004923 "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4924 " Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
Daniel Jaspera836b902013-01-23 16:58:21 +00004925
4926 verifyFormat(
Daniel Jasperb27c4b72013-08-27 11:09:05 +00004927 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4928 " aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper7b27a102013-05-27 12:45:09 +00004929 verifyFormat("unsigned OriginalStartColumn =\n"
4930 " SourceMgr.getSpellingColumnNumber(\n"
4931 " Current.FormatTok.getStartOfNonWhitespace()) -\n"
4932 " 1;");
Daniel Jasper206df732013-01-07 13:08:40 +00004933}
4934
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004935TEST_F(FormatTest, AlignsAfterAssignments) {
4936 verifyFormat(
4937 "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004938 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004939 verifyFormat(
4940 "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004941 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004942 verifyFormat(
4943 "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004944 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004945 verifyFormat(
4946 "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
Daniel Jasper206df732013-01-07 13:08:40 +00004947 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperee7539a2013-07-08 14:25:23 +00004948 verifyFormat(
4949 "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4950 " aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4951 " aaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004952}
4953
4954TEST_F(FormatTest, AlignsAfterReturn) {
4955 verifyFormat(
4956 "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4957 " aaaaaaaaaaaaaaaaaaaaaaaaa;");
4958 verifyFormat(
4959 "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4960 " aaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperc238c872013-04-02 14:33:13 +00004961 verifyFormat(
4962 "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004963 " aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasperc238c872013-04-02 14:33:13 +00004964 verifyFormat(
4965 "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00004966 " aaaaaaaaaaaaaaaaaaaaaa());");
4967 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4968 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4969 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4970 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4971 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspereabede62013-09-30 08:29:03 +00004972 verifyFormat("return\n"
4973 " // true if code is one of a or b.\n"
4974 " code == a || code == b;");
Daniel Jasper2eda23e2012-12-24 13:43:52 +00004975}
4976
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004977TEST_F(FormatTest, AlignsAfterOpenBracket) {
4978 verifyFormat(
4979 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4980 " aaaaaaaaa aaaaaaa) {}");
4981 verifyFormat(
4982 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4983 " aaaaaaaaaaa aaaaaaaaa);");
4984 verifyFormat(
4985 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4986 " aaaaaaaaaaaaaaaaaaaaa));");
4987 FormatStyle Style = getLLVMStyle();
Daniel Jasper6501f7e2015-10-27 12:38:37 +00004988 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jaspera44991332015-04-29 13:06:49 +00004989 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4990 " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4991 Style);
4992 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4993 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4994 Style);
4995 verifyFormat("SomeLongVariableName->someFunction(\n"
4996 " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4997 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00004998 verifyFormat(
4999 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5000 " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5001 Style);
5002 verifyFormat(
5003 "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5004 " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5005 Style);
5006 verifyFormat(
5007 "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5008 " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5009 Style);
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005010
Daniel Jasper2a9f7202016-02-08 09:52:54 +00005011 verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
5012 " ccccccc(aaaaaaaaaaaaaaaaa, //\n"
5013 " b));",
5014 Style);
5015
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005016 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5017 Style.BinPackArguments = false;
5018 Style.BinPackParameters = false;
5019 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5020 " aaaaaaaaaaa aaaaaaaa,\n"
5021 " aaaaaaaaa aaaaaaa,\n"
5022 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5023 Style);
5024 verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5025 " aaaaaaaaaaa aaaaaaaaa,\n"
5026 " aaaaaaaaaaa aaaaaaaaa,\n"
5027 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5028 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00005029 verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
5030 " aaaaaaaaaaaaaaa,\n"
5031 " aaaaaaaaaaaaaaaaaaaaa,\n"
5032 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
Daniel Jasper870d1bc2015-12-14 08:41:18 +00005033 Style);
Daniel Jasper710f8492016-03-17 12:00:22 +00005034 verifyFormat(
5035 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
5036 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5037 Style);
5038 verifyFormat(
5039 "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
5040 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5041 Style);
5042 verifyFormat(
5043 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5044 " aaaaaaaaaaaaaaaaaaaaa(\n"
5045 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
5046 " aaaaaaaaaaaaaaaa);",
5047 Style);
5048 verifyFormat(
5049 "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5050 " aaaaaaaaaaaaaaaaaaaaa(\n"
5051 " aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
5052 " aaaaaaaaaaaaaaaa);",
5053 Style);
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +00005054}
5055
Daniel Jasper3219e432014-12-02 13:24:51 +00005056TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
5057 FormatStyle Style = getLLVMStyleWithColumns(40);
5058 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5059 " bbbbbbbbbbbbbbbbbbbbbb);",
5060 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005061 Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
Daniel Jasper3219e432014-12-02 13:24:51 +00005062 Style.AlignOperands = false;
5063 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5064 " bbbbbbbbbbbbbbbbbbbbbb);",
5065 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005066 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00005067 Style.AlignOperands = true;
5068 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5069 " bbbbbbbbbbbbbbbbbbbbbb);",
5070 Style);
Daniel Jasper6501f7e2015-10-27 12:38:37 +00005071 Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
Daniel Jasper3219e432014-12-02 13:24:51 +00005072 Style.AlignOperands = false;
5073 verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5074 " bbbbbbbbbbbbbbbbbbbbbb);",
5075 Style);
5076}
5077
Daniel Jasper399d24b2013-01-09 07:06:56 +00005078TEST_F(FormatTest, BreaksConditionalExpressions) {
5079 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005080 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
5081 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5082 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8c5fba92013-01-16 16:23:19 +00005083 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005084 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
5085 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5086 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005087 verifyFormat(
5088 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
5089 " : aaaaaaaaaaaaa);");
5090 verifyFormat(
5091 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperaab220f2013-03-20 13:53:11 +00005092 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005093 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5094 " aaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005095 verifyFormat(
5096 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5097 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5098 " aaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005099 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5100 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5101 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5102 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5103 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5104 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5105 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5106 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5107 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5108 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5109 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5110 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005111 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5112 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5113 " ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5114 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5115 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper54a86022013-02-15 11:07:25 +00005116 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5117 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5118 " : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005119 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5120 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5121 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5122 " : aaaaaaaaaaaaaaaa;");
Daniel Jaspercd8599e2013-02-23 21:01:55 +00005123 verifyFormat(
5124 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5125 " ? aaaaaaaaaaaaaaa\n"
5126 " : aaaaaaaaaaaaaaa;");
5127 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00005128 " aaaaaaaaa\n"
Daniel Jaspere7de2a32013-04-08 10:45:44 +00005129 " ? b\n"
5130 " : c);");
Daniel Jasper119ff532014-11-14 12:31:14 +00005131 verifyFormat("return aaaa == bbbb\n"
5132 " // comment\n"
5133 " ? aaaa\n"
5134 " : bbbb;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005135 verifyFormat("unsigned Indent =\n"
Daniel Jasper22ed2622016-11-29 09:40:32 +00005136 " format(TheLine.First,\n"
5137 " IndentForLevel[TheLine.Level] >= 0\n"
5138 " ? IndentForLevel[TheLine.Level]\n"
5139 " : TheLine * 2,\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005140 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
Daniel Jasper22ed2622016-11-29 09:40:32 +00005141 getLLVMStyleWithColumns(60));
Daniel Jasper2c611c02013-05-31 14:56:12 +00005142 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5143 " ? aaaaaaaaaaaaaaa\n"
5144 " : bbbbbbbbbbbbbbb //\n"
5145 " ? ccccccccccccccc\n"
5146 " : ddddddddddddddd;");
5147 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5148 " ? aaaaaaaaaaaaaaa\n"
5149 " : (bbbbbbbbbbbbbbb //\n"
5150 " ? ccccccccccccccc\n"
5151 " : ddddddddddddddd);");
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005152 verifyFormat(
5153 "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5154 " ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5155 " aaaaaaaaaaaaaaaaaaaaa +\n"
5156 " aaaaaaaaaaaaaaaaaaaaa\n"
5157 " : aaaaaaaaaa;");
Daniel Jasperfc3861a2014-07-17 12:22:04 +00005158 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005159 "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5160 " : aaaaaaaaaaaaaaaaaaaaaa\n"
5161 " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper54a86022013-02-15 11:07:25 +00005162
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005163 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper18210d72014-10-09 09:52:05 +00005164 NoBinPacking.BinPackArguments = false;
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005165 verifyFormat(
Daniel Jaspercd8599e2013-02-23 21:01:55 +00005166 "void f() {\n"
5167 " g(aaa,\n"
5168 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5169 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5170 " ? aaaaaaaaaaaaaaa\n"
5171 " : aaaaaaaaaaaaaaa);\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005172 "}",
5173 NoBinPacking);
Daniel Jasperb1ae7342013-08-01 22:05:00 +00005174 verifyFormat(
5175 "void f() {\n"
5176 " g(aaa,\n"
5177 " aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5178 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5179 " ?: aaaaaaaaaaaaaaa);\n"
5180 "}",
5181 NoBinPacking);
Daniel Jasper1a31bab2014-10-16 09:10:11 +00005182
5183 verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
5184 " // comment.\n"
5185 " ccccccccccccccccccccccccccccccccccccccc\n"
5186 " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5187 " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper6c22c442014-11-14 13:03:40 +00005188
5189 // Assignments in conditional expressions. Apparently not uncommon :-(.
5190 verifyFormat("return a != b\n"
5191 " // comment\n"
5192 " ? a = b\n"
5193 " : a = b;");
5194 verifyFormat("return a != b\n"
5195 " // comment\n"
5196 " ? a = a != b\n"
5197 " // comment\n"
5198 " ? a = b\n"
5199 " : a\n"
5200 " : a;\n");
5201 verifyFormat("return a != b\n"
5202 " // comment\n"
5203 " ? a\n"
5204 " : a = a != b\n"
5205 " // comment\n"
5206 " ? a = b\n"
5207 " : a;");
Daniel Jasper399d24b2013-01-09 07:06:56 +00005208}
5209
Daniel Jasper165b29e2013-11-08 00:57:11 +00005210TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
5211 FormatStyle Style = getLLVMStyle();
5212 Style.BreakBeforeTernaryOperators = false;
5213 Style.ColumnLimit = 70;
5214 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005215 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
5216 " aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5217 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005218 Style);
5219 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00005220 "aaaa(aaaaaaaaaaaaaaaaaaaa,\n"
5221 " aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5222 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
Daniel Jasper165b29e2013-11-08 00:57:11 +00005223 Style);
5224 verifyFormat(
5225 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
5226 " aaaaaaaaaaaaa);",
5227 Style);
5228 verifyFormat(
5229 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5230 " aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5231 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5232 " aaaaaaaaaaaaa);",
5233 Style);
5234 verifyFormat(
5235 "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5236 " aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5237 " aaaaaaaaaaaaa);",
5238 Style);
5239 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5240 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5241 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5242 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5243 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5244 Style);
5245 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5246 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5247 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5248 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5249 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5250 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5251 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5252 Style);
5253 verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5254 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
5255 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5256 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5257 " aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5258 Style);
5259 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5260 " aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5261 " aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5262 Style);
5263 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +00005264 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
Daniel Jasper165b29e2013-11-08 00:57:11 +00005265 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5266 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5267 Style);
5268 verifyFormat(
5269 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5270 " aaaaaaaaaaaaaaa :\n"
5271 " aaaaaaaaaaaaaaa;",
5272 Style);
5273 verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5274 " aaaaaaaaa ?\n"
5275 " b :\n"
5276 " c);",
5277 Style);
Daniel Jasper22ed2622016-11-29 09:40:32 +00005278 verifyFormat("unsigned Indent =\n"
5279 " format(TheLine.First,\n"
5280 " IndentForLevel[TheLine.Level] >= 0 ?\n"
5281 " IndentForLevel[TheLine.Level] :\n"
5282 " TheLine * 2,\n"
5283 " TheLine.InPPDirective, PreviousEndOfLineColumn);",
5284 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005285 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5286 " aaaaaaaaaaaaaaa :\n"
5287 " bbbbbbbbbbbbbbb ? //\n"
5288 " ccccccccccccccc :\n"
5289 " ddddddddddddddd;",
5290 Style);
5291 verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5292 " aaaaaaaaaaaaaaa :\n"
5293 " (bbbbbbbbbbbbbbb ? //\n"
5294 " ccccccccccccccc :\n"
5295 " ddddddddddddddd);",
5296 Style);
Daniel Jasper45860fa2016-02-03 17:27:10 +00005297 verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5298 " /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
5299 " ccccccccccccccccccccccccccc;",
5300 Style);
Daniel Jasper04b4e102016-03-01 04:19:59 +00005301 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5302 " aaaaa :\n"
5303 " bbbbbbbbbbbbbbb + cccccccccccccccc;",
5304 Style);
Daniel Jasper165b29e2013-11-08 00:57:11 +00005305}
5306
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005307TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
5308 verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
5309 " aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
5310 verifyFormat("bool a = true, b = false;");
5311
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005312 verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005313 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005314 " bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
Daniel Jasperc238c872013-04-02 14:33:13 +00005315 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005316 verifyFormat(
Daniel Jasper37905f72013-02-21 15:00:29 +00005317 "bool aaaaaaaaaaaaaaaaaaaaa =\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005318 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
Daniel Jasper37905f72013-02-21 15:00:29 +00005319 " d = e && f;");
Daniel Jasper31c96b92013-04-05 09:38:50 +00005320 verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
5321 " c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
5322 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5323 " *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
5324 verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
5325 " ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005326
Daniel Jasperbea1ab42015-03-01 18:55:26 +00005327 FormatStyle Style = getGoogleStyle();
5328 Style.PointerAlignment = FormatStyle::PAS_Left;
5329 Style.DerivePointerAlignment = false;
5330 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5331 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
5332 " *b = bbbbbbbbbbbbbbbbbbb;",
5333 Style);
Daniel Jaspera44991332015-04-29 13:06:49 +00005334 verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5335 " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
5336 Style);
Daniel Jasper3f2cde92016-09-26 15:14:24 +00005337 verifyFormat("vector<int*> a, b;", Style);
Daniel Jasper85d1f0b2016-10-04 20:18:25 +00005338 verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
Daniel Jasper38c11ce2013-01-29 11:21:01 +00005339}
5340
Nico Weber4a5030c2013-01-12 01:28:06 +00005341TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
5342 verifyFormat("arr[foo ? bar : baz];");
5343 verifyFormat("f()[foo ? bar : baz];");
5344 verifyFormat("(a + b)[foo ? bar : baz];");
5345 verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
5346}
5347
Daniel Jasperf7935112012-12-03 18:12:45 +00005348TEST_F(FormatTest, AlignsStringLiterals) {
5349 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
5350 " \"short literal\");");
5351 verifyFormat(
5352 "looooooooooooooooooooooooongFunction(\n"
5353 " \"short literal\"\n"
5354 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005355 verifyFormat("someFunction(\"Always break between multi-line\"\n"
5356 " \" string literals\",\n"
5357 " and, other, parameters);");
Daniel Jasper240527c2017-01-16 13:13:15 +00005358 EXPECT_EQ("fun +\n"
5359 " \"1243\" /* comment */\n"
5360 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005361 format("fun + \"1243\" /* comment */\n"
Daniel Jasper240527c2017-01-16 13:13:15 +00005362 " \"5678\";",
Manuel Klimek02f640a2013-02-20 15:25:48 +00005363 getLLVMStyleWithColumns(28)));
5364 EXPECT_EQ(
5365 "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5366 " \"aaaaaaaaaaaaaaaaaaaaa\"\n"
5367 " \"aaaaaaaaaaaaaaaa\";",
5368 format("aaaaaa ="
5369 "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
5370 "aaaaaaaaaaaaaaaaaaaaa\" "
5371 "\"aaaaaaaaaaaaaaaa\";"));
Daniel Jasper240527c2017-01-16 13:13:15 +00005372 verifyFormat("a = a +\n"
5373 " \"a\"\n"
5374 " \"a\"\n"
5375 " \"a\";");
5376 verifyFormat("f(\"a\",\n"
5377 " \"b\"\n"
5378 " \"c\");");
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00005379
5380 verifyFormat(
5381 "#define LL_FORMAT \"ll\"\n"
5382 "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
5383 " \"d, ddddddddd: %\" LL_FORMAT \"d\");");
Daniel Jasper47a04442013-05-13 20:50:15 +00005384
5385 verifyFormat("#define A(X) \\\n"
5386 " \"aaaaa\" #X \"bbbbbb\" \\\n"
5387 " \"ccccc\"",
5388 getLLVMStyleWithColumns(23));
5389 verifyFormat("#define A \"def\"\n"
5390 "f(\"abc\" A \"ghi\"\n"
5391 " \"jkl\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005392
5393 verifyFormat("f(L\"a\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005394 " L\"b\");");
Daniel Jasper04b6a082013-12-20 06:22:01 +00005395 verifyFormat("#define A(X) \\\n"
5396 " L\"aaaaa\" #X L\"bbbbbb\" \\\n"
5397 " L\"ccccc\"",
5398 getLLVMStyleWithColumns(25));
Daniel Jasper015c7a92015-05-11 15:15:48 +00005399
5400 verifyFormat("f(@\"a\"\n"
5401 " @\"b\");");
5402 verifyFormat("NSString s = @\"a\"\n"
Daniel Jasper09285532015-05-17 08:13:23 +00005403 " @\"b\"\n"
5404 " @\"c\";");
5405 verifyFormat("NSString s = @\"a\"\n"
5406 " \"b\"\n"
5407 " \"c\";");
Daniel Jasperf7935112012-12-03 18:12:45 +00005408}
5409
Zachary Turner448592e2015-12-18 22:20:15 +00005410TEST_F(FormatTest, ReturnTypeBreakingStyle) {
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005411 FormatStyle Style = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00005412 // No declarations or definitions should be moved to own line.
5413 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
5414 verifyFormat("class A {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005415 " int f() { return 1; }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005416 " int g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005417 "};\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005418 "int f() { return 1; }\n"
5419 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005420 Style);
Zachary Turner448592e2015-12-18 22:20:15 +00005421
5422 // All declarations and definitions should have the return type moved to its
5423 // own
5424 // line.
5425 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
5426 verifyFormat("class E {\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005427 " int\n"
5428 " f() {\n"
5429 " return 1;\n"
5430 " }\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005431 " int\n"
5432 " g();\n"
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005433 "};\n"
5434 "int\n"
5435 "f() {\n"
5436 " return 1;\n"
Zachary Turner448592e2015-12-18 22:20:15 +00005437 "}\n"
5438 "int\n"
5439 "g();\n",
5440 Style);
5441
5442 // Top-level definitions, and no kinds of declarations should have the
5443 // return type moved to its own line.
5444 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
5445 verifyFormat("class B {\n"
5446 " int f() { return 1; }\n"
5447 " int g();\n"
5448 "};\n"
5449 "int\n"
5450 "f() {\n"
5451 " return 1;\n"
5452 "}\n"
5453 "int g();\n",
5454 Style);
5455
5456 // Top-level definitions and declarations should have the return type moved
5457 // to its own line.
5458 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
5459 verifyFormat("class C {\n"
5460 " int f() { return 1; }\n"
5461 " int g();\n"
5462 "};\n"
5463 "int\n"
5464 "f() {\n"
5465 " return 1;\n"
5466 "}\n"
5467 "int\n"
5468 "g();\n",
5469 Style);
5470
5471 // All definitions should have the return type moved to its own line, but no
5472 // kinds of declarations.
5473 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5474 verifyFormat("class D {\n"
5475 " int\n"
5476 " f() {\n"
5477 " return 1;\n"
5478 " }\n"
5479 " int g();\n"
5480 "};\n"
5481 "int\n"
5482 "f() {\n"
5483 " return 1;\n"
5484 "}\n"
5485 "int g();\n",
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005486 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005487 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005488 "f(void) {\n" // Break here.
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005489 " return \"\";\n"
5490 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005491 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005492 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005493 verifyFormat("template <class T>\n"
5494 "T *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005495 "f(T &c) {\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005496 " return NULL;\n"
5497 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005498 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005499 Style);
Birunthan Mohanathas525579d2015-07-15 19:11:58 +00005500 verifyFormat("class C {\n"
5501 " int\n"
5502 " operator+() {\n"
5503 " return 1;\n"
5504 " }\n"
5505 " int\n"
5506 " operator()() {\n"
5507 " return 1;\n"
5508 " }\n"
5509 "};\n",
5510 Style);
5511 verifyFormat("void\n"
5512 "A::operator()() {}\n"
5513 "void\n"
5514 "A::operator>>() {}\n"
5515 "void\n"
5516 "A::operator+() {}\n",
5517 Style);
5518 verifyFormat("void *operator new(std::size_t s);", // No break here.
5519 Style);
5520 verifyFormat("void *\n"
5521 "operator new(std::size_t s) {}",
5522 Style);
5523 verifyFormat("void *\n"
5524 "operator delete[](void *ptr) {}",
5525 Style);
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005526 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Daniel Jasperdb764792014-08-14 11:36:03 +00005527 verifyFormat("const char *\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005528 "f(void)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005529 "{\n"
5530 " return \"\";\n"
5531 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005532 "const char *bar(void);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005533 Style);
Daniel Jasperdb764792014-08-14 11:36:03 +00005534 verifyFormat("template <class T>\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005535 "T *\n" // Problem here: no line break
5536 "f(T &c)\n" // Break here.
Daniel Jasperdb764792014-08-14 11:36:03 +00005537 "{\n"
5538 " return NULL;\n"
5539 "}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00005540 "template <class T> T *f(T &c);\n", // No break here.
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +00005541 Style);
Daniel Jasperca4ea1c2014-08-05 12:16:31 +00005542}
5543
Alexander Kornienko58611712013-07-04 12:02:44 +00005544TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5545 FormatStyle NoBreak = getLLVMStyle();
5546 NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5547 FormatStyle Break = getLLVMStyle();
5548 Break.AlwaysBreakBeforeMultilineStrings = true;
Daniel Jasperc834c702013-07-17 15:38:19 +00005549 verifyFormat("aaaa = \"bbbb\"\n"
5550 " \"cccc\";",
5551 NoBreak);
5552 verifyFormat("aaaa =\n"
5553 " \"bbbb\"\n"
5554 " \"cccc\";",
5555 Break);
5556 verifyFormat("aaaa(\"bbbb\"\n"
5557 " \"cccc\");",
5558 NoBreak);
5559 verifyFormat("aaaa(\n"
5560 " \"bbbb\"\n"
5561 " \"cccc\");",
5562 Break);
Daniel Jasper240527c2017-01-16 13:13:15 +00005563 verifyFormat("aaaa(qqq,\n"
5564 " \"bbbb\"\n"
5565 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005566 NoBreak);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005567 verifyFormat("aaaa(qqq,\n"
5568 " \"bbbb\"\n"
5569 " \"cccc\");",
Daniel Jasperc834c702013-07-17 15:38:19 +00005570 Break);
Daniel Jasper1bf729c2015-06-18 16:05:17 +00005571 verifyFormat("aaaa(qqq,\n"
5572 " L\"bbbb\"\n"
5573 " L\"cccc\");",
5574 Break);
Daniel Jasper240527c2017-01-16 13:13:15 +00005575 verifyFormat("aaaaa(aaaaaa,\n"
5576 " aaaaaaa(\"aaaa\"\n"
5577 " \"bbbb\"));",
Daniel Jasper04b6a082013-12-20 06:22:01 +00005578 Break);
Daniel Jasper9fb676a2015-06-19 10:32:28 +00005579 verifyFormat("string s = someFunction(\n"
5580 " \"abc\"\n"
5581 " \"abc\");",
5582 Break);
Daniel Jasperc834c702013-07-17 15:38:19 +00005583
Daniel Jasper3251fff2014-06-10 06:27:23 +00005584 // As we break before unary operators, breaking right after them is bad.
5585 verifyFormat("string foo = abc ? \"x\"\n"
5586 " \"blah blah blah blah blah blah\"\n"
5587 " : \"y\";",
5588 Break);
5589
Daniel Jasperc834c702013-07-17 15:38:19 +00005590 // Don't break if there is no column gain.
5591 verifyFormat("f(\"aaaa\"\n"
5592 " \"bbbb\");",
5593 Break);
5594
5595 // Treat literals with escaped newlines like multi-line string literals.
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005596 EXPECT_EQ("x = \"a\\\n"
5597 "b\\\n"
5598 "c\";",
5599 format("x = \"a\\\n"
5600 "b\\\n"
5601 "c\";",
5602 NoBreak));
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005603 EXPECT_EQ("xxxx =\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005604 " \"a\\\n"
5605 "b\\\n"
5606 "c\";",
Daniel Jasper2aaedd32015-06-18 09:12:47 +00005607 format("xxxx = \"a\\\n"
Alexander Kornienko657c67b2013-07-16 21:06:13 +00005608 "b\\\n"
5609 "c\";",
5610 Break));
Daniel Jasper27943052013-11-09 03:08:25 +00005611
5612 // Exempt ObjC strings for now.
5613 EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005614 " @\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005615 format("NSString *const kString = @\"aaaa\"\n"
Daniel Jasper015c7a92015-05-11 15:15:48 +00005616 "@\"bbbb\";",
Daniel Jasper27943052013-11-09 03:08:25 +00005617 Break));
Daniel Jasper6fd5d642015-01-20 12:59:20 +00005618
5619 Break.ColumnLimit = 0;
5620 verifyFormat("const char *hello = \"hello llvm\";", Break);
Alexander Kornienko58611712013-07-04 12:02:44 +00005621}
5622
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005623TEST_F(FormatTest, AlignsPipes) {
5624 verifyFormat(
5625 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5626 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5627 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5628 verifyFormat(
5629 "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5630 " << aaaaaaaaaaaaaaaaaaaa;");
5631 verifyFormat(
5632 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5633 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5634 verifyFormat(
Daniel Jasper7aacf462016-12-19 11:14:23 +00005635 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5636 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5637 verifyFormat(
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005638 "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5639 " \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5640 " << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5641 verifyFormat(
5642 "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5643 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5644 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jaspera44991332015-04-29 13:06:49 +00005645 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5646 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5647 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5648 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasper2fd16632015-05-17 07:27:09 +00005649 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5650 " << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
Daniel Jasper0e617842014-04-16 12:26:54 +00005651 verifyFormat(
5652 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5653 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper2603ee02013-02-04 07:34:48 +00005654
Daniel Jasperc0d606a2014-04-14 11:08:45 +00005655 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5656 " << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
Daniel Jasper173504e2015-05-10 21:15:07 +00005657 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5658 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5659 " aaaaaaaaaaaaaaaaaaaaa)\n"
5660 " << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper5962fa82015-06-03 09:26:03 +00005661 verifyFormat("LOG_IF(aaa == //\n"
5662 " bbb)\n"
5663 " << a << b;");
Daniel Jasperc238c872013-04-02 14:33:13 +00005664
Daniel Jasper467ddb12013-08-12 12:58:05 +00005665 // But sometimes, breaking before the first "<<" is desirable.
Daniel Jasper004177e2013-12-19 16:06:40 +00005666 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5667 " << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005668 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5669 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5670 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper467ddb12013-08-12 12:58:05 +00005671 verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5672 " << BEF << IsTemplate << Description << E->getType();");
Daniel Jasper602a7272016-02-11 13:15:14 +00005673 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5674 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5675 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5676 verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5677 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5678 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5679 " << aaa;");
Daniel Jasper77d5d312013-07-12 15:14:05 +00005680
Daniel Jasperc238c872013-04-02 14:33:13 +00005681 verifyFormat(
5682 "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5683 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper0b1f76b2013-09-29 12:02:57 +00005684
5685 // Incomplete string literal.
5686 EXPECT_EQ("llvm::errs() << \"\n"
5687 " << a;",
5688 format("llvm::errs() << \"\n<<a;"));
Manuel Klimek06c84f22013-11-20 11:20:32 +00005689
5690 verifyFormat("void f() {\n"
5691 " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5692 " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5693 "}");
Daniel Jasperd05d3a82015-01-08 13:56:57 +00005694
5695 // Handle 'endl'.
Daniel Jasper69963122015-02-17 10:05:15 +00005696 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5697 " << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5698 verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
Daniel Jasper0a589412016-01-05 13:06:27 +00005699
5700 // Handle '\n'.
5701 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5702 " << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5703 verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5704 " << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5705 verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5706 " << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5707 verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
Alexander Kornienko578fdd82012-12-06 18:03:27 +00005708}
5709
Daniel Jasper7209bb92016-12-13 11:16:42 +00005710TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5711 verifyFormat("return out << \"somepacket = {\\n\"\n"
5712 " << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5713 " << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5714 " << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5715 " << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5716 " << \"}\";");
5717
5718 verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5719 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5720 " << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5721 verifyFormat(
5722 "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5723 " << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5724 " << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5725 " << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5726 " << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5727 verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5728 " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5729 verifyFormat(
5730 "void f() {\n"
5731 " llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5732 " << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5733 "}");
5734
5735 // Breaking before the first "<<" is generally not desirable.
5736 verifyFormat(
5737 "llvm::errs()\n"
5738 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5739 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5740 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5741 " << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5742 getLLVMStyleWithColumns(70));
5743 verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5744 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5745 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5746 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5747 " << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5748 " << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5749 getLLVMStyleWithColumns(70));
5750
5751 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5752 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5753 " \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5754 verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5755 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5756 " \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
Daniel Jasperf789f052016-12-20 15:27:46 +00005757 verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5758 " (aaaa + aaaa);",
5759 getLLVMStyleWithColumns(40));
5760 verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5761 " (aaaaaaa + aaaaa));",
5762 getLLVMStyleWithColumns(40));
Daniel Jasper23888612016-12-22 12:37:06 +00005763 verifyFormat(
5764 "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5765 " SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5766 " bbbbbbbbbbbbbbbbbbbbbbb);");
Daniel Jasper7209bb92016-12-13 11:16:42 +00005767}
5768
Daniel Jasperf7935112012-12-03 18:12:45 +00005769TEST_F(FormatTest, UnderstandsEquals) {
5770 verifyFormat(
5771 "aaaaaaaaaaaaaaaaa =\n"
5772 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5773 verifyFormat(
5774 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005775 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005776 verifyFormat(
5777 "if (a) {\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00005778 " f();\n"
Daniel Jasperf7935112012-12-03 18:12:45 +00005779 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005780 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5781 "}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005782
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005783 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5784 " 100000000 + 10000000) {\n}");
Daniel Jasperf7935112012-12-03 18:12:45 +00005785}
5786
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005787TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005788 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5789 " .looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005790
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005791 verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5792 " ->looooooooooooooooooooooooooooooooooooooongFunction();");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005793
5794 verifyFormat(
5795 "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5796 " Parameter2);");
5797
5798 verifyFormat(
5799 "ShortObject->shortFunction(\n"
5800 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5801 " LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5802
5803 verifyFormat("loooooooooooooongFunction(\n"
5804 " LoooooooooooooongObject->looooooooooooooooongFunction());");
5805
5806 verifyFormat(
5807 "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5808 " ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5809
Daniel Jasper687af3b2013-02-14 14:26:07 +00005810 verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5811 " .WillRepeatedly(Return(SomeValue));");
Daniel Jasperd6f17d82014-09-12 16:35:28 +00005812 verifyFormat("void f() {\n"
5813 " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5814 " .Times(2)\n"
5815 " .WillRepeatedly(Return(SomeValue));\n"
5816 "}");
Daniel Jasper4d7a97a2014-01-10 08:40:17 +00005817 verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5818 " ccccccccccccccccccccccc);");
Daniel Jasper32a796b2013-05-27 11:50:16 +00005819 verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005820 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5821 " .aaaaa(aaaaa),\n"
Daniel Jasper32a796b2013-05-27 11:50:16 +00005822 " aaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005823 verifyFormat("void f() {\n"
5824 " aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5825 " aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5826 "}");
Daniel Jaspera44991332015-04-29 13:06:49 +00005827 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5828 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5829 " .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5830 " aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5831 " aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasperc238c872013-04-02 14:33:13 +00005832 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5833 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5834 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5835 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5836 "}");
Daniel Jasper687af3b2013-02-14 14:26:07 +00005837
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005838 // Here, it is not necessary to wrap at "." or "->".
Daniel Jasper2af6bbe2012-12-18 21:05:13 +00005839 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00005840 " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
Daniel Jasperc7345cc2013-01-07 07:13:20 +00005841 verifyFormat(
5842 "aaaaaaaaaaa->aaaaaaaaa(\n"
5843 " aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5844 " aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
Daniel Jaspere11095a2013-02-14 15:01:34 +00005845
5846 verifyFormat(
5847 "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5848 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
Daniel Jasper8f6ae192013-03-13 15:37:48 +00005849 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5850 " aaaaaaaaa()->aaaaaa()->aaaaa());");
5851 verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5852 " aaaaaaaaa()->aaaaaa()->aaaaa());");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005853
Daniel Jasper9b334242013-03-15 14:57:30 +00005854 verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasper05cd9292015-03-26 18:46:28 +00005855 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5856 " .a();");
Daniel Jasper9b334242013-03-15 14:57:30 +00005857
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00005858 FormatStyle NoBinPacking = getLLVMStyle();
5859 NoBinPacking.BinPackParameters = false;
5860 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5861 " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5862 " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5863 " aaaaaaaaaaaaaaaaaaa,\n"
5864 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5865 NoBinPacking);
Daniel Jasperbd058882013-07-09 11:57:27 +00005866
5867 // If there is a subsequent call, change to hanging indentation.
5868 verifyFormat(
5869 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5870 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5871 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5872 verifyFormat(
5873 "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5874 " aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
Daniel Jasper96964352013-12-18 10:44:36 +00005875 verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5876 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5877 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5878 verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5879 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5880 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
Daniel Jasper5485d0c2012-12-17 14:34:14 +00005881}
5882
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005883TEST_F(FormatTest, WrapsTemplateDeclarations) {
5884 verifyFormat("template <typename T>\n"
5885 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasper69bd8fb2013-09-27 07:49:08 +00005886 verifyFormat("template <typename T>\n"
5887 "// T should be one of {A, B}.\n"
5888 "virtual void loooooooooooongFunction(int Param1, int Param2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005889 verifyFormat(
Daniel Jasper04468962013-01-18 10:56:38 +00005890 "template <typename T>\n"
Daniel Jasper400adc62013-02-08 15:28:42 +00005891 "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00005892 verifyFormat("template <typename T>\n"
5893 "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5894 " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005895 verifyFormat(
5896 "template <typename T>\n"
5897 "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5898 " int Paaaaaaaaaaaaaaaaaaaaram2);");
Daniel Jasper90e51fd2013-01-02 18:30:06 +00005899 verifyFormat(
5900 "template <typename T>\n"
5901 "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5902 " aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5903 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper89058942013-01-09 09:50:48 +00005904 verifyFormat("template <typename T>\n"
5905 "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
Daniel Jaspera628c982013-04-03 13:36:17 +00005906 " int aaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperbcab4302013-01-09 10:40:23 +00005907 verifyFormat(
5908 "template <typename T1, typename T2 = char, typename T3 = char,\n"
5909 " typename T4 = char>\n"
5910 "void f();");
Daniel Jasper298c3402013-11-22 07:48:15 +00005911 verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5912 " template <typename> class cccccccccccccccccccccc,\n"
5913 " typename ddddddddddddd>\n"
5914 "class C {};");
Daniel Jasper7a31af12013-01-25 15:43:32 +00005915 verifyFormat(
5916 "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5917 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper3a9370c2013-02-04 07:21:18 +00005918
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00005919 verifyFormat("void f() {\n"
5920 " a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5921 " a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5922 "}");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005923
Daniel Jaspera9eb2aa2013-05-31 14:56:20 +00005924 verifyFormat("template <typename T> class C {};");
Daniel Jasper61e6bbf2013-05-29 12:07:31 +00005925 verifyFormat("template <typename T> void f();");
5926 verifyFormat("template <typename T> void f() {}");
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00005927 verifyFormat(
5928 "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5929 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5930 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5931 " new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5932 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5933 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5934 " bbbbbbbbbbbbbbbbbbbbbbbb);",
5935 getLLVMStyleWithColumns(72));
Daniel Jasperfcfac102014-07-15 09:00:34 +00005936 EXPECT_EQ("static_cast<A< //\n"
5937 " B> *>(\n"
5938 "\n"
5939 " );",
5940 format("static_cast<A<//\n"
5941 " B>*>(\n"
5942 "\n"
5943 " );"));
Daniel Jasper598dd332014-08-12 13:22:26 +00005944 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5945 " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
Daniel Jasper5c9e3cd2013-09-14 08:13:22 +00005946
5947 FormatStyle AlwaysBreak = getLLVMStyle();
5948 AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5949 verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5950 verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5951 verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5952 verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5953 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5954 " ccccccccccccccccccccccccccccccccccccccccccccccc);");
5955 verifyFormat("template <template <typename> class Fooooooo,\n"
5956 " template <typename> class Baaaaaaar>\n"
5957 "struct C {};",
5958 AlwaysBreak);
Daniel Jasperd3e014d2013-10-09 15:06:17 +00005959 verifyFormat("template <typename T> // T can be A, B or C.\n"
5960 "struct C {};",
5961 AlwaysBreak);
Daniel Jaspera7900ad2016-05-08 18:12:22 +00005962 verifyFormat("template <enum E> class A {\n"
5963 "public:\n"
5964 " E *f();\n"
5965 "};");
Daniel Jasperac5c1c22013-01-02 15:08:56 +00005966}
5967
Daniel Jasper45797022013-01-25 10:57:27 +00005968TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5969 verifyFormat(
5970 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5971 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5972 verifyFormat(
5973 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5974 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5975 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5976
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005977 // FIXME: Should we have the extra indent after the second break?
Daniel Jasper45797022013-01-25 10:57:27 +00005978 verifyFormat(
5979 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5980 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
Daniel Jasper0f0234e2013-05-08 10:00:18 +00005981 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00005982
Daniel Jasper45797022013-01-25 10:57:27 +00005983 verifyFormat(
5984 "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
Daniel Jasper4ad42352013-01-28 07:43:15 +00005985 " cccccccccccccccccccccccccccccccccccccccccccccc());");
Daniel Jasper45797022013-01-25 10:57:27 +00005986
5987 // Breaking at nested name specifiers is generally not desirable.
5988 verifyFormat(
5989 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5990 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperca6623b2013-01-28 12:45:14 +00005991
5992 verifyFormat(
Daniel Jasper240527c2017-01-16 13:13:15 +00005993 "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5994 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5995 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
Daniel Jasperca6623b2013-01-28 12:45:14 +00005996 " aaaaaaaaaaaaaaaaaaaaa);",
5997 getLLVMStyleWithColumns(74));
Daniel Jasperc238c872013-04-02 14:33:13 +00005998
5999 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6000 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6001 " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper45797022013-01-25 10:57:27 +00006002}
6003
Daniel Jasperf7935112012-12-03 18:12:45 +00006004TEST_F(FormatTest, UnderstandsTemplateParameters) {
6005 verifyFormat("A<int> a;");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006006 verifyFormat("A<A<A<int>>> a;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006007 verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
6008 verifyFormat("bool x = a < 1 || 2 > a;");
6009 verifyFormat("bool x = 5 < f<int>();");
6010 verifyFormat("bool x = f<int>() > 5;");
6011 verifyFormat("bool x = 5 < a<int>::x;");
6012 verifyFormat("bool x = a < 4 ? a > 2 : false;");
6013 verifyFormat("bool x = f() ? a < 2 : a > 2;");
6014
6015 verifyGoogleFormat("A<A<int>> a;");
6016 verifyGoogleFormat("A<A<A<int>>> a;");
6017 verifyGoogleFormat("A<A<A<A<int>>>> a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006018 verifyGoogleFormat("A<A<int> > a;");
6019 verifyGoogleFormat("A<A<A<int> > > a;");
6020 verifyGoogleFormat("A<A<A<A<int> > > > a;");
Daniel Jasperfba84ff2013-10-12 05:16:06 +00006021 verifyGoogleFormat("A<::A<int>> a;");
6022 verifyGoogleFormat("A<::A> a;");
6023 verifyGoogleFormat("A< ::A> a;");
6024 verifyGoogleFormat("A< ::A<int> > a;");
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006025 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
6026 EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
Daniel Jasperfba84ff2013-10-12 05:16:06 +00006027 EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
6028 EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006029 EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
6030 format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006031
Nico Weber7533b4d2014-09-24 17:17:32 +00006032 verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
6033
Daniel Jasperf7935112012-12-03 18:12:45 +00006034 verifyFormat("test >> a >> b;");
6035 verifyFormat("test << a >> b;");
6036
6037 verifyFormat("f<int>();");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006038 verifyFormat("template <typename T> void f() {}");
Daniel Jasperb13135b2015-01-08 08:48:21 +00006039 verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
Daniel Jasper112b50e2015-05-06 14:53:50 +00006040 verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
6041 "sizeof(char)>::type>;");
Daniel Jasperadba2aa2015-05-18 12:52:00 +00006042 verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
Daniel Jasper0c9772e2016-02-05 14:17:16 +00006043 verifyFormat("f(a.operator()<A>());");
6044 verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6045 " .template operator()<A>());",
6046 getLLVMStyleWithColumns(35));
Daniel Jasperd5893912013-06-01 18:56:00 +00006047
6048 // Not template parameters.
6049 verifyFormat("return a < b && c > d;");
6050 verifyFormat("void f() {\n"
6051 " while (a < b && c > d) {\n"
6052 " }\n"
6053 "}");
Daniel Jasper62c0ac02013-07-30 22:37:19 +00006054 verifyFormat("template <typename... Types>\n"
6055 "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
Daniel Jasper0de8efa2013-09-17 08:15:46 +00006056
6057 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6058 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
6059 getLLVMStyleWithColumns(60));
Daniel Jasper6ba16382014-07-28 13:19:58 +00006060 verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
Daniel Jasper65df5aa2014-08-04 14:51:02 +00006061 verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
Daniel Jasper4d9ec172015-05-06 08:38:24 +00006062 verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
Daniel Jasperf7935112012-12-03 18:12:45 +00006063}
6064
Malcolm Parsons6af3f142016-11-03 16:57:30 +00006065TEST_F(FormatTest, BitshiftOperatorWidth) {
6066 EXPECT_EQ("int a = 1 << 2; /* foo\n"
6067 " bar */",
6068 format("int a=1<<2; /* foo\n"
6069 " bar */"));
6070
6071 EXPECT_EQ("int b = 256 >> 1; /* foo\n"
6072 " bar */",
6073 format("int b =256>>1 ; /* foo\n"
6074 " bar */"));
6075}
6076
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006077TEST_F(FormatTest, UnderstandsBinaryOperators) {
6078 verifyFormat("COMPARE(a, ==, b);");
Daniel Jasper594be2f2016-06-13 07:49:09 +00006079 verifyFormat("auto s = sizeof...(Ts) - 1;");
Alexander Kornienko674be0a2013-03-20 16:41:56 +00006080}
6081
6082TEST_F(FormatTest, UnderstandsPointersToMembers) {
6083 verifyFormat("int A::*x;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006084 verifyFormat("int (S::*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006085 verifyFormat("void f() { int (S::*func)(void *); }");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006086 verifyFormat("typedef bool *(Class::*Member)() const;");
Daniel Jaspercfda5172013-05-08 14:58:20 +00006087 verifyFormat("void f() {\n"
6088 " (a->*f)();\n"
6089 " a->*x;\n"
6090 " (a.*f)();\n"
6091 " ((*a).*f)();\n"
6092 " a.*x;\n"
6093 "}");
Daniel Jasper998cabc2013-07-18 14:46:07 +00006094 verifyFormat("void f() {\n"
6095 " (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
6096 " aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
6097 "}");
Daniel Jasper85bcadc2014-07-09 13:07:57 +00006098 verifyFormat(
6099 "(aaaaaaaaaa->*bbbbbbb)(\n"
6100 " aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006101 FormatStyle Style = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006102 Style.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2f34cac2013-05-08 15:06:58 +00006103 verifyFormat("typedef bool* (Class::*Member)() const;", Style);
Daniel Jasperd8ffcfa2013-02-28 09:21:10 +00006104}
6105
Daniel Jasper8dd40472012-12-21 09:41:31 +00006106TEST_F(FormatTest, UnderstandsUnaryOperators) {
Daniel Jasperf7935112012-12-03 18:12:45 +00006107 verifyFormat("int a = -2;");
Daniel Jasper8b529712012-12-04 13:02:32 +00006108 verifyFormat("f(-1, -2, -3);");
6109 verifyFormat("a[-1] = 5;");
6110 verifyFormat("int a = 5 + -2;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006111 verifyFormat("if (i == -1) {\n}");
6112 verifyFormat("if (i != -1) {\n}");
6113 verifyFormat("if (i > -1) {\n}");
6114 verifyFormat("if (i < -1) {\n}");
Daniel Jasper26333c32012-12-06 13:16:39 +00006115 verifyFormat("++(a->f());");
6116 verifyFormat("--(a->f());");
Daniel Jasper13f23e12013-01-14 12:18:19 +00006117 verifyFormat("(a->f())++;");
6118 verifyFormat("a[42]++;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006119 verifyFormat("if (!(a->f())) {\n}");
Daniel Jasper8dd40472012-12-21 09:41:31 +00006120
6121 verifyFormat("a-- > b;");
6122 verifyFormat("b ? -a : c;");
6123 verifyFormat("n * sizeof char16;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006124 verifyFormat("n * alignof char16;", getGoogleStyle());
Daniel Jasper8dd40472012-12-21 09:41:31 +00006125 verifyFormat("sizeof(char);");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006126 verifyFormat("alignof(char);", getGoogleStyle());
Daniel Jasperda1c68a2013-01-02 15:26:16 +00006127
6128 verifyFormat("return -1;");
6129 verifyFormat("switch (a) {\n"
6130 "case -1:\n"
6131 " break;\n"
6132 "}");
Daniel Jasper399d1ee2013-03-22 10:44:43 +00006133 verifyFormat("#define X -1");
6134 verifyFormat("#define X -kConstant");
Nico Weber63a54eb2013-01-12 05:41:23 +00006135
Chandler Carruthf8b72662014-03-02 12:37:31 +00006136 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
6137 verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
Daniel Jasper71945272013-01-15 14:27:39 +00006138
6139 verifyFormat("int a = /* confusing comment */ -1;");
6140 // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
6141 verifyFormat("int a = i /* confusing comment */++;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006142}
6143
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006144TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
Daniel Jasperf110e202013-08-21 08:39:01 +00006145 verifyFormat("if (!aaaaaaaaaa( // break\n"
Daniel Jasper0c214fa2014-02-05 13:43:04 +00006146 " aaaaa)) {\n"
Daniel Jasperf110e202013-08-21 08:39:01 +00006147 "}");
6148 verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
Daniel Jasper739b85f2015-06-29 10:42:59 +00006149 " aaaaa));");
Daniel Jasper0649d362013-08-23 15:14:03 +00006150 verifyFormat("*aaa = aaaaaaa( // break\n"
6151 " bbbbbb);");
Daniel Jasperf110e202013-08-21 08:39:01 +00006152}
6153
Daniel Jasper8863ada2013-08-26 08:10:17 +00006154TEST_F(FormatTest, UnderstandsOverloadedOperators) {
Daniel Jasper537a2962012-12-24 10:56:04 +00006155 verifyFormat("bool operator<();");
6156 verifyFormat("bool operator>();");
6157 verifyFormat("bool operator=();");
6158 verifyFormat("bool operator==();");
6159 verifyFormat("bool operator!=();");
6160 verifyFormat("int operator+();");
6161 verifyFormat("int operator++();");
Daniel Jasper804a2762016-01-09 15:56:40 +00006162 verifyFormat("bool operator,();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006163 verifyFormat("bool operator();");
6164 verifyFormat("bool operator()();");
6165 verifyFormat("bool operator[]();");
6166 verifyFormat("operator bool();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006167 verifyFormat("operator int();");
6168 verifyFormat("operator void *();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006169 verifyFormat("operator SomeType<int>();");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006170 verifyFormat("operator SomeType<int, int>();");
Chandler Carruthf8b72662014-03-02 12:37:31 +00006171 verifyFormat("operator SomeType<SomeType<int>>();");
Daniel Jasper537a2962012-12-24 10:56:04 +00006172 verifyFormat("void *operator new(std::size_t size);");
6173 verifyFormat("void *operator new[](std::size_t size);");
6174 verifyFormat("void operator delete(void *ptr);");
6175 verifyFormat("void operator delete[](void *ptr);");
Daniel Jasper8f9624b2013-05-10 07:59:58 +00006176 verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
6177 "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
Daniel Jasper804a2762016-01-09 15:56:40 +00006178 verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
Daniel Jasperdf51f2e62016-01-11 12:55:33 +00006179 " aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006180
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006181 verifyFormat(
6182 "ostream &operator<<(ostream &OutputStream,\n"
6183 " SomeReallyLongType WithSomeReallyLongValue);");
Daniel Jasper54ac8202013-04-05 17:21:59 +00006184 verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
6185 " const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
6186 " return left.group < right.group;\n"
6187 "}");
Daniel Jasper6e8f4ed2013-04-11 08:48:20 +00006188 verifyFormat("SomeType &operator=(const SomeType &S);");
Daniel Jasper8835a322014-10-20 13:56:30 +00006189 verifyFormat("f.template operator()<int>();");
Daniel Jasper0af92eb2013-02-15 19:24:08 +00006190
Daniel Jasper35d2dc72013-02-11 08:01:18 +00006191 verifyGoogleFormat("operator void*();");
6192 verifyGoogleFormat("operator SomeType<SomeType<int>>();");
Daniel Jasperedc5f092013-10-29 12:24:23 +00006193 verifyGoogleFormat("operator ::A();");
Daniel Jasper42401c82013-09-02 09:20:39 +00006194
6195 verifyFormat("using A::operator+;");
Daniel Jasper5af04a42015-10-07 03:43:10 +00006196 verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
6197 "int i;");
Daniel Jasperf7935112012-12-03 18:12:45 +00006198}
6199
Daniel Jasper1c220482015-02-25 10:30:06 +00006200TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
Daniel Jasperaf642c62015-08-25 13:40:51 +00006201 verifyFormat("Deleted &operator=(const Deleted &) & = default;");
6202 verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
6203 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
6204 verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
6205 verifyFormat("Deleted &operator=(const Deleted &) &;");
6206 verifyFormat("Deleted &operator=(const Deleted &) &&;");
6207 verifyFormat("SomeType MemberFunction(const Deleted &) &;");
6208 verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
6209 verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
6210 verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
6211 verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00006212 verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
Daniel Jasper28b4d512016-11-01 06:23:19 +00006213 verifyFormat("template <typename T>\n"
6214 "void F(T) && = delete;",
6215 getGoogleStyle());
Daniel Jasper1c220482015-02-25 10:30:06 +00006216
Daniel Jasperaf642c62015-08-25 13:40:51 +00006217 FormatStyle AlignLeft = getLLVMStyle();
6218 AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper2b4d6ea2016-06-08 08:23:46 +00006219 verifyFormat("void A::b() && {}", AlignLeft);
Daniel Jasperaf642c62015-08-25 13:40:51 +00006220 verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
6221 verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
6222 AlignLeft);
6223 verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
6224 verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006225 verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
6226 verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
6227 verifyFormat("auto Function(T) & -> void {}", AlignLeft);
6228 verifyFormat("auto Function(T) & -> void;", AlignLeft);
Daniel Jasper43e4d3a2016-06-13 07:49:28 +00006229 verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
Daniel Jasper1c220482015-02-25 10:30:06 +00006230
6231 FormatStyle Spaces = getLLVMStyle();
6232 Spaces.SpacesInCStyleCastParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006233 verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
6234 verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
6235 verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
6236 verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006237
6238 Spaces.SpacesInCStyleCastParentheses = false;
6239 Spaces.SpacesInParentheses = true;
Daniel Jasperaf642c62015-08-25 13:40:51 +00006240 verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
6241 verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
6242 verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
6243 verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
Daniel Jasper1c220482015-02-25 10:30:06 +00006244}
6245
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006246TEST_F(FormatTest, UnderstandsNewAndDelete) {
Daniel Jasperba0bda92013-02-23 08:07:18 +00006247 verifyFormat("void f() {\n"
6248 " A *a = new A;\n"
6249 " A *a = new (placement) A;\n"
6250 " delete a;\n"
6251 " delete (A *)a;\n"
6252 "}");
Daniel Jasper71646ec2014-07-30 12:14:10 +00006253 verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6254 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper316ab382014-08-06 13:14:58 +00006255 verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6256 " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6257 " typename aaaaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jasper80222262014-11-02 22:46:42 +00006258 verifyFormat("delete[] h->p;");
Daniel Jasperd6a947f2013-01-11 16:09:04 +00006259}
6260
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006261TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006262 verifyFormat("int *f(int *a) {}");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006263 verifyFormat("int main(int argc, char **argv) {}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006264 verifyFormat("Test::Test(int b) : a(b * b) {}");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006265 verifyIndependentOfContext("f(a, *a);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006266 verifyFormat("void g() { f(*a); }");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006267 verifyIndependentOfContext("int a = b * 10;");
6268 verifyIndependentOfContext("int a = 10 * b;");
6269 verifyIndependentOfContext("int a = b * c;");
6270 verifyIndependentOfContext("int a += b * c;");
6271 verifyIndependentOfContext("int a -= b * c;");
6272 verifyIndependentOfContext("int a *= b * c;");
6273 verifyIndependentOfContext("int a /= b * c;");
6274 verifyIndependentOfContext("int a = *b;");
6275 verifyIndependentOfContext("int a = *b * c;");
6276 verifyIndependentOfContext("int a = b * *c;");
Daniel Jasper93101662015-05-19 12:29:27 +00006277 verifyIndependentOfContext("int a = b * (10);");
6278 verifyIndependentOfContext("S << b * (10);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006279 verifyIndependentOfContext("return 10 * b;");
6280 verifyIndependentOfContext("return *b * *c;");
6281 verifyIndependentOfContext("return a & ~b;");
6282 verifyIndependentOfContext("f(b ? *c : *d);");
6283 verifyIndependentOfContext("int a = b ? *c : *d;");
6284 verifyIndependentOfContext("*b = a;");
6285 verifyIndependentOfContext("a * ~b;");
6286 verifyIndependentOfContext("a * !b;");
6287 verifyIndependentOfContext("a * +b;");
6288 verifyIndependentOfContext("a * -b;");
6289 verifyIndependentOfContext("a * ++b;");
6290 verifyIndependentOfContext("a * --b;");
6291 verifyIndependentOfContext("a[4] * b;");
Daniel Jasper8e559272013-02-27 11:43:50 +00006292 verifyIndependentOfContext("a[a * a] = 1;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006293 verifyIndependentOfContext("f() * b;");
6294 verifyIndependentOfContext("a * [self dostuff];");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006295 verifyIndependentOfContext("int x = a * (a + b);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006296 verifyIndependentOfContext("(a *)(a + b);");
Daniel Jasper942d9712014-04-28 09:19:28 +00006297 verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006298 verifyIndependentOfContext("int *pa = (int *)&a;");
Nico Weber44449172013-02-12 16:17:07 +00006299 verifyIndependentOfContext("return sizeof(int **);");
6300 verifyIndependentOfContext("return sizeof(int ******);");
6301 verifyIndependentOfContext("return (int **&)a;");
Daniel Jasper4d03d3b2013-05-28 15:27:10 +00006302 verifyIndependentOfContext("f((*PointerToArray)[10]);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006303 verifyFormat("void f(Type (*parameter)[10]) {}");
Daniel Jasper4bc013e2015-10-07 01:41:22 +00006304 verifyFormat("void f(Type (&parameter)[10]) {}");
Nico Weber44449172013-02-12 16:17:07 +00006305 verifyGoogleFormat("return sizeof(int**);");
6306 verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
6307 verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006308 verifyFormat("auto a = [](int **&, int ***) {};");
Daniel Jasperd46e07e2013-10-20 18:15:30 +00006309 verifyFormat("auto PointerBinding = [](const char *S) {};");
Daniel Jasper71665cd2013-09-10 10:26:38 +00006310 verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
Daniel Jasper4ac7de72014-06-11 07:35:16 +00006311 verifyFormat("[](const decltype(*a) &value) {}");
Daniel Jasper033181b2015-08-13 13:43:51 +00006312 verifyFormat("decltype(a * b) F();");
Daniel Jasper99b5a462015-05-12 10:20:32 +00006313 verifyFormat("#define MACRO() [](A *a) { return 1; }");
Daniel Jasperd27df3d2016-02-01 11:21:07 +00006314 verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
Daniel Jasper3682fcd2013-12-16 08:36:18 +00006315 verifyIndependentOfContext("typedef void (*f)(int *a);");
Daniel Jasper39485162014-05-22 09:00:33 +00006316 verifyIndependentOfContext("int i{a * b};");
Daniel Jasper7d028292014-06-02 11:54:20 +00006317 verifyIndependentOfContext("aaa && aaa->f();");
Daniel Jasper2ac3fdf2014-07-28 12:08:16 +00006318 verifyIndependentOfContext("int x = ~*p;");
Daniel Jasperd127e3b2014-11-14 17:26:49 +00006319 verifyFormat("Constructor() : a(a), area(width * height) {}");
Daniel Jaspere1e348b2014-11-17 18:42:22 +00006320 verifyFormat("Constructor() : a(a), area(a, width * height) {}");
Daniel Jaspere4ab49e2015-04-20 12:54:29 +00006321 verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
Daniel Jasper6a3fd832014-11-17 13:55:04 +00006322 verifyFormat("void f() { f(a, c * d); }");
Daniel Jasper3a26a8d2015-05-13 12:54:30 +00006323 verifyFormat("void f() { f(new a(), c * d); }");
Daniel Jasperc941e7d2017-01-09 11:04:07 +00006324 verifyFormat("void f(const MyOverride &override);");
6325 verifyFormat("void f(const MyFinal &final);");
6326 verifyIndependentOfContext("bool a = f() && override.f();");
6327 verifyIndependentOfContext("bool a = f() && final.f();");
Daniel Jasper27234032012-12-07 09:52:15 +00006328
Daniel Jasper5b49f472013-01-23 12:10:53 +00006329 verifyIndependentOfContext("InvalidRegions[*R] = 0;");
Daniel Jasper3c2557d2013-01-04 20:46:38 +00006330
Daniel Jasper5b49f472013-01-23 12:10:53 +00006331 verifyIndependentOfContext("A<int *> a;");
6332 verifyIndependentOfContext("A<int **> a;");
6333 verifyIndependentOfContext("A<int *, int *> a;");
Daniel Jasper139d4a32014-04-08 13:07:41 +00006334 verifyIndependentOfContext("A<int *[]> a;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006335 verifyIndependentOfContext(
6336 "const char *const p = reinterpret_cast<const char *const>(q);");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006337 verifyIndependentOfContext("A<int **, int **> a;");
Daniel Jasper8035b0a2013-02-06 10:57:42 +00006338 verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
Daniel Jasperae907642013-03-14 10:50:25 +00006339 verifyFormat("for (char **a = b; *a; ++a) {\n}");
Daniel Jasperc37de302013-05-03 14:41:24 +00006340 verifyFormat("for (; a && b;) {\n}");
Daniel Jasperea2d0422014-05-08 08:50:10 +00006341 verifyFormat("bool foo = true && [] { return false; }();");
Daniel Jaspera4396862012-12-10 18:59:13 +00006342
Daniel Jasper66dcb1c2013-01-08 20:03:18 +00006343 verifyFormat(
6344 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6345 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6346
Daniel Jasper1f5d6372016-06-13 14:45:12 +00006347 verifyGoogleFormat("int const* a = &b;");
Daniel Jasper6a968202015-01-07 12:19:53 +00006348 verifyGoogleFormat("**outparam = 1;");
Daniel Jasper75092162015-01-23 19:04:49 +00006349 verifyGoogleFormat("*outparam = a * b;");
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006350 verifyGoogleFormat("int main(int argc, char** argv) {}");
Daniel Jaspera4396862012-12-10 18:59:13 +00006351 verifyGoogleFormat("A<int*> a;");
6352 verifyGoogleFormat("A<int**> a;");
6353 verifyGoogleFormat("A<int*, int*> a;");
6354 verifyGoogleFormat("A<int**, int**> a;");
Daniel Jasper22bcf8a2013-01-02 08:57:10 +00006355 verifyGoogleFormat("f(b ? *c : *d);");
6356 verifyGoogleFormat("int a = b ? *c : *d;");
Daniel Jaspera1dc93a2013-01-16 16:04:06 +00006357 verifyGoogleFormat("Type* t = **x;");
6358 verifyGoogleFormat("Type* t = *++*x;");
6359 verifyGoogleFormat("*++*x;");
6360 verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
6361 verifyGoogleFormat("Type* t = x++ * y;");
Daniel Jasperc697ad22013-02-06 10:05:46 +00006362 verifyGoogleFormat(
6363 "const char* const p = reinterpret_cast<const char* const>(q);");
Daniel Jasper8184d662014-07-28 12:24:21 +00006364 verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
Daniel Jasper0bd9a192014-11-10 16:57:30 +00006365 verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
6366 verifyGoogleFormat("template <typename T>\n"
6367 "void f(int i = 0, SomeType** temps = NULL);");
Manuel Klimek557811f2013-01-14 10:58:01 +00006368
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006369 FormatStyle Left = getLLVMStyle();
6370 Left.PointerAlignment = FormatStyle::PAS_Left;
6371 verifyFormat("x = *a(x) = *a(y);", Left);
Daniel Jasper28b4d512016-11-01 06:23:19 +00006372 verifyFormat("for (;; *a = b) {\n}", Left);
Daniel Jasper95516cd2015-12-23 18:01:29 +00006373 verifyFormat("return *this += 1;", Left);
Daniel Jasper1904e9b2014-08-14 10:53:19 +00006374
Daniel Jasper5b49f472013-01-23 12:10:53 +00006375 verifyIndependentOfContext("a = *(x + y);");
6376 verifyIndependentOfContext("a = &(x + y);");
6377 verifyIndependentOfContext("*(x + y).call();");
6378 verifyIndependentOfContext("&(x + y)->call();");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006379 verifyFormat("void f() { &(*I).first; }");
Daniel Jasper71945272013-01-15 14:27:39 +00006380
Daniel Jasper5b49f472013-01-23 12:10:53 +00006381 verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
Daniel Jasper71945272013-01-15 14:27:39 +00006382 verifyFormat(
Daniel Jasperf9fc2152014-04-09 13:18:49 +00006383 "int *MyValues = {\n"
6384 " *A, // Operator detection might be confused by the '{'\n"
6385 " *BB // Operator detection might be confused by previous comment\n"
Daniel Jasper71945272013-01-15 14:27:39 +00006386 "};");
Nico Weber80a82762013-01-17 17:17:19 +00006387
Daniel Jasper5b49f472013-01-23 12:10:53 +00006388 verifyIndependentOfContext("if (int *a = &b)");
6389 verifyIndependentOfContext("if (int &a = *b)");
6390 verifyIndependentOfContext("if (a & b[i])");
6391 verifyIndependentOfContext("if (a::b::c::d & b[i])");
6392 verifyIndependentOfContext("if (*b[i])");
6393 verifyIndependentOfContext("if (int *a = (&b))");
6394 verifyIndependentOfContext("while (int *a = &b)");
Daniel Jasperdf620b22013-09-21 17:31:51 +00006395 verifyIndependentOfContext("size = sizeof *a;");
Daniel Jasperdc4f7252015-03-11 12:59:49 +00006396 verifyIndependentOfContext("if (a && (b = c))");
Daniel Jasper420d7d32013-01-23 12:58:14 +00006397 verifyFormat("void f() {\n"
6398 " for (const int &v : Values) {\n"
6399 " }\n"
6400 "}");
Daniel Jasper5065bc42013-02-18 12:44:35 +00006401 verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
6402 verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
Daniel Jasper5ca9b712013-09-11 20:37:10 +00006403 verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
Daniel Jasper0b820602013-01-22 11:46:26 +00006404
Daniel Jaspera98da3d2013-11-07 19:56:07 +00006405 verifyFormat("#define A (!a * b)");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006406 verifyFormat("#define MACRO \\\n"
6407 " int *i = a * b; \\\n"
6408 " void f(a *b);",
6409 getLLVMStyleWithColumns(19));
6410
Daniel Jasper97b89482013-03-13 07:49:51 +00006411 verifyIndependentOfContext("A = new SomeType *[Length];");
Daniel Jasper5b49f472013-01-23 12:10:53 +00006412 verifyIndependentOfContext("A = new SomeType *[Length]();");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006413 verifyIndependentOfContext("T **t = new T *;");
6414 verifyIndependentOfContext("T **t = new T *();");
Daniel Jasper532a0312015-04-23 10:23:53 +00006415 verifyGoogleFormat("A = new SomeType*[Length]();");
6416 verifyGoogleFormat("A = new SomeType*[Length];");
Daniel Jasper6f9c8d22013-07-05 13:30:40 +00006417 verifyGoogleFormat("T** t = new T*;");
6418 verifyGoogleFormat("T** t = new T*();");
Daniel Jasperb910bbb2013-05-13 07:14:40 +00006419
Daniel Jasper990ff972013-05-07 14:17:18 +00006420 FormatStyle PointerLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006421 PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasper990ff972013-05-07 14:17:18 +00006422 verifyFormat("delete *x;", PointerLeft);
Daniel Jaspera65e8872014-03-25 10:52:45 +00006423 verifyFormat("STATIC_ASSERT((a & b) == 0);");
6424 verifyFormat("STATIC_ASSERT(0 == (a & b));");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006425 verifyFormat("template <bool a, bool b> "
Daniel Jasper4afc6b32014-06-02 10:57:55 +00006426 "typename t::if<x && y>::type f() {}");
6427 verifyFormat("template <int *y> f() {}");
Manuel Klimekf81e5c02014-03-27 11:17:36 +00006428 verifyFormat("vector<int *> v;");
6429 verifyFormat("vector<int *const> v;");
6430 verifyFormat("vector<int *const **const *> v;");
6431 verifyFormat("vector<int *volatile> v;");
6432 verifyFormat("vector<a * b> v;");
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006433 verifyFormat("foo<b && false>();");
6434 verifyFormat("foo<b & 1>();");
Daniel Jasper73e171f2014-08-29 12:54:38 +00006435 verifyFormat("decltype(*::std::declval<const T &>()) void F();");
Daniel Jasper13a7f462014-10-28 18:11:52 +00006436 verifyFormat(
Daniel Jasper22ed2622016-11-29 09:40:32 +00006437 "template <class T,\n"
6438 " class = typename std::enable_if<\n"
6439 " std::is_integral<T>::value &&\n"
6440 " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006441 "void F();",
Daniel Jasper22ed2622016-11-29 09:40:32 +00006442 getLLVMStyleWithColumns(70));
Daniel Jasperf0c809a2014-10-28 18:28:22 +00006443 verifyFormat(
6444 "template <class T,\n"
6445 " class = typename ::std::enable_if<\n"
6446 " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6447 "void F();",
6448 getGoogleStyleWithColumns(68));
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006449
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006450 verifyIndependentOfContext("MACRO(int *i);");
6451 verifyIndependentOfContext("MACRO(auto *a);");
6452 verifyIndependentOfContext("MACRO(const A *a);");
Daniel Jasper91beebd2014-06-30 13:44:47 +00006453 verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
Daniel Jasperd0d27aa2016-11-01 06:23:14 +00006454 verifyFormat("void f() { f(float{1}, a * a); }");
Daniel Jaspercc7bf7f2014-04-03 09:00:49 +00006455 // FIXME: Is there a way to make this work?
6456 // verifyIndependentOfContext("MACRO(A *a);");
6457
Daniel Jasper32ccb032014-06-23 07:36:18 +00006458 verifyFormat("DatumHandle const *operator->() const { return input_; }");
Daniel Jasper0ea4d792015-10-07 01:41:14 +00006459 verifyFormat("return options != nullptr && operator==(*options);");
Daniel Jasper32ccb032014-06-23 07:36:18 +00006460
Daniel Jasper866468a2014-04-14 13:15:29 +00006461 EXPECT_EQ("#define OP(x) \\\n"
6462 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6463 " return s << a.DebugString(); \\\n"
6464 " }",
6465 format("#define OP(x) \\\n"
6466 " ostream &operator<<(ostream &s, const A &a) { \\\n"
6467 " return s << a.DebugString(); \\\n"
6468 " }",
6469 getLLVMStyleWithColumns(50)));
6470
Manuel Klimek1f9d80a2014-03-27 19:00:52 +00006471 // FIXME: We cannot handle this case yet; we might be able to figure out that
6472 // foo<x> d > v; doesn't make sense.
Daniel Jasper6ba16382014-07-28 13:19:58 +00006473 verifyFormat("foo<a<b && c> d> v;");
Daniel Jasper553d4872014-06-17 12:40:34 +00006474
6475 FormatStyle PointerMiddle = getLLVMStyle();
6476 PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6477 verifyFormat("delete *x;", PointerMiddle);
6478 verifyFormat("int * x;", PointerMiddle);
6479 verifyFormat("template <int * y> f() {}", PointerMiddle);
6480 verifyFormat("int * f(int * a) {}", PointerMiddle);
6481 verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6482 verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6483 verifyFormat("A<int *> a;", PointerMiddle);
6484 verifyFormat("A<int **> a;", PointerMiddle);
6485 verifyFormat("A<int *, int *> a;", PointerMiddle);
6486 verifyFormat("A<int * []> a;", PointerMiddle);
Daniel Jasper532a0312015-04-23 10:23:53 +00006487 verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6488 verifyFormat("A = new SomeType *[Length];", PointerMiddle);
Daniel Jasper553d4872014-06-17 12:40:34 +00006489 verifyFormat("T ** t = new T *;", PointerMiddle);
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006490
6491 // Member function reference qualifiers aren't binary operators.
6492 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006493 "operator()() & {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006494 verifyFormat("string // break\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006495 "operator()() && {}");
Daniel Jasper3992e2c2015-07-01 21:02:24 +00006496 verifyGoogleFormat("template <typename T>\n"
Daniel Jasperaf642c62015-08-25 13:40:51 +00006497 "auto x() & -> int {}");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006498}
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006499
Daniel Jasperee6d6502013-07-17 20:25:02 +00006500TEST_F(FormatTest, UnderstandsAttributes) {
6501 verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
Daniel Jasper559b63c2014-01-28 20:13:43 +00006502 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6503 "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006504 FormatStyle AfterType = getLLVMStyle();
Zachary Turner448592e2015-12-18 22:20:15 +00006505 AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
Daniel Jaspera5fa4d12015-07-06 11:30:34 +00006506 verifyFormat("__attribute__((nodebug)) void\n"
6507 "foo() {}\n",
6508 AfterType);
Daniel Jasperee6d6502013-07-17 20:25:02 +00006509}
6510
Daniel Jasper10cd5812013-05-06 06:35:44 +00006511TEST_F(FormatTest, UnderstandsEllipsis) {
6512 verifyFormat("int printf(const char *fmt, ...);");
6513 verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006514 verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6515
6516 FormatStyle PointersLeft = getLLVMStyle();
Daniel Jasper553d4872014-06-17 12:40:34 +00006517 PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
Daniel Jasperbafa6b72013-07-01 09:47:25 +00006518 verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
Daniel Jasper10cd5812013-05-06 06:35:44 +00006519}
6520
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006521TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006522 EXPECT_EQ("int *a;\n"
6523 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006524 "int *a;",
6525 format("int *a;\n"
6526 "int* a;\n"
6527 "int *a;",
6528 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006529 EXPECT_EQ("int* a;\n"
6530 "int* a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006531 "int* a;",
6532 format("int* a;\n"
6533 "int* a;\n"
6534 "int *a;",
6535 getGoogleStyle()));
Daniel Jasper7fce3ab2013-02-06 14:22:40 +00006536 EXPECT_EQ("int *a;\n"
6537 "int *a;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006538 "int *a;",
6539 format("int *a;\n"
6540 "int * a;\n"
6541 "int * a;",
6542 getGoogleStyle()));
Daniel Jasper352f0df2015-07-18 16:35:30 +00006543 EXPECT_EQ("auto x = [] {\n"
6544 " int *a;\n"
6545 " int *a;\n"
6546 " int *a;\n"
6547 "};",
6548 format("auto x=[]{int *a;\n"
6549 "int * a;\n"
6550 "int * a;};",
6551 getGoogleStyle()));
Daniel Jasperf7935112012-12-03 18:12:45 +00006552}
6553
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006554TEST_F(FormatTest, UnderstandsRvalueReferences) {
6555 verifyFormat("int f(int &&a) {}");
6556 verifyFormat("int f(int a, char &&b) {}");
6557 verifyFormat("void f() { int &&a = b; }");
6558 verifyGoogleFormat("int f(int a, char&& b) {}");
6559 verifyGoogleFormat("void f() { int&& a = b; }");
6560
Daniel Jasper1eff9082013-05-27 16:36:33 +00006561 verifyIndependentOfContext("A<int &&> a;");
6562 verifyIndependentOfContext("A<int &&, int &&> a;");
6563 verifyGoogleFormat("A<int&&> a;");
6564 verifyGoogleFormat("A<int&&, int&&> a;");
Daniel Jasper8b1c6352013-08-01 17:58:23 +00006565
6566 // Not rvalue references:
6567 verifyFormat("template <bool B, bool C> class A {\n"
6568 " static_assert(B && C, \"Something is wrong\");\n"
6569 "};");
Daniel Jasper29a98cf2013-08-13 09:09:09 +00006570 verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6571 verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
Daniel Jasper72ab43b2014-04-14 12:50:02 +00006572 verifyFormat("#define A(a, b) (a && b)");
Alexander Kornienkoa5151272013-03-12 16:28:18 +00006573}
6574
Manuel Klimekc1237a82013-01-23 14:08:21 +00006575TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6576 verifyFormat("void f() {\n"
6577 " x[aaaaaaaaa -\n"
Daniel Jasper6bee6822013-04-08 20:33:42 +00006578 " b] = 23;\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006579 "}",
6580 getLLVMStyleWithColumns(15));
Manuel Klimekc1237a82013-01-23 14:08:21 +00006581}
6582
Daniel Jasperef906a92013-01-13 08:01:36 +00006583TEST_F(FormatTest, FormatsCasts) {
6584 verifyFormat("Type *A = static_cast<Type *>(P);");
6585 verifyFormat("Type *A = (Type *)P;");
6586 verifyFormat("Type *A = (vector<Type *, int *>)P;");
6587 verifyFormat("int a = (int)(2.0f);");
Daniel Jasperda6f2252013-05-31 16:14:28 +00006588 verifyFormat("int a = (int)2.0f;");
6589 verifyFormat("x[(int32)y];");
6590 verifyFormat("x = (int32)y;");
6591 verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6592 verifyFormat("int a = (int)*b;");
6593 verifyFormat("int a = (int)2.0f;");
6594 verifyFormat("int a = (int)~0;");
6595 verifyFormat("int a = (int)++a;");
6596 verifyFormat("int a = (int)sizeof(int);");
6597 verifyFormat("int a = (int)+2;");
6598 verifyFormat("my_int a = (my_int)2.0f;");
6599 verifyFormat("my_int a = (my_int)sizeof(int);");
Daniel Jasper05866372013-06-06 08:20:20 +00006600 verifyFormat("return (my_int)aaa;");
Daniel Jasper49a94482013-07-15 15:04:42 +00006601 verifyFormat("#define x ((int)-1)");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006602 verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
Daniel Jasper49a94482013-07-15 15:04:42 +00006603 verifyFormat("#define p(q) ((int *)&q)");
Daniel Jasper30646202014-07-14 12:38:38 +00006604 verifyFormat("fn(a)(b) + 1;");
Daniel Jasperef906a92013-01-13 08:01:36 +00006605
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006606 verifyFormat("void f() { my_int a = (my_int)*b; }");
6607 verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6608 verifyFormat("my_int a = (my_int)~0;");
6609 verifyFormat("my_int a = (my_int)++a;");
Daniel Jaspera45eb4c2014-10-06 13:16:43 +00006610 verifyFormat("my_int a = (my_int)-2;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006611 verifyFormat("my_int a = (my_int)1;");
6612 verifyFormat("my_int a = (my_int *)1;");
6613 verifyFormat("my_int a = (const my_int)-1;");
6614 verifyFormat("my_int a = (const my_int *)-1;");
Daniel Jasper4b3ba212014-08-25 09:36:07 +00006615 verifyFormat("my_int a = (my_int)(my_int)-1;");
Daniel Jasperf5e5ee62015-05-19 11:18:39 +00006616 verifyFormat("my_int a = (ns::my_int)-2;");
Daniel Jasper554e49f2015-06-12 07:15:33 +00006617 verifyFormat("case (my_int)ONE:");
Daniel Jasper94b1bdf2016-04-05 11:46:06 +00006618 verifyFormat("auto x = (X)this;");
Dinesh Dwivedi76f98f82014-05-05 13:14:35 +00006619
6620 // FIXME: single value wrapped with paren will be treated as cast.
6621 verifyFormat("void f(int i = (kValue)*kMask) {}");
Daniel Jasperef906a92013-01-13 08:01:36 +00006622
Dinesh Dwivedi2e92e662014-05-06 11:46:49 +00006623 verifyFormat("{ (void)F; }");
6624
Daniel Jasper998cabc2013-07-18 14:46:07 +00006625 // Don't break after a cast's
6626 verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6627 " (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6628 " bbbbbbbbbbbbbbbbbbbbbb);");
6629
Daniel Jasperef906a92013-01-13 08:01:36 +00006630 // These are not casts.
6631 verifyFormat("void f(int *) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006632 verifyFormat("f(foo)->b;");
6633 verifyFormat("f(foo).b;");
6634 verifyFormat("f(foo)(b);");
6635 verifyFormat("f(foo)[b];");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +00006636 verifyFormat("[](foo) { return 4; }(bar);");
Nico Weber4401b2a2013-02-13 04:32:57 +00006637 verifyFormat("(*funptr)(foo)[4];");
6638 verifyFormat("funptrs[4](foo)[4];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006639 verifyFormat("void f(int *);");
6640 verifyFormat("void f(int *) = 0;");
6641 verifyFormat("void f(SmallVector<int>) {}");
6642 verifyFormat("void f(SmallVector<int>);");
6643 verifyFormat("void f(SmallVector<int>) = 0;");
Nico Weber06fcec12013-02-09 18:02:07 +00006644 verifyFormat("void f(int i = (kA * kB) & kMask) {}");
Nico Weber4401b2a2013-02-13 04:32:57 +00006645 verifyFormat("int a = sizeof(int) * b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006646 verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
Daniel Jasper05866372013-06-06 08:20:20 +00006647 verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6648 verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
Aaron Ballman61005bc2015-02-16 14:14:01 +00006649 verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006650
Daniel Jasperba0bda92013-02-23 08:07:18 +00006651 // These are not casts, but at some point were confused with casts.
6652 verifyFormat("virtual void foo(int *) override;");
6653 verifyFormat("virtual void foo(char &) const;");
6654 verifyFormat("virtual void foo(int *a, char *) const;");
Daniel Jasper8a68b952013-03-13 17:13:53 +00006655 verifyFormat("int a = sizeof(int *) + b;");
Alexander Kornienko1e808872013-06-28 12:51:24 +00006656 verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
Daniel Jasper9bb30012015-11-23 15:55:50 +00006657 verifyFormat("bool b = f(g<int>) && c;");
Daniel Jasper8e8b4fb2015-11-23 19:11:45 +00006658 verifyFormat("typedef void (*f)(int i) func;");
Daniel Jasper1bc1b502013-07-05 07:58:34 +00006659
6660 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6661 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006662 // FIXME: The indentation here is not ideal.
Daniel Jasper0e90c3d2013-07-05 09:14:35 +00006663 verifyFormat(
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006664 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6665 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6666 " [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
Daniel Jasperef906a92013-01-13 08:01:36 +00006667}
6668
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006669TEST_F(FormatTest, FormatsFunctionTypes) {
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006670 verifyFormat("A<bool()> a;");
6671 verifyFormat("A<SomeType()> a;");
Daniel Jasper37194282013-05-28 08:33:00 +00006672 verifyFormat("A<void (*)(int, std::string)> a;");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006673 verifyFormat("A<void *(int)>;");
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006674 verifyFormat("void *(*a)(int *, SomeType *);");
Daniel Jasper8eb371b2013-03-01 17:13:29 +00006675 verifyFormat("int (*func)(void *);");
Daniel Jasper37194282013-05-28 08:33:00 +00006676 verifyFormat("void f() { int (*func)(void *); }");
Daniel Jasper59036852013-08-12 12:16:34 +00006677 verifyFormat("template <class CallbackClass>\n"
6678 "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
Daniel Jasperb8914dd2013-03-20 09:53:18 +00006679
Daniel Jasper6e42b1e2013-04-01 17:13:26 +00006680 verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6681 verifyGoogleFormat("void* (*a)(int);");
Daniel Jasper59036852013-08-12 12:16:34 +00006682 verifyGoogleFormat(
6683 "template <class CallbackClass>\n"
6684 "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
Daniel Jasperabc34212013-05-14 08:34:47 +00006685
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006686 // Other constructs can look somewhat like function types:
Daniel Jasperabc34212013-05-14 08:34:47 +00006687 verifyFormat("A<sizeof(*x)> a;");
Daniel Jasper5dad58e2013-05-15 07:51:51 +00006688 verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
Daniel Jasper655d96a2013-07-16 11:37:21 +00006689 verifyFormat("some_var = function(*some_pointer_var)[0];");
6690 verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
Daniel Jaspera85c3312015-12-28 07:44:25 +00006691 verifyFormat("int x = f(&h)();");
Daniel Jasper21561662016-06-13 07:49:35 +00006692 verifyFormat("returnsFunction(&param1, &param2)(param);");
Daniel Jasperc1fa2812013-01-10 13:08:12 +00006693}
6694
Daniel Jasperbeaa3222015-02-26 11:30:50 +00006695TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6696 verifyFormat("A (*foo_)[6];");
6697 verifyFormat("vector<int> (*foo_)[6];");
6698}
6699
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006700TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6701 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6702 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
6703 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6704 " LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasperb754a742015-03-12 15:04:53 +00006705 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6706 " *LoooooooooooooooooooooooooooooooooooooooongVariable;");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006707
6708 // Different ways of ()-initializiation.
6709 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6710 " LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6711 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6712 " LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6713 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6714 " LoooooooooooooooooooooooooooooooooooooooongVariable({});");
Daniel Jasper0faa9132015-04-23 13:58:40 +00006715 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6716 " LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006717}
6718
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006719TEST_F(FormatTest, BreaksLongDeclarations) {
Daniel Jasper8e357692013-05-06 08:27:33 +00006720 verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006721 " AnotherNameForTheLongType;");
Daniel Jasperbc5cb4e2013-11-07 17:43:07 +00006722 verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006723 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
Daniel Jasper8e357692013-05-06 08:27:33 +00006724 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +00006725 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasperb754a742015-03-12 15:04:53 +00006726 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6727 "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
Daniel Jasper8e357692013-05-06 08:27:33 +00006728 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6729 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasper2ad0aba2014-10-28 17:06:04 +00006730 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6731 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperdba1c552013-07-02 09:47:29 +00006732 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6733 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperf10a28d2014-05-05 13:48:09 +00006734 verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6735 "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
Daniel Jasperc3ff0cd2016-04-18 11:31:21 +00006736 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6737 "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6738 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6739 "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
Daniel Jasperc75e1ef2014-07-09 08:42:42 +00006740 FormatStyle Indented = getLLVMStyle();
6741 Indented.IndentWrappedFunctionNames = true;
6742 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6743 " LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6744 Indented);
6745 verifyFormat(
6746 "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6747 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6748 Indented);
6749 verifyFormat(
6750 "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6751 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6752 Indented);
6753 verifyFormat(
6754 "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6755 " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6756 Indented);
Daniel Jasper8e357692013-05-06 08:27:33 +00006757
6758 // FIXME: Without the comment, this breaks after "(".
Manuel Klimek836c2862013-06-21 17:25:42 +00006759 verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"
6760 " (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6761 getGoogleStyle());
Daniel Jasper8e357692013-05-06 08:27:33 +00006762
Daniel Jasperd2639ef2013-01-28 15:16:31 +00006763 verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006764 " int LoooooooooooooooooooongParam2) {}");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006765 verifyFormat(
Daniel Jasper6728fc12013-04-11 14:29:13 +00006766 "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6767 " SourceLocation L, IdentifierIn *II,\n"
6768 " Type *T) {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006769 verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006770 "ReallyReaaallyLongFunctionName(\n"
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006771 " const std::string &SomeParameter,\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006772 " const SomeType<string, SomeOtherTemplateParameter>\n"
6773 " &ReallyReallyLongParameterName,\n"
6774 " const SomeType<string, SomeOtherTemplateParameter>\n"
6775 " &AnotherLongParameterName) {}");
Daniel Jasperc6fbc212013-05-15 09:35:08 +00006776 verifyFormat("template <typename A>\n"
6777 "SomeLoooooooooooooooooooooongType<\n"
6778 " typename some_namespace::SomeOtherType<A>::Type>\n"
6779 "Function() {}");
Daniel Jasper26d1b1d2013-02-24 18:54:32 +00006780
Daniel Jasperd36ef5e2013-01-28 15:40:20 +00006781 verifyGoogleFormat(
Daniel Jasper53643062013-08-19 10:16:18 +00006782 "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6783 " aaaaaaaaaaaaaaaaaaaaaaa;");
6784 verifyGoogleFormat(
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006785 "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6786 " SourceLocation L) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006787 verifyGoogleFormat(
6788 "some_namespace::LongReturnType\n"
6789 "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006790 " int first_long_parameter, int second_parameter) {}");
Daniel Jasperb9caeac2013-02-13 20:33:44 +00006791
6792 verifyGoogleFormat("template <typename T>\n"
6793 "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
Daniel Jasper12ef4e52013-02-21 21:33:55 +00006794 "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
Daniel Jasper57d4a582013-02-28 10:06:05 +00006795 verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6796 " int aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper78b45332014-08-14 10:52:56 +00006797
6798 verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
Daniel Jasperb754a742015-03-12 15:04:53 +00006799 " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6800 " *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperde7ca752015-05-04 07:39:00 +00006801 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6802 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6803 " aaaaaaaaaaaaaaaaaaaaaaaa);");
6804 verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6805 " vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6806 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6807 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasperd1926a32013-01-02 08:44:14 +00006808}
6809
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006810TEST_F(FormatTest, FormatsArrays) {
6811 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6812 " [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
Daniel Jasper362a1bf2015-12-23 18:01:43 +00006813 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6814 " [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
Daniel Jaspere1afb9b2015-12-30 12:23:00 +00006815 verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6816 " aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006817 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6818 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6819 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6820 " [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6821 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6822 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6823 " [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6824 verifyFormat(
6825 "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6826 " << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6827 " [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
Daniel Jasperf9168de2016-03-01 04:19:55 +00006828 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6829 " .aaaaaaaaaaaaaaaaaaaaaa();");
Daniel Jaspere0ab9e72013-12-06 15:19:50 +00006830
6831 verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6832 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
Daniel Jasperecaba172014-06-10 13:27:57 +00006833 verifyFormat(
6834 "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6835 " .aaaaaaa[0]\n"
6836 " .aaaaaaaaaaaaaaaaaaaaaa();");
Manuel Klimek27f278182016-01-19 14:05:32 +00006837 verifyFormat("a[::b::c];");
Daniel Jasper675b4f82015-01-19 10:51:23 +00006838
6839 verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
Daniel Jaspera3cd21642016-01-14 13:36:46 +00006840
6841 FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6842 verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
Daniel Jasperaea3bde2013-07-12 11:19:37 +00006843}
6844
Daniel Jaspere9de2602012-12-06 09:56:08 +00006845TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6846 verifyFormat("(a)->b();");
6847 verifyFormat("--a;");
6848}
6849
Daniel Jasper8b529712012-12-04 13:02:32 +00006850TEST_F(FormatTest, HandlesIncludeDirectives) {
Daniel Jasper2ab0d012013-01-14 15:52:06 +00006851 verifyFormat("#include <string>\n"
6852 "#include <a/b/c.h>\n"
6853 "#include \"a/b/string\"\n"
6854 "#include \"string.h\"\n"
6855 "#include \"string.h\"\n"
Manuel Klimek99c7baa2013-01-15 15:50:27 +00006856 "#include <a-a>\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006857 "#include < path with space >\n"
Daniel Jasperfa3f8fb2015-05-19 11:22:29 +00006858 "#include_next <test.h>"
Daniel Jasper4a4be012013-05-06 10:24:51 +00006859 "#include \"abc.h\" // this is included for ABC\n"
Daniel Jasper8bb99e82013-05-16 12:59:13 +00006860 "#include \"some long include\" // with a comment\n"
Daniel Jasperaf5ba0e2013-02-23 07:46:38 +00006861 "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
6862 getLLVMStyleWithColumns(35));
Daniel Jasper98857842013-10-30 13:54:53 +00006863 EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\""));
6864 EXPECT_EQ("#include <a>", format("#include<a>"));
Nico Weber8f83ee42012-12-21 18:21:56 +00006865
Daniel Jasper5ef433f2013-01-13 08:12:18 +00006866 verifyFormat("#import <string>");
6867 verifyFormat("#import <a/b/c.h>");
6868 verifyFormat("#import \"a/b/string\"");
6869 verifyFormat("#import \"string.h\"");
6870 verifyFormat("#import \"string.h\"");
Daniel Jaspered8f1c62013-08-28 08:24:04 +00006871 verifyFormat("#if __has_include(<strstream>)\n"
6872 "#include <strstream>\n"
6873 "#endif");
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006874
Daniel Jasper343643b2014-08-13 08:29:18 +00006875 verifyFormat("#define MY_IMPORT <a/b>");
6876
Daniel Jasper47ef6dd2014-01-17 16:21:39 +00006877 // Protocol buffer definition or missing "#".
6878 verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6879 getLLVMStyleWithColumns(30));
Daniel Jasper9509f182014-05-05 08:08:07 +00006880
6881 FormatStyle Style = getLLVMStyle();
6882 Style.AlwaysBreakBeforeMultilineStrings = true;
6883 Style.ColumnLimit = 0;
6884 verifyFormat("#import \"abc.h\"", Style);
Daniel Jasper86ee0b62014-12-04 08:57:27 +00006885
6886 // But 'import' might also be a regular C++ namespace.
6887 verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6888 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8b529712012-12-04 13:02:32 +00006889}
6890
Alexander Kornienko578fdd82012-12-06 18:03:27 +00006891//===----------------------------------------------------------------------===//
6892// Error recovery tests.
6893//===----------------------------------------------------------------------===//
6894
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006895TEST_F(FormatTest, IncompleteParameterLists) {
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00006896 FormatStyle NoBinPacking = getLLVMStyle();
6897 NoBinPacking.BinPackParameters = false;
6898 verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6899 " double *min_x,\n"
6900 " double *max_x,\n"
6901 " double *min_y,\n"
6902 " double *max_y,\n"
6903 " double *min_z,\n"
6904 " double *max_z, ) {}",
6905 NoBinPacking);
Daniel Jasper66e9dee2013-02-14 09:19:04 +00006906}
6907
Daniel Jasper83a54d22013-01-10 09:26:47 +00006908TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
Alexander Kornienkoae6e53c2013-01-16 11:45:16 +00006909 verifyFormat("void f() { return; }\n42");
6910 verifyFormat("void f() {\n"
6911 " if (0)\n"
6912 " return;\n"
6913 "}\n"
6914 "42");
Alexander Kornienko1231e062013-01-16 11:43:46 +00006915 verifyFormat("void f() { return }\n42");
6916 verifyFormat("void f() {\n"
6917 " if (0)\n"
6918 " return\n"
6919 "}\n"
6920 "42");
6921}
6922
6923TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6924 EXPECT_EQ("void f() { return }", format("void f ( ) { return }"));
6925 EXPECT_EQ("void f() {\n"
6926 " if (a)\n"
6927 " return\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006928 "}",
6929 format("void f ( ) { if ( a ) return }"));
Daniel Jasperabca58c2013-05-15 14:09:55 +00006930 EXPECT_EQ("namespace N {\n"
6931 "void f()\n"
6932 "}",
6933 format("namespace N { void f() }"));
Alexander Kornienko1231e062013-01-16 11:43:46 +00006934 EXPECT_EQ("namespace N {\n"
6935 "void f() {}\n"
6936 "void g()\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006937 "}",
6938 format("namespace N { void f( ) { } void g( ) }"));
Daniel Jasper83a54d22013-01-10 09:26:47 +00006939}
6940
Daniel Jasper2df93312013-01-09 10:16:05 +00006941TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6942 verifyFormat("int aaaaaaaa =\n"
Alexander Kornienkoffd6d042013-03-27 11:52:18 +00006943 " // Overlylongcomment\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006944 " b;",
6945 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006946 verifyFormat("function(\n"
6947 " ShortArgument,\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00006948 " LoooooooooooongArgument);\n",
6949 getLLVMStyleWithColumns(20));
Daniel Jasper2df93312013-01-09 10:16:05 +00006950}
6951
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006952TEST_F(FormatTest, IncorrectAccessSpecifier) {
6953 verifyFormat("public:");
6954 verifyFormat("class A {\n"
6955 "public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006956 " void f() {}\n"
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006957 "};");
6958 verifyFormat("public\n"
6959 "int qwerty;");
6960 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006961 "B {}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006962 verifyFormat("public\n"
Manuel Klimeke7d10a12013-01-10 13:24:24 +00006963 "{}");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006964 verifyFormat("public\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00006965 "B { int x; }");
Alexander Kornienko2ca766f2012-12-10 16:34:48 +00006966}
Daniel Jasperf7935112012-12-03 18:12:45 +00006967
Daniel Jasper291f9362013-03-20 15:58:10 +00006968TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6969 verifyFormat("{");
6970 verifyFormat("#})");
Daniel Jasperd97d5d52015-02-17 09:58:03 +00006971 verifyNoCrash("(/**/[:!] ?[).");
Daniel Jasper291f9362013-03-20 15:58:10 +00006972}
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006973
6974TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006975 verifyFormat("do {\n}");
6976 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006977 "f();");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00006978 verifyFormat("do {\n}\n"
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006979 "wheeee(fun);");
6980 verifyFormat("do {\n"
6981 " f();\n"
Manuel Klimek28cacc72013-01-07 18:10:23 +00006982 "}");
Alexander Kornienko0ea8e102012-12-04 15:40:36 +00006983}
6984
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006985TEST_F(FormatTest, IncorrectCodeMissingParens) {
Manuel Klimekadededf2013-01-11 18:28:36 +00006986 verifyFormat("if {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006987 verifyFormat("switch {\n foo;\n foo();\n}");
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006988 verifyIncompleteFormat("for {\n foo;\n foo();\n}");
Manuel Klimek9fa8d552013-01-11 19:23:05 +00006989 verifyFormat("while {\n foo;\n foo();\n}");
6990 verifyFormat("do {\n foo;\n foo();\n} while;");
Manuel Klimekadededf2013-01-11 18:28:36 +00006991}
6992
Daniel Jasperc0880a92013-01-04 18:52:56 +00006993TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
Manuel Klimekec5c3db2015-05-07 12:26:30 +00006994 verifyIncompleteFormat("namespace {\n"
6995 "class Foo { Foo (\n"
6996 "};\n"
6997 "} // comment");
Daniel Jasperc0880a92013-01-04 18:52:56 +00006998}
6999
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007000TEST_F(FormatTest, IncorrectCodeErrorDetection) {
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007001 EXPECT_EQ("{\n {}\n", format("{\n{\n}\n"));
Manuel Klimeke7d10a12013-01-10 13:24:24 +00007002 EXPECT_EQ("{\n {}\n", format("{\n {\n}\n"));
7003 EXPECT_EQ("{\n {}\n", format("{\n {\n }\n"));
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007004 EXPECT_EQ("{\n {}\n}\n}\n", format("{\n {\n }\n }\n}\n"));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007005
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007006 EXPECT_EQ("{\n"
Daniel Jasperfbc057e2013-10-18 17:20:57 +00007007 " {\n"
7008 " breakme(\n"
7009 " qwe);\n"
7010 " }\n",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007011 format("{\n"
7012 " {\n"
7013 " breakme(qwe);\n"
7014 "}\n",
7015 getLLVMStyleWithColumns(10)));
Alexander Kornienko870f9eb2012-12-04 17:27:50 +00007016}
7017
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00007018TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007019 verifyFormat("int x = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007020 " avariable,\n"
7021 " b(alongervariable)};",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007022 getLLVMStyleWithColumns(25));
Manuel Klimek73a2fdf2013-01-10 14:36:46 +00007023}
7024
Manuel Klimek762dd182013-01-21 10:07:49 +00007025TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007026 verifyFormat("return (a)(b){1, 2, 3};");
Manuel Klimek762dd182013-01-21 10:07:49 +00007027}
7028
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007029TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007030 verifyFormat("vector<int> x{1, 2, 3, 4};");
Daniel Jaspera125d532014-03-21 12:38:57 +00007031 verifyFormat("vector<int> x{\n"
7032 " 1, 2, 3, 4,\n"
7033 "};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007034 verifyFormat("vector<T> x{{}, {}, {}, {}};");
7035 verifyFormat("f({1, 2});");
7036 verifyFormat("auto v = Foo{-1};");
7037 verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
7038 verifyFormat("Class::Class : member{1, 2, 3} {}");
7039 verifyFormat("new vector<int>{1, 2, 3};");
7040 verifyFormat("new int[3]{1, 2, 3};");
Daniel Jasper7a2d60e2014-05-07 07:59:03 +00007041 verifyFormat("new int{1};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007042 verifyFormat("return {arg1, arg2};");
7043 verifyFormat("return {arg1, SomeType{parameter}};");
7044 verifyFormat("int count = set<int>{f(), g(), h()}.size();");
7045 verifyFormat("new T{arg1, arg2};");
7046 verifyFormat("f(MyMap[{composite, key}]);");
7047 verifyFormat("class Class {\n"
7048 " T member = {arg1, arg2};\n"
7049 "};");
7050 verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
Daniel Jasper91b032a2014-05-22 12:46:38 +00007051 verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
7052 verifyFormat("int a = std::is_integral<int>{} + 0;");
Daniel Jaspere5777d22013-05-23 10:15:45 +00007053
Daniel Jasper438059e2014-05-22 12:11:13 +00007054 verifyFormat("int foo(int i) { return fo1{}(i); }");
7055 verifyFormat("int foo(int i) { return fo1{}(i); }");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00007056 verifyFormat("auto i = decltype(x){};");
Daniel Jasper610381f2014-08-26 09:37:52 +00007057 verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
Daniel Jasper168c8aa2014-08-27 11:53:26 +00007058 verifyFormat("Node n{1, Node{1000}, //\n"
7059 " 2};");
Daniel Jasperb812e322015-02-26 11:46:29 +00007060 verifyFormat("Aaaa aaaaaaa{\n"
7061 " {\n"
7062 " aaaa,\n"
7063 " },\n"
7064 "};");
Daniel Jaspercec9ffd2015-05-18 14:12:24 +00007065 verifyFormat("class C : public D {\n"
7066 " SomeClass SC{2};\n"
7067 "};");
Daniel Jasper3c883d12015-05-18 14:49:19 +00007068 verifyFormat("class C : public A {\n"
7069 " class D : public B {\n"
7070 " void f() { int i{2}; }\n"
7071 " };\n"
7072 "};");
Daniel Jasperb86e2722015-08-24 13:23:37 +00007073 verifyFormat("#define A {a, a},");
Daniel Jasper438059e2014-05-22 12:11:13 +00007074
Daniel Jaspere4ada022016-12-13 10:05:03 +00007075 // Cases where distinguising braced lists and blocks is hard.
7076 verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
7077 verifyFormat("void f() {\n"
7078 " return; // comment\n"
7079 "}\n"
7080 "SomeType t;");
7081 verifyFormat("void f() {\n"
7082 " if (a) {\n"
7083 " f();\n"
7084 " }\n"
7085 "}\n"
7086 "SomeType t;");
7087
Daniel Jasper08434342015-05-26 07:26:26 +00007088 // In combination with BinPackArguments = false.
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007089 FormatStyle NoBinPacking = getLLVMStyle();
Daniel Jasper08434342015-05-26 07:26:26 +00007090 NoBinPacking.BinPackArguments = false;
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007091 verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
7092 " bbbbb,\n"
7093 " ccccc,\n"
7094 " ddddd,\n"
7095 " eeeee,\n"
7096 " ffffff,\n"
7097 " ggggg,\n"
7098 " hhhhhh,\n"
7099 " iiiiii,\n"
7100 " jjjjjj,\n"
7101 " kkkkkk};",
7102 NoBinPacking);
7103 verifyFormat("const Aaaaaa aaaaa = {\n"
7104 " aaaaa,\n"
7105 " bbbbb,\n"
7106 " ccccc,\n"
7107 " ddddd,\n"
7108 " eeeee,\n"
7109 " ffffff,\n"
7110 " ggggg,\n"
7111 " hhhhhh,\n"
7112 " iiiiii,\n"
7113 " jjjjjj,\n"
7114 " kkkkkk,\n"
7115 "};",
7116 NoBinPacking);
Daniel Jasper839922e2014-08-13 08:46:21 +00007117 verifyFormat(
7118 "const Aaaaaa aaaaa = {\n"
7119 " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n"
7120 " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n"
7121 " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
7122 "};",
7123 NoBinPacking);
Daniel Jasperae8e0d82014-04-17 11:32:02 +00007124
Chandler Carruthf8b72662014-03-02 12:37:31 +00007125 // FIXME: The alignment of these trailing comments might be bad. Then again,
7126 // this might be utterly useless in real code.
7127 verifyFormat("Constructor::Constructor()\n"
Daniel Jasper64a328e2014-11-11 19:34:57 +00007128 " : some_value{ //\n"
7129 " aaaaaaa, //\n"
7130 " bbbbbbb} {}");
Daniel Jasper5a611392013-12-19 21:41:37 +00007131
Chandler Carruthf8b72662014-03-02 12:37:31 +00007132 // In braced lists, the first comment is always assumed to belong to the
7133 // first element. Thus, it can be moved to the next or previous line as
7134 // appropriate.
7135 EXPECT_EQ("function({// First element:\n"
7136 " 1,\n"
7137 " // Second element:\n"
7138 " 2});",
7139 format("function({\n"
7140 " // First element:\n"
7141 " 1,\n"
7142 " // Second element:\n"
7143 " 2});"));
7144 EXPECT_EQ("std::vector<int> MyNumbers{\n"
7145 " // First element:\n"
7146 " 1,\n"
7147 " // Second element:\n"
7148 " 2};",
7149 format("std::vector<int> MyNumbers{// First element:\n"
7150 " 1,\n"
7151 " // Second element:\n"
7152 " 2};",
7153 getLLVMStyleWithColumns(30)));
Daniel Jasper64a328e2014-11-11 19:34:57 +00007154 // A trailing comma should still lead to an enforced line break.
7155 EXPECT_EQ("vector<int> SomeVector = {\n"
7156 " // aaa\n"
7157 " 1, 2,\n"
7158 "};",
7159 format("vector<int> SomeVector = { // aaa\n"
7160 " 1, 2, };"));
Daniel Jasper5a611392013-12-19 21:41:37 +00007161
Chandler Carruthf8b72662014-03-02 12:37:31 +00007162 FormatStyle ExtraSpaces = getLLVMStyle();
7163 ExtraSpaces.Cpp11BracedListStyle = false;
7164 ExtraSpaces.ColumnLimit = 75;
7165 verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
7166 verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
7167 verifyFormat("f({ 1, 2 });", ExtraSpaces);
7168 verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
7169 verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
7170 verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
7171 verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
7172 verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
7173 verifyFormat("return { arg1, arg2 };", ExtraSpaces);
7174 verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
7175 verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
7176 verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
7177 verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
7178 verifyFormat("class Class {\n"
7179 " T member = { arg1, arg2 };\n"
7180 "};",
7181 ExtraSpaces);
7182 verifyFormat(
7183 "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7184 " aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
7185 " : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
7186 " bbbbbbbbbbbbbbbbbbbb, bbbbb };",
7187 ExtraSpaces);
7188 verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
Daniel Jasper610381f2014-08-26 09:37:52 +00007189 verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007190 ExtraSpaces);
7191 verifyFormat(
7192 "someFunction(OtherParam,\n"
7193 " BracedList{ // comment 1 (Forcing interesting break)\n"
7194 " param1, param2,\n"
7195 " // comment 2\n"
Daniel Jasper11a0ac62014-12-12 09:40:58 +00007196 " param3, param4 });",
Chandler Carruthf8b72662014-03-02 12:37:31 +00007197 ExtraSpaces);
7198 verifyFormat(
7199 "std::this_thread::sleep_for(\n"
7200 " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
7201 ExtraSpaces);
Daniel Jasperff8d61362016-12-19 08:40:56 +00007202 verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +00007203 " aaaaaaa,\n"
7204 " aaaaaaaaaa,\n"
7205 " aaaaa,\n"
7206 " aaaaaaaaaaaaaaa,\n"
7207 " aaa,\n"
7208 " aaaaaaaaaa,\n"
7209 " a,\n"
7210 " aaaaaaaaaaaaaaaaaaaaa,\n"
7211 " aaaaaaaaaaaa,\n"
7212 " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
7213 " aaaaaaa,\n"
7214 " a};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007215 verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
Manuel Klimekab419912013-05-23 09:41:43 +00007216}
7217
Daniel Jasper33b909c2013-10-25 14:29:37 +00007218TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00007219 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7220 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7221 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7222 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7223 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7224 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007225 verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007226 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
Daniel Jasper731dde92015-05-15 09:41:59 +00007227 " 1, 22, 333, 4444, 55555, //\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007228 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7229 " 1, 22, 333, 4444, 55555, 666666, 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007230 verifyFormat(
Chandler Carruthf8b72662014-03-02 12:37:31 +00007231 "vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7232 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7233 " 1, 22, 333, 4444, 55555, 666666, // comment\n"
7234 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7235 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7236 " 7777777, 1, 22, 333, 4444, 55555, 666666,\n"
7237 " 7777777};");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007238 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007239 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7240 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Daniel Jasper731dde92015-05-15 09:41:59 +00007241 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7242 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7243 " // Separating comment.\n"
7244 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
7245 verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7246 " // Leading comment\n"
7247 " X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7248 " X86::R8, X86::R9, X86::R10, X86::R11, 0};");
Chandler Carruthf8b72662014-03-02 12:37:31 +00007249 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7250 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007251 getLLVMStyleWithColumns(39));
Chandler Carruthf8b72662014-03-02 12:37:31 +00007252 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7253 " 1, 1, 1, 1};",
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007254 getLLVMStyleWithColumns(38));
7255 verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007256 " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
7257 getLLVMStyleWithColumns(43));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007258 verifyFormat(
7259 "static unsigned SomeValues[10][3] = {\n"
7260 " {1, 4, 0}, {4, 9, 0}, {4, 5, 9}, {8, 5, 4}, {1, 8, 4},\n"
7261 " {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
7262 verifyFormat("static auto fields = new vector<string>{\n"
7263 " \"aaaaaaaaaaaaa\",\n"
7264 " \"aaaaaaaaaaaaa\",\n"
7265 " \"aaaaaaaaaaaa\",\n"
7266 " \"aaaaaaaaaaaaaa\",\n"
7267 " \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7268 " \"aaaaaaaaaaaa\",\n"
7269 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7270 "};");
Daniel Jasperd57843d2015-05-11 13:35:40 +00007271 verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
7272 verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
7273 " 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
7274 " 3, cccccccccccccccccccccc};",
7275 getLLVMStyleWithColumns(60));
Daniel Jasperf93551c2013-08-23 10:05:49 +00007276
7277 // Trailing commas.
Daniel Jaspera125d532014-03-21 12:38:57 +00007278 verifyFormat("vector<int> x = {\n"
7279 " 1, 1, 1, 1, 1, 1, 1, 1,\n"
7280 "};",
Daniel Jasperf93551c2013-08-23 10:05:49 +00007281 getLLVMStyleWithColumns(39));
Daniel Jasperb175d572014-04-09 09:53:23 +00007282 verifyFormat("vector<int> x = {\n"
7283 " 1, 1, 1, 1, 1, 1, 1, 1, //\n"
Daniel Jasperf93551c2013-08-23 10:05:49 +00007284 "};",
7285 getLLVMStyleWithColumns(39));
Daniel Jasper610381f2014-08-26 09:37:52 +00007286 verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7287 " 1, 1, 1, 1,\n"
7288 " /**/ /**/};",
Daniel Jasper8863ada2013-08-26 08:10:17 +00007289 getLLVMStyleWithColumns(39));
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007290
Daniel Jasper60c27072015-05-13 08:16:00 +00007291 // Trailing comment in the first line.
7292 verifyFormat("vector<int> iiiiiiiiiiiiiii = { //\n"
7293 " 1111111111, 2222222222, 33333333333, 4444444444, //\n"
7294 " 111111111, 222222222, 3333333333, 444444444, //\n"
7295 " 11111111, 22222222, 333333333, 44444444};");
Daniel Jasper00fb2a12015-07-15 16:26:47 +00007296 // Trailing comment in the last line.
7297 verifyFormat("int aaaaa[] = {\n"
7298 " 1, 2, 3, // comment\n"
7299 " 4, 5, 6 // comment\n"
7300 "};");
Daniel Jasper60c27072015-05-13 08:16:00 +00007301
Daniel Jaspere4c16c72015-05-08 13:51:14 +00007302 // With nested lists, we should either format one item per line or all nested
7303 // lists one on line.
7304 // FIXME: For some nested lists, we can do better.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007305 verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
7306 " {aaaaaaaaaaaaaaaaaaa},\n"
7307 " {aaaaaaaaaaaaaaaaaaaaa},\n"
7308 " {aaaaaaaaaaaaaaaaa}};",
Daniel Jaspercb3f0ed2013-08-27 08:43:47 +00007309 getLLVMStyleWithColumns(60));
Daniel Jasper63af7c42013-12-09 14:40:19 +00007310 verifyFormat(
7311 "SomeStruct my_struct_array = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007312 " {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
7313 " aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
7314 " {aaa, aaa},\n"
7315 " {aaa, aaa},\n"
7316 " {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
7317 " {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7318 " aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
Daniel Jasper01603472014-01-09 13:42:56 +00007319
7320 // No column layout should be used here.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007321 verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
7322 " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
Daniel Jasper20e8c3b2015-01-19 10:51:42 +00007323
7324 verifyNoCrash("a<,");
Daniel Jasperabd1f572016-03-02 22:44:03 +00007325
Daniel Jaspereb65e912015-12-21 18:31:15 +00007326 // No braced initializer here.
7327 verifyFormat("void f() {\n"
7328 " struct Dummy {};\n"
7329 " f(v);\n"
7330 "}");
Daniel Jasper55582072016-01-04 07:30:44 +00007331
7332 // Long lists should be formatted in columns even if they are nested.
7333 verifyFormat(
7334 "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7335 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7336 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7337 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7338 " 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7339 " 1, 22, 333, 4444, 55555, 666666, 7777777});");
Daniel Jaspere6169662016-12-19 07:26:11 +00007340
7341 // Allow "single-column" layout even if that violates the column limit. There
7342 // isn't going to be a better way.
7343 verifyFormat("std::vector<int> a = {\n"
7344 " aaaaaaaa,\n"
7345 " aaaaaaaa,\n"
7346 " aaaaaaaa,\n"
7347 " aaaaaaaa,\n"
7348 " aaaaaaaaaa,\n"
7349 " aaaaaaaa,\n"
7350 " aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
7351 getLLVMStyleWithColumns(30));
Daniel Jasper083d1702016-12-21 17:02:06 +00007352 verifyFormat("vector<int> aaaa = {\n"
7353 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7354 " aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7355 " aaaaaa.aaaaaaa,\n"
7356 " aaaaaa.aaaaaaa,\n"
7357 " aaaaaa.aaaaaaa,\n"
7358 " aaaaaa.aaaaaaa,\n"
7359 "};");
Daniel Jasperd1a9d8acd2017-01-12 19:35:26 +00007360
7361 // Don't create hanging lists.
7362 verifyFormat("someFunction(Param,\n"
7363 " {List1, List2,\n"
7364 " List3});",
7365 getLLVMStyleWithColumns(35));
Daniel Jaspere3710102017-01-12 20:06:28 +00007366 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
7367 " aaaaaaaaaaaaaaaaaaaaaaa);");
Daniel Jasper8de9ed02013-08-22 15:00:41 +00007368}
7369
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007370TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007371 FormatStyle DoNotMerge = getLLVMStyle();
Daniel Jasperd74cf402014-04-08 12:46:38 +00007372 DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007373
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007374 verifyFormat("void f() { return 42; }");
7375 verifyFormat("void f() {\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007376 " return 42;\n"
7377 "}",
7378 DoNotMerge);
7379 verifyFormat("void f() {\n"
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007380 " // Comment\n"
7381 "}");
7382 verifyFormat("{\n"
7383 "#error {\n"
7384 " int a;\n"
7385 "}");
7386 verifyFormat("{\n"
7387 " int a;\n"
7388 "#error {\n"
7389 "}");
Daniel Jasperf9eb9b12013-05-16 10:17:39 +00007390 verifyFormat("void f() {} // comment");
7391 verifyFormat("void f() { int a; } // comment");
Daniel Jasper92716502013-05-16 16:54:34 +00007392 verifyFormat("void f() {\n"
7393 "} // comment",
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00007394 DoNotMerge);
7395 verifyFormat("void f() {\n"
7396 " int a;\n"
7397 "} // comment",
7398 DoNotMerge);
7399 verifyFormat("void f() {\n"
7400 "} // comment",
Daniel Jasper92716502013-05-16 16:54:34 +00007401 getLLVMStyleWithColumns(15));
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007402
7403 verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7404 verifyFormat("void f() {\n return 42;\n}", getLLVMStyleWithColumns(22));
7405
7406 verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7407 verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
Alexander Kornienko06dd15a2013-12-04 13:58:27 +00007408 verifyFormat("class C {\n"
7409 " C()\n"
7410 " : iiiiiiii(nullptr),\n"
7411 " kkkkkkk(nullptr),\n"
7412 " mmmmmmm(nullptr),\n"
7413 " nnnnnnn(nullptr) {}\n"
7414 "};",
7415 getGoogleStyle());
Alexander Kornienko31e95542013-12-04 12:21:08 +00007416
7417 FormatStyle NoColumnLimit = getLLVMStyle();
7418 NoColumnLimit.ColumnLimit = 0;
7419 EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7420 EXPECT_EQ("class C {\n"
7421 " A() : b(0) {}\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00007422 "};",
7423 format("class C{A():b(0){}};", NoColumnLimit));
Alexander Kornienko31e95542013-12-04 12:21:08 +00007424 EXPECT_EQ("A()\n"
7425 " : b(0) {\n"
7426 "}",
7427 format("A()\n:b(0)\n{\n}", NoColumnLimit));
7428
7429 FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
Daniel Jasperd74cf402014-04-08 12:46:38 +00007430 DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7431 FormatStyle::SFS_None;
Alexander Kornienko31e95542013-12-04 12:21:08 +00007432 EXPECT_EQ("A()\n"
7433 " : b(0) {\n"
7434 "}",
7435 format("A():b(0){}", DoNotMergeNoColumnLimit));
7436 EXPECT_EQ("A()\n"
7437 " : b(0) {\n"
7438 "}",
7439 format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
Daniel Jasper64989962014-02-07 13:45:27 +00007440
7441 verifyFormat("#define A \\\n"
7442 " void f() { \\\n"
7443 " int i; \\\n"
7444 " }",
7445 getLLVMStyleWithColumns(20));
7446 verifyFormat("#define A \\\n"
7447 " void f() { int i; }",
7448 getLLVMStyleWithColumns(21));
7449 verifyFormat("#define A \\\n"
7450 " void f() { \\\n"
7451 " int i; \\\n"
7452 " } \\\n"
7453 " int j;",
7454 getLLVMStyleWithColumns(22));
7455 verifyFormat("#define A \\\n"
7456 " void f() { int i; } \\\n"
7457 " int j;",
7458 getLLVMStyleWithColumns(23));
Manuel Klimekf4ab9ef2013-01-11 17:54:10 +00007459}
7460
Daniel Jasperd74cf402014-04-08 12:46:38 +00007461TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7462 FormatStyle MergeInlineOnly = getLLVMStyle();
7463 MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7464 verifyFormat("class C {\n"
7465 " int f() { return 42; }\n"
7466 "};",
7467 MergeInlineOnly);
7468 verifyFormat("int f() {\n"
7469 " return 42;\n"
7470 "}",
7471 MergeInlineOnly);
7472}
7473
Manuel Klimeke01bab52013-01-15 13:38:33 +00007474TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7475 // Elaborate type variable declarations.
Chandler Carruthf8b72662014-03-02 12:37:31 +00007476 verifyFormat("struct foo a = {bar};\nint n;");
7477 verifyFormat("class foo a = {bar};\nint n;");
7478 verifyFormat("union foo a = {bar};\nint n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007479
7480 // Elaborate types inside function definitions.
7481 verifyFormat("struct foo f() {}\nint n;");
7482 verifyFormat("class foo f() {}\nint n;");
7483 verifyFormat("union foo f() {}\nint n;");
7484
7485 // Templates.
7486 verifyFormat("template <class X> void f() {}\nint n;");
7487 verifyFormat("template <struct X> void f() {}\nint n;");
7488 verifyFormat("template <union X> void f() {}\nint n;");
7489
7490 // Actual definitions...
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007491 verifyFormat("struct {\n} n;");
7492 verifyFormat(
7493 "template <template <class T, class Y>, class Z> class X {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007494 verifyFormat("union Z {\n int n;\n} x;");
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007495 verifyFormat("class MACRO Z {\n} n;");
7496 verifyFormat("class MACRO(X) Z {\n} n;");
7497 verifyFormat("class __attribute__(X) Z {\n} n;");
7498 verifyFormat("class __declspec(X) Z {\n} n;");
Manuel Klimekd2650902013-02-06 15:57:54 +00007499 verifyFormat("class A##B##C {\n} n;");
Manuel Klimek91e48582013-10-07 09:15:41 +00007500 verifyFormat("class alignas(16) Z {\n} n;");
Daniel Jasper04785d02015-05-06 14:03:02 +00007501 verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7502 verifyFormat("class MACROA MACRO(X) Z {\n} n;");
Manuel Klimeke01bab52013-01-15 13:38:33 +00007503
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007504 // Redefinition from nested context:
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007505 verifyFormat("class A::B::C {\n} n;");
Manuel Klimek3c6b7c72013-01-21 10:17:14 +00007506
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007507 // Template definitions.
Daniel Jasper6f05e592013-05-15 13:46:48 +00007508 verifyFormat(
7509 "template <typename F>\n"
7510 "Matcher(const Matcher<F> &Other,\n"
7511 " typename enable_if_c<is_base_of<F, T>::value &&\n"
7512 " !is_same<F, T>::value>::type * = 0)\n"
7513 " : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7514
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007515 // FIXME: This is still incorrectly handled at the formatter side.
Daniel Jasper62c0ac02013-07-30 22:37:19 +00007516 verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
Daniel Jasper6f2b88a2015-06-05 13:18:09 +00007517 verifyFormat("int i = SomeFunction(a<b, a> b);");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007518
7519 // FIXME:
7520 // This now gets parsed incorrectly as class definition.
Manuel Klimeka4fe1c12013-01-21 16:42:44 +00007521 // verifyFormat("class A<int> f() {\n}\nint n;");
Manuel Klimekcdee74d2013-01-21 13:58:54 +00007522
Manuel Klimeke01bab52013-01-15 13:38:33 +00007523 // Elaborate types where incorrectly parsing the structural element would
7524 // break the indent.
7525 verifyFormat("if (true)\n"
7526 " class X x;\n"
7527 "else\n"
7528 " f();\n");
Daniel Jasper1a32a612013-03-20 15:12:38 +00007529
7530 // This is simply incomplete. Formatting is not important, but must not crash.
Daniel Jaspercdaffa42013-08-13 10:58:30 +00007531 verifyFormat("class A:");
Manuel Klimekd5e5f8f2013-01-11 18:13:04 +00007532}
7533
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007534TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
Manuel Klimek71814b42013-10-11 21:25:45 +00007535 EXPECT_EQ("#error Leave all white!!!!! space* alone!\n",
7536 format("#error Leave all white!!!!! space* alone!\n"));
7537 EXPECT_EQ(
7538 "#warning Leave all white!!!!! space* alone!\n",
7539 format("#warning Leave all white!!!!! space* alone!\n"));
Manuel Klimek99c7baa2013-01-15 15:50:27 +00007540 EXPECT_EQ("#error 1", format(" # error 1"));
7541 EXPECT_EQ("#warning 1", format(" # warning 1"));
7542}
7543
Daniel Jasper4431aa92013-04-23 13:54:04 +00007544TEST_F(FormatTest, FormatHashIfExpressions) {
Daniel Jasper7cfde412014-01-21 08:56:09 +00007545 verifyFormat("#if AAAA && BBBB");
Daniel Jasperd7884572015-08-14 12:44:06 +00007546 verifyFormat("#if (AAAA && BBBB)");
7547 verifyFormat("#elif (AAAA && BBBB)");
Daniel Jasper4431aa92013-04-23 13:54:04 +00007548 // FIXME: Come up with a better indentation for #elif.
7549 verifyFormat(
7550 "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) && \\\n"
7551 " defined(BBBBBBBB)\n"
7552 "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) && \\\n"
7553 " defined(BBBBBBBB)\n"
7554 "#endif",
7555 getLLVMStyleWithColumns(65));
7556}
7557
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007558TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7559 FormatStyle AllowsMergedIf = getGoogleStyle();
7560 AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7561 verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7562 verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
Manuel Klimekda087612013-01-18 14:46:43 +00007563 verifyFormat("if (true)\n#error E\n return 42;", AllowsMergedIf);
7564 EXPECT_EQ("if (true) return 42;",
7565 format("if (true)\nreturn 42;", AllowsMergedIf));
7566 FormatStyle ShortMergedIf = AllowsMergedIf;
7567 ShortMergedIf.ColumnLimit = 25;
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007568 verifyFormat("#define A \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007569 " if (true) return 42;",
7570 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007571 verifyFormat("#define A \\\n"
7572 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007573 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007574 "#define B",
7575 ShortMergedIf);
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007576 verifyFormat("#define A \\\n"
7577 " f(); \\\n"
Manuel Klimekda087612013-01-18 14:46:43 +00007578 " if (true)\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007579 "g();",
7580 ShortMergedIf);
Manuel Klimekd5e782b2013-01-21 14:16:56 +00007581 verifyFormat("{\n"
7582 "#ifdef A\n"
7583 " // Comment\n"
7584 " if (true) continue;\n"
7585 "#endif\n"
7586 " // Comment\n"
Manuel Klimek71814b42013-10-11 21:25:45 +00007587 " if (true) continue;\n"
7588 "}",
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007589 ShortMergedIf);
Daniel Jasper64989962014-02-07 13:45:27 +00007590 ShortMergedIf.ColumnLimit = 29;
7591 verifyFormat("#define A \\\n"
7592 " if (aaaaaaaaaa) return 1; \\\n"
7593 " return 2;",
7594 ShortMergedIf);
7595 ShortMergedIf.ColumnLimit = 28;
7596 verifyFormat("#define A \\\n"
7597 " if (aaaaaaaaaa) \\\n"
7598 " return 1; \\\n"
7599 " return 2;",
7600 ShortMergedIf);
Manuel Klimekd3b92fa2013-01-18 14:04:34 +00007601}
7602
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007603TEST_F(FormatTest, BlockCommentsInControlLoops) {
7604 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7605 " f();\n"
7606 "}");
7607 verifyFormat("if (0) /* a comment in a strange place */ {\n"
7608 " f();\n"
7609 "} /* another comment */ else /* comment #3 */ {\n"
7610 " g();\n"
7611 "}");
7612 verifyFormat("while (0) /* a comment in a strange place */ {\n"
7613 " f();\n"
7614 "}");
7615 verifyFormat("for (;;) /* a comment in a strange place */ {\n"
7616 " f();\n"
7617 "}");
7618 verifyFormat("do /* a comment in a strange place */ {\n"
7619 " f();\n"
7620 "} /* another comment */ while (0);");
7621}
7622
7623TEST_F(FormatTest, BlockComments) {
7624 EXPECT_EQ("/* */ /* */ /* */\n/* */ /* */ /* */",
7625 format("/* *//* */ /* */\n/* *//* */ /* */"));
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007626 EXPECT_EQ("/* */ a /* */ b;", format(" /* */ a/* */ b;"));
Daniel Jaspera49393f2013-08-28 09:07:32 +00007627 EXPECT_EQ("#define A /*123*/ \\\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007628 " b\n"
7629 "/* */\n"
7630 "someCall(\n"
7631 " parameter);",
Alexander Kornienko547a9f522013-03-21 12:28:10 +00007632 format("#define A /*123*/ b\n"
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007633 "/* */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007634 "someCall(parameter);",
7635 getLLVMStyleWithColumns(15)));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007636
7637 EXPECT_EQ("#define A\n"
7638 "/* */ someCall(\n"
7639 " parameter);",
7640 format("#define A\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007641 "/* */someCall(parameter);",
7642 getLLVMStyleWithColumns(15)));
Daniel Jasper51fb2b22013-05-30 06:40:07 +00007643 EXPECT_EQ("/*\n**\n*/", format("/*\n**\n*/"));
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007644 EXPECT_EQ("/*\n"
7645 "*\n"
7646 " * aaaaaa\n"
Daniel Jasper6d9b88d2015-05-06 07:17:22 +00007647 " * aaaaaa\n"
Daniel Jasper58dd2f02013-05-30 15:20:29 +00007648 "*/",
7649 format("/*\n"
7650 "*\n"
7651 " * aaaaaa aaaaaa\n"
7652 "*/",
7653 getLLVMStyleWithColumns(10)));
Daniel Jasperce257f22013-05-30 17:27:48 +00007654 EXPECT_EQ("/*\n"
7655 "**\n"
7656 "* aaaaaa\n"
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007657 "*aaaaaa\n"
Daniel Jasperce257f22013-05-30 17:27:48 +00007658 "*/",
7659 format("/*\n"
7660 "**\n"
7661 "* aaaaaa aaaaaa\n"
7662 "*/",
7663 getLLVMStyleWithColumns(10)));
Daniel Jasperacadc8e2016-06-08 09:45:08 +00007664 EXPECT_EQ("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7665 " /* line 1\n"
7666 " bbbbbbbbbbbb */\n"
7667 " bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7668 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7669 " /* line 1\n"
7670 " bbbbbbbbbbbb */ bbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
7671 getLLVMStyleWithColumns(50)));
Daniel Jasper1f140982013-02-04 07:32:14 +00007672
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007673 FormatStyle NoBinPacking = getLLVMStyle();
7674 NoBinPacking.BinPackParameters = false;
Daniel Jasper1f140982013-02-04 07:32:14 +00007675 EXPECT_EQ("someFunction(1, /* comment 1 */\n"
7676 " 2, /* comment 2 */\n"
7677 " 3, /* comment 3 */\n"
Daniel Jasper14e40ec2013-02-04 08:34:57 +00007678 " aaaa,\n"
7679 " bbbb);",
Daniel Jasper1f140982013-02-04 07:32:14 +00007680 format("someFunction (1, /* comment 1 */\n"
7681 " 2, /* comment 2 */ \n"
7682 " 3, /* comment 3 */\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007683 "aaaa, bbbb );",
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007684 NoBinPacking));
Daniel Jasper38396592013-02-06 15:23:09 +00007685 verifyFormat(
7686 "bool aaaaaaaaaaaaa = /* comment: */ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7687 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7688 EXPECT_EQ(
7689 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7690 " aaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7691 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;",
7692 format(
7693 "bool aaaaaaaaaaaaa = /* trailing comment */\n"
7694 " aaaaaaaaaaaaaaaaaaaaaaaaaaa||aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
7695 " aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaa;"));
Daniel Jasper94f0e132013-02-06 20:07:35 +00007696 EXPECT_EQ(
7697 "int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7698 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7699 "int cccccccccccccccccccccccccccccc; /* comment */\n",
7700 format("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; /* comment */\n"
7701 "int bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; /* comment */\n"
7702 "int cccccccccccccccccccccccccccccc; /* comment */\n"));
Daniel Jasper022612d2013-07-01 09:34:09 +00007703
7704 verifyFormat("void f(int * /* unused */) {}");
Alexander Kornienko614d96a2013-07-08 14:12:07 +00007705
7706 EXPECT_EQ("/*\n"
7707 " **\n"
7708 " */",
7709 format("/*\n"
7710 " **\n"
7711 " */"));
7712 EXPECT_EQ("/*\n"
7713 " *q\n"
7714 " */",
7715 format("/*\n"
7716 " *q\n"
7717 " */"));
7718 EXPECT_EQ("/*\n"
7719 " * q\n"
7720 " */",
7721 format("/*\n"
7722 " * q\n"
7723 " */"));
7724 EXPECT_EQ("/*\n"
7725 " **/",
7726 format("/*\n"
7727 " **/"));
7728 EXPECT_EQ("/*\n"
7729 " ***/",
7730 format("/*\n"
7731 " ***/"));
Manuel Klimekf92f7bc2013-01-22 16:31:55 +00007732}
7733
Manuel Klimek82b836a2013-02-06 16:40:56 +00007734TEST_F(FormatTest, BlockCommentsInMacros) {
7735 EXPECT_EQ("#define A \\\n"
7736 " { \\\n"
7737 " /* one line */ \\\n"
7738 " someCall();",
7739 format("#define A { \\\n"
7740 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007741 " someCall();",
7742 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007743 EXPECT_EQ("#define A \\\n"
7744 " { \\\n"
7745 " /* previous */ \\\n"
7746 " /* one line */ \\\n"
7747 " someCall();",
7748 format("#define A { \\\n"
7749 " /* previous */ \\\n"
7750 " /* one line */ \\\n"
Daniel Jasper2ec3ffb82013-02-18 11:59:17 +00007751 " someCall();",
7752 getLLVMStyleWithColumns(20)));
Manuel Klimek82b836a2013-02-06 16:40:56 +00007753}
7754
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007755TEST_F(FormatTest, BlockCommentsAtEndOfLine) {
7756 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007757 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007758 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007759 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007760 "};",
7761 getLLVMStyleWithColumns(15)));
7762 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007763 " 1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007764 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007765 format("a = {1111 /* */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007766 "};",
7767 getLLVMStyleWithColumns(15)));
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007768 EXPECT_EQ("a = {\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00007769 " 1111 /* a\n"
Krasimir Georgiev91834222017-01-25 13:58:58 +00007770 " */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007771 "};",
Alexander Kornienkof370ad92013-06-12 19:04:12 +00007772 format("a = {1111 /* a */\n"
Manuel Klimekae1fbfb2013-05-29 22:06:18 +00007773 "};",
7774 getLLVMStyleWithColumns(15)));
7775}
7776
Manuel Klimek82b836a2013-02-06 16:40:56 +00007777TEST_F(FormatTest, IndentLineCommentsInStartOfBlockAtEndOfFile) {
Manuel Klimek82b836a2013-02-06 16:40:56 +00007778 verifyFormat("{\n"
Marianne Mailhot-Sarrasin03137c62016-04-14 14:56:49 +00007779 " // a\n"
7780 " // b");
Manuel Klimek82b836a2013-02-06 16:40:56 +00007781}
7782
Manuel Klimekd33516e2013-01-23 10:09:28 +00007783TEST_F(FormatTest, FormatStarDependingOnContext) {
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007784 verifyFormat("void f(int *a);");
7785 verifyFormat("void f() { f(fint * b); }");
Manuel Klimek39080572013-01-23 11:03:04 +00007786 verifyFormat("class A {\n void f(int *a);\n};");
7787 verifyFormat("class A {\n int *a;\n};");
7788 verifyFormat("namespace a {\n"
7789 "namespace b {\n"
7790 "class A {\n"
7791 " void f() {}\n"
7792 " int *a;\n"
7793 "};\n"
7794 "}\n"
7795 "}");
Manuel Klimek0a3a3c92013-01-23 09:32:48 +00007796}
7797
Manuel Klimekd33516e2013-01-23 10:09:28 +00007798TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7799 verifyFormat("while");
7800 verifyFormat("operator");
7801}
7802
Daniel Jasperfda47cd2016-10-31 13:23:00 +00007803TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7804 // This code would be painfully slow to format if we didn't skip it.
7805 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
7806 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7807 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7808 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7809 "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7810 "A(1, 1)\n"
7811 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7812 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7813 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7814 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7815 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7816 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7817 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7818 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7819 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7820 ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7821 // Deeply nested part is untouched, rest is formatted.
7822 EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7823 format(std::string("int i;\n") + Code + "int j;\n",
7824 getLLVMStyle(), IC_ExpectIncomplete));
7825}
7826
Nico Weber7e6a7a12013-01-08 17:56:31 +00007827//===----------------------------------------------------------------------===//
7828// Objective-C tests.
7829//===----------------------------------------------------------------------===//
7830
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007831TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7832 verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7833 EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7834 format("-(NSUInteger)indexOfObject:(id)anObject;"));
Daniel Jasper8d1832e2013-01-07 13:26:07 +00007835 EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007836 EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7837 EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7838 format("-(NSInteger)Method3:(id)anObject;"));
7839 EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7840 format("-(NSInteger)Method4:(id)anObject;"));
7841 EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7842 format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7843 EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7844 format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
Daniel Jaspera44991332015-04-29 13:06:49 +00007845 EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7846 "forAllCells:(BOOL)flag;",
7847 format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7848 "forAllCells:(BOOL)flag;"));
Fariborz Jahanian9017ec32012-12-21 22:51:18 +00007849
7850 // Very long objectiveC method declaration.
Daniel Jasper55ca6082015-03-12 22:13:45 +00007851 verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7852 " (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
Daniel Jasper1ac3e052013-02-05 10:07:47 +00007853 verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7854 " inRange:(NSRange)range\n"
7855 " outRange:(NSRange)out_range\n"
7856 " outRange1:(NSRange)out_range1\n"
7857 " outRange2:(NSRange)out_range2\n"
7858 " outRange3:(NSRange)out_range3\n"
7859 " outRange4:(NSRange)out_range4\n"
7860 " outRange5:(NSRange)out_range5\n"
7861 " outRange6:(NSRange)out_range6\n"
7862 " outRange7:(NSRange)out_range7\n"
7863 " outRange8:(NSRange)out_range8\n"
7864 " outRange9:(NSRange)out_range9;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007865
Daniel Jaspera2a4d9c2015-05-13 09:38:25 +00007866 // When the function name has to be wrapped.
7867 FormatStyle Style = getLLVMStyle();
7868 Style.IndentWrappedFunctionNames = false;
7869 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7870 "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7871 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7872 "}",
7873 Style);
7874 Style.IndentWrappedFunctionNames = true;
7875 verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7876 " veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7877 " anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7878 "}",
7879 Style);
7880
Nico Weberd6f962f2013-01-10 20:18:33 +00007881 verifyFormat("- (int)sum:(vector<int>)numbers;");
Nico Weber772fbfd2013-01-17 06:14:50 +00007882 verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
Nico Weberd6f962f2013-01-10 20:18:33 +00007883 // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7884 // protocol lists (but not for template classes):
Daniel Jaspera44991332015-04-29 13:06:49 +00007885 // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
Nico Weber9efe2912013-01-10 23:11:41 +00007886
Daniel Jasper37194282013-05-28 08:33:00 +00007887 verifyFormat("- (int (*)())foo:(int (*)())f;");
7888 verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007889
7890 // If there's no return type (very rare in practice!), LLVM and Google style
7891 // agree.
Daniel Jasperdd9276e2013-03-22 16:55:40 +00007892 verifyFormat("- foo;");
Nico Weber9efe2912013-01-10 23:11:41 +00007893 verifyFormat("- foo:(int)f;");
7894 verifyGoogleFormat("- foo:(int)foo;");
Fariborz Jahanian68a542a2012-12-20 19:54:13 +00007895}
7896
Nico Weber0588b502013-02-07 00:19:29 +00007897
Alexander Kornienko64a42b82014-04-15 14:52:43 +00007898TEST_F(FormatTest, BreaksStringLiterals) {
Manuel Klimek1998ea22013-02-20 10:15:13 +00007899 EXPECT_EQ("\"some text \"\n"
7900 "\"other\";",
7901 format("\"some text other\";", getLLVMStyleWithColumns(12)));
Alexander Kornienko9e90b622013-04-17 17:34:05 +00007902 EXPECT_EQ("\"some text \"\n"
7903 "\"other\";",
7904 format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007905 EXPECT_EQ(
7906 "#define A \\\n"
7907 " \"some \" \\\n"
7908 " \"text \" \\\n"
7909 " \"other\";",
7910 format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7911 EXPECT_EQ(
7912 "#define A \\\n"
7913 " \"so \" \\\n"
7914 " \"text \" \\\n"
7915 " \"other\";",
7916 format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7917
7918 EXPECT_EQ("\"some text\"",
7919 format("\"some text\"", getLLVMStyleWithColumns(1)));
7920 EXPECT_EQ("\"some text\"",
7921 format("\"some text\"", getLLVMStyleWithColumns(11)));
7922 EXPECT_EQ("\"some \"\n"
7923 "\"text\"",
7924 format("\"some text\"", getLLVMStyleWithColumns(10)));
7925 EXPECT_EQ("\"some \"\n"
7926 "\"text\"",
7927 format("\"some text\"", getLLVMStyleWithColumns(7)));
Manuel Klimekb176cff2013-03-01 13:14:08 +00007928 EXPECT_EQ("\"some\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00007929 "\" tex\"\n"
7930 "\"t\"",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007931 format("\"some text\"", getLLVMStyleWithColumns(6)));
Manuel Klimekabf6e032013-03-04 20:03:38 +00007932 EXPECT_EQ("\"some\"\n"
7933 "\" tex\"\n"
7934 "\" and\"",
7935 format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7936 EXPECT_EQ("\"some\"\n"
7937 "\"/tex\"\n"
7938 "\"/and\"",
7939 format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007940
7941 EXPECT_EQ("variable =\n"
7942 " \"long string \"\n"
7943 " \"literal\";",
7944 format("variable = \"long string literal\";",
7945 getLLVMStyleWithColumns(20)));
7946
7947 EXPECT_EQ("variable = f(\n"
7948 " \"long string \"\n"
Daniel Jasper2cf17bf2013-02-27 09:47:53 +00007949 " \"literal\",\n"
7950 " short,\n"
Manuel Klimek1998ea22013-02-20 10:15:13 +00007951 " loooooooooooooooooooong);",
7952 format("variable = f(\"long string literal\", short, "
7953 "loooooooooooooooooooong);",
7954 getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007955
Daniel Jaspera44991332015-04-29 13:06:49 +00007956 EXPECT_EQ(
7957 "f(g(\"long string \"\n"
7958 " \"literal\"),\n"
7959 " b);",
7960 format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
Alexander Kornienko4d26b6e2013-06-17 12:59:44 +00007961 EXPECT_EQ("f(g(\"long string \"\n"
7962 " \"literal\",\n"
7963 " a),\n"
7964 " b);",
7965 format("f(g(\"long string literal\", a), b);",
7966 getLLVMStyleWithColumns(20)));
Manuel Klimek1998ea22013-02-20 10:15:13 +00007967 EXPECT_EQ(
7968 "f(\"one two\".split(\n"
Daniel Jasperf79b0b12013-08-30 08:29:25 +00007969 " variable));",
Manuel Klimek1998ea22013-02-20 10:15:13 +00007970 format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7971 EXPECT_EQ("f(\"one two three four five six \"\n"
7972 " \"seven\".split(\n"
7973 " really_looooong_variable));",
7974 format("f(\"one two three four five six seven\"."
7975 "split(really_looooong_variable));",
7976 getLLVMStyleWithColumns(33)));
7977
7978 EXPECT_EQ("f(\"some \"\n"
7979 " \"text\",\n"
7980 " other);",
7981 format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
Daniel Jasper5497fce2013-02-26 12:52:34 +00007982
7983 // Only break as a last resort.
7984 verifyFormat(
7985 "aaaaaaaaaaaaaaaaaaaa(\n"
7986 " aaaaaaaaaaaaaaaaaaaa,\n"
7987 " aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
Manuel Klimekb176cff2013-03-01 13:14:08 +00007988
Daniel Jaspera44991332015-04-29 13:06:49 +00007989 EXPECT_EQ("\"splitmea\"\n"
7990 "\"trandomp\"\n"
7991 "\"oint\"",
7992 format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
Manuel Klimeke317d1b2013-03-01 13:29:19 +00007993
Daniel Jaspera44991332015-04-29 13:06:49 +00007994 EXPECT_EQ("\"split/\"\n"
7995 "\"pathat/\"\n"
7996 "\"slashes\"",
7997 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Daniel Jasper6fe2f002013-04-25 08:56:26 +00007998
Daniel Jaspera44991332015-04-29 13:06:49 +00007999 EXPECT_EQ("\"split/\"\n"
8000 "\"pathat/\"\n"
8001 "\"slashes\"",
8002 format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
Alexander Kornienko72852072013-06-19 14:22:47 +00008003 EXPECT_EQ("\"split at \"\n"
8004 "\"spaces/at/\"\n"
8005 "\"slashes.at.any$\"\n"
8006 "\"non-alphanumeric%\"\n"
8007 "\"1111111111characte\"\n"
8008 "\"rs\"",
8009 format("\"split at "
8010 "spaces/at/"
8011 "slashes.at."
8012 "any$non-"
8013 "alphanumeric%"
8014 "1111111111characte"
8015 "rs\"",
8016 getLLVMStyleWithColumns(20)));
8017
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008018 // Verify that splitting the strings understands
8019 // Style::AlwaysBreakBeforeMultilineStrings.
Daniel Jasper2aaedd32015-06-18 09:12:47 +00008020 EXPECT_EQ(
8021 "aaaaaaaaaaaa(\n"
8022 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8023 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8024 format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8025 "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8026 "aaaaaaaaaaaaaaaaaaaaaa\");",
8027 getGoogleStyle()));
Daniel Jasper2436fe92013-10-18 16:47:55 +00008028 EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8029 " \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8030 format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8031 "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8032 "aaaaaaaaaaaaaaaaaaaaaa\";",
8033 getGoogleStyle()));
Daniel Jasper3dcd7ec2013-08-02 11:01:15 +00008034 EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8035 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8036 format("llvm::outs() << "
8037 "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8038 "aaaaaaaaaaaaaaaaaaa\";"));
Daniel Jasperf438cb72013-08-23 11:57:34 +00008039 EXPECT_EQ("ffff(\n"
8040 " {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8041 " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8042 format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8043 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8044 getGoogleStyle()));
Daniel Jasper5aad4e52013-07-12 11:37:05 +00008045
Daniel Jaspere1a7b762016-02-01 11:21:02 +00008046 FormatStyle Style = getLLVMStyleWithColumns(12);
8047 Style.BreakStringLiterals = false;
8048 EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8049
Daniel Jasper6fe2f002013-04-25 08:56:26 +00008050 FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
8051 AlignLeft.AlignEscapedNewlinesLeft = true;
Daniel Jaspera44991332015-04-29 13:06:49 +00008052 EXPECT_EQ("#define A \\\n"
8053 " \"some \" \\\n"
8054 " \"text \" \\\n"
8055 " \"other\";",
8056 format("#define A \"some text other\";", AlignLeft));
Manuel Klimek1998ea22013-02-20 10:15:13 +00008057}
8058
Manuel Klimek9e321992015-07-28 15:50:24 +00008059TEST_F(FormatTest, FullyRemoveEmptyLines) {
8060 FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8061 NoEmptyLines.MaxEmptyLinesToKeep = 0;
8062 EXPECT_EQ("int i = a(b());",
8063 format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8064}
8065
Alexander Kornienko64a42b82014-04-15 14:52:43 +00008066TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8067 EXPECT_EQ(
8068 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8069 "(\n"
8070 " \"x\t\");",
8071 format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8072 "aaaaaaa("
8073 "\"x\t\");"));
8074}
8075
Daniel Jasper174b0122014-01-09 14:18:12 +00008076TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
Alexander Kornienko81e32942013-09-16 20:20:49 +00008077 EXPECT_EQ(
8078 "u8\"utf8 string \"\n"
8079 "u8\"literal\";",
8080 format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8081 EXPECT_EQ(
8082 "u\"utf16 string \"\n"
8083 "u\"literal\";",
8084 format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8085 EXPECT_EQ(
8086 "U\"utf32 string \"\n"
8087 "U\"literal\";",
8088 format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8089 EXPECT_EQ("L\"wide string \"\n"
8090 "L\"literal\";",
8091 format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
Daniel Jasper174b0122014-01-09 14:18:12 +00008092 EXPECT_EQ("@\"NSString \"\n"
8093 "@\"literal\";",
Daniel Jasperd07c2ee2014-01-14 09:53:07 +00008094 format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
Daniel Jaspere4b48c62015-01-21 19:50:35 +00008095
8096 // This input makes clang-format try to split the incomplete unicode escape
8097 // sequence, which used to lead to a crasher.
8098 verifyNoCrash(
8099 "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8100 getLLVMStyleWithColumns(60));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008101}
8102
Alexander Kornienko732b6bd2014-12-14 20:47:11 +00008103TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8104 FormatStyle Style = getGoogleStyleWithColumns(15);
8105 EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8106 EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8107 EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8108 EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8109 EXPECT_EQ("u8R\"x(raw literal)x\";",
8110 format("u8R\"x(raw literal)x\";", Style));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008111}
8112
8113TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8114 FormatStyle Style = getLLVMStyleWithColumns(20);
8115 EXPECT_EQ(
8116 "_T(\"aaaaaaaaaaaaaa\")\n"
8117 "_T(\"aaaaaaaaaaaaaa\")\n"
8118 "_T(\"aaaaaaaaaaaa\")",
8119 format(" _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
8120 EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
8121 " _T(\"aaaaaa\"),\n"
8122 " z);",
8123 format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8124
8125 // FIXME: Handle embedded spaces in one iteration.
8126 // EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8127 // "_T(\"aaaaaaaaaaaaa\")\n"
8128 // "_T(\"aaaaaaaaaaaaa\")\n"
8129 // "_T(\"a\")",
8130 // format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8131 // getLLVMStyleWithColumns(20)));
8132 EXPECT_EQ(
8133 "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8134 format(" _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
Daniel Jaspere99c72f2015-03-26 14:47:35 +00008135 EXPECT_EQ("f(\n"
8136 "#if !TEST\n"
8137 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8138 "#endif\n"
8139 " );",
8140 format("f(\n"
8141 "#if !TEST\n"
8142 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8143 "#endif\n"
8144 ");"));
8145 EXPECT_EQ("f(\n"
8146 "\n"
8147 " _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8148 format("f(\n"
8149 "\n"
8150 "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
Alexander Kornienko81e32942013-09-16 20:20:49 +00008151}
8152
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008153TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008154 EXPECT_EQ(
8155 "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8156 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8157 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8158 format("aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8159 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8160 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8161}
8162
8163TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8164 EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008165 format("f(g(R\"x(raw literal)x\", a), b);", getGoogleStyle()));
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008166 EXPECT_EQ("fffffffffff(g(R\"x(\n"
8167 "multiline raw string literal xxxxxxxxxxxxxx\n"
8168 ")x\",\n"
8169 " a),\n"
8170 " b);",
8171 format("fffffffffff(g(R\"x(\n"
8172 "multiline raw string literal xxxxxxxxxxxxxx\n"
8173 ")x\", a), b);",
8174 getGoogleStyleWithColumns(20)));
8175 EXPECT_EQ("fffffffffff(\n"
8176 " g(R\"x(qqq\n"
8177 "multiline raw string literal xxxxxxxxxxxxxx\n"
8178 ")x\",\n"
8179 " a),\n"
8180 " b);",
8181 format("fffffffffff(g(R\"x(qqq\n"
8182 "multiline raw string literal xxxxxxxxxxxxxx\n"
8183 ")x\", a), b);",
8184 getGoogleStyleWithColumns(20)));
8185
8186 EXPECT_EQ("fffffffffff(R\"x(\n"
8187 "multiline raw string literal xxxxxxxxxxxxxx\n"
8188 ")x\");",
8189 format("fffffffffff(R\"x(\n"
8190 "multiline raw string literal xxxxxxxxxxxxxx\n"
8191 ")x\");",
8192 getGoogleStyleWithColumns(20)));
8193 EXPECT_EQ("fffffffffff(R\"x(\n"
8194 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008195 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008196 format("fffffffffff(R\"x(\n"
8197 "multiline raw string literal xxxxxxxxxxxxxx\n"
Daniel Jasper5d2587d2014-03-27 16:14:13 +00008198 ")x\" + bbbbbb);",
Alexander Kornienkod7b837e2013-08-29 17:32:57 +00008199 getGoogleStyleWithColumns(20)));
Daniel Jasperc39b56f2013-12-16 07:23:08 +00008200 EXPECT_EQ("fffffffffff(\n"
8201 " R\"x(\n"
8202 "multiline raw string literal xxxxxxxxxxxxxx\n"
8203 ")x\" +\n"
8204 " bbbbbb);",
8205 format("fffffffffff(\n"
8206 " R\"x(\n"
8207 "multiline raw string literal xxxxxxxxxxxxxx\n"
8208 ")x\" + bbbbbb);",
8209 getGoogleStyleWithColumns(20)));
Alexander Kornienko657c67b2013-07-16 21:06:13 +00008210}
8211
Alexander Kornienkobe633902013-06-14 11:46:10 +00008212TEST_F(FormatTest, SkipsUnknownStringLiterals) {
Daniel Jasper8369aa52013-07-16 20:28:33 +00008213 verifyFormat("string a = \"unterminated;");
8214 EXPECT_EQ("function(\"unterminated,\n"
8215 " OtherParameter);",
8216 format("function( \"unterminated,\n"
8217 " OtherParameter);"));
Alexander Kornienko1e808872013-06-28 12:51:24 +00008218}
8219
8220TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
Chandler Carruthf8b72662014-03-02 12:37:31 +00008221 FormatStyle Style = getLLVMStyle();
8222 Style.Standard = FormatStyle::LS_Cpp03;
Alexander Kornienko1e808872013-06-28 12:51:24 +00008223 EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
Chandler Carruthf8b72662014-03-02 12:37:31 +00008224 format("#define x(_a) printf(\"foo\"_a);", Style));
Alexander Kornienkobe633902013-06-14 11:46:10 +00008225}
8226
Daniel Jaspera44991332015-04-29 13:06:49 +00008227TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
Daniel Jasper20fd3c62014-04-15 08:49:21 +00008228
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008229TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
8230 EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
8231 " \"ddeeefff\");",
8232 format("someFunction(\"aaabbbcccdddeeefff\");",
8233 getLLVMStyleWithColumns(25)));
8234 EXPECT_EQ("someFunction1234567890(\n"
8235 " \"aaabbbcccdddeeefff\");",
8236 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8237 getLLVMStyleWithColumns(26)));
8238 EXPECT_EQ("someFunction1234567890(\n"
8239 " \"aaabbbcccdddeeeff\"\n"
8240 " \"f\");",
8241 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8242 getLLVMStyleWithColumns(25)));
8243 EXPECT_EQ("someFunction1234567890(\n"
8244 " \"aaabbbcccdddeeeff\"\n"
8245 " \"f\");",
8246 format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
8247 getLLVMStyleWithColumns(24)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008248 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8249 " \"ddde \"\n"
8250 " \"efff\");",
8251 format("someFunction(\"aaabbbcc ddde efff\");",
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008252 getLLVMStyleWithColumns(25)));
8253 EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
8254 " \"ddeeefff\");",
8255 format("someFunction(\"aaabbbccc ddeeefff\");",
8256 getLLVMStyleWithColumns(25)));
8257 EXPECT_EQ("someFunction1234567890(\n"
8258 " \"aaabb \"\n"
8259 " \"cccdddeeefff\");",
8260 format("someFunction1234567890(\"aaabb cccdddeeefff\");",
8261 getLLVMStyleWithColumns(25)));
8262 EXPECT_EQ("#define A \\\n"
8263 " string s = \\\n"
8264 " \"123456789\" \\\n"
8265 " \"0\"; \\\n"
8266 " int i;",
8267 format("#define A string s = \"1234567890\"; int i;",
8268 getLLVMStyleWithColumns(20)));
Daniel Jasper2739af32013-08-28 10:03:58 +00008269 // FIXME: Put additional penalties on breaking at non-whitespace locations.
8270 EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
8271 " \"dddeeeff\"\n"
8272 " \"f\");",
8273 format("someFunction(\"aaabbbcc dddeeefff\");",
8274 getLLVMStyleWithColumns(25)));
Manuel Klimek5ecb5fd2013-05-14 09:04:24 +00008275}
8276
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008277TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
Daniel Jaspera44991332015-04-29 13:06:49 +00008278 EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
8279 EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008280 EXPECT_EQ("\"test\"\n"
8281 "\"\\n\"",
8282 format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8283 EXPECT_EQ("\"tes\\\\\"\n"
8284 "\"n\"",
8285 format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8286 EXPECT_EQ("\"\\\\\\\\\"\n"
8287 "\"\\n\"",
8288 format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
Daniel Jaspera44991332015-04-29 13:06:49 +00008289 EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008290 EXPECT_EQ("\"\\uff01\"\n"
8291 "\"test\"",
8292 format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8293 EXPECT_EQ("\"\\Uff01ff02\"",
8294 format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8295 EXPECT_EQ("\"\\x000000000001\"\n"
8296 "\"next\"",
8297 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8298 EXPECT_EQ("\"\\x000000000001next\"",
8299 format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8300 EXPECT_EQ("\"\\x000000000001\"",
8301 format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8302 EXPECT_EQ("\"test\"\n"
8303 "\"\\000000\"\n"
8304 "\"000001\"",
8305 format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8306 EXPECT_EQ("\"test\\000\"\n"
Alexander Kornienkocb45bc12013-04-15 14:28:00 +00008307 "\"00000000\"\n"
8308 "\"1\"",
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008309 format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
Manuel Klimek5085d9b2013-03-08 18:59:48 +00008310}
8311
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008312TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8313 verifyFormat("void f() {\n"
8314 " return g() {}\n"
8315 " void h() {}");
Daniel Jasper4afc6b32014-06-02 10:57:55 +00008316 verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
Daniel Jasper1ec31062013-05-28 18:50:02 +00008317 "g();\n"
Manuel Klimeka3ff45e2013-04-10 09:52:05 +00008318 "}");
8319}
8320
Manuel Klimek421147e2014-01-24 09:25:23 +00008321TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8322 verifyFormat(
Daniel Jasper39485162014-05-22 09:00:33 +00008323 "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
Manuel Klimek421147e2014-01-24 09:25:23 +00008324}
8325
Manuel Klimek13b97d82013-05-13 08:42:42 +00008326TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8327 verifyFormat("class X {\n"
8328 " void f() {\n"
8329 " }\n"
8330 "};",
8331 getLLVMStyleWithColumns(12));
8332}
8333
8334TEST_F(FormatTest, ConfigurableIndentWidth) {
8335 FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8336 EightIndent.IndentWidth = 8;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008337 EightIndent.ContinuationIndentWidth = 8;
Manuel Klimek13b97d82013-05-13 08:42:42 +00008338 verifyFormat("void f() {\n"
8339 " someFunction();\n"
8340 " if (true) {\n"
8341 " f();\n"
8342 " }\n"
8343 "}",
8344 EightIndent);
8345 verifyFormat("class X {\n"
8346 " void f() {\n"
8347 " }\n"
8348 "};",
8349 EightIndent);
8350 verifyFormat("int x[] = {\n"
8351 " call(),\n"
Chandler Carruthf8b72662014-03-02 12:37:31 +00008352 " call()};",
Manuel Klimek13b97d82013-05-13 08:42:42 +00008353 EightIndent);
8354}
8355
Alexander Kornienko34a87e82013-06-22 01:35:36 +00008356TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
Daniel Jaspere068ac72014-10-27 17:13:59 +00008357 verifyFormat("double\n"
Manuel Klimek836c2862013-06-21 17:25:42 +00008358 "f();",
8359 getLLVMStyleWithColumns(8));
8360}
8361
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008362TEST_F(FormatTest, ConfigurableUseOfTab) {
8363 FormatStyle Tab = getLLVMStyleWithColumns(42);
8364 Tab.IndentWidth = 8;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008365 Tab.UseTab = FormatStyle::UT_Always;
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008366 Tab.AlignEscapedNewlinesLeft = true;
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008367
8368 EXPECT_EQ("if (aaaaaaaa && // q\n"
8369 " bb)\t\t// w\n"
8370 "\t;",
8371 format("if (aaaaaaaa &&// q\n"
8372 "bb)// w\n"
8373 ";",
8374 Tab));
8375 EXPECT_EQ("if (aaa && bbb) // w\n"
8376 "\t;",
8377 format("if(aaa&&bbb)// w\n"
8378 ";",
8379 Tab));
8380
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008381 verifyFormat("class X {\n"
8382 "\tvoid f() {\n"
8383 "\t\tsomeFunction(parameter1,\n"
8384 "\t\t\t parameter2);\n"
8385 "\t}\n"
8386 "};",
8387 Tab);
8388 verifyFormat("#define A \\\n"
8389 "\tvoid f() { \\\n"
8390 "\t\tsomeFunction( \\\n"
8391 "\t\t parameter1, \\\n"
8392 "\t\t parameter2); \\\n"
8393 "\t}",
8394 Tab);
Manuel Klimek34d15152013-05-28 10:01:59 +00008395
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +00008396 Tab.TabWidth = 4;
8397 Tab.IndentWidth = 8;
8398 verifyFormat("class TabWidth4Indent8 {\n"
8399 "\t\tvoid f() {\n"
8400 "\t\t\t\tsomeFunction(parameter1,\n"
8401 "\t\t\t\t\t\t\t parameter2);\n"
8402 "\t\t}\n"
8403 "};",
8404 Tab);
8405
8406 Tab.TabWidth = 4;
8407 Tab.IndentWidth = 4;
8408 verifyFormat("class TabWidth4Indent4 {\n"
8409 "\tvoid f() {\n"
8410 "\t\tsomeFunction(parameter1,\n"
8411 "\t\t\t\t\t parameter2);\n"
8412 "\t}\n"
8413 "};",
8414 Tab);
8415
8416 Tab.TabWidth = 8;
8417 Tab.IndentWidth = 4;
8418 verifyFormat("class TabWidth8Indent4 {\n"
8419 " void f() {\n"
8420 "\tsomeFunction(parameter1,\n"
8421 "\t\t parameter2);\n"
8422 " }\n"
8423 "};",
8424 Tab);
8425
Alexander Kornienko39856b72013-09-10 09:38:25 +00008426 Tab.TabWidth = 8;
8427 Tab.IndentWidth = 8;
8428 EXPECT_EQ("/*\n"
8429 "\t a\t\tcomment\n"
8430 "\t in multiple lines\n"
8431 " */",
8432 format(" /*\t \t \n"
8433 " \t \t a\t\tcomment\t \t\n"
8434 " \t \t in multiple lines\t\n"
8435 " \t */",
8436 Tab));
Alexander Kornienkodb4c21f2013-09-27 09:45:40 +00008437
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008438 Tab.UseTab = FormatStyle::UT_ForIndentation;
Chandler Carruthf8b72662014-03-02 12:37:31 +00008439 verifyFormat("{\n"
8440 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8441 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8442 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8443 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8444 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8445 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008446 "};",
8447 Tab);
Daniel Jasper411af722016-01-05 16:10:39 +00008448 verifyFormat("enum AA {\n"
Daniel Jasper96972812014-01-05 12:38:10 +00008449 "\ta1, // Force multiple lines\n"
Alexander Kornienkoe2e03872013-10-14 00:46:35 +00008450 "\ta2,\n"
8451 "\ta3\n"
8452 "};",
8453 Tab);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008454 EXPECT_EQ("if (aaaaaaaa && // q\n"
8455 " bb) // w\n"
8456 "\t;",
8457 format("if (aaaaaaaa &&// q\n"
8458 "bb)// w\n"
8459 ";",
8460 Tab));
8461 verifyFormat("class X {\n"
8462 "\tvoid f() {\n"
8463 "\t\tsomeFunction(parameter1,\n"
8464 "\t\t parameter2);\n"
8465 "\t}\n"
8466 "};",
8467 Tab);
8468 verifyFormat("{\n"
Daniel Jasper100ffc62015-08-21 11:44:57 +00008469 "\tQ(\n"
8470 "\t {\n"
8471 "\t\t int a;\n"
8472 "\t\t someFunction(aaaaaaaa,\n"
8473 "\t\t bbbbbbb);\n"
8474 "\t },\n"
8475 "\t p);\n"
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008476 "}",
8477 Tab);
8478 EXPECT_EQ("{\n"
8479 "\t/* aaaa\n"
8480 "\t bbbb */\n"
8481 "}",
8482 format("{\n"
8483 "/* aaaa\n"
8484 " bbbb */\n"
8485 "}",
8486 Tab));
8487 EXPECT_EQ("{\n"
8488 "\t/*\n"
8489 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8490 "\t bbbbbbbbbbbbb\n"
8491 "\t*/\n"
8492 "}",
8493 format("{\n"
8494 "/*\n"
8495 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8496 "*/\n"
8497 "}",
8498 Tab));
8499 EXPECT_EQ("{\n"
8500 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8501 "\t// bbbbbbbbbbbbb\n"
8502 "}",
8503 format("{\n"
8504 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8505 "}",
8506 Tab));
8507 EXPECT_EQ("{\n"
8508 "\t/*\n"
8509 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8510 "\t bbbbbbbbbbbbb\n"
8511 "\t*/\n"
8512 "}",
8513 format("{\n"
8514 "\t/*\n"
8515 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8516 "\t*/\n"
8517 "}",
8518 Tab));
8519 EXPECT_EQ("{\n"
8520 "\t/*\n"
8521 "\n"
8522 "\t*/\n"
8523 "}",
8524 format("{\n"
8525 "\t/*\n"
8526 "\n"
8527 "\t*/\n"
Alexander Kornienko45dc1b22013-09-27 16:40:11 +00008528 "}",
8529 Tab));
8530 EXPECT_EQ("{\n"
8531 "\t/*\n"
8532 " asdf\n"
8533 "\t*/\n"
8534 "}",
8535 format("{\n"
8536 "\t/*\n"
8537 " asdf\n"
8538 "\t*/\n"
8539 "}",
8540 Tab));
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +00008541
8542 Tab.UseTab = FormatStyle::UT_Never;
Alexander Kornienko39856b72013-09-10 09:38:25 +00008543 EXPECT_EQ("/*\n"
8544 " a\t\tcomment\n"
8545 " in multiple lines\n"
8546 " */",
8547 format(" /*\t \t \n"
8548 " \t \t a\t\tcomment\t \t\n"
8549 " \t \t in multiple lines\t\n"
8550 " \t */",
8551 Tab));
8552 EXPECT_EQ("/* some\n"
8553 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008554 format(" \t \t /* some\n"
8555 " \t \t comment */",
8556 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008557 EXPECT_EQ("int a; /* some\n"
8558 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008559 format(" \t \t int a; /* some\n"
8560 " \t \t comment */",
8561 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008562
Alexander Kornienko39856b72013-09-10 09:38:25 +00008563 EXPECT_EQ("int a; /* some\n"
8564 "comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008565 format(" \t \t int\ta; /* some\n"
8566 " \t \t comment */",
8567 Tab));
Alexander Kornienko39856b72013-09-10 09:38:25 +00008568 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8569 " comment */",
Daniel Jaspera44991332015-04-29 13:06:49 +00008570 format(" \t \t f(\"\t\t\"); /* some\n"
8571 " \t \t comment */",
8572 Tab));
Manuel Klimek34d15152013-05-28 10:01:59 +00008573 EXPECT_EQ("{\n"
8574 " /*\n"
8575 " * Comment\n"
8576 " */\n"
8577 " int i;\n"
8578 "}",
8579 format("{\n"
8580 "\t/*\n"
8581 "\t * Comment\n"
8582 "\t */\n"
8583 "\t int i;\n"
8584 "}"));
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +00008585
8586 Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8587 Tab.TabWidth = 8;
8588 Tab.IndentWidth = 8;
8589 EXPECT_EQ("if (aaaaaaaa && // q\n"
8590 " bb) // w\n"
8591 "\t;",
8592 format("if (aaaaaaaa &&// q\n"
8593 "bb)// w\n"
8594 ";",
8595 Tab));
8596 EXPECT_EQ("if (aaa && bbb) // w\n"
8597 "\t;",
8598 format("if(aaa&&bbb)// w\n"
8599 ";",
8600 Tab));
8601 verifyFormat("class X {\n"
8602 "\tvoid f() {\n"
8603 "\t\tsomeFunction(parameter1,\n"
8604 "\t\t\t parameter2);\n"
8605 "\t}\n"
8606 "};",
8607 Tab);
8608 verifyFormat("#define A \\\n"
8609 "\tvoid f() { \\\n"
8610 "\t\tsomeFunction( \\\n"
8611 "\t\t parameter1, \\\n"
8612 "\t\t parameter2); \\\n"
8613 "\t}",
8614 Tab);
8615 Tab.TabWidth = 4;
8616 Tab.IndentWidth = 8;
8617 verifyFormat("class TabWidth4Indent8 {\n"
8618 "\t\tvoid f() {\n"
8619 "\t\t\t\tsomeFunction(parameter1,\n"
8620 "\t\t\t\t\t\t\t parameter2);\n"
8621 "\t\t}\n"
8622 "};",
8623 Tab);
8624 Tab.TabWidth = 4;
8625 Tab.IndentWidth = 4;
8626 verifyFormat("class TabWidth4Indent4 {\n"
8627 "\tvoid f() {\n"
8628 "\t\tsomeFunction(parameter1,\n"
8629 "\t\t\t\t\t parameter2);\n"
8630 "\t}\n"
8631 "};",
8632 Tab);
8633 Tab.TabWidth = 8;
8634 Tab.IndentWidth = 4;
8635 verifyFormat("class TabWidth8Indent4 {\n"
8636 " void f() {\n"
8637 "\tsomeFunction(parameter1,\n"
8638 "\t\t parameter2);\n"
8639 " }\n"
8640 "};",
8641 Tab);
8642 Tab.TabWidth = 8;
8643 Tab.IndentWidth = 8;
8644 EXPECT_EQ("/*\n"
8645 "\t a\t\tcomment\n"
8646 "\t in multiple lines\n"
8647 " */",
8648 format(" /*\t \t \n"
8649 " \t \t a\t\tcomment\t \t\n"
8650 " \t \t in multiple lines\t\n"
8651 " \t */",
8652 Tab));
8653 verifyFormat("{\n"
8654 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8655 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8656 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8657 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8658 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8659 "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8660 "};",
8661 Tab);
8662 verifyFormat("enum AA {\n"
8663 "\ta1, // Force multiple lines\n"
8664 "\ta2,\n"
8665 "\ta3\n"
8666 "};",
8667 Tab);
8668 EXPECT_EQ("if (aaaaaaaa && // q\n"
8669 " bb) // w\n"
8670 "\t;",
8671 format("if (aaaaaaaa &&// q\n"
8672 "bb)// w\n"
8673 ";",
8674 Tab));
8675 verifyFormat("class X {\n"
8676 "\tvoid f() {\n"
8677 "\t\tsomeFunction(parameter1,\n"
8678 "\t\t\t parameter2);\n"
8679 "\t}\n"
8680 "};",
8681 Tab);
8682 verifyFormat("{\n"
8683 "\tQ(\n"
8684 "\t {\n"
8685 "\t\t int a;\n"
8686 "\t\t someFunction(aaaaaaaa,\n"
8687 "\t\t\t\t bbbbbbb);\n"
8688 "\t },\n"
8689 "\t p);\n"
8690 "}",
8691 Tab);
8692 EXPECT_EQ("{\n"
8693 "\t/* aaaa\n"
8694 "\t bbbb */\n"
8695 "}",
8696 format("{\n"
8697 "/* aaaa\n"
8698 " bbbb */\n"
8699 "}",
8700 Tab));
8701 EXPECT_EQ("{\n"
8702 "\t/*\n"
8703 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8704 "\t bbbbbbbbbbbbb\n"
8705 "\t*/\n"
8706 "}",
8707 format("{\n"
8708 "/*\n"
8709 " aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8710 "*/\n"
8711 "}",
8712 Tab));
8713 EXPECT_EQ("{\n"
8714 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8715 "\t// bbbbbbbbbbbbb\n"
8716 "}",
8717 format("{\n"
8718 "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8719 "}",
8720 Tab));
8721 EXPECT_EQ("{\n"
8722 "\t/*\n"
8723 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8724 "\t bbbbbbbbbbbbb\n"
8725 "\t*/\n"
8726 "}",
8727 format("{\n"
8728 "\t/*\n"
8729 "\t aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8730 "\t*/\n"
8731 "}",
8732 Tab));
8733 EXPECT_EQ("{\n"
8734 "\t/*\n"
8735 "\n"
8736 "\t*/\n"
8737 "}",
8738 format("{\n"
8739 "\t/*\n"
8740 "\n"
8741 "\t*/\n"
8742 "}",
8743 Tab));
8744 EXPECT_EQ("{\n"
8745 "\t/*\n"
8746 " asdf\n"
8747 "\t*/\n"
8748 "}",
8749 format("{\n"
8750 "\t/*\n"
8751 " asdf\n"
8752 "\t*/\n"
8753 "}",
8754 Tab));
8755 EXPECT_EQ("/*\n"
8756 "\t a\t\tcomment\n"
8757 "\t in multiple lines\n"
8758 " */",
8759 format(" /*\t \t \n"
8760 " \t \t a\t\tcomment\t \t\n"
8761 " \t \t in multiple lines\t\n"
8762 " \t */",
8763 Tab));
8764 EXPECT_EQ("/* some\n"
8765 " comment */",
8766 format(" \t \t /* some\n"
8767 " \t \t comment */",
8768 Tab));
8769 EXPECT_EQ("int a; /* some\n"
8770 " comment */",
8771 format(" \t \t int a; /* some\n"
8772 " \t \t comment */",
8773 Tab));
8774 EXPECT_EQ("int a; /* some\n"
8775 "comment */",
8776 format(" \t \t int\ta; /* some\n"
8777 " \t \t comment */",
8778 Tab));
8779 EXPECT_EQ("f(\"\t\t\"); /* some\n"
8780 " comment */",
8781 format(" \t \t f(\"\t\t\"); /* some\n"
8782 " \t \t comment */",
8783 Tab));
8784 EXPECT_EQ("{\n"
8785 " /*\n"
8786 " * Comment\n"
8787 " */\n"
8788 " int i;\n"
8789 "}",
8790 format("{\n"
8791 "\t/*\n"
8792 "\t * Comment\n"
8793 "\t */\n"
8794 "\t int i;\n"
8795 "}"));
8796 Tab.AlignConsecutiveAssignments = true;
8797 Tab.AlignConsecutiveDeclarations = true;
8798 Tab.TabWidth = 4;
8799 Tab.IndentWidth = 4;
8800 verifyFormat("class Assign {\n"
8801 "\tvoid f() {\n"
8802 "\t\tint x = 123;\n"
8803 "\t\tint random = 4;\n"
8804 "\t\tstd::string alphabet =\n"
8805 "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8806 "\t}\n"
8807 "};",
8808 Tab);
Manuel Klimekb9eae4c2013-05-13 09:22:11 +00008809}
8810
Alexander Kornienko917f9e02013-09-10 12:29:48 +00008811TEST_F(FormatTest, CalculatesOriginalColumn) {
8812 EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8813 "q\"; /* some\n"
8814 " comment */",
8815 format(" \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8816 "q\"; /* some\n"
8817 " comment */",
8818 getLLVMStyle()));
8819 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8820 "/* some\n"
8821 " comment */",
8822 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8823 " /* some\n"
8824 " comment */",
8825 getLLVMStyle()));
8826 EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8827 "qqq\n"
8828 "/* some\n"
8829 " comment */",
8830 format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8831 "qqq\n"
8832 " /* some\n"
8833 " comment */",
8834 getLLVMStyle()));
8835 EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8836 "wwww; /* some\n"
8837 " comment */",
8838 format(" inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8839 "wwww; /* some\n"
8840 " comment */",
8841 getLLVMStyle()));
8842}
8843
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008844TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
Daniel Jasperb55acad2013-08-20 12:36:34 +00008845 FormatStyle NoSpace = getLLVMStyle();
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008846 NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008847
8848 verifyFormat("while(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008849 " continue;",
8850 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008851 verifyFormat("for(;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008852 " continue;",
8853 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008854 verifyFormat("if(true)\n"
8855 " f();\n"
8856 "else if(true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008857 " f();",
8858 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008859 verifyFormat("do {\n"
8860 " do_something();\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008861 "} while(something());",
8862 NoSpace);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008863 verifyFormat("switch(x) {\n"
8864 "default:\n"
8865 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008866 "}",
8867 NoSpace);
Chad Rosier0a84f172014-08-05 17:58:54 +00008868 verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
Daniel Jasper78b194992014-08-06 14:15:41 +00008869 verifyFormat("size_t x = sizeof(x);", NoSpace);
8870 verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8871 verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8872 verifyFormat("alignas(128) char a[128];", NoSpace);
8873 verifyFormat("size_t x = alignof(MyType);", NoSpace);
8874 verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8875 verifyFormat("int f() throw(Deprecated);", NoSpace);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008876 verifyFormat("typedef void (*cb)(int);", NoSpace);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008877 verifyFormat("T A::operator()();", NoSpace);
8878 verifyFormat("X A::operator++(T);", NoSpace);
Alexander Kornienkofdca83d2013-12-10 10:18:34 +00008879
8880 FormatStyle Space = getLLVMStyle();
8881 Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8882
8883 verifyFormat("int f ();", Space);
8884 verifyFormat("void f (int a, T b) {\n"
8885 " while (true)\n"
8886 " continue;\n"
8887 "}",
8888 Space);
8889 verifyFormat("if (true)\n"
8890 " f ();\n"
8891 "else if (true)\n"
8892 " f ();",
8893 Space);
8894 verifyFormat("do {\n"
8895 " do_something ();\n"
8896 "} while (something ());",
8897 Space);
8898 verifyFormat("switch (x) {\n"
8899 "default:\n"
8900 " break;\n"
8901 "}",
8902 Space);
8903 verifyFormat("A::A () : a (1) {}", Space);
8904 verifyFormat("void f () __attribute__ ((asdf));", Space);
8905 verifyFormat("*(&a + 1);\n"
8906 "&((&a)[1]);\n"
8907 "a[(b + c) * d];\n"
8908 "(((a + 1) * 2) + 3) * 4;",
8909 Space);
8910 verifyFormat("#define A(x) x", Space);
8911 verifyFormat("#define A (x) x", Space);
8912 verifyFormat("#if defined(x)\n"
8913 "#endif",
8914 Space);
Chad Rosier0a84f172014-08-05 17:58:54 +00008915 verifyFormat("auto i = std::make_unique<int> (5);", Space);
Daniel Jasper78b194992014-08-06 14:15:41 +00008916 verifyFormat("size_t x = sizeof (x);", Space);
8917 verifyFormat("auto f (int x) -> decltype (x);", Space);
8918 verifyFormat("int f (T x) noexcept (x.create ());", Space);
8919 verifyFormat("alignas (128) char a[128];", Space);
8920 verifyFormat("size_t x = alignof (MyType);", Space);
8921 verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8922 verifyFormat("int f () throw (Deprecated);", Space);
Anders Waldenborgb09075a2015-05-19 16:54:26 +00008923 verifyFormat("typedef void (*cb) (int);", Space);
Daniel Jaspera804d1e2015-08-11 20:32:24 +00008924 verifyFormat("T A::operator() ();", Space);
8925 verifyFormat("X A::operator++ (T);", Space);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008926}
8927
8928TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8929 FormatStyle Spaces = getLLVMStyle();
8930
8931 Spaces.SpacesInParentheses = true;
8932 verifyFormat("call( x, y, z );", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008933 verifyFormat("call();", Spaces);
8934 verifyFormat("std::function<void( int, int )> callback;", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +00008935 verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8936 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008937 verifyFormat("while ( (bool)1 )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008938 " continue;",
8939 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008940 verifyFormat("for ( ;; )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008941 " continue;",
8942 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008943 verifyFormat("if ( true )\n"
8944 " f();\n"
8945 "else if ( true )\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008946 " f();",
8947 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008948 verifyFormat("do {\n"
8949 " do_something( (int)i );\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008950 "} while ( something() );",
8951 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008952 verifyFormat("switch ( x ) {\n"
8953 "default:\n"
8954 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008955 "}",
8956 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008957
8958 Spaces.SpacesInParentheses = false;
8959 Spaces.SpacesInCStyleCastParentheses = true;
8960 verifyFormat("Type *A = ( Type * )P;", Spaces);
8961 verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8962 verifyFormat("x = ( int32 )y;", Spaces);
8963 verifyFormat("int a = ( int )(2.0f);", Spaces);
8964 verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8965 verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8966 verifyFormat("#define x (( int )-1)", Spaces);
8967
Daniel Jasper92e09822015-03-18 12:59:19 +00008968 // Run the first set of tests again with:
Richard Trieucc3949d2016-02-18 22:34:54 +00008969 Spaces.SpacesInParentheses = false;
8970 Spaces.SpaceInEmptyParentheses = true;
Daniel Jasperb55acad2013-08-20 12:36:34 +00008971 Spaces.SpacesInCStyleCastParentheses = true;
8972 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008973 verifyFormat("call( );", Spaces);
8974 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008975 verifyFormat("while (( bool )1)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008976 " continue;",
8977 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008978 verifyFormat("for (;;)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008979 " continue;",
8980 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008981 verifyFormat("if (true)\n"
8982 " f( );\n"
8983 "else if (true)\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008984 " f( );",
8985 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008986 verifyFormat("do {\n"
8987 " do_something(( int )i);\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008988 "} while (something( ));",
8989 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00008990 verifyFormat("switch (x) {\n"
8991 "default:\n"
8992 " break;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00008993 "}",
8994 Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008995
Daniel Jasper92e09822015-03-18 12:59:19 +00008996 // Run the first set of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00008997 Spaces.SpaceAfterCStyleCast = true;
8998 verifyFormat("call(x, y, z);", Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00008999 verifyFormat("call( );", Spaces);
9000 verifyFormat("std::function<void(int, int)> callback;", Spaces);
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009001 verifyFormat("while (( bool ) 1)\n"
9002 " continue;",
9003 Spaces);
9004 verifyFormat("for (;;)\n"
9005 " continue;",
9006 Spaces);
9007 verifyFormat("if (true)\n"
9008 " f( );\n"
9009 "else if (true)\n"
9010 " f( );",
9011 Spaces);
9012 verifyFormat("do {\n"
9013 " do_something(( int ) i);\n"
9014 "} while (something( ));",
9015 Spaces);
9016 verifyFormat("switch (x) {\n"
9017 "default:\n"
9018 " break;\n"
9019 "}",
9020 Spaces);
Daniel Jasper92e09822015-03-18 12:59:19 +00009021
9022 // Run subset of tests again with:
Daniel Jasperdb986eb2014-09-03 07:37:29 +00009023 Spaces.SpacesInCStyleCastParentheses = false;
9024 Spaces.SpaceAfterCStyleCast = true;
9025 verifyFormat("while ((bool) 1)\n"
9026 " continue;",
9027 Spaces);
9028 verifyFormat("do {\n"
9029 " do_something((int) i);\n"
9030 "} while (something( ));",
9031 Spaces);
Daniel Jasperb55acad2013-08-20 12:36:34 +00009032}
9033
Daniel Jasperad981f82014-08-26 11:41:14 +00009034TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9035 verifyFormat("int a[5];");
9036 verifyFormat("a[3] += 42;");
9037
9038 FormatStyle Spaces = getLLVMStyle();
9039 Spaces.SpacesInSquareBrackets = true;
9040 // Lambdas unchanged.
9041 verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9042 verifyFormat("return [i, args...] {};", Spaces);
9043
9044 // Not lambdas.
9045 verifyFormat("int a[ 5 ];", Spaces);
9046 verifyFormat("a[ 3 ] += 42;", Spaces);
9047 verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9048 verifyFormat("double &operator[](int i) { return 0; }\n"
9049 "int i;",
9050 Spaces);
9051 verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9052 verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9053 verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9054}
9055
Daniel Jasperd94bff32013-09-25 15:15:02 +00009056TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9057 verifyFormat("int a = 5;");
9058 verifyFormat("a += 42;");
9059 verifyFormat("a or_eq 8;");
9060
9061 FormatStyle Spaces = getLLVMStyle();
9062 Spaces.SpaceBeforeAssignmentOperators = false;
9063 verifyFormat("int a= 5;", Spaces);
9064 verifyFormat("a+= 42;", Spaces);
9065 verifyFormat("a or_eq 8;", Spaces);
9066}
9067
Daniel Jaspera44991332015-04-29 13:06:49 +00009068TEST_F(FormatTest, AlignConsecutiveAssignments) {
9069 FormatStyle Alignment = getLLVMStyle();
9070 Alignment.AlignConsecutiveAssignments = false;
9071 verifyFormat("int a = 5;\n"
9072 "int oneTwoThree = 123;",
9073 Alignment);
9074 verifyFormat("int a = 5;\n"
9075 "int oneTwoThree = 123;",
9076 Alignment);
9077
9078 Alignment.AlignConsecutiveAssignments = true;
9079 verifyFormat("int a = 5;\n"
9080 "int oneTwoThree = 123;",
9081 Alignment);
9082 verifyFormat("int a = method();\n"
9083 "int oneTwoThree = 133;",
9084 Alignment);
9085 verifyFormat("a &= 5;\n"
9086 "bcd *= 5;\n"
9087 "ghtyf += 5;\n"
9088 "dvfvdb -= 5;\n"
9089 "a /= 5;\n"
9090 "vdsvsv %= 5;\n"
9091 "sfdbddfbdfbb ^= 5;\n"
9092 "dvsdsv |= 5;\n"
9093 "int dsvvdvsdvvv = 123;",
9094 Alignment);
9095 verifyFormat("int i = 1, j = 10;\n"
9096 "something = 2000;",
9097 Alignment);
9098 verifyFormat("something = 2000;\n"
9099 "int i = 1, j = 10;\n",
9100 Alignment);
9101 verifyFormat("something = 2000;\n"
9102 "another = 911;\n"
9103 "int i = 1, j = 10;\n"
9104 "oneMore = 1;\n"
9105 "i = 2;",
9106 Alignment);
9107 verifyFormat("int a = 5;\n"
9108 "int one = 1;\n"
9109 "method();\n"
9110 "int oneTwoThree = 123;\n"
9111 "int oneTwo = 12;",
9112 Alignment);
Daniel Jasperbbfd20d2015-09-22 09:32:00 +00009113 verifyFormat("int oneTwoThree = 123;\n"
9114 "int oneTwo = 12;\n"
9115 "method();\n",
9116 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009117 verifyFormat("int oneTwoThree = 123; // comment\n"
9118 "int oneTwo = 12; // comment",
9119 Alignment);
9120 EXPECT_EQ("int a = 5;\n"
9121 "\n"
9122 "int oneTwoThree = 123;",
9123 format("int a = 5;\n"
9124 "\n"
9125 "int oneTwoThree= 123;",
9126 Alignment));
9127 EXPECT_EQ("int a = 5;\n"
9128 "int one = 1;\n"
9129 "\n"
9130 "int oneTwoThree = 123;",
9131 format("int a = 5;\n"
9132 "int one = 1;\n"
9133 "\n"
9134 "int oneTwoThree = 123;",
9135 Alignment));
9136 EXPECT_EQ("int a = 5;\n"
9137 "int one = 1;\n"
9138 "\n"
9139 "int oneTwoThree = 123;\n"
9140 "int oneTwo = 12;",
9141 format("int a = 5;\n"
9142 "int one = 1;\n"
9143 "\n"
9144 "int oneTwoThree = 123;\n"
9145 "int oneTwo = 12;",
9146 Alignment));
9147 Alignment.AlignEscapedNewlinesLeft = true;
9148 verifyFormat("#define A \\\n"
9149 " int aaaa = 12; \\\n"
9150 " int b = 23; \\\n"
9151 " int ccc = 234; \\\n"
9152 " int dddddddddd = 2345;",
9153 Alignment);
9154 Alignment.AlignEscapedNewlinesLeft = false;
9155 verifyFormat("#define A "
9156 " \\\n"
9157 " int aaaa = 12; "
9158 " \\\n"
9159 " int b = 23; "
9160 " \\\n"
9161 " int ccc = 234; "
9162 " \\\n"
9163 " int dddddddddd = 2345;",
9164 Alignment);
9165 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9166 "k = 4, int l = 5,\n"
9167 " int m = 6) {\n"
9168 " int j = 10;\n"
9169 " otherThing = 1;\n"
9170 "}",
9171 Alignment);
9172 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9173 " int i = 1;\n"
9174 " int j = 2;\n"
9175 " int big = 10000;\n"
9176 "}",
9177 Alignment);
9178 verifyFormat("class C {\n"
9179 "public:\n"
Daniel Jasperec90e512015-12-01 12:00:43 +00009180 " int i = 1;\n"
Daniel Jaspera44991332015-04-29 13:06:49 +00009181 " virtual void f() = 0;\n"
9182 "};",
9183 Alignment);
9184 verifyFormat("int i = 1;\n"
9185 "if (SomeType t = getSomething()) {\n"
9186 "}\n"
9187 "int j = 2;\n"
9188 "int big = 10000;",
9189 Alignment);
9190 verifyFormat("int j = 7;\n"
9191 "for (int k = 0; k < N; ++k) {\n"
9192 "}\n"
9193 "int j = 2;\n"
9194 "int big = 10000;\n"
9195 "}",
9196 Alignment);
9197 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9198 verifyFormat("int i = 1;\n"
9199 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9200 " = someLooooooooooooooooongFunction();\n"
9201 "int j = 2;",
9202 Alignment);
9203 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9204 verifyFormat("int i = 1;\n"
9205 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9206 " someLooooooooooooooooongFunction();\n"
9207 "int j = 2;",
9208 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009209
9210 verifyFormat("auto lambda = []() {\n"
9211 " auto i = 0;\n"
9212 " return 0;\n"
9213 "};\n"
9214 "int i = 0;\n"
9215 "auto v = type{\n"
9216 " i = 1, //\n"
9217 " (i = 2), //\n"
9218 " i = 3 //\n"
9219 "};",
9220 Alignment);
9221
Daniel Jaspera44991332015-04-29 13:06:49 +00009222 // FIXME: Should align all three assignments
9223 verifyFormat(
9224 "int i = 1;\n"
9225 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9226 " loooooooooooooooooooooongParameterB);\n"
9227 "int j = 2;",
9228 Alignment);
Daniel Jasperec90e512015-12-01 12:00:43 +00009229
9230 verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
9231 " typename B = very_long_type_name_1,\n"
9232 " typename T_2 = very_long_type_name_2>\n"
9233 "auto foo() {}\n",
9234 Alignment);
9235 verifyFormat("int a, b = 1;\n"
9236 "int c = 2;\n"
9237 "int dd = 3;\n",
9238 Alignment);
9239 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9240 "float b[1][] = {{3.f}};\n",
9241 Alignment);
Daniel Jaspera44991332015-04-29 13:06:49 +00009242}
9243
Daniel Jaspere12597c2015-10-01 10:06:54 +00009244TEST_F(FormatTest, AlignConsecutiveDeclarations) {
9245 FormatStyle Alignment = getLLVMStyle();
9246 Alignment.AlignConsecutiveDeclarations = false;
9247 verifyFormat("float const a = 5;\n"
9248 "int oneTwoThree = 123;",
9249 Alignment);
9250 verifyFormat("int a = 5;\n"
9251 "float const oneTwoThree = 123;",
9252 Alignment);
9253
9254 Alignment.AlignConsecutiveDeclarations = true;
9255 verifyFormat("float const a = 5;\n"
9256 "int oneTwoThree = 123;",
9257 Alignment);
9258 verifyFormat("int a = method();\n"
9259 "float const oneTwoThree = 133;",
9260 Alignment);
9261 verifyFormat("int i = 1, j = 10;\n"
9262 "something = 2000;",
9263 Alignment);
9264 verifyFormat("something = 2000;\n"
9265 "int i = 1, j = 10;\n",
9266 Alignment);
9267 verifyFormat("float something = 2000;\n"
9268 "double another = 911;\n"
9269 "int i = 1, j = 10;\n"
9270 "const int *oneMore = 1;\n"
9271 "unsigned i = 2;",
9272 Alignment);
9273 verifyFormat("float a = 5;\n"
9274 "int one = 1;\n"
9275 "method();\n"
9276 "const double oneTwoThree = 123;\n"
9277 "const unsigned int oneTwo = 12;",
9278 Alignment);
9279 verifyFormat("int oneTwoThree{0}; // comment\n"
9280 "unsigned oneTwo; // comment",
9281 Alignment);
9282 EXPECT_EQ("float const a = 5;\n"
9283 "\n"
9284 "int oneTwoThree = 123;",
9285 format("float const a = 5;\n"
9286 "\n"
9287 "int oneTwoThree= 123;",
9288 Alignment));
9289 EXPECT_EQ("float a = 5;\n"
9290 "int one = 1;\n"
9291 "\n"
9292 "unsigned oneTwoThree = 123;",
9293 format("float a = 5;\n"
9294 "int one = 1;\n"
9295 "\n"
9296 "unsigned oneTwoThree = 123;",
9297 Alignment));
9298 EXPECT_EQ("float a = 5;\n"
9299 "int one = 1;\n"
9300 "\n"
9301 "unsigned oneTwoThree = 123;\n"
9302 "int oneTwo = 12;",
9303 format("float a = 5;\n"
9304 "int one = 1;\n"
9305 "\n"
9306 "unsigned oneTwoThree = 123;\n"
9307 "int oneTwo = 12;",
9308 Alignment));
9309 Alignment.AlignConsecutiveAssignments = true;
9310 verifyFormat("float something = 2000;\n"
9311 "double another = 911;\n"
9312 "int i = 1, j = 10;\n"
9313 "const int *oneMore = 1;\n"
9314 "unsigned i = 2;",
9315 Alignment);
9316 verifyFormat("int oneTwoThree = {0}; // comment\n"
9317 "unsigned oneTwo = 0; // comment",
9318 Alignment);
9319 EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9320 " int const i = 1;\n"
9321 " int * j = 2;\n"
9322 " int big = 10000;\n"
9323 "\n"
9324 " unsigned oneTwoThree = 123;\n"
9325 " int oneTwo = 12;\n"
9326 " method();\n"
9327 " float k = 2;\n"
9328 " int ll = 10000;\n"
9329 "}",
9330 format("void SomeFunction(int parameter= 0) {\n"
9331 " int const i= 1;\n"
9332 " int *j=2;\n"
9333 " int big = 10000;\n"
9334 "\n"
9335 "unsigned oneTwoThree =123;\n"
9336 "int oneTwo = 12;\n"
9337 " method();\n"
9338 "float k= 2;\n"
9339 "int ll=10000;\n"
9340 "}",
9341 Alignment));
9342 Alignment.AlignConsecutiveAssignments = false;
9343 Alignment.AlignEscapedNewlinesLeft = true;
9344 verifyFormat("#define A \\\n"
9345 " int aaaa = 12; \\\n"
9346 " float b = 23; \\\n"
9347 " const int ccc = 234; \\\n"
9348 " unsigned dddddddddd = 2345;",
9349 Alignment);
9350 Alignment.AlignEscapedNewlinesLeft = false;
9351 Alignment.ColumnLimit = 30;
9352 verifyFormat("#define A \\\n"
9353 " int aaaa = 12; \\\n"
9354 " float b = 23; \\\n"
9355 " const int ccc = 234; \\\n"
9356 " int dddddddddd = 2345;",
9357 Alignment);
9358 Alignment.ColumnLimit = 80;
9359 verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9360 "k = 4, int l = 5,\n"
9361 " int m = 6) {\n"
9362 " const int j = 10;\n"
9363 " otherThing = 1;\n"
9364 "}",
9365 Alignment);
9366 verifyFormat("void SomeFunction(int parameter = 0) {\n"
9367 " int const i = 1;\n"
9368 " int * j = 2;\n"
9369 " int big = 10000;\n"
9370 "}",
9371 Alignment);
9372 verifyFormat("class C {\n"
9373 "public:\n"
9374 " int i = 1;\n"
9375 " virtual void f() = 0;\n"
9376 "};",
9377 Alignment);
9378 verifyFormat("float i = 1;\n"
9379 "if (SomeType t = getSomething()) {\n"
9380 "}\n"
9381 "const unsigned j = 2;\n"
9382 "int big = 10000;",
9383 Alignment);
9384 verifyFormat("float j = 7;\n"
9385 "for (int k = 0; k < N; ++k) {\n"
9386 "}\n"
9387 "unsigned j = 2;\n"
9388 "int big = 10000;\n"
9389 "}",
9390 Alignment);
9391 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9392 verifyFormat("float i = 1;\n"
9393 "LooooooooooongType loooooooooooooooooooooongVariable\n"
9394 " = someLooooooooooooooooongFunction();\n"
9395 "int j = 2;",
9396 Alignment);
9397 Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9398 verifyFormat("int i = 1;\n"
9399 "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9400 " someLooooooooooooooooongFunction();\n"
9401 "int j = 2;",
9402 Alignment);
Daniel Jasper39828252015-10-07 15:03:26 +00009403
9404 Alignment.AlignConsecutiveAssignments = true;
9405 verifyFormat("auto lambda = []() {\n"
9406 " auto ii = 0;\n"
9407 " float j = 0;\n"
9408 " return 0;\n"
9409 "};\n"
9410 "int i = 0;\n"
9411 "float i2 = 0;\n"
9412 "auto v = type{\n"
9413 " i = 1, //\n"
9414 " (i = 2), //\n"
9415 " i = 3 //\n"
9416 "};",
9417 Alignment);
9418 Alignment.AlignConsecutiveAssignments = false;
9419
Daniel Jaspere12597c2015-10-01 10:06:54 +00009420 // FIXME: Should align all three declarations
9421 verifyFormat(
9422 "int i = 1;\n"
9423 "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9424 " loooooooooooooooooooooongParameterB);\n"
9425 "int j = 2;",
9426 Alignment);
9427
9428 // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9429 // We expect declarations and assignments to align, as long as it doesn't
9430 // exceed the column limit, starting a new alignemnt sequence whenever it
9431 // happens.
9432 Alignment.AlignConsecutiveAssignments = true;
9433 Alignment.ColumnLimit = 30;
9434 verifyFormat("float ii = 1;\n"
9435 "unsigned j = 2;\n"
9436 "int someVerylongVariable = 1;\n"
9437 "AnotherLongType ll = 123456;\n"
9438 "VeryVeryLongType k = 2;\n"
9439 "int myvar = 1;",
9440 Alignment);
9441 Alignment.ColumnLimit = 80;
Daniel Jasperec90e512015-12-01 12:00:43 +00009442 Alignment.AlignConsecutiveAssignments = false;
9443
9444 verifyFormat(
9445 "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9446 " typename LongType, typename B>\n"
9447 "auto foo() {}\n",
9448 Alignment);
9449 verifyFormat("float a, b = 1;\n"
9450 "int c = 2;\n"
9451 "int dd = 3;\n",
9452 Alignment);
9453 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9454 "float b[1][] = {{3.f}};\n",
9455 Alignment);
9456 Alignment.AlignConsecutiveAssignments = true;
9457 verifyFormat("float a, b = 1;\n"
9458 "int c = 2;\n"
9459 "int dd = 3;\n",
9460 Alignment);
9461 verifyFormat("int aa = ((1 > 2) ? 3 : 4);\n"
9462 "float b[1][] = {{3.f}};\n",
9463 Alignment);
9464 Alignment.AlignConsecutiveAssignments = false;
9465
9466 Alignment.ColumnLimit = 30;
9467 Alignment.BinPackParameters = false;
9468 verifyFormat("void foo(float a,\n"
9469 " float b,\n"
9470 " int c,\n"
9471 " uint32_t *d) {\n"
9472 " int * e = 0;\n"
9473 " float f = 0;\n"
9474 " double g = 0;\n"
9475 "}\n"
9476 "void bar(ino_t a,\n"
9477 " int b,\n"
9478 " uint32_t *c,\n"
9479 " bool d) {}\n",
9480 Alignment);
9481 Alignment.BinPackParameters = true;
9482 Alignment.ColumnLimit = 80;
Daniel Jaspere12597c2015-10-01 10:06:54 +00009483}
9484
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009485TEST_F(FormatTest, LinuxBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009486 FormatStyle LinuxBraceStyle = getLLVMStyle();
9487 LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009488 verifyFormat("namespace a\n"
9489 "{\n"
9490 "class A\n"
9491 "{\n"
9492 " void f()\n"
9493 " {\n"
9494 " if (true) {\n"
9495 " a();\n"
9496 " b();\n"
Daniel Jasper96cbb502015-12-14 08:33:07 +00009497 " } else {\n"
9498 " a();\n"
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009499 " }\n"
9500 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009501 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009502 "};\n"
9503 "struct B {\n"
9504 " int x;\n"
9505 "};\n"
9506 "}\n",
9507 LinuxBraceStyle);
9508 verifyFormat("enum X {\n"
9509 " Y = 0,\n"
9510 "}\n",
9511 LinuxBraceStyle);
9512 verifyFormat("struct S {\n"
9513 " int Type;\n"
9514 " union {\n"
9515 " int x;\n"
9516 " double y;\n"
9517 " } Value;\n"
9518 " class C\n"
9519 " {\n"
9520 " MyFavoriteType Value;\n"
9521 " } Class;\n"
9522 "}\n",
9523 LinuxBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009524}
9525
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +00009526TEST_F(FormatTest, MozillaBraceBreaking) {
9527 FormatStyle MozillaBraceStyle = getLLVMStyle();
9528 MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
9529 verifyFormat("namespace a {\n"
9530 "class A\n"
9531 "{\n"
9532 " void f()\n"
9533 " {\n"
9534 " if (true) {\n"
9535 " a();\n"
9536 " b();\n"
9537 " }\n"
9538 " }\n"
9539 " void g() { return; }\n"
9540 "};\n"
9541 "enum E\n"
9542 "{\n"
9543 " A,\n"
9544 " // foo\n"
9545 " B,\n"
9546 " C\n"
9547 "};\n"
9548 "struct B\n"
9549 "{\n"
9550 " int x;\n"
9551 "};\n"
9552 "}\n",
9553 MozillaBraceStyle);
9554 verifyFormat("struct S\n"
9555 "{\n"
9556 " int Type;\n"
9557 " union\n"
9558 " {\n"
9559 " int x;\n"
9560 " double y;\n"
9561 " } Value;\n"
9562 " class C\n"
9563 " {\n"
9564 " MyFavoriteType Value;\n"
9565 " } Class;\n"
9566 "}\n",
9567 MozillaBraceStyle);
9568}
9569
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009570TEST_F(FormatTest, StroustrupBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009571 FormatStyle StroustrupBraceStyle = getLLVMStyle();
9572 StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009573 verifyFormat("namespace a {\n"
9574 "class A {\n"
9575 " void f()\n"
9576 " {\n"
9577 " if (true) {\n"
9578 " a();\n"
9579 " b();\n"
9580 " }\n"
9581 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009582 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009583 "};\n"
9584 "struct B {\n"
9585 " int x;\n"
9586 "};\n"
9587 "}\n",
9588 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009589
Daniel Jasperd9670872014-08-05 12:06:20 +00009590 verifyFormat("void foo()\n"
9591 "{\n"
9592 " if (a) {\n"
9593 " a();\n"
9594 " }\n"
9595 " else {\n"
9596 " b();\n"
9597 " }\n"
9598 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009599 StroustrupBraceStyle);
Daniel Jasperd9670872014-08-05 12:06:20 +00009600
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009601 verifyFormat("#ifdef _DEBUG\n"
9602 "int foo(int i = 0)\n"
9603 "#else\n"
9604 "int foo(int i = 5)\n"
9605 "#endif\n"
9606 "{\n"
9607 " return i;\n"
9608 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009609 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009610
9611 verifyFormat("void foo() {}\n"
9612 "void bar()\n"
9613 "#ifdef _DEBUG\n"
9614 "{\n"
9615 " foo();\n"
9616 "}\n"
9617 "#else\n"
9618 "{\n"
9619 "}\n"
9620 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009621 StroustrupBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009622
9623 verifyFormat("void foobar() { int i = 5; }\n"
9624 "#ifdef _DEBUG\n"
9625 "void bar() {}\n"
9626 "#else\n"
9627 "void bar() { foobar(); }\n"
9628 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009629 StroustrupBraceStyle);
Manuel Klimeka8eb9142013-05-13 12:51:40 +00009630}
9631
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009632TEST_F(FormatTest, AllmanBraceBreaking) {
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009633 FormatStyle AllmanBraceStyle = getLLVMStyle();
9634 AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009635 verifyFormat("namespace a\n"
9636 "{\n"
9637 "class A\n"
9638 "{\n"
9639 " void f()\n"
9640 " {\n"
9641 " if (true)\n"
9642 " {\n"
9643 " a();\n"
9644 " b();\n"
9645 " }\n"
9646 " }\n"
Alexander Kornienko3cfa9732013-11-20 16:33:05 +00009647 " void g() { return; }\n"
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009648 "};\n"
9649 "struct B\n"
9650 "{\n"
9651 " int x;\n"
9652 "};\n"
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009653 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009654 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009655
9656 verifyFormat("void f()\n"
9657 "{\n"
9658 " if (true)\n"
9659 " {\n"
9660 " a();\n"
9661 " }\n"
9662 " else if (false)\n"
9663 " {\n"
9664 " b();\n"
9665 " }\n"
9666 " else\n"
9667 " {\n"
9668 " c();\n"
9669 " }\n"
9670 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009671 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009672
9673 verifyFormat("void f()\n"
9674 "{\n"
9675 " for (int i = 0; i < 10; ++i)\n"
9676 " {\n"
9677 " a();\n"
9678 " }\n"
9679 " while (false)\n"
9680 " {\n"
9681 " b();\n"
9682 " }\n"
9683 " do\n"
9684 " {\n"
9685 " c();\n"
9686 " } while (false)\n"
9687 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009688 AllmanBraceStyle);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009689
9690 verifyFormat("void f(int a)\n"
9691 "{\n"
9692 " switch (a)\n"
9693 " {\n"
9694 " case 0:\n"
9695 " break;\n"
9696 " case 1:\n"
9697 " {\n"
9698 " break;\n"
9699 " }\n"
9700 " case 2:\n"
9701 " {\n"
9702 " }\n"
9703 " break;\n"
9704 " default:\n"
9705 " break;\n"
9706 " }\n"
9707 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009708 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009709
9710 verifyFormat("enum X\n"
9711 "{\n"
9712 " Y = 0,\n"
9713 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009714 AllmanBraceStyle);
Daniel Jaspere18ff372014-06-02 10:17:32 +00009715 verifyFormat("enum X\n"
9716 "{\n"
9717 " Y = 0\n"
9718 "}\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009719 AllmanBraceStyle);
Manuel Klimeka027f302013-08-07 19:20:45 +00009720
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009721 verifyFormat("@interface BSApplicationController ()\n"
9722 "{\n"
9723 "@private\n"
9724 " id _extraIvar;\n"
9725 "}\n"
9726 "@end\n",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009727 AllmanBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009728
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009729 verifyFormat("#ifdef _DEBUG\n"
9730 "int foo(int i = 0)\n"
9731 "#else\n"
9732 "int foo(int i = 5)\n"
9733 "#endif\n"
9734 "{\n"
9735 " return i;\n"
9736 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009737 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009738
9739 verifyFormat("void foo() {}\n"
9740 "void bar()\n"
9741 "#ifdef _DEBUG\n"
9742 "{\n"
9743 " foo();\n"
9744 "}\n"
9745 "#else\n"
9746 "{\n"
9747 "}\n"
9748 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009749 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009750
9751 verifyFormat("void foobar() { int i = 5; }\n"
9752 "#ifdef _DEBUG\n"
9753 "void bar() {}\n"
9754 "#else\n"
9755 "void bar() { foobar(); }\n"
9756 "#endif",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009757 AllmanBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009758
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009759 // This shouldn't affect ObjC blocks..
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009760 verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009761 " // ...\n"
9762 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009763 "}];",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009764 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009765 verifyFormat("void (^block)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +00009766 " // ...\n"
9767 " int i;\n"
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009768 "};",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009769 AllmanBraceStyle);
Daniel Jasperba1b6bb2014-05-26 07:24:34 +00009770 // .. or dict literals.
9771 verifyFormat("void f()\n"
9772 "{\n"
9773 " [object someMethod:@{ @\"a\" : @\"b\" }];\n"
9774 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009775 AllmanBraceStyle);
Daniel Jasper55aed672014-12-07 16:44:49 +00009776 verifyFormat("int f()\n"
9777 "{ // comment\n"
9778 " return 42;\n"
9779 "}",
9780 AllmanBraceStyle);
Daniel Jasper565ed5e2014-05-22 13:53:55 +00009781
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009782 AllmanBraceStyle.ColumnLimit = 19;
9783 verifyFormat("void f() { int i; }", AllmanBraceStyle);
9784 AllmanBraceStyle.ColumnLimit = 18;
Daniel Jasper234379f2013-12-24 13:31:25 +00009785 verifyFormat("void f()\n"
9786 "{\n"
9787 " int i;\n"
9788 "}",
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009789 AllmanBraceStyle);
9790 AllmanBraceStyle.ColumnLimit = 80;
Daniel Jasper234379f2013-12-24 13:31:25 +00009791
Roman Kashitsyna043ced2014-08-11 12:18:01 +00009792 FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
Manuel Klimeka027f302013-08-07 19:20:45 +00009793 BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9794 BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9795 verifyFormat("void f(bool b)\n"
9796 "{\n"
9797 " if (b)\n"
9798 " {\n"
9799 " return;\n"
9800 " }\n"
9801 "}\n",
9802 BreakBeforeBraceShortIfs);
9803 verifyFormat("void f(bool b)\n"
9804 "{\n"
9805 " if (b) return;\n"
9806 "}\n",
9807 BreakBeforeBraceShortIfs);
9808 verifyFormat("void f(bool b)\n"
9809 "{\n"
9810 " while (b)\n"
9811 " {\n"
9812 " return;\n"
9813 " }\n"
9814 "}\n",
9815 BreakBeforeBraceShortIfs);
Manuel Klimekd3ed59a2013-08-02 21:31:59 +00009816}
9817
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009818TEST_F(FormatTest, GNUBraceBreaking) {
9819 FormatStyle GNUBraceStyle = getLLVMStyle();
9820 GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9821 verifyFormat("namespace a\n"
9822 "{\n"
9823 "class A\n"
9824 "{\n"
9825 " void f()\n"
9826 " {\n"
9827 " int a;\n"
9828 " {\n"
9829 " int b;\n"
9830 " }\n"
9831 " if (true)\n"
9832 " {\n"
9833 " a();\n"
9834 " b();\n"
9835 " }\n"
9836 " }\n"
9837 " void g() { return; }\n"
9838 "}\n"
9839 "}",
9840 GNUBraceStyle);
9841
9842 verifyFormat("void f()\n"
9843 "{\n"
9844 " if (true)\n"
9845 " {\n"
9846 " a();\n"
9847 " }\n"
9848 " else if (false)\n"
9849 " {\n"
9850 " b();\n"
9851 " }\n"
9852 " else\n"
9853 " {\n"
9854 " c();\n"
9855 " }\n"
9856 "}\n",
9857 GNUBraceStyle);
9858
9859 verifyFormat("void f()\n"
9860 "{\n"
9861 " for (int i = 0; i < 10; ++i)\n"
9862 " {\n"
9863 " a();\n"
9864 " }\n"
9865 " while (false)\n"
9866 " {\n"
9867 " b();\n"
9868 " }\n"
9869 " do\n"
9870 " {\n"
9871 " c();\n"
9872 " }\n"
9873 " while (false);\n"
9874 "}\n",
9875 GNUBraceStyle);
9876
9877 verifyFormat("void f(int a)\n"
9878 "{\n"
9879 " switch (a)\n"
9880 " {\n"
9881 " case 0:\n"
9882 " break;\n"
9883 " case 1:\n"
9884 " {\n"
9885 " break;\n"
9886 " }\n"
9887 " case 2:\n"
9888 " {\n"
9889 " }\n"
9890 " break;\n"
9891 " default:\n"
9892 " break;\n"
9893 " }\n"
9894 "}\n",
9895 GNUBraceStyle);
9896
9897 verifyFormat("enum X\n"
9898 "{\n"
9899 " Y = 0,\n"
9900 "}\n",
9901 GNUBraceStyle);
Dinesh Dwivediea3aca82014-05-02 17:01:46 +00009902
9903 verifyFormat("@interface BSApplicationController ()\n"
9904 "{\n"
9905 "@private\n"
9906 " id _extraIvar;\n"
9907 "}\n"
9908 "@end\n",
9909 GNUBraceStyle);
Dinesh Dwivediafe6fb62014-05-05 11:36:35 +00009910
9911 verifyFormat("#ifdef _DEBUG\n"
9912 "int foo(int i = 0)\n"
9913 "#else\n"
9914 "int foo(int i = 5)\n"
9915 "#endif\n"
9916 "{\n"
9917 " return i;\n"
9918 "}",
9919 GNUBraceStyle);
9920
9921 verifyFormat("void foo() {}\n"
9922 "void bar()\n"
9923 "#ifdef _DEBUG\n"
9924 "{\n"
9925 " foo();\n"
9926 "}\n"
9927 "#else\n"
9928 "{\n"
9929 "}\n"
9930 "#endif",
9931 GNUBraceStyle);
9932
9933 verifyFormat("void foobar() { int i = 5; }\n"
9934 "#ifdef _DEBUG\n"
9935 "void bar() {}\n"
9936 "#else\n"
9937 "void bar() { foobar(); }\n"
9938 "#endif",
9939 GNUBraceStyle);
Alexander Kornienko3a33f022013-12-12 09:49:52 +00009940}
Roman Kashitsyn291f64f2015-08-10 13:43:19 +00009941
9942TEST_F(FormatTest, WebKitBraceBreaking) {
9943 FormatStyle WebKitBraceStyle = getLLVMStyle();
9944 WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
9945 verifyFormat("namespace a {\n"
9946 "class A {\n"
9947 " void f()\n"
9948 " {\n"
9949 " if (true) {\n"
9950 " a();\n"
9951 " b();\n"
9952 " }\n"
9953 " }\n"
9954 " void g() { return; }\n"
9955 "};\n"
9956 "enum E {\n"
9957 " A,\n"
9958 " // foo\n"
9959 " B,\n"
9960 " C\n"
9961 "};\n"
9962 "struct B {\n"
9963 " int x;\n"
9964 "};\n"
9965 "}\n",
9966 WebKitBraceStyle);
9967 verifyFormat("struct S {\n"
9968 " int Type;\n"
9969 " union {\n"
9970 " int x;\n"
9971 " double y;\n"
9972 " } Value;\n"
9973 " class C {\n"
9974 " MyFavoriteType Value;\n"
9975 " } Class;\n"
9976 "};\n",
9977 WebKitBraceStyle);
9978}
9979
Manuel Klimekd5735502013-08-12 03:51:17 +00009980TEST_F(FormatTest, CatchExceptionReferenceBinding) {
9981 verifyFormat("void f() {\n"
9982 " try {\n"
Daniel Jasper04a71a42014-05-08 11:58:24 +00009983 " } catch (const Exception &e) {\n"
Manuel Klimekd5735502013-08-12 03:51:17 +00009984 " }\n"
9985 "}\n",
9986 getLLVMStyle());
9987}
9988
Daniel Jasper9613c812013-08-07 16:29:23 +00009989TEST_F(FormatTest, UnderstandsPragmas) {
9990 verifyFormat("#pragma omp reduction(| : var)");
9991 verifyFormat("#pragma omp reduction(+ : var)");
Daniel Jasperdc32c1b2014-01-09 13:56:49 +00009992
9993 EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
9994 "(including parentheses).",
9995 format("#pragma mark Any non-hyphenated or hyphenated string "
9996 "(including parentheses)."));
Daniel Jasper9613c812013-08-07 16:29:23 +00009997}
9998
Daniel Jasperee4a8a12015-04-22 09:45:42 +00009999TEST_F(FormatTest, UnderstandPragmaOption) {
10000 verifyFormat("#pragma option -C -A");
10001
10002 EXPECT_EQ("#pragma option -C -A", format("#pragma option -C -A"));
10003}
10004
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010005#define EXPECT_ALL_STYLES_EQUAL(Styles) \
10006 for (size_t i = 1; i < Styles.size(); ++i) \
Daniel Jaspera44991332015-04-29 13:06:49 +000010007 EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
10008 << " differs from Style #0"
Alexander Kornienkod6538332013-05-07 15:32:14 +000010009
10010TEST_F(FormatTest, GetsPredefinedStyleByName) {
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010011 SmallVector<FormatStyle, 3> Styles;
10012 Styles.resize(3);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010013
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010014 Styles[0] = getLLVMStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010015 EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
10016 EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
10017 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010018
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010019 Styles[0] = getGoogleStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010020 EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
10021 EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
10022 EXPECT_ALL_STYLES_EQUAL(Styles);
10023
Nico Weber514ecc82014-02-02 20:50:45 +000010024 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010025 EXPECT_TRUE(
10026 getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
10027 EXPECT_TRUE(
10028 getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
10029 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010030
Nico Weber514ecc82014-02-02 20:50:45 +000010031 Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010032 EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
10033 EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
10034 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010035
10036 Styles[0] = getMozillaStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010037 EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
10038 EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
10039 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010040
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010041 Styles[0] = getWebKitStyle();
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010042 EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
10043 EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
10044 EXPECT_ALL_STYLES_EQUAL(Styles);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010045
Alexander Kornienkofe7a57f2013-12-10 15:42:15 +000010046 Styles[0] = getGNUStyle();
10047 EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
10048 EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
10049 EXPECT_ALL_STYLES_EQUAL(Styles);
10050
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010051 EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
10052}
10053
10054TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
10055 SmallVector<FormatStyle, 8> Styles;
10056 Styles.resize(2);
10057
10058 Styles[0] = getGoogleStyle();
10059 Styles[1] = getLLVMStyle();
10060 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10061 EXPECT_ALL_STYLES_EQUAL(Styles);
10062
10063 Styles.resize(5);
Nico Weber514ecc82014-02-02 20:50:45 +000010064 Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010065 Styles[1] = getLLVMStyle();
10066 Styles[1].Language = FormatStyle::LK_JavaScript;
10067 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
10068
10069 Styles[2] = getLLVMStyle();
10070 Styles[2].Language = FormatStyle::LK_JavaScript;
10071 EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
10072 "BasedOnStyle: Google",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010073 &Styles[2])
10074 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010075
10076 Styles[3] = getLLVMStyle();
10077 Styles[3].Language = FormatStyle::LK_JavaScript;
10078 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
10079 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010080 &Styles[3])
10081 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010082
10083 Styles[4] = getLLVMStyle();
10084 Styles[4].Language = FormatStyle::LK_JavaScript;
10085 EXPECT_EQ(0, parseConfiguration("---\n"
10086 "BasedOnStyle: LLVM\n"
10087 "IndentWidth: 123\n"
10088 "---\n"
10089 "BasedOnStyle: Google\n"
10090 "Language: JavaScript",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010091 &Styles[4])
10092 .value());
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010093 EXPECT_ALL_STYLES_EQUAL(Styles);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010094}
10095
Daniel Jasper91881d92014-09-29 08:07:46 +000010096#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \
Alexander Kornienkod6538332013-05-07 15:32:14 +000010097 Style.FIELD = false; \
Daniel Jasper91881d92014-09-29 08:07:46 +000010098 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \
Alexander Kornienko006b5c82013-05-19 00:53:30 +000010099 EXPECT_TRUE(Style.FIELD); \
Daniel Jasper91881d92014-09-29 08:07:46 +000010100 EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \
Patrik Hagglund76aca642013-05-14 07:53:53 +000010101 EXPECT_FALSE(Style.FIELD);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010102
Daniel Jasper91881d92014-09-29 08:07:46 +000010103#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
10104
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010105#define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME) \
10106 Style.STRUCT.FIELD = false; \
10107 EXPECT_EQ(0, \
10108 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": true", &Style) \
10109 .value()); \
10110 EXPECT_TRUE(Style.STRUCT.FIELD); \
10111 EXPECT_EQ(0, \
10112 parseConfiguration(#STRUCT ":\n " CONFIG_NAME ": false", &Style) \
10113 .value()); \
10114 EXPECT_FALSE(Style.STRUCT.FIELD);
10115
10116#define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD) \
10117 CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
10118
Daniel Jasper00853002014-09-16 16:22:30 +000010119#define CHECK_PARSE(TEXT, FIELD, VALUE) \
10120 EXPECT_NE(VALUE, Style.FIELD); \
10121 EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \
10122 EXPECT_EQ(VALUE, Style.FIELD)
10123
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010124TEST_F(FormatTest, ParsesConfigurationBools) {
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010125 FormatStyle Style = {};
10126 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010127 CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
Daniel Jasper3219e432014-12-02 13:24:51 +000010128 CHECK_PARSE_BOOL(AlignOperands);
Daniel Jasper552f4a72013-07-31 23:55:15 +000010129 CHECK_PARSE_BOOL(AlignTrailingComments);
Daniel Jaspera44991332015-04-29 13:06:49 +000010130 CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
Daniel Jaspere12597c2015-10-01 10:06:54 +000010131 CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010132 CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
Daniel Jasper17605d32014-05-14 09:33:35 +000010133 CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
Daniel Jasperb87899b2014-09-10 13:11:45 +000010134 CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010135 CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
Daniel Jasper997af662013-05-16 12:16:23 +000010136 CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
Daniel Jasper61e6bbf2013-05-29 12:07:31 +000010137 CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
Daniel Jasper18210d72014-10-09 09:52:05 +000010138 CHECK_PARSE_BOOL(BinPackArguments);
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010139 CHECK_PARSE_BOOL(BinPackParameters);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010140 CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
Daniel Jasper165b29e2013-11-08 00:57:11 +000010141 CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
Daniel Jaspere33d4af2013-07-26 16:56:36 +000010142 CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
Daniel Jaspere1a7b762016-02-01 11:21:02 +000010143 CHECK_PARSE_BOOL(BreakStringLiterals);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010144 CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
Daniel Jasper553d4872014-06-17 12:40:34 +000010145 CHECK_PARSE_BOOL(DerivePointerAlignment);
Daniel Jasper91881d92014-09-29 08:07:46 +000010146 CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
Daniel Jasperda446772015-11-16 12:38:56 +000010147 CHECK_PARSE_BOOL(DisableFormat);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010148 CHECK_PARSE_BOOL(IndentCaseLabels);
Daniel Jasperc75e1ef2014-07-09 08:42:42 +000010149 CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
Daniel Jaspera26fc5c2014-03-21 13:43:14 +000010150 CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
Daniel Jaspere9beea22014-01-28 15:20:33 +000010151 CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010152 CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Daniel Jasper6ab54682013-07-16 18:22:10 +000010153 CHECK_PARSE_BOOL(Cpp11BracedListStyle);
Daniel Jaspera0a50392015-12-01 13:28:53 +000010154 CHECK_PARSE_BOOL(ReflowComments);
Daniel Jasperda446772015-11-16 12:38:56 +000010155 CHECK_PARSE_BOOL(SortIncludes);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010156 CHECK_PARSE_BOOL(SpacesInParentheses);
Daniel Jasperad981f82014-08-26 11:41:14 +000010157 CHECK_PARSE_BOOL(SpacesInSquareBrackets);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000010158 CHECK_PARSE_BOOL(SpacesInAngles);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010159 CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
Daniel Jasperb2e10a52014-01-15 15:09:08 +000010160 CHECK_PARSE_BOOL(SpacesInContainerLiterals);
Daniel Jasperb55acad2013-08-20 12:36:34 +000010161 CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
Daniel Jasperdb986eb2014-09-03 07:37:29 +000010162 CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000010163 CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
Daniel Jasperd94bff32013-09-25 15:15:02 +000010164 CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010165
10166 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10167 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10168 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10169 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10170 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10171 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10172 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10173 CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
10174 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10175 CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10176 CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010177}
Alexander Kornienkod6538332013-05-07 15:32:14 +000010178
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010179#undef CHECK_PARSE_BOOL
10180
Alexander Kornienkoc6221a52014-08-14 13:07:35 +000010181TEST_F(FormatTest, ParsesConfiguration) {
10182 FormatStyle Style = {};
10183 Style.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010184 CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010185 CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10186 ConstructorInitializerIndentWidth, 1234u);
Daniel Jasper50d634b2014-10-28 16:53:38 +000010187 CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010188 CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10189 CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
Daniel Jasper33b909c2013-10-25 14:29:37 +000010190 CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10191 PenaltyBreakBeforeFirstCallParameter, 1234u);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010192 CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10193 CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10194 PenaltyReturnTypeOnItsOwnLine, 1234u);
10195 CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10196 SpacesBeforeTrailingComments, 1234u);
Manuel Klimek13b97d82013-05-13 08:42:42 +000010197 CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
Daniel Jasper6633ab82013-10-18 10:38:14 +000010198 CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010199 CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
Alexander Kornienkod6538332013-05-07 15:32:14 +000010200
Daniel Jasper553d4872014-06-17 12:40:34 +000010201 Style.PointerAlignment = FormatStyle::PAS_Middle;
Daniel Jasperac043c92014-09-15 11:11:00 +000010202 CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10203 FormatStyle::PAS_Left);
10204 CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10205 FormatStyle::PAS_Right);
10206 CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10207 FormatStyle::PAS_Middle);
Daniel Jasper00853002014-09-16 16:22:30 +000010208 // For backward compatibility:
10209 CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10210 FormatStyle::PAS_Left);
10211 CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10212 FormatStyle::PAS_Right);
10213 CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10214 FormatStyle::PAS_Middle);
Daniel Jasper553d4872014-06-17 12:40:34 +000010215
Alexander Kornienkod6538332013-05-07 15:32:14 +000010216 Style.Standard = FormatStyle::LS_Auto;
Alexander Kornienkob40cfe42013-09-04 14:09:13 +000010217 CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10218 CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
Alexander Kornienkod6538332013-05-07 15:32:14 +000010219 CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10220 CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10221 CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10222
Daniel Jasperac043c92014-09-15 11:11:00 +000010223 Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
Daniel Jasperac043c92014-09-15 11:11:00 +000010224 CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10225 BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
Daniel Jasperac043c92014-09-15 11:11:00 +000010226 CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10227 FormatStyle::BOS_None);
10228 CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10229 FormatStyle::BOS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010230 // For backward compatibility:
10231 CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10232 FormatStyle::BOS_None);
10233 CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10234 FormatStyle::BOS_All);
Daniel Jasperac043c92014-09-15 11:11:00 +000010235
Daniel Jasper6501f7e2015-10-27 12:38:37 +000010236 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10237 CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10238 FormatStyle::BAS_Align);
10239 CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10240 FormatStyle::BAS_DontAlign);
10241 CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10242 FormatStyle::BAS_AlwaysBreak);
10243 // For backward compatibility:
10244 CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10245 FormatStyle::BAS_DontAlign);
10246 CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10247 FormatStyle::BAS_Align);
10248
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010249 Style.UseTab = FormatStyle::UT_ForIndentation;
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010250 CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10251 CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10252 CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
Marianne Mailhot-Sarrasin51fe2792016-04-14 14:52:26 +000010253 CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10254 FormatStyle::UT_ForContinuationAndIndentation);
Daniel Jasper00853002014-09-16 16:22:30 +000010255 // For backward compatibility:
10256 CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10257 CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
Alexander Kornienko3c3d09c2013-09-27 16:14:22 +000010258
Daniel Jasperd74cf402014-04-08 12:46:38 +000010259 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010260 CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10261 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10262 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10263 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
Daniel Jasper9e709352014-11-26 10:43:58 +000010264 CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10265 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010266 CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10267 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasper00853002014-09-16 16:22:30 +000010268 // For backward compatibility:
10269 CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10270 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10271 CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10272 AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
Daniel Jasperd74cf402014-04-08 12:46:38 +000010273
Alexander Kornienkofdca83d2013-12-10 10:18:34 +000010274 Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10275 CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10276 FormatStyle::SBPO_Never);
10277 CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10278 FormatStyle::SBPO_Always);
10279 CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10280 FormatStyle::SBPO_ControlStatements);
10281 // For backward compatibility:
10282 CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10283 FormatStyle::SBPO_Never);
10284 CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10285 FormatStyle::SBPO_ControlStatements);
10286
Alexander Kornienkod6538332013-05-07 15:32:14 +000010287 Style.ColumnLimit = 123;
10288 FormatStyle BaseStyle = getLLVMStyle();
10289 CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10290 CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10291
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010292 Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10293 CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10294 FormatStyle::BS_Attach);
10295 CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10296 FormatStyle::BS_Linux);
Birunthan Mohanathas305fa9c2015-07-12 03:13:54 +000010297 CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10298 FormatStyle::BS_Mozilla);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010299 CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10300 FormatStyle::BS_Stroustrup);
Alexander Kornienko3a33f022013-12-12 09:49:52 +000010301 CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10302 FormatStyle::BS_Allman);
10303 CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
Daniel Jasperc1bc38e2015-09-29 14:57:55 +000010304 CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10305 FormatStyle::BS_WebKit);
10306 CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10307 FormatStyle::BS_Custom);
Manuel Klimeka8eb9142013-05-13 12:51:40 +000010308
Zachary Turner448592e2015-12-18 22:20:15 +000010309 Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10310 CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10311 FormatStyle::RTBS_None);
10312 CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10313 FormatStyle::RTBS_All);
10314 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
Zachary Turner6bc7f972015-12-18 22:58:42 +000010315 AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
Zachary Turner448592e2015-12-18 22:20:15 +000010316 CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10317 AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10318 CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10319 AlwaysBreakAfterReturnType,
10320 FormatStyle::RTBS_TopLevelDefinitions);
10321
Birunthan Mohanathasa0388a82015-06-29 15:30:42 +000010322 Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10323 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10324 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10325 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10326 AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10327 CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10328 AlwaysBreakAfterDefinitionReturnType,
10329 FormatStyle::DRTBS_TopLevel);
10330
Daniel Jasper65ee3472013-07-31 23:16:02 +000010331 Style.NamespaceIndentation = FormatStyle::NI_All;
10332 CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10333 FormatStyle::NI_None);
10334 CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10335 FormatStyle::NI_Inner);
10336 CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10337 FormatStyle::NI_All);
Daniel Jaspere1e43192014-04-01 12:55:11 +000010338
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010339 // FIXME: This is required because parsing a configuration simply overwrites
10340 // the first N elements of the list instead of resetting it.
Daniel Jaspere1e43192014-04-01 12:55:11 +000010341 Style.ForEachMacros.clear();
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010342 std::vector<std::string> BoostForeach;
10343 BoostForeach.push_back("BOOST_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010344 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
Aaron Ballman2b9036d2014-04-01 16:30:35 +000010345 std::vector<std::string> BoostAndQForeach;
10346 BoostAndQForeach.push_back("BOOST_FOREACH");
10347 BoostAndQForeach.push_back("Q_FOREACH");
Daniel Jaspere1e43192014-04-01 12:55:11 +000010348 CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10349 BoostAndQForeach);
Daniel Jasper8ce1b8d2015-10-06 11:54:18 +000010350
10351 Style.IncludeCategories.clear();
10352 std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10353 {".*", 1}};
10354 CHECK_PARSE("IncludeCategories:\n"
10355 " - Regex: abc/.*\n"
10356 " Priority: 2\n"
10357 " - Regex: .*\n"
10358 " Priority: 1",
10359 IncludeCategories, ExpectedCategories);
Daniel Jasper9c8ff352016-03-21 14:11:27 +000010360 CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010361}
10362
10363TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10364 FormatStyle Style = {};
10365 Style.Language = FormatStyle::LK_Cpp;
10366 CHECK_PARSE("Language: Cpp\n"
10367 "IndentWidth: 12",
10368 IndentWidth, 12u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010369 EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10370 "IndentWidth: 34",
10371 &Style),
10372 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010373 EXPECT_EQ(12u, Style.IndentWidth);
10374 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10375 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10376
10377 Style.Language = FormatStyle::LK_JavaScript;
10378 CHECK_PARSE("Language: JavaScript\n"
10379 "IndentWidth: 12",
10380 IndentWidth, 12u);
10381 CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
Rafael Espindola1f243172014-06-12 11:35:17 +000010382 EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10383 "IndentWidth: 34",
10384 &Style),
10385 ParseError::Unsuitable);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010386 EXPECT_EQ(23u, Style.IndentWidth);
10387 CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10388 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10389
10390 CHECK_PARSE("BasedOnStyle: LLVM\n"
10391 "IndentWidth: 67",
10392 IndentWidth, 67u);
10393
10394 CHECK_PARSE("---\n"
10395 "Language: JavaScript\n"
10396 "IndentWidth: 12\n"
10397 "---\n"
10398 "Language: Cpp\n"
10399 "IndentWidth: 34\n"
10400 "...\n",
10401 IndentWidth, 12u);
10402
10403 Style.Language = FormatStyle::LK_Cpp;
10404 CHECK_PARSE("---\n"
10405 "Language: JavaScript\n"
10406 "IndentWidth: 12\n"
10407 "---\n"
10408 "Language: Cpp\n"
10409 "IndentWidth: 34\n"
10410 "...\n",
10411 IndentWidth, 34u);
10412 CHECK_PARSE("---\n"
10413 "IndentWidth: 78\n"
10414 "---\n"
10415 "Language: JavaScript\n"
10416 "IndentWidth: 56\n"
10417 "...\n",
10418 IndentWidth, 78u);
10419
10420 Style.ColumnLimit = 123;
10421 Style.IndentWidth = 234;
10422 Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10423 Style.TabWidth = 345;
Rafael Espindola3ae06202014-05-31 03:20:52 +000010424 EXPECT_FALSE(parseConfiguration("---\n"
10425 "IndentWidth: 456\n"
10426 "BreakBeforeBraces: Allman\n"
10427 "---\n"
10428 "Language: JavaScript\n"
10429 "IndentWidth: 111\n"
10430 "TabWidth: 111\n"
10431 "---\n"
10432 "Language: Cpp\n"
10433 "BreakBeforeBraces: Stroustrup\n"
10434 "TabWidth: 789\n"
10435 "...\n",
10436 &Style));
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010437 EXPECT_EQ(123u, Style.ColumnLimit);
10438 EXPECT_EQ(456u, Style.IndentWidth);
10439 EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10440 EXPECT_EQ(789u, Style.TabWidth);
10441
Rafael Espindola1f243172014-06-12 11:35:17 +000010442 EXPECT_EQ(parseConfiguration("---\n"
10443 "Language: JavaScript\n"
10444 "IndentWidth: 56\n"
10445 "---\n"
10446 "IndentWidth: 78\n"
10447 "...\n",
10448 &Style),
10449 ParseError::Error);
10450 EXPECT_EQ(parseConfiguration("---\n"
10451 "Language: JavaScript\n"
10452 "IndentWidth: 56\n"
10453 "---\n"
10454 "Language: JavaScript\n"
10455 "IndentWidth: 78\n"
10456 "...\n",
10457 &Style),
10458 ParseError::Error);
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010459
10460 EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10461}
Daniel Jasper65ee3472013-07-31 23:16:02 +000010462
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010463#undef CHECK_PARSE
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010464
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010465TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10466 FormatStyle Style = {};
10467 Style.Language = FormatStyle::LK_JavaScript;
10468 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010469 EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010470 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010471
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010472 Style.BreakBeforeTernaryOperators = true;
Alexander Kornienkod6bd7472013-12-30 16:11:28 +000010473 EXPECT_EQ(0, parseConfiguration("---\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010474 "BasedOnStyle: Google\n"
10475 "---\n"
10476 "Language: JavaScript\n"
10477 "IndentWidth: 76\n"
10478 "...\n",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000010479 &Style)
10480 .value());
Daniel Jaspere551bb72014-11-05 17:22:31 +000010481 EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
Alexander Kornienkoc1637f12013-12-10 11:28:13 +000010482 EXPECT_EQ(76u, Style.IndentWidth);
10483 EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10484}
10485
Alexander Kornienkod6538332013-05-07 15:32:14 +000010486TEST_F(FormatTest, ConfigurationRoundTripTest) {
10487 FormatStyle Style = getLLVMStyle();
10488 std::string YAML = configurationAsText(Style);
10489 FormatStyle ParsedStyle = {};
Alexander Kornienkocabdd732013-11-29 15:19:43 +000010490 ParsedStyle.Language = FormatStyle::LK_Cpp;
Alexander Kornienkod6538332013-05-07 15:32:14 +000010491 EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10492 EXPECT_EQ(Style, ParsedStyle);
10493}
10494
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010495TEST_F(FormatTest, WorksFor8bitEncodings) {
10496 EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10497 "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10498 "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10499 "\"\xef\xee\xf0\xf3...\"",
10500 format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10501 "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10502 "\xef\xee\xf0\xf3...\"",
10503 getLLVMStyleWithColumns(12)));
10504}
10505
Alexander Kornienko393e3082013-11-13 14:04:17 +000010506TEST_F(FormatTest, HandlesUTF8BOM) {
10507 EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10508 EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10509 format("\xef\xbb\xbf#include <iostream>"));
10510 EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10511 format("\xef\xbb\xbf\n#include <iostream>"));
10512}
10513
NAKAMURA Takumi5238eba2013-06-06 01:14:58 +000010514// FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10515#if !defined(_MSC_VER)
10516
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010517TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10518 verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10519 getLLVMStyleWithColumns(35));
10520 verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010521 getLLVMStyleWithColumns(31));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010522 verifyFormat("// Однажды в студёную зимнюю пору...",
10523 getLLVMStyleWithColumns(36));
Daniel Jaspera44991332015-04-29 13:06:49 +000010524 verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010525 verifyFormat("/* Однажды в студёную зимнюю пору... */",
10526 getLLVMStyleWithColumns(39));
10527 verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010528 getLLVMStyleWithColumns(35));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010529}
10530
10531TEST_F(FormatTest, SplitsUTF8Strings) {
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010532 // Non-printable characters' width is currently considered to be the length in
10533 // bytes in UTF8. The characters can be displayed in very different manner
10534 // (zero-width, single width with a substitution glyph, expanded to their code
10535 // (e.g. "<8d>"), so there's no single correct way to handle them.
10536 EXPECT_EQ("\"aaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010537 "\"\xc2\x8d\";",
10538 format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Alexander Kornienko71d95d62013-11-26 10:38:53 +000010539 EXPECT_EQ("\"aaaaaaaÄ\"\n"
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010540 "\"\xc2\x8d\";",
10541 format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
Daniel Jaspera44991332015-04-29 13:06:49 +000010542 EXPECT_EQ("\"Однажды, в \"\n"
10543 "\"студёную \"\n"
10544 "\"зимнюю \"\n"
10545 "\"пору,\"",
10546 format("\"Однажды, в студёную зимнюю пору,\"",
10547 getLLVMStyleWithColumns(13)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010548 EXPECT_EQ(
Daniel Jaspera44991332015-04-29 13:06:49 +000010549 "\"一 二 三 \"\n"
10550 "\"四 五六 \"\n"
10551 "\"七 八 九 \"\n"
10552 "\"十\"",
10553 format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010554 EXPECT_EQ("\"一\t二 \"\n"
10555 "\"\t三 \"\n"
10556 "\"四 五\t六 \"\n"
10557 "\"\t七 \"\n"
10558 "\"八九十\tqq\"",
10559 format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10560 getLLVMStyleWithColumns(11)));
Daniel Jaspere35c2202015-07-20 23:28:07 +000010561
10562 // UTF8 character in an escape sequence.
10563 EXPECT_EQ("\"aaaaaa\"\n"
10564 "\"\\\xC2\x8D\"",
10565 format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010566}
10567
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010568TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10569 EXPECT_EQ("const char *sssss =\n"
10570 " \"一二三四五六七八\\\n"
10571 " 九 十\";",
10572 format("const char *sssss = \"一二三四五六七八\\\n"
10573 " 九 十\";",
10574 getLLVMStyleWithColumns(30)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010575}
10576
10577TEST_F(FormatTest, SplitsUTF8LineComments) {
Alexander Kornienkofd1d7002013-11-26 13:31:46 +000010578 EXPECT_EQ("// aaaaÄ\xc2\x8d",
10579 format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010580 EXPECT_EQ("// Я из лесу\n"
10581 "// вышел; был\n"
10582 "// сильный\n"
10583 "// мороз.",
10584 format("// Я из лесу вышел; был сильный мороз.",
10585 getLLVMStyleWithColumns(13)));
10586 EXPECT_EQ("// 一二三\n"
10587 "// 四五六七\n"
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010588 "// 八 九\n"
10589 "// 十",
10590 format("// 一二三 四五六七 八 九 十", getLLVMStyleWithColumns(9)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010591}
10592
10593TEST_F(FormatTest, SplitsUTF8BlockComments) {
10594 EXPECT_EQ("/* Гляжу,\n"
10595 " * поднимается\n"
10596 " * медленно в\n"
10597 " * гору\n"
10598 " * Лошадка,\n"
10599 " * везущая\n"
10600 " * хворосту\n"
10601 " * воз. */",
10602 format("/* Гляжу, поднимается медленно в гору\n"
10603 " * Лошадка, везущая хворосту воз. */",
10604 getLLVMStyleWithColumns(13)));
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010605 EXPECT_EQ(
10606 "/* 一二三\n"
10607 " * 四五六七\n"
10608 " * 八 九\n"
10609 " * 十 */",
10610 format("/* 一二三 四五六七 八 九 十 */", getLLVMStyleWithColumns(9)));
Alexander Kornienkoff73c202013-06-05 15:08:20 +000010611 EXPECT_EQ("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯\n"
10612 " * 𝕓𝕪𝕥𝕖\n"
10613 " * 𝖀𝕿𝕱-𝟠 */",
10614 format("/* 𝓣𝓮𝓼𝓽 𝔣𝔬𝔲𝔯 𝕓𝕪𝕥𝕖 𝖀𝕿𝕱-𝟠 */", getLLVMStyleWithColumns(12)));
Alexander Kornienkoffcc0102013-06-05 14:09:10 +000010615}
10616
Alexander Kornienkoebb43ca2013-09-05 14:08:34 +000010617#endif // _MSC_VER
10618
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010619TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10620 FormatStyle Style = getLLVMStyle();
10621
10622 Style.ConstructorInitializerIndentWidth = 4;
10623 verifyFormat(
10624 "SomeClass::Constructor()\n"
10625 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10626 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10627 Style);
10628
10629 Style.ConstructorInitializerIndentWidth = 2;
10630 verifyFormat(
10631 "SomeClass::Constructor()\n"
10632 " : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10633 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10634 Style);
10635
10636 Style.ConstructorInitializerIndentWidth = 0;
10637 verifyFormat(
10638 "SomeClass::Constructor()\n"
10639 ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10640 " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10641 Style);
Daniel Jasperb618a982016-02-02 10:28:11 +000010642 Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10643 verifyFormat(
10644 "SomeLongTemplateVariableName<\n"
10645 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10646 Style);
10647 verifyFormat(
10648 "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10649 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10650 Style);
Daniel Jasper00853002014-09-16 16:22:30 +000010651}
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010652
Daniel Jasper00853002014-09-16 16:22:30 +000010653TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10654 FormatStyle Style = getLLVMStyle();
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010655 Style.BreakConstructorInitializersBeforeComma = true;
10656 Style.ConstructorInitializerIndentWidth = 4;
10657 verifyFormat("SomeClass::Constructor()\n"
10658 " : a(a)\n"
10659 " , b(b)\n"
10660 " , c(c) {}",
10661 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010662 verifyFormat("SomeClass::Constructor()\n"
10663 " : a(a) {}",
10664 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010665
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010666 Style.ColumnLimit = 0;
10667 verifyFormat("SomeClass::Constructor()\n"
10668 " : a(a) {}",
10669 Style);
Daniel Jasper56ef6ac2016-03-01 21:41:58 +000010670 verifyFormat("SomeClass::Constructor() noexcept\n"
10671 " : a(a) {}",
10672 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010673 verifyFormat("SomeClass::Constructor()\n"
10674 " : a(a)\n"
10675 " , b(b)\n"
10676 " , c(c) {}",
10677 Style);
10678 verifyFormat("SomeClass::Constructor()\n"
10679 " : a(a) {\n"
10680 " foo();\n"
10681 " bar();\n"
10682 "}",
10683 Style);
10684
Daniel Jasperd74cf402014-04-08 12:46:38 +000010685 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010686 verifyFormat("SomeClass::Constructor()\n"
10687 " : a(a)\n"
10688 " , b(b)\n"
10689 " , c(c) {\n}",
10690 Style);
10691 verifyFormat("SomeClass::Constructor()\n"
10692 " : a(a) {\n}",
10693 Style);
10694
10695 Style.ColumnLimit = 80;
Daniel Jasperd74cf402014-04-08 12:46:38 +000010696 Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010697 Style.ConstructorInitializerIndentWidth = 2;
10698 verifyFormat("SomeClass::Constructor()\n"
10699 " : a(a)\n"
10700 " , b(b)\n"
10701 " , c(c) {}",
10702 Style);
10703
10704 Style.ConstructorInitializerIndentWidth = 0;
10705 verifyFormat("SomeClass::Constructor()\n"
10706 ": a(a)\n"
10707 ", b(b)\n"
10708 ", c(c) {}",
10709 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010710
10711 Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10712 Style.ConstructorInitializerIndentWidth = 4;
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010713 verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10714 verifyFormat(
10715 "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10716 Style);
Daniel Jasperec01cd62013-10-08 05:11:18 +000010717 verifyFormat(
10718 "SomeClass::Constructor()\n"
10719 " : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10720 Style);
10721 Style.ConstructorInitializerIndentWidth = 4;
10722 Style.ColumnLimit = 60;
10723 verifyFormat("SomeClass::Constructor()\n"
10724 " : aaaaaaaa(aaaaaaaa)\n"
10725 " , aaaaaaaa(aaaaaaaa)\n"
10726 " , aaaaaaaa(aaaaaaaa) {}",
10727 Style);
Daniel Jaspercdaffa42013-08-13 10:58:30 +000010728}
10729
Daniel Jasper38efc132014-10-21 07:51:54 +000010730TEST_F(FormatTest, Destructors) {
10731 verifyFormat("void F(int &i) { i.~int(); }");
10732 verifyFormat("void F(int &i) { i->~int(); }");
10733}
10734
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010735TEST_F(FormatTest, FormatsWithWebKitStyle) {
10736 FormatStyle Style = getWebKitStyle();
10737
10738 // Don't indent in outer namespaces.
10739 verifyFormat("namespace outer {\n"
10740 "int i;\n"
10741 "namespace inner {\n"
Daniel Jasper65ee3472013-07-31 23:16:02 +000010742 " int i;\n"
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010743 "} // namespace inner\n"
10744 "} // namespace outer\n"
10745 "namespace other_outer {\n"
10746 "int i;\n"
10747 "}",
10748 Style);
10749
10750 // Don't indent case labels.
10751 verifyFormat("switch (variable) {\n"
10752 "case 1:\n"
10753 "case 2:\n"
10754 " doSomething();\n"
10755 " break;\n"
10756 "default:\n"
10757 " ++variable;\n"
10758 "}",
10759 Style);
10760
10761 // Wrap before binary operators.
Daniel Jaspera44991332015-04-29 13:06:49 +000010762 EXPECT_EQ("void f()\n"
10763 "{\n"
10764 " if (aaaaaaaaaaaaaaaa\n"
10765 " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10766 " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10767 " return;\n"
10768 "}",
10769 format("void f() {\n"
10770 "if (aaaaaaaaaaaaaaaa\n"
10771 "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10772 "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10773 "return;\n"
10774 "}",
10775 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010776
Daniel Jasper35995672014-04-29 14:05:20 +000010777 // Allow functions on a single line.
10778 verifyFormat("void f() { return; }", Style);
10779
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010780 // Constructor initializers are formatted one per line with the "," on the
10781 // new line.
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010782 verifyFormat("Constructor()\n"
10783 " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10784 " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
Daniel Jasper3aa9a6a2014-11-18 23:55:27 +000010785 " aaaaaaaaaaaaaa)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010786 " , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10787 "{\n"
10788 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010789 Style);
10790 verifyFormat("SomeClass::Constructor()\n"
10791 " : a(a)\n"
Daniel Jasper234379f2013-12-24 13:31:25 +000010792 "{\n"
10793 "}",
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010794 Style);
Daniel Jasper234379f2013-12-24 13:31:25 +000010795 EXPECT_EQ("SomeClass::Constructor()\n"
10796 " : a(a)\n"
10797 "{\n"
10798 "}",
10799 format("SomeClass::Constructor():a(a){}", Style));
10800 verifyFormat("SomeClass::Constructor()\n"
10801 " : a(a)\n"
10802 " , b(b)\n"
10803 " , c(c)\n"
10804 "{\n"
Daniel Jaspera44991332015-04-29 13:06:49 +000010805 "}",
10806 Style);
Alexander Kornienkoa594ba82013-12-16 14:35:51 +000010807 verifyFormat("SomeClass::Constructor()\n"
10808 " : a(a)\n"
10809 "{\n"
10810 " foo();\n"
10811 " bar();\n"
10812 "}",
10813 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010814
Daniel Jasper65ee3472013-07-31 23:16:02 +000010815 // Access specifiers should be aligned left.
10816 verifyFormat("class C {\n"
10817 "public:\n"
10818 " int i;\n"
10819 "};",
10820 Style);
10821
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010822 // Do not align comments.
Daniel Jasper552f4a72013-07-31 23:55:15 +000010823 verifyFormat("int a; // Do not\n"
10824 "double b; // align comments.",
10825 Style);
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010826
Daniel Jasper3219e432014-12-02 13:24:51 +000010827 // Do not align operands.
10828 EXPECT_EQ("ASSERT(aaaa\n"
10829 " || bbbb);",
10830 format("ASSERT ( aaaa\n||bbbb);", Style));
10831
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010832 // Accept input's line breaks.
10833 EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10834 " || bbbbbbbbbbbbbbb) {\n"
10835 " i++;\n"
10836 "}",
10837 format("if (aaaaaaaaaaaaaaa\n"
10838 "|| bbbbbbbbbbbbbbb) { i++; }",
10839 Style));
10840 EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10841 " i++;\n"
10842 "}",
10843 format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
Daniel Jasper98fb6e12013-11-08 17:33:27 +000010844
10845 // Don't automatically break all macro definitions (llvm.org/PR17842).
10846 verifyFormat("#define aNumber 10", Style);
10847 // However, generally keep the line breaks that the user authored.
10848 EXPECT_EQ("#define aNumber \\\n"
10849 " 10",
10850 format("#define aNumber \\\n"
10851 " 10",
10852 Style));
Daniel Jasperaf4fee22014-04-14 12:05:05 +000010853
10854 // Keep empty and one-element array literals on a single line.
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010855 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10856 " copyItems:YES];",
10857 format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10858 "copyItems:YES];",
10859 Style));
10860 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10861 " copyItems:YES];",
10862 format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10863 " copyItems:YES];",
10864 Style));
Daniel Jasper335ff262014-05-28 09:11:53 +000010865 // FIXME: This does not seem right, there should be more indentation before
10866 // the array literal's entries. Nested blocks have the same problem.
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010867 EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
Daniel Jasper335ff262014-05-28 09:11:53 +000010868 " @\"a\",\n"
10869 " @\"a\"\n"
10870 "]\n"
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010871 " copyItems:YES];",
10872 format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10873 " @\"a\",\n"
10874 " @\"a\"\n"
10875 " ]\n"
10876 " copyItems:YES];",
10877 Style));
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010878 EXPECT_EQ(
Daniel Jasperdb8804b2014-04-14 12:11:07 +000010879 "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10880 " copyItems:YES];",
Daniel Jasper7f0c5172014-05-19 08:06:34 +000010881 format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10882 " copyItems:YES];",
10883 Style));
10884
10885 verifyFormat("[self.a b:c c:d];", Style);
10886 EXPECT_EQ("[self.a b:c\n"
10887 " c:d];",
10888 format("[self.a b:c\n"
10889 "c:d];",
10890 Style));
Daniel Jasperffefb3d2013-07-24 13:10:59 +000010891}
10892
Manuel Klimekffdeb592013-09-03 15:10:01 +000010893TEST_F(FormatTest, FormatsLambdas) {
Daniel Jasper5f3ea472014-05-22 08:36:53 +000010894 verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10895 verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10896 verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10897 verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10898 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
Chandler Carruthf8b72662014-03-02 12:37:31 +000010899 verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
Daniel Jasper3ade3be2016-11-01 06:23:05 +000010900 verifyFormat("int x = f(*+[] {});");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010901 verifyFormat("void f() {\n"
10902 " other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10903 "}\n");
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010904 verifyFormat("void f() {\n"
10905 " other(x.begin(), //\n"
10906 " x.end(), //\n"
Daniel Jasper9a8d48b2013-09-05 10:04:31 +000010907 " [&](int, int) { return 1; });\n"
Daniel Jasper9fe0e8d2013-09-05 09:29:45 +000010908 "}\n");
Daniel Jasper21397a32014-04-09 12:21:48 +000010909 verifyFormat("SomeFunction([]() { // A cool function...\n"
10910 " return 43;\n"
10911 "});");
Daniel Jasper56346192014-10-27 16:31:46 +000010912 EXPECT_EQ("SomeFunction([]() {\n"
10913 "#define A a\n"
10914 " return 43;\n"
10915 "});",
10916 format("SomeFunction([](){\n"
10917 "#define A a\n"
10918 "return 43;\n"
10919 "});"));
Daniel Jasper0e6c51c2014-05-05 12:36:29 +000010920 verifyFormat("void f() {\n"
10921 " SomeFunction([](decltype(x), A *a) {});\n"
10922 "}");
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010923 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10924 " [](const aaaaaaaaaa &a) { return a; });");
Daniel Jaspera5621202014-08-08 12:00:13 +000010925 verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10926 " SomeOtherFunctioooooooooooooooooooooooooon();\n"
10927 "});");
Daniel Jasperd6a1cab2015-01-12 10:23:24 +000010928 verifyFormat("Constructor()\n"
10929 " : Field([] { // comment\n"
10930 " int i;\n"
10931 " }) {}");
Daniel Jasper0ad28142015-05-13 08:47:16 +000010932 verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
10933 " return some_parameter.size();\n"
10934 "};");
Daniel Jasper9c8a7742016-01-04 07:29:40 +000010935 verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
10936 " [](const string &s) { return s; };");
Daniel Jasperc4144ea2015-05-13 16:09:21 +000010937 verifyFormat("int i = aaaaaa ? 1 //\n"
10938 " : [] {\n"
10939 " return 2; //\n"
10940 " }();");
10941 verifyFormat("llvm::errs() << \"number of twos is \"\n"
10942 " << std::count_if(v.begin(), v.end(), [](int x) {\n"
10943 " return x == 2; // force break\n"
10944 " });");
Daniel Jasperb9edcfb2015-07-07 13:50:50 +000010945 verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa([=](\n"
10946 " int iiiiiiiiiiii) {\n"
10947 " return aaaaaaaaaaaaaaaaaaaaaaa != aaaaaaaaaaaaaaaaaaaaaaa;\n"
10948 "});",
10949 getLLVMStyleWithColumns(60));
Daniel Jasperea40cee2015-07-14 11:26:14 +000010950 verifyFormat("SomeFunction({[&] {\n"
10951 " // comment\n"
10952 " },\n"
10953 " [&] {\n"
10954 " // comment\n"
10955 " }});");
10956 verifyFormat("SomeFunction({[&] {\n"
10957 " // comment\n"
10958 "}});");
Daniel Jasper100ffc62015-08-21 11:44:57 +000010959 verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
10960 " [&]() { return true; },\n"
10961 " aaaaa aaaaaaaaa);");
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000010962
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010963 // Lambdas with return types.
Daniel Jasper81a20782014-03-10 10:02:02 +000010964 verifyFormat("int c = []() -> int { return 2; }();\n");
Daniel Jasper60ba32d2015-06-12 09:59:16 +000010965 verifyFormat("int c = []() -> int * { return 2; }();\n");
Daniel Jasper81a20782014-03-10 10:02:02 +000010966 verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
10967 verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010968 verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
Daniel Jasper3431b752014-12-08 13:22:37 +000010969 verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
Daniel Jasperbcb55ee2014-11-21 14:08:38 +000010970 verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
10971 verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
Daniel Jasper5eaa0092015-08-13 13:37:08 +000010972 verifyFormat("[a, a]() -> a<1> {};");
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010973 verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
10974 " int j) -> int {\n"
Daniel Jaspera2fb50f2014-06-24 09:15:49 +000010975 " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
Daniel Jasper8f59ae52014-03-11 11:03:26 +000010976 "};");
Daniel Jaspere6623162015-03-02 10:35:13 +000010977 verifyFormat(
10978 "aaaaaaaaaaaaaaaaaaaaaa(\n"
10979 " [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
10980 " return aaaaaaaaaaaaaaaaa;\n"
10981 " });",
10982 getLLVMStyleWithColumns(70));
Daniel Jasper87448c52016-06-13 07:48:45 +000010983 verifyFormat("[]() //\n"
10984 " -> int {\n"
10985 " return 1; //\n"
10986 "};");
Daniel Jaspercb51cf42014-01-16 09:11:55 +000010987
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010988 // Multiple lambdas in the same parentheses change indentation rules.
Daniel Jasper4b444492014-11-21 13:38:53 +000010989 verifyFormat("SomeFunction(\n"
10990 " []() {\n"
10991 " int i = 42;\n"
10992 " return i;\n"
10993 " },\n"
10994 " []() {\n"
10995 " int j = 43;\n"
10996 " return j;\n"
10997 " });");
Daniel Jasper3ae6f5a2014-04-09 12:08:39 +000010998
Daniel Jasperda18fd82014-06-10 06:39:03 +000010999 // More complex introducers.
11000 verifyFormat("return [i, args...] {};");
11001
Daniel Jasperbf02b2c12013-09-05 11:49:39 +000011002 // Not lambdas.
Chandler Carruthf8b72662014-03-02 12:37:31 +000011003 verifyFormat("constexpr char hello[]{\"hello\"};");
Daniel Jasperb4b99982013-09-06 21:25:51 +000011004 verifyFormat("double &operator[](int i) { return 0; }\n"
11005 "int i;");
Daniel Jasper6b70ec02014-01-22 17:01:47 +000011006 verifyFormat("std::unique_ptr<int[]> foo() {}");
Daniel Jasperd3c7ab92014-03-11 09:59:36 +000011007 verifyFormat("int i = a[a][a]->f();");
Daniel Jaspera58dd5d2014-03-11 10:03:33 +000011008 verifyFormat("int i = (*b)[a]->f();");
Daniel Jasper84a12e12014-03-10 15:06:25 +000011009
11010 // Other corner cases.
11011 verifyFormat("void f() {\n"
11012 " bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
11013 " );\n"
11014 "}");
Daniel Jasperc580af92014-03-11 09:29:46 +000011015
11016 // Lambdas created through weird macros.
11017 verifyFormat("void f() {\n"
11018 " MACRO((const AA &a) { return 1; });\n"
Daniel Jasper54353da2016-01-07 14:36:11 +000011019 " MACRO((AA &a) { return 1; });\n"
Daniel Jasperc580af92014-03-11 09:29:46 +000011020 "}");
Daniel Jasper11a0ac62014-12-12 09:40:58 +000011021
11022 verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
11023 " doo_dah();\n"
11024 " doo_dah();\n"
11025 " })) {\n"
11026 "}");
Daniel Jasper29d39d52015-02-08 09:34:49 +000011027 verifyFormat("auto lambda = []() {\n"
11028 " int a = 2\n"
11029 "#if A\n"
11030 " + 2\n"
11031 "#endif\n"
11032 " ;\n"
11033 "};");
Manuel Klimekffdeb592013-09-03 15:10:01 +000011034}
11035
Manuel Klimek516e0542013-09-04 13:25:30 +000011036TEST_F(FormatTest, FormatsBlocks) {
Daniel Jasper76284682014-10-22 09:12:44 +000011037 FormatStyle ShortBlocks = getLLVMStyle();
11038 ShortBlocks.AllowShortBlocksOnASingleLine = true;
11039 verifyFormat("int (^Block)(int, int);", ShortBlocks);
11040 verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
11041 verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
11042 verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
11043 verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
11044 verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011045
Daniel Jasper76284682014-10-22 09:12:44 +000011046 verifyFormat("foo(^{ bar(); });", ShortBlocks);
11047 verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
11048 verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
Daniel Jasper31745732014-01-19 07:46:32 +000011049
Daniel Jasper76284682014-10-22 09:12:44 +000011050 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011051 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011052 "}];");
11053 verifyFormat("int i = {[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011054 " [self onOperationDone];\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011055 "}]};");
11056 verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011057 " f();\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011058 "}];");
11059 verifyFormat("int a = [operation block:^int(int *i) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011060 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011061 "}];");
Daniel Jaspera225bce2014-01-16 19:14:34 +000011062 verifyFormat("[myObject doSomethingWith:arg1\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011063 " aaa:^int(int *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011064 " return 1;\n"
Daniel Jasper76284682014-10-22 09:12:44 +000011065 " }\n"
Daniel Jasper5f3ea472014-05-22 08:36:53 +000011066 " bbb:f(a * bbbbbbbb)];");
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011067
11068 verifyFormat("[operation setCompletionBlock:^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011069 " [self.delegate newDataAvailable];\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011070 "}];",
11071 getLLVMStyleWithColumns(60));
11072 verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011073 " NSString *path = [self sessionFilePath];\n"
11074 " if (path) {\n"
11075 " // ...\n"
11076 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011077 "});");
11078 verifyFormat("[[SessionService sharedService]\n"
11079 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011080 " if (window) {\n"
11081 " [self windowDidLoad:window];\n"
11082 " } else {\n"
11083 " [self errorLoadingWindow];\n"
11084 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011085 " }];");
11086 verifyFormat("void (^largeBlock)(void) = ^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011087 " // ...\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011088 "};\n",
11089 getLLVMStyleWithColumns(40));
11090 verifyFormat("[[SessionService sharedService]\n"
11091 " loadWindowWithCompletionBlock: //\n"
11092 " ^(SessionWindow *window) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011093 " if (window) {\n"
11094 " [self windowDidLoad:window];\n"
11095 " } else {\n"
11096 " [self errorLoadingWindow];\n"
11097 " }\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011098 " }];",
11099 getLLVMStyleWithColumns(60));
11100 verifyFormat("[myObject doSomethingWith:arg1\n"
11101 " firstBlock:^(Foo *a) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011102 " // ...\n"
11103 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011104 " }\n"
11105 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011106 " // ...\n"
11107 " int i;\n"
Daniel Jasperc13ee342014-03-27 09:43:54 +000011108 " }\n"
11109 " thirdBlock:^Foo(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011110 " // ...\n"
11111 " int i;\n"
Daniel Jasperb88b25f2013-12-23 07:29:06 +000011112 " }];");
Daniel Jasperb77105d2014-04-08 14:04:31 +000011113 verifyFormat("[myObject doSomethingWith:arg1\n"
11114 " firstBlock:-1\n"
11115 " secondBlock:^(Bar *b) {\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011116 " // ...\n"
11117 " int i;\n"
Daniel Jasperb77105d2014-04-08 14:04:31 +000011118 " }];");
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011119
11120 verifyFormat("f(^{\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011121 " @autoreleasepool {\n"
11122 " if (a) {\n"
11123 " g();\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011124 " }\n"
Daniel Jasper50d634b2014-10-28 16:53:38 +000011125 " }\n"
Daniel Jasperac7e34e2014-03-13 10:11:17 +000011126 "});");
Daniel Jasperbb86d842014-11-23 19:15:35 +000011127 verifyFormat("Block b = ^int *(A *a, B *b) {}");
Daniel Jaspere31388a2016-09-26 22:19:08 +000011128 verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11129 "};");
Daniel Jasper50d634b2014-10-28 16:53:38 +000011130
11131 FormatStyle FourIndent = getLLVMStyle();
11132 FourIndent.ObjCBlockIndentWidth = 4;
11133 verifyFormat("[operation setCompletionBlock:^{\n"
11134 " [self onOperationDone];\n"
11135 "}];",
11136 FourIndent);
Manuel Klimek516e0542013-09-04 13:25:30 +000011137}
11138
Daniel Jasper289afc02015-04-23 09:23:17 +000011139TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11140 FormatStyle ZeroColumn = getLLVMStyle();
11141 ZeroColumn.ColumnLimit = 0;
11142
11143 verifyFormat("[[SessionService sharedService] "
11144 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11145 " if (window) {\n"
11146 " [self windowDidLoad:window];\n"
11147 " } else {\n"
11148 " [self errorLoadingWindow];\n"
11149 " }\n"
11150 "}];",
11151 ZeroColumn);
11152 EXPECT_EQ("[[SessionService sharedService]\n"
11153 " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11154 " if (window) {\n"
11155 " [self windowDidLoad:window];\n"
11156 " } else {\n"
11157 " [self errorLoadingWindow];\n"
11158 " }\n"
11159 " }];",
11160 format("[[SessionService sharedService]\n"
11161 "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11162 " if (window) {\n"
11163 " [self windowDidLoad:window];\n"
11164 " } else {\n"
11165 " [self errorLoadingWindow];\n"
11166 " }\n"
11167 "}];",
11168 ZeroColumn));
11169 verifyFormat("[myObject doSomethingWith:arg1\n"
11170 " firstBlock:^(Foo *a) {\n"
11171 " // ...\n"
11172 " int i;\n"
11173 " }\n"
11174 " secondBlock:^(Bar *b) {\n"
11175 " // ...\n"
11176 " int i;\n"
11177 " }\n"
11178 " thirdBlock:^Foo(Bar *b) {\n"
11179 " // ...\n"
11180 " int i;\n"
11181 " }];",
11182 ZeroColumn);
11183 verifyFormat("f(^{\n"
11184 " @autoreleasepool {\n"
11185 " if (a) {\n"
11186 " g();\n"
11187 " }\n"
11188 " }\n"
11189 "});",
11190 ZeroColumn);
11191 verifyFormat("void (^largeBlock)(void) = ^{\n"
11192 " // ...\n"
11193 "};",
11194 ZeroColumn);
11195
11196 ZeroColumn.AllowShortBlocksOnASingleLine = true;
11197 EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
Daniel Jaspere6fcf7d2015-06-17 13:08:06 +000011198 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
Daniel Jasper289afc02015-04-23 09:23:17 +000011199 ZeroColumn.AllowShortBlocksOnASingleLine = false;
11200 EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11201 " int i;\n"
11202 "};",
11203 format("void (^largeBlock)(void) = ^{ int i; };", ZeroColumn));
11204}
11205
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011206TEST_F(FormatTest, SupportsCRLF) {
11207 EXPECT_EQ("int a;\r\n"
11208 "int b;\r\n"
11209 "int c;\r\n",
11210 format("int a;\r\n"
11211 " int b;\r\n"
11212 " int c;\r\n",
11213 getLLVMStyle()));
11214 EXPECT_EQ("int a;\r\n"
11215 "int b;\r\n"
11216 "int c;\r\n",
11217 format("int a;\r\n"
11218 " int b;\n"
11219 " int c;\r\n",
11220 getLLVMStyle()));
11221 EXPECT_EQ("int a;\n"
11222 "int b;\n"
11223 "int c;\n",
11224 format("int a;\r\n"
11225 " int b;\n"
11226 " int c;\n",
11227 getLLVMStyle()));
11228 EXPECT_EQ("\"aaaaaaa \"\r\n"
11229 "\"bbbbbbb\";\r\n",
11230 format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11231 EXPECT_EQ("#define A \\\r\n"
11232 " b; \\\r\n"
11233 " c; \\\r\n"
11234 " d;\r\n",
11235 format("#define A \\\r\n"
11236 " b; \\\r\n"
11237 " c; d; \r\n",
11238 getGoogleStyle()));
Daniel Jasper580da272013-10-30 07:36:40 +000011239
11240 EXPECT_EQ("/*\r\n"
11241 "multi line block comments\r\n"
11242 "should not introduce\r\n"
11243 "an extra carriage return\r\n"
11244 "*/\r\n",
11245 format("/*\r\n"
11246 "multi line block comments\r\n"
11247 "should not introduce\r\n"
11248 "an extra carriage return\r\n"
11249 "*/\r\n"));
Alexander Kornienko9e649af2013-09-11 12:25:57 +000011250}
11251
Manuel Klimekb212f3b2013-10-12 22:46:56 +000011252TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11253 verifyFormat("MY_CLASS(C) {\n"
11254 " int i;\n"
11255 " int j;\n"
11256 "};");
11257}
11258
Daniel Jasper6633ab82013-10-18 10:38:14 +000011259TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11260 FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11261 TwoIndent.ContinuationIndentWidth = 2;
11262
11263 EXPECT_EQ("int i =\n"
11264 " longFunction(\n"
11265 " arg);",
11266 format("int i = longFunction(arg);", TwoIndent));
11267
11268 FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11269 SixIndent.ContinuationIndentWidth = 6;
11270
11271 EXPECT_EQ("int i =\n"
11272 " longFunction(\n"
11273 " arg);",
11274 format("int i = longFunction(arg);", SixIndent));
11275}
11276
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011277TEST_F(FormatTest, SpacesInAngles) {
11278 FormatStyle Spaces = getLLVMStyle();
11279 Spaces.SpacesInAngles = true;
11280
11281 verifyFormat("static_cast< int >(arg);", Spaces);
11282 verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11283 verifyFormat("f< int, float >();", Spaces);
11284 verifyFormat("template <> g() {}", Spaces);
11285 verifyFormat("template < std::vector< int > > f() {}", Spaces);
Daniel Jasper74331d42015-10-26 12:08:47 +000011286 verifyFormat("std::function< void(int, int) > fct;", Spaces);
11287 verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11288 Spaces);
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011289
11290 Spaces.Standard = FormatStyle::LS_Cpp03;
11291 Spaces.SpacesInAngles = true;
11292 verifyFormat("A< A< int > >();", Spaces);
11293
11294 Spaces.SpacesInAngles = false;
11295 verifyFormat("A<A<int> >();", Spaces);
11296
11297 Spaces.Standard = FormatStyle::LS_Cpp11;
11298 Spaces.SpacesInAngles = true;
11299 verifyFormat("A< A< int > >();", Spaces);
Alexander Kornienkoa48a12c2013-12-03 10:50:16 +000011300
Daniel Jasperdd978ae2013-10-29 14:52:02 +000011301 Spaces.SpacesInAngles = false;
11302 verifyFormat("A<A<int>>();", Spaces);
11303}
11304
Sylvestre Ledru83bbd572016-08-09 14:24:40 +000011305TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11306 FormatStyle Style = getLLVMStyle();
11307 Style.SpaceAfterTemplateKeyword = false;
11308 verifyFormat("template<int> void foo();", Style);
11309}
11310
Jacques Pienaarfc275112015-02-18 23:48:37 +000011311TEST_F(FormatTest, TripleAngleBrackets) {
11312 verifyFormat("f<<<1, 1>>>();");
11313 verifyFormat("f<<<1, 1, 1, s>>>();");
11314 verifyFormat("f<<<a, b, c, d>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011315 EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011316 verifyFormat("f<param><<<1, 1>>>();");
11317 verifyFormat("f<1><<<1, 1>>>();");
Daniel Jaspera44991332015-04-29 13:06:49 +000011318 EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011319 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11320 "aaaaaaaaaaa<<<\n 1, 1>>>();");
Daniel Jaspera4322082016-11-05 17:43:16 +000011321 verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11322 " <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
Jacques Pienaarfc275112015-02-18 23:48:37 +000011323}
11324
11325TEST_F(FormatTest, MergeLessLessAtEnd) {
Jacques Pienaar68a7dbf2015-02-20 21:09:01 +000011326 verifyFormat("<<");
Jacques Pienaar411b2512015-02-24 23:23:24 +000011327 EXPECT_EQ("< < <", format("\\\n<<<"));
Jacques Pienaarfc275112015-02-18 23:48:37 +000011328 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11329 "aaallvm::outs() <<");
11330 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11331 "aaaallvm::outs()\n <<");
11332}
11333
Manuel Klimek819788d2014-03-18 11:22:45 +000011334TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11335 std::string code = "#if A\n"
11336 "#if B\n"
11337 "a.\n"
11338 "#endif\n"
11339 " a = 1;\n"
11340 "#else\n"
11341 "#endif\n"
11342 "#if C\n"
11343 "#else\n"
11344 "#endif\n";
11345 EXPECT_EQ(code, format(code));
11346}
11347
Manuel Klimek68b03042014-04-14 09:14:11 +000011348TEST_F(FormatTest, HandleConflictMarkers) {
11349 // Git/SVN conflict markers.
11350 EXPECT_EQ("int a;\n"
11351 "void f() {\n"
11352 " callme(some(parameter1,\n"
11353 "<<<<<<< text by the vcs\n"
11354 " parameter2),\n"
11355 "||||||| text by the vcs\n"
11356 " parameter2),\n"
11357 " parameter3,\n"
11358 "======= text by the vcs\n"
11359 " parameter2, parameter3),\n"
11360 ">>>>>>> text by the vcs\n"
11361 " otherparameter);\n",
11362 format("int a;\n"
11363 "void f() {\n"
11364 " callme(some(parameter1,\n"
11365 "<<<<<<< text by the vcs\n"
11366 " parameter2),\n"
11367 "||||||| text by the vcs\n"
11368 " parameter2),\n"
11369 " parameter3,\n"
11370 "======= text by the vcs\n"
11371 " parameter2,\n"
11372 " parameter3),\n"
11373 ">>>>>>> text by the vcs\n"
11374 " otherparameter);\n"));
11375
11376 // Perforce markers.
11377 EXPECT_EQ("void f() {\n"
11378 " function(\n"
11379 ">>>> text by the vcs\n"
11380 " parameter,\n"
11381 "==== text by the vcs\n"
11382 " parameter,\n"
11383 "==== text by the vcs\n"
11384 " parameter,\n"
11385 "<<<< text by the vcs\n"
11386 " parameter);\n",
11387 format("void f() {\n"
11388 " function(\n"
11389 ">>>> text by the vcs\n"
11390 " parameter,\n"
11391 "==== text by the vcs\n"
11392 " parameter,\n"
11393 "==== text by the vcs\n"
11394 " parameter,\n"
11395 "<<<< text by the vcs\n"
11396 " parameter);\n"));
11397
11398 EXPECT_EQ("<<<<<<<\n"
11399 "|||||||\n"
11400 "=======\n"
11401 ">>>>>>>",
11402 format("<<<<<<<\n"
11403 "|||||||\n"
11404 "=======\n"
11405 ">>>>>>>"));
11406
11407 EXPECT_EQ("<<<<<<<\n"
11408 "|||||||\n"
11409 "int i;\n"
11410 "=======\n"
11411 ">>>>>>>",
11412 format("<<<<<<<\n"
11413 "|||||||\n"
11414 "int i;\n"
11415 "=======\n"
11416 ">>>>>>>"));
11417
11418 // FIXME: Handle parsing of macros around conflict markers correctly:
11419 EXPECT_EQ("#define Macro \\\n"
11420 "<<<<<<<\n"
11421 "Something \\\n"
11422 "|||||||\n"
11423 "Else \\\n"
11424 "=======\n"
11425 "Other \\\n"
11426 ">>>>>>>\n"
Daniel Jasper4355e7f2014-07-09 07:50:33 +000011427 " End int i;\n",
Manuel Klimek68b03042014-04-14 09:14:11 +000011428 format("#define Macro \\\n"
11429 "<<<<<<<\n"
11430 " Something \\\n"
11431 "|||||||\n"
11432 " Else \\\n"
11433 "=======\n"
11434 " Other \\\n"
11435 ">>>>>>>\n"
11436 " End\n"
11437 "int i;\n"));
11438}
11439
Daniel Jasper471894432014-08-06 13:40:26 +000011440TEST_F(FormatTest, DisableRegions) {
11441 EXPECT_EQ("int i;\n"
11442 "// clang-format off\n"
11443 " int j;\n"
11444 "// clang-format on\n"
11445 "int k;",
11446 format(" int i;\n"
11447 " // clang-format off\n"
11448 " int j;\n"
11449 " // clang-format on\n"
11450 " int k;"));
Roman Kashitsyn650ecb52014-09-11 14:47:20 +000011451 EXPECT_EQ("int i;\n"
11452 "/* clang-format off */\n"
11453 " int j;\n"
11454 "/* clang-format on */\n"
11455 "int k;",
11456 format(" int i;\n"
11457 " /* clang-format off */\n"
11458 " int j;\n"
11459 " /* clang-format on */\n"
11460 " int k;"));
Krasimir Georgiev91834222017-01-25 13:58:58 +000011461
11462 // Don't reflow comments within disabled regions.
11463 EXPECT_EQ(
11464 "// clang-format off\n"
11465 "// long long long long long long line\n"
11466 "/* clang-format on */\n"
11467 "/* long long long\n"
11468 " * long long long\n"
11469 " * line */\n"
11470 "int i;\n"
11471 "/* clang-format off */\n"
11472 "/* long long long long long long line */\n",
11473 format("// clang-format off\n"
11474 "// long long long long long long line\n"
11475 "/* clang-format on */\n"
11476 "/* long long long long long long line */\n"
11477 "int i;\n"
11478 "/* clang-format off */\n"
11479 "/* long long long long long long line */\n",
11480 getLLVMStyleWithColumns(20)));
Daniel Jasper471894432014-08-06 13:40:26 +000011481}
11482
Manuel Klimekf0c95b32015-06-11 10:14:13 +000011483TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11484 format("? ) =");
11485 verifyNoCrash("#define a\\\n /**/}");
11486}
Manuel Klimek5f594f82014-08-13 14:00:41 +000011487
Daniel Jasper498f5582015-12-25 08:53:31 +000011488TEST_F(FormatTest, FormatsTableGenCode) {
11489 FormatStyle Style = getLLVMStyle();
11490 Style.Language = FormatStyle::LK_TableGen;
11491 verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11492}
11493
Nico Weberb2673a12016-11-10 21:49:25 +000011494TEST_F(FormatTest, ArrayOfTemplates) {
11495 EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11496 format("auto a = new unique_ptr<int > [ 10];"));
11497
11498 FormatStyle Spaces = getLLVMStyle();
11499 Spaces.SpacesInSquareBrackets = true;
11500 EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11501 format("auto a = new unique_ptr<int > [10];", Spaces));
11502}
11503
11504TEST_F(FormatTest, ArrayAsTemplateType) {
11505 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11506 format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11507
11508 FormatStyle Spaces = getLLVMStyle();
11509 Spaces.SpacesInSquareBrackets = true;
11510 EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11511 format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11512}
11513
Eric Liu547d8792016-03-24 13:22:42 +000011514TEST(FormatStyle, GetStyleOfFile) {
11515 vfs::InMemoryFileSystem FS;
11516 // Test 1: format file in the same directory.
11517 ASSERT_TRUE(
11518 FS.addFile("/a/.clang-format", 0,
11519 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11520 ASSERT_TRUE(
11521 FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011522 auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011523 ASSERT_TRUE((bool)Style1);
11524 ASSERT_EQ(*Style1, getLLVMStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011525
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011526 // Test 2.1: fallback to default.
Eric Liu547d8792016-03-24 13:22:42 +000011527 ASSERT_TRUE(
11528 FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011529 auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011530 ASSERT_TRUE((bool)Style2);
11531 ASSERT_EQ(*Style2, getMozillaStyle());
Eric Liu547d8792016-03-24 13:22:42 +000011532
Antonio Maiorano7eb75072017-01-20 01:22:42 +000011533 // Test 2.2: no format on 'none' fallback style.
11534 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11535 ASSERT_TRUE((bool)Style2);
11536 ASSERT_EQ(*Style2, getNoStyle());
11537
11538 // Test 2.3: format if config is found with no based style while fallback is
11539 // 'none'.
11540 ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11541 llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11542 Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11543 ASSERT_TRUE((bool)Style2);
11544 ASSERT_EQ(*Style2, getLLVMStyle());
11545
11546 // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11547 Style2 = getStyle("{}", "a.h", "none", "", &FS);
11548 ASSERT_TRUE((bool)Style2);
11549 ASSERT_EQ(*Style2, getLLVMStyle());
11550
Eric Liu547d8792016-03-24 13:22:42 +000011551 // Test 3: format file in parent directory.
11552 ASSERT_TRUE(
11553 FS.addFile("/c/.clang-format", 0,
11554 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11555 ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11556 llvm::MemoryBuffer::getMemBuffer("int i;")));
Daniel Jasper03a04fe2016-12-12 12:42:29 +000011557 auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
Antonio Maiorano3adfb6a2017-01-17 00:12:27 +000011558 ASSERT_TRUE((bool)Style3);
11559 ASSERT_EQ(*Style3, getGoogleStyle());
11560
11561 // Test 4: error on invalid fallback style
11562 auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11563 ASSERT_FALSE((bool)Style4);
11564 llvm::consumeError(Style4.takeError());
11565
11566 // Test 5: error on invalid yaml on command line
11567 auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11568 ASSERT_FALSE((bool)Style5);
11569 llvm::consumeError(Style5.takeError());
11570
11571 // Test 6: error on invalid style
11572 auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11573 ASSERT_FALSE((bool)Style6);
11574 llvm::consumeError(Style6.takeError());
11575
11576 // Test 7: found config file, error on parsing it
11577 ASSERT_TRUE(
11578 FS.addFile("/d/.clang-format", 0,
11579 llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11580 "InvalidKey: InvalidValue")));
11581 ASSERT_TRUE(
11582 FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11583 auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11584 ASSERT_FALSE((bool)Style7);
11585 llvm::consumeError(Style7.takeError());
Eric Liu547d8792016-03-24 13:22:42 +000011586}
11587
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011588TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11589 // Column limit is 20.
11590 std::string Code = "Type *a =\n"
11591 " new Type();\n"
11592 "g(iiiii, 0, jjjjj,\n"
11593 " 0, kkkkk, 0, mm);\n"
11594 "int bad = format ;";
11595 std::string Expected = "auto a = new Type();\n"
11596 "g(iiiii, nullptr,\n"
11597 " jjjjj, nullptr,\n"
11598 " kkkkk, nullptr,\n"
11599 " mm);\n"
11600 "int bad = format ;";
11601 FileID ID = Context.createInMemoryFile("format.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011602 tooling::Replacements Replaces = toReplacements(
11603 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11604 "auto "),
11605 tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11606 "nullptr"),
11607 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11608 "nullptr"),
11609 tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11610 "nullptr")});
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011611
11612 format::FormatStyle Style = format::getLLVMStyle();
11613 Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
Eric Liu4f8d9942016-07-11 13:53:12 +000011614 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11615 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11616 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11617 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11618 EXPECT_TRUE(static_cast<bool>(Result));
11619 EXPECT_EQ(Expected, *Result);
Manuel Klimekb12e5a52016-03-01 12:37:30 +000011620}
11621
Eric Liubaf58c22016-05-18 13:43:48 +000011622TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11623 std::string Code = "#include \"a.h\"\n"
11624 "#include \"c.h\"\n"
11625 "\n"
11626 "int main() {\n"
11627 " return 0;\n"
11628 "}";
11629 std::string Expected = "#include \"a.h\"\n"
11630 "#include \"b.h\"\n"
11631 "#include \"c.h\"\n"
11632 "\n"
11633 "int main() {\n"
11634 " return 0;\n"
11635 "}";
11636 FileID ID = Context.createInMemoryFile("fix.cpp", Code);
Eric Liu40ef2fb2016-08-01 10:16:37 +000011637 tooling::Replacements Replaces = toReplacements(
11638 {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11639 "#include \"b.h\"\n")});
Eric Liubaf58c22016-05-18 13:43:48 +000011640
11641 format::FormatStyle Style = format::getLLVMStyle();
11642 Style.SortIncludes = true;
Eric Liu4f8d9942016-07-11 13:53:12 +000011643 auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11644 EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11645 << llvm::toString(FormattedReplaces.takeError()) << "\n";
11646 auto Result = applyAllReplacements(Code, *FormattedReplaces);
11647 EXPECT_TRUE(static_cast<bool>(Result));
11648 EXPECT_EQ(Expected, *Result);
Eric Liubaf58c22016-05-18 13:43:48 +000011649}
11650
Andi-Bogdan Postelnicua9a8fde2016-10-26 07:44:51 +000011651TEST_F(FormatTest, AllignTrailingComments) {
11652 EXPECT_EQ("#define MACRO(V) \\\n"
11653 " V(Rt2) /* one more char */ \\\n"
11654 " V(Rs) /* than here */ \\\n"
11655 "/* comment 3 */\n",
11656 format("#define MACRO(V)\\\n"
11657 "V(Rt2) /* one more char */ \\\n"
11658 "V(Rs) /* than here */ \\\n"
11659 "/* comment 3 */ \\\n",
11660 getLLVMStyleWithColumns(40)));
11661}
Daniel Jasperd246a5a2015-06-15 15:25:11 +000011662} // end namespace
11663} // end namespace format
Daniel Jasper8d1832e2013-01-07 13:26:07 +000011664} // end namespace clang